Files
Jungfraujoch/common/DetectorSetup.h
2025-08-16 19:59:27 +02:00

154 lines
7.2 KiB
C++

// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#ifndef JUNGFRAUJOCH_DETECTORSETUP_H
#define JUNGFRAUJOCH_DETECTORSETUP_H
#include <memory>
#include <chrono>
#include <optional>
#include "DetectorGeometry.h"
#include "../jungfrau/JFModuleGainCalibration.h"
#include "DetectorGeometryFixed.h"
#include "DetectorGeometryModular.h"
#include "DetectorSettings.h"
constexpr uint16_t SimplonStream2Port = 31001;
enum class DetectorType {EIGER, JUNGFRAU, DECTRIS};
class DetectorSetup {
std::string description;
std::string serial_number;
std::shared_ptr<DetectorGeometry> geometry;
std::vector<std::string> det_modules_hostname;
std::vector<std::string> gain_file_names;
std::vector<std::string> trim_file_names;
std::string trim_file_directory;
std::vector<JFModuleGainCalibration> gain_calibration;
int64_t udp_interface_count = 2;
float pixel_size_um = 75.0f;
std::string sensor_material = "Si";
float sensor_thickness_um = 320.0f;
std::vector<int64_t> tx_delay;
DetectorType detector_type;
int32_t high_voltage = 120.0;
uint32_t ipv4_base_addr = 0x010a0a0a;
bool module_sync = true;
std::chrono::microseconds read_out_time;
std::chrono::microseconds min_count_time;
std::chrono::microseconds min_frame_time;
float min_energy_threshold_keV = 2.7f;
int32_t temperature_thresold_degC = 55;
std::string dectris_roi;
std::optional<int64_t> bit_depth_image;
std::optional<int64_t> bit_depth_readout;
std::optional<int64_t> saturation_limit;
std::optional<DetectorSettings> settings;
DetectorSetup(std::shared_ptr<DetectorGeometry> geom,
DetectorType detector_type,
const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
public:
DetectorSetup(const DetectorGeometryFixed& geom,
DetectorType detector_type,
const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
DetectorSetup(const DetectorGeometryModular& geom,
DetectorType detector_type,
const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
void LoadGain(const std::vector<std::string> &filenames);
void SetTrimFiles(const std::vector<std::string> &filenames);
DetectorSetup& TxDelay(const std::vector<int64_t> &v);
DetectorSetup& UDPInterfaceCount(int64_t input);
DetectorSetup& SensorMaterial(const std::string &input);
DetectorSetup& SensorThickness_um(float input);
DetectorSetup& PixelSize_um(float input);
DetectorSetup& HighVoltage(int32_t input);
DetectorSetup& SerialNumber(const std::string &input);
DetectorSetup& BaseIPv4Addr(const std::string &input);
DetectorSetup& ModuleSync(bool input);
DetectorSetup& ReadOutTime(std::chrono::microseconds input);
DetectorSetup& Geometry(const DetectorGeometryFixed& input);
DetectorSetup& BitDepthReadout(int64_t input);
DetectorSetup& BitDepthImage(int64_t input);
DetectorSetup& MinFrameTime(std::chrono::microseconds input);
DetectorSetup& MinCountTime(std::chrono::microseconds input);
DetectorSetup& MinThreshold_keV(float input);
DetectorSetup& SaturationLimit(std::optional<int64_t> input);
DetectorSetup& Description(const std::string &input);
DetectorSetup& DECTRISROI(const std::string &input);
DetectorSetup& DefaultSettings(const std::optional<DetectorSettings> &input);
DetectorSetup& TempThreshold_degC(int64_t input);
[[nodiscard]] DetectorType GetDetectorType() const;
[[nodiscard]] const DetectorGeometry& GetGeometry() const;
[[nodiscard]] const std::vector<std::string>& GetDetectorModuleHostname() const;
[[nodiscard]] uint64_t GetModulesNum() const;
[[nodiscard]] std::string GetDescription() const;
[[nodiscard]] float GetPixelSize_mm() const;
[[nodiscard]] float GetSensorThickness_um() const;
[[nodiscard]] std::string GetSensorMaterial() const;
[[nodiscard]] const std::vector<JFModuleGainCalibration> &GetGainCalibration() const;
[[nodiscard]] int64_t GetUDPInterfaceCount() const;
[[nodiscard]] const std::vector<int64_t> &GetTxDelay() const; // can be empty for default
[[nodiscard]] const std::vector<std::string> &GetGainFileNames() const;
[[nodiscard]] const std::vector<std::string> &GetTrimFileNames() const;
[[nodiscard]] std::string GetTrimFileDirectory() const;
[[nodiscard]] int32_t GetHighVoltage() const;
[[nodiscard]] std::string GetSerialNumber() const;
[[nodiscard]] uint32_t GetSrcIPv4Addr(uint32_t half_module) const;
[[nodiscard]] std::string GetBaseIPv4Addr() const;
[[nodiscard]] bool IsModuleSync() const;
[[nodiscard]] std::chrono::microseconds GetReadOutTime() const;
[[nodiscard]] std::chrono::microseconds GetMinFrameTime() const;
[[nodiscard]] std::chrono::microseconds GetMinCountTime() const;
[[nodiscard]] std::optional<int64_t> GetBitDepthReadout() const;
[[nodiscard]] std::optional<int64_t> GetBitDepthImage() const;
[[nodiscard]] std::string GetDECTRISStream2Addr() const;
[[nodiscard]] float GetMinThreshold_keV() const;
[[nodiscard]] std::optional<int64_t> GetSaturationLimit() const;
[[nodiscard]] std::string GetDECTRISROI() const;
[[nodiscard]] std::optional<DetectorSettings> GetDefaultSettings() const;
[[nodiscard]] int32_t GetTempThreshold_degC() const;
};
DetectorSetup DetJF4M(const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
DetectorSetup DetJF9M(const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
DetectorSetup DetJF(int32_t nmodules,
int32_t horizontal_stacking = 1,
int32_t gap_x = 0,
int32_t gap_y = 0,
bool mirror_y = true,
const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
DetectorSetup DetJF(const DetectorGeometryModular &geom,
const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
DetectorSetup DetEIGER(int32_t nmodules,
int32_t horizontal_stacking = 1,
int32_t gap_x = 0,
int32_t gap_y = 0,
bool mirror_y = true,
const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
DetectorSetup DetEIGER(const DetectorGeometryModular &geom,
const std::string &description = "Detector",
const std::vector<std::string> &det_modules_hostname = {});
DetectorSetup DetDECTRIS(int64_t width, int64_t height,
const std::string &description,
const std::string &addr);
#endif //JUNGFRAUJOCH_DETECTORSETUP_H