// Copyright (2019-2023) Paul Scherrer Institute #ifndef DIFFRACTIONEXPERIMENT_H #define DIFFRACTIONEXPERIMENT_H #include #include #include #include "../compression/CompressionAlgorithmEnum.h" #include "UnitCell.h" #include "Coord.h" #include "Definitions.h" #include "../frame_serialize/JFJochMessages.h" #include "DetectorSetup.h" #include "../image_analysis/SpotFindingSettings.h" #include "DatasetSettings.h" #include "ROIMask.h" enum class DetectorMode { Conversion, Raw, PedestalG0, PedestalG1, PedestalG2 }; struct AcquisitionDeviceNetConfig { std::string mac_addr; std::string ipv4_addr; uint64_t udp_port; }; struct DetectorModuleConfig { uint64_t udp_dest_port_1; uint64_t udp_dest_port_2; std::string ipv4_src_addr_1; std::string ipv4_src_addr_2; std::string ipv4_dest_addr_1; std::string ipv4_dest_addr_2; std::string mac_addr_dest_1; std::string mac_addr_dest_2; uint64_t module_id_in_data_stream; }; class DiffractionExperiment { // Internal detector settings std::chrono::microseconds frame_time_pedestalG1G2{}; // uint64 frame_time_pedestalG2_us = 2; reserved std::chrono::microseconds frame_time{}; std::chrono::microseconds count_time{}; DetectorSetup detector; int64_t ndatastreams; bool internal_fpga_packet_generator; int64_t internal_fpga_packet_generator_images; int64_t storage_cells; int64_t storage_cell_start; std::chrono::nanoseconds storage_cell_delay{}; std::chrono::nanoseconds detector_delay{}; int64_t pedestal_g0_frames; int64_t pedestal_g1_frames; int64_t pedestal_g2_frames; bool use_gain_hg0; bool fix_gain_g1; std::chrono::microseconds preview_period{}; DetectorMode mode; bool mask_module_edges; bool mask_chip_edges; int64_t ipv4_base_addr; float low_q; float high_q; float q_spacing; std::string source_name; std::string source_name_short; std::string instrument_name; std::string instrument_name_short; bool pulsed_source; bool debug_pixel_mask; Coord default_omega_axis; bool conversion_on_fpga; uint64_t series_id; std::string neural_net_model_path; bool rad_int_solid_angle_corr; bool rad_int_polarization_corr; float rad_int_polarization_factor{}; // Dataset settings DatasetSettings dataset; ROIMask roi_mask; int64_t max_spot_count; public: // Public methods are atomic DiffractionExperiment(); DiffractionExperiment(const DetectorSetup& geom); // Methods below can be chained together DiffractionExperiment& Detector(const DetectorSetup& input); DiffractionExperiment& Mode(DetectorMode input); DiffractionExperiment& DataStreams(int64_t input); DiffractionExperiment& PedestalG0Frames(int64_t input); DiffractionExperiment& PedestalG1Frames(int64_t input); DiffractionExperiment& PedestalG2Frames(int64_t input); DiffractionExperiment& FrameTime(std::chrono::microseconds frame_time, std::chrono::microseconds in_count_time = std::chrono::microseconds(0)); DiffractionExperiment& PedestalG1G2FrameTime(std::chrono::microseconds input); DiffractionExperiment& PreviewPeriod(std::chrono::microseconds input); DiffractionExperiment& UseInternalPacketGenerator(bool input); DiffractionExperiment& InternalPacketGeneratorImages(int64_t input); DiffractionExperiment& IPv4BaseAddr(std::string input); DiffractionExperiment& MaskModuleEdges(bool input); DiffractionExperiment& MaskChipEdges(bool input); DiffractionExperiment& LowResForAzimInt_A(float input); DiffractionExperiment& HighResForAzimInt_A(float input); DiffractionExperiment& LowQForAzimInt_recipA(float input); DiffractionExperiment& HighQForAzimInt_recipA(float input); DiffractionExperiment& QSpacingForAzimInt_recipA(float input); DiffractionExperiment& StorageCells(int64_t input); DiffractionExperiment& StorageCellStart(int64_t input = 15); DiffractionExperiment& SourceName(std::string input); DiffractionExperiment& SourceNameShort(std::string input); DiffractionExperiment& InstrumentName(std::string input); DiffractionExperiment& InstrumentNameShort(std::string input); DiffractionExperiment& ApplyPixelMaskInFPGA(bool input); DiffractionExperiment& DefaultOmegaAxis(const Coord &c); DiffractionExperiment& UsingGainHG0(bool input); DiffractionExperiment& FixedGainG1(bool input); DiffractionExperiment& IncrementSeriesID(); DiffractionExperiment& ConversionOnFPGA(bool input); DiffractionExperiment& NeuralNetModelPath(const std::string& input); DiffractionExperiment& PulsedSource(bool input); DiffractionExperiment& ImagesPerTrigger(int64_t input); DiffractionExperiment& NumTriggers(int64_t triggers); DiffractionExperiment& PhotonEnergy_keV(float input); DiffractionExperiment& BeamX_pxl(float input); DiffractionExperiment& BeamY_pxl(float input); DiffractionExperiment& DetectorDistance_mm(float input); DiffractionExperiment& FilePrefix(std::string input); DiffractionExperiment& Compression(CompressionAlgorithm input); DiffractionExperiment& SetUnitCell(const std::optional &cell); DiffractionExperiment& SpaceGroupNumber(int64_t input); DiffractionExperiment& SampleName(std::string input); DiffractionExperiment& AttenuatorTransmission(const std::optional &input); DiffractionExperiment& TotalFlux(const std::optional &input); DiffractionExperiment& OmegaStep(const std::optional &input); DiffractionExperiment& OmegaStart(float input); DiffractionExperiment& OmegaAxis(const Coord &c); DiffractionExperiment& OmegaAxis(); DiffractionExperiment& HeaderAppendix(const std::string& input); DiffractionExperiment& ImageAppendix(const std::string& input); DiffractionExperiment& PhotonEnergyMultiplayer(float input); DiffractionExperiment& SaveCalibration(bool input); DiffractionExperiment& Summation(int64_t input); DiffractionExperiment& FPGAOutputMode(FPGAPixelOutput input); DiffractionExperiment& MaxSpotCount(int64_t input); DiffractionExperiment& ImagesPerFile(int64_t input); DiffractionExperiment& ImportDatasetSettings(const DatasetSettings& input); DatasetSettings GetDatasetSettings() const; void FillMessage(StartMessage &message) const; static void CheckDataProcessingSettings(const SpotFindingSettings& settings); static SpotFindingSettings DefaultDataProcessingSettings(); DetectorMode GetDetectorMode() const; int64_t GetPixelDepth() const; bool IsPixelSigned() const; int64_t GetOverflow() const; int64_t GetUnderflow() const; int64_t GetPedestalG0Frames() const; int64_t GetPedestalG1Frames() const; int64_t GetPedestalG2Frames() const; int64_t GetImageNum() const; int64_t GetFrameNum() const; int64_t GetFrameNumPerTrigger() const; std::chrono::microseconds GetFrameTime() const; std::chrono::microseconds GetDetectorPeriod() const; std::chrono::microseconds GetImageTime() const; std::chrono::microseconds GetImageCountTime() const; std::chrono::microseconds GetFrameCountTime() const; DiffractionExperiment& StorageCellDelay(std::chrono::nanoseconds input); std::chrono::nanoseconds GetStorageCellDelay() const; DiffractionExperiment& DetectorDelay(std::chrono::nanoseconds input); std::chrono::nanoseconds GetDetectorDelay() const; int64_t GetMaxCompressedSize() const; int64_t GetSendBufferLocationSize() const; int64_t GetDataStreamsNum() const; int64_t GetModulesNum(uint16_t data_stream) const; int64_t GetModulesNum() const; int64_t GetFirstModuleOfDataStream(uint16_t data_stream) const; int64_t GetPixelsNum() const; int64_t GetYPixelsNum() const; int64_t GetXPixelsNum() const; int64_t GetPixel0OfModule(uint16_t module_number) const; int64_t GetModuleFastDirectionStep(uint16_t module_number) const; int64_t GetModuleSlowDirectionStep(uint16_t module_number) const; Coord GetModuleFastDirection(uint16_t module_number) const; Coord GetModuleSlowDirection(uint16_t module_number) const; std::chrono::microseconds GetPreviewPeriod() const; int64_t GetDefaultPlotBinning() const; bool IsUsingInternalPacketGen() const; int64_t GetInternalPacketGeneratorImages() const; uint32_t GetSrcIPv4Address(uint32_t data_stream, uint32_t half_module) const; bool GetMaskModuleEdges() const; bool GetMaskChipEdges() const; Coord LabCoord(float detector_x, float detector_y) const; float GetLowQForAzimInt_recipA() const; float GetHighQForAzimInt_recipA() const; float GetQSpacingForAzimInt_recipA() const; float GetLowQForBkgEstimate_recipA() const; float GetHighQForBkgEstimate_recipA() const; int64_t GetStorageCellNumber() const; int64_t GetStorageCellStart() const; int64_t GetMaxSpotCount() const; bool GetApplyPixelMaskInFPGA() const; float GetPixelSize_mm() const; std::string GetSourceName() const; std::string GetSourceNameShort() const; std::string GetInstrumentName() const; std::string GetInstrumentNameShort() const; std::string GetDetectorDescription() const; std::vector GetDetectorModuleHostname() const; DiffractionExperiment& ApplySolidAngleCorr(bool input); DiffractionExperiment& ApplyPolarizationCorr(bool input); DiffractionExperiment& PolarizationFactor(float input); bool GetApplySolidAngleCorr() const; bool GetApplyPolarizationCorr() const; float GetPolarizationFactor() const; int64_t GetUDPInterfaceCount() const; std::vector GetDetectorModuleConfig(const std::vector& net_config) const; Coord GetDefaultOmegaAxis() const; bool IsFixedGainG1() const; bool IsUsingGainHG0() const; uint64_t GetSeriesID() const; std::string GetSeriesIDString() const; bool IsConversionOnFPGA() const; const DetectorSetup& GetDetectorSetup() const; std::string GetNeuralNetModelPath() const; bool IsPulsedSource() const; bool IsSpotFindingEnabled() const; float GetPhotonEnergyForConversion_keV() const; std::optional GetAttenuatorTransmission() const; std::optional GetTotalFlux() const; std::optional GetOmegaStep() const; float GetOmegaStart() const; Coord GetOmegaAxis() const; std::string GetHeaderAppendix() const; std::string GetImageAppendix() const; float GetPhotonEnergyMultiplier() const; std::optional GetUnitCell() const; int64_t GetSpaceGroupNumber() const; bool GetSaveCalibration() const; int64_t GetSummation() const; FPGAPixelOutput GetFPGAOutputMode() const; std::string GetSampleName() const; float GetPhotonEnergy_keV() const; float GetWavelength_A() const; float GetBeamX_pxl() const; float GetBeamY_pxl() const; float GetDetectorDistance_mm() const; Coord GetScatteringVector() const; std::string GetFilePrefix() const; int64_t GetTimePointNumber() const; CompressionAlgorithm GetCompressionAlgorithm() const; int64_t GetNumTriggers() const; ROIMask& ROI(); const ROIMask& ROI() const; void ExportROIMask(uint16_t *v, size_t module_number) const; int64_t GetImagesPerFile() const; }; #endif //DIFFRACTIONEXPERIMENT_H