// Copyright (2019-2022) Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-or-later #ifndef DIFFRACTIONEXPERIMENT_H #define DIFFRACTIONEXPERIMENT_H #include #include #include #include #include "../compression/CompressionAlgorithmEnum.h" #include "UnitCell.h" #include "Coord.h" #include "Definitions.h" #include "../frame_serialize/StartMessage.h" #include "../frame_serialize/EndMessage.h" #include "DetectorSetup.h" enum class DetectorMode : int { Conversion, Raw, PedestalG0, PedestalG1, PedestalG2 }; class DiffractionExperiment { JFJochProtoBuf::DatasetSettings dataset; JFJochProtoBuf::InternalSettings internal; constexpr static const int64_t max_spot_count = 100; DiffractionExperiment& SetUnitCell(const JFJochProtoBuf::UnitCell &input); public: // Public methods are atomic DiffractionExperiment(); DiffractionExperiment(const DetectorSetup& geom); explicit DiffractionExperiment(const JFJochProtoBuf::JungfraujochSettings &settings); // Methods below can be chained together DiffractionExperiment& Detector(const DetectorSetup& input); DiffractionExperiment& Mode(DetectorMode input); DiffractionExperiment& DataStreams(int64_t input); DiffractionExperiment& Import(const JFJochProtoBuf::JungfraujochSettings &settings); DiffractionExperiment& ImagesPerTrigger(int64_t input); DiffractionExperiment& NumTriggers(int64_t triggers); 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& Summation(int64_t input); DiffractionExperiment& ImageTimeUs(std::chrono::microseconds image_time); DiffractionExperiment& PedestalG1G2FrameTime(std::chrono::microseconds input); DiffractionExperiment& PhotonEnergy_keV(float input); DiffractionExperiment& BeamX_pxl(float input); DiffractionExperiment& BeamY_pxl(float input); DiffractionExperiment& DetectorDistance_mm(float input); DiffractionExperiment& ScatteringVector(Coord input); DiffractionExperiment& ScatteringVector(); DiffractionExperiment& FilePrefix(std::string input); DiffractionExperiment& DataFileCount(int64_t input); DiffractionExperiment& Compression(JFJochProtoBuf::Compression input); DiffractionExperiment& PreviewPeriod(std::chrono::microseconds input); DiffractionExperiment& SpotFindingPeriod(std::chrono::microseconds input); DiffractionExperiment& UseInternalPacketGenerator(bool input); DiffractionExperiment& IPv4BaseAddr(std::string input); DiffractionExperiment& MaskModuleEdges(bool input); DiffractionExperiment& MaskChipEdges(bool input); DiffractionExperiment& SetUnitCell(const UnitCell &cell); DiffractionExperiment& SetUnitCell(); DiffractionExperiment& LowResForRadialInt_A(float input); DiffractionExperiment& HighResForRadialInt_A(float input); DiffractionExperiment& LowQForRadialInt_recipA(float input); DiffractionExperiment& HighQForRadialInt_recipA(float input); DiffractionExperiment& QSpacingForRadialInt_recipA(float input); DiffractionExperiment& SpaceGroupNumber(int64_t input); DiffractionExperiment& StorageCells(int64_t input); DiffractionExperiment& StorageCellStart(int64_t input = 15); DiffractionExperiment& SampleName(std::string input); DiffractionExperiment& ConversionOnCPU(bool input); DiffractionExperiment& SourceName(std::string input); DiffractionExperiment& SourceNameShort(std::string input); DiffractionExperiment& InstrumentName(std::string input); DiffractionExperiment& InstrumentNameShort(std::string input); DiffractionExperiment& Binning2x2(bool input); DiffractionExperiment& ApplyPixelMaskInFPGA(bool input); operator JFJochProtoBuf::JungfraujochSettings() const; operator JFJochProtoBuf::DetectorInput() const; void FillMessage(StartMessage &message) const; JFJochProtoBuf::DetectorConfig DetectorConfig(const JFJochProtoBuf::ReceiverNetworkConfig& net_config) const; void LoadDatasetSettings(const JFJochProtoBuf::DatasetSettings &settings); void LoadDetectorSettings(const JFJochProtoBuf::DetectorSettings &settings); JFJochProtoBuf::DetectorSettings GetDetectorSettings() const; static void CheckDataProcessingSettings(const JFJochProtoBuf::DataProcessingSettings& settings); static JFJochProtoBuf::DataProcessingSettings DefaultDataProcessingSettings(); DetectorMode GetDetectorMode() const; int64_t GetPixelDepth() const; bool IsPixelSigned() const; int64_t GetOverflow() const; int64_t GetUnderflow() const; int64_t GetNumTriggers() const; int64_t GetImageNum() const; int64_t GetImageNumPerTrigger() const; int64_t GetPedestalG0Frames() const; int64_t GetPedestalG1Frames() const; int64_t GetPedestalG2Frames() const; int64_t GetFrameNum() const; int64_t GetFrameNumPerTrigger() const; std::chrono::microseconds GetFrameTime() const; std::chrono::microseconds GetImageTime() const; int64_t GetSummation() const; std::chrono::microseconds GetImageCountTime() const; std::chrono::microseconds GetFrameCountTime() 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 GetDataFileCount() const; JFJochProtoBuf::Compression GetCompressionAlgorithm() const; CompressionAlgorithm GetCompressionAlgorithmEnum() const; int64_t GetMaxCompressedSize() const; int64_t GetDataStreamsNum() const; int64_t GetModulesNum(uint16_t data_stream = TASK_NO_DATA_STREAM) const; int64_t GetFirstModuleOfDataStream(uint16_t data_stream) const; int64_t GetPixelsNum() const; int64_t GetPixelsNumFullImage() const; // before filters, like ROI or binning int64_t GetYPixelsNum() const; int64_t GetYPixelsNumFullImage() const; // before filters, like ROI or binning int64_t GetXPixelsNum() const; int64_t GetXPixelsNumFullImage() const; // before filters, like ROI or binning int64_t GetPixel0OfModule(uint16_t module_number) const; // before filters, like ROI or binning int64_t GetModuleFastDirectionStep(uint16_t module_number) const; // before filters, like ROI or binning int64_t GetModuleSlowDirectionStep(uint16_t module_number) const; // before filters, like ROI or binning std::chrono::microseconds GetPreviewPeriod() const; int64_t GetPreviewStride() const; std::chrono::microseconds GetSpotFindingPeriod() const; int64_t GetSpotFindingStride() const; int64_t GetSpotFindingBin() const; int64_t GetPreviewStride(std::chrono::microseconds period) const; bool IsUsingInternalPacketGen() const; uint32_t GetSrcIPv4Address(uint32_t data_stream, uint32_t half_module) const; bool CheckGitSha1Consistent() const; std::string CheckGitSha1Msg() const; bool GetMaskModuleEdges() const; bool GetMaskChipEdges() const; UnitCell GetUnitCell() const; bool HasUnitCell() const; float ResToPxl(float resolution) const; Coord LabCoord(float detector_x, float detector_y) const; float PxlToRes(float detector_x, float detector_y) const; float CalcRadIntSolidAngleCorr(float q) const; float GetLowQForRadialInt_recipA() const; float GetHighQForRadialInt_recipA() const; float GetQSpacingForRadialInt_recipA() const; int64_t GetSpaceGroupNumber() const; int64_t GetStorageCellNumber() const; int64_t GetStorageCellStart() const; JFJochProtoBuf::DetectorType GetDetectorType() const; int64_t GetMaxSpotCount() const; std::string GetSampleName() const; bool GetConversionOnCPU() const; bool GetConversionOnFPGA() const; bool GetApplyPixelMaskInFPGA() const; float GetPixelSize_mm() const; bool GetBinning2x2() const; std::string GetSourceName() const; std::string GetSourceNameShort() const; std::string GetInstrumentName() const; std::string GetInstrumentNameShort() const; std::string GetDetectorDescription() const; void GetDetectorModuleHostname(std::vector& output) const; bool GetPedestalWithExternalTrigger() const; }; inline int64_t CalculateStride(const std::chrono::microseconds &frame_time, const std::chrono::microseconds &preview_time) { if ((preview_time.count() <= 0) || (frame_time.count() <= 0)) return 0; else if (preview_time < frame_time) return 1; else return preview_time / frame_time; } #endif //DIFFRACTIONEXPERIMENT_H