232 lines
8.8 KiB
C++
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
|