// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JUNGFRAUJOCH_DETECTORSETUP_H #define JUNGFRAUJOCH_DETECTORSETUP_H #include #include #include #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 geometry; std::vector det_modules_hostname; std::vector gain_file_names; std::vector trim_file_names; std::string trim_file_directory; std::vector 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 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 bit_depth_image; std::optional bit_depth_readout; std::optional saturation_limit; std::optional settings; DetectorSetup(std::shared_ptr geom, DetectorType detector_type, const std::string &description = "Detector", const std::vector &det_modules_hostname = {}); public: DetectorSetup(const DetectorGeometryFixed& geom, DetectorType detector_type, const std::string &description = "Detector", const std::vector &det_modules_hostname = {}); DetectorSetup(const DetectorGeometryModular& geom, DetectorType detector_type, const std::string &description = "Detector", const std::vector &det_modules_hostname = {}); void LoadGain(const std::vector &filenames); void SetTrimFiles(const std::vector &filenames); DetectorSetup& TxDelay(const std::vector &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 input); DetectorSetup& Description(const std::string &input); DetectorSetup& DECTRISROI(const std::string &input); DetectorSetup& DefaultSettings(const std::optional &input); DetectorSetup& TempThreshold_degC(int64_t input); [[nodiscard]] DetectorType GetDetectorType() const; [[nodiscard]] const DetectorGeometry& GetGeometry() const; [[nodiscard]] const std::vector& 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 &GetGainCalibration() const; [[nodiscard]] int64_t GetUDPInterfaceCount() const; [[nodiscard]] const std::vector &GetTxDelay() const; // can be empty for default [[nodiscard]] const std::vector &GetGainFileNames() const; [[nodiscard]] const std::vector &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 GetBitDepthReadout() const; [[nodiscard]] std::optional GetBitDepthImage() const; [[nodiscard]] std::string GetDECTRISStream2Addr() const; [[nodiscard]] float GetMinThreshold_keV() const; [[nodiscard]] std::optional GetSaturationLimit() const; [[nodiscard]] std::string GetDECTRISROI() const; [[nodiscard]] std::optional GetDefaultSettings() const; [[nodiscard]] int32_t GetTempThreshold_degC() const; }; DetectorSetup DetJF4M(const std::string &description = "Detector", const std::vector &det_modules_hostname = {}); DetectorSetup DetJF9M(const std::string &description = "Detector", const std::vector &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 &det_modules_hostname = {}); DetectorSetup DetJF(const DetectorGeometryModular &geom, const std::string &description = "Detector", const std::vector &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 &det_modules_hostname = {}); DetectorSetup DetEIGER(const DetectorGeometryModular &geom, const std::string &description = "Detector", const std::vector &det_modules_hostname = {}); DetectorSetup DetDECTRIS(int64_t width, int64_t height, const std::string &description, const std::string &addr); #endif //JUNGFRAUJOCH_DETECTORSETUP_H