Files
Jungfraujoch/common/DiffractionExperiment.h

232 lines
8.8 KiB
C++

// Copyright (2019-2022) Paul Scherrer Institute
// SPDX-License-Identifier: GPL-3.0-or-later
#ifndef DIFFRACTIONEXPERIMENT_H
#define DIFFRACTIONEXPERIMENT_H
#include <chrono>
#include <exception>
#include <mutex>
#include <jfjoch.pb.h>
#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<std::string>& 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