* Enhancements for XFEL

* Enhancements for EIGER
* Writer is more flexible and capable of handling DECTRIS data
This commit is contained in:
2024-03-05 20:41:47 +01:00
parent 71d862b706
commit d315506633
165 changed files with 5440 additions and 2230 deletions
+87 -15
View File
@@ -167,6 +167,25 @@ TEST_CASE("DiffractionExperiment_IPv4Address","[DiffractionExperiment]") {
REQUIRE(x.GetSrcIPv4Address(2, 6) == IPv4AddressFromStr("64.1.124.23"));
}
TEST_CASE("DiffractionExperiment_IPv4Address_1_UDP_Interface","[DiffractionExperiment]") {
DetectorSetup detector(DetectorGeometry(4));
detector.UDPInterfaceCount(1);
DiffractionExperiment x(detector);
x.Mode(DetectorMode::Conversion);
x.DataStreams(2);
REQUIRE_NOTHROW(x.IPv4BaseAddr("64.1.124.1"));
REQUIRE(x.GetSrcIPv4Address(0, 0) == IPv4AddressFromStr("64.1.124.1"));
REQUIRE(x.GetSrcIPv4Address(0, 1) == IPv4AddressFromStr("64.1.124.2"));
REQUIRE(x.GetSrcIPv4Address(1, 1) == IPv4AddressFromStr("64.1.124.4"));
REQUIRE_THROWS(x.GetSrcIPv4Address(0, 2));
REQUIRE_THROWS(x.GetSrcIPv4Address(2, 0));
}
TEST_CASE("IPv4AddressToStr","") {
REQUIRE(IPv4AddressToStr(0x0f32010a) == "10.1.50.15");
}
@@ -367,32 +386,25 @@ TEST_CASE("DiffractionExperiment_Preview", "[DiffractionExperiment]") {
std::map<size_t, uint32_t> map, map2;
x.ImagesPerTrigger(10000).FrameTime(1ms);
x.PreviewPeriod(0ms);
REQUIRE(x.GetPreviewStride() == 0);
REQUIRE(x.GetPreviewPeriod().count() == 0);
x.PreviewPeriod(1s);
REQUIRE(x.GetPreviewPeriod() == std::chrono::milliseconds(1000));
REQUIRE(x.GetPreviewStride() == 1000);
REQUIRE_THROWS(x.PreviewPeriod(-5ms));
REQUIRE(x.GetPreviewStride(100ms) == 100);
REQUIRE(x.GetPreviewStride(50ms) == 50);
REQUIRE(x.GetPreviewStride(1ms) == 1);
REQUIRE(x.GetPreviewStride(500us) == 1);
REQUIRE(x.GetPreviewStride(0s) == 0);
x.Mode(DetectorMode::Raw);
REQUIRE(x.GetPreviewStride() == 0);
REQUIRE(x.GetPreviewPeriod().count() == 0);
x.Mode(DetectorMode::PedestalG0);
REQUIRE(x.GetPreviewStride() == 0);
REQUIRE(x.GetPreviewPeriod().count() == 0);
x.Mode(DetectorMode::PedestalG1);
REQUIRE(x.GetPreviewStride() == 0);
REQUIRE(x.GetPreviewPeriod().count() == 0);
x.Mode(DetectorMode::PedestalG2);
REQUIRE(x.GetPreviewStride() == 0);
REQUIRE(x.GetPreviewPeriod().count() == 0);
}
TEST_CASE("DiffractionExperiment_SpaceGroup", "[DiffractionExperiment]") {
@@ -582,6 +594,38 @@ TEST_CASE("DiffractionExperiment_StorageCells_Pedestal","[DiffractionExperiment]
REQUIRE(x.GetFrameNumPerTrigger() == 2);
}
TEST_CASE("DiffractionExperiment_PulsedSource","[DiffractionExperiment]") {
DiffractionExperiment x;
REQUIRE(!x.IsPulsedSource()); // default must be off
x.ImagesPerTrigger(50).NumTriggers(100).Mode(DetectorMode::Raw).PedestalG0Frames(1000)
.PedestalG1Frames(200).PedestalG2Frames(100);
REQUIRE(x.GetImageNumPerTrigger() == 50);
x.PulsedSource(true);
REQUIRE(x.GetImageNumPerTrigger() == 1);
REQUIRE(x.GetFrameNumPerTrigger() == 1);
x.Summation(10);
REQUIRE(x.GetImageNumPerTrigger() == 1);
REQUIRE(x.GetFrameNumPerTrigger() == 10);
x.Mode(DetectorMode::PedestalG0);
REQUIRE(x.GetImageNumPerTrigger() == 0);
REQUIRE(x.GetFrameNumPerTrigger() == 1);
REQUIRE(x.GetNumTriggers() == 1000);
x.Mode(DetectorMode::PedestalG1);
REQUIRE(x.GetImageNumPerTrigger() == 0);
REQUIRE(x.GetFrameNumPerTrigger() == 1);
REQUIRE(x.GetNumTriggers() == 200);
x.Mode(DetectorMode::PedestalG2);
REQUIRE(x.GetImageNumPerTrigger() == 0);
REQUIRE(x.GetFrameNumPerTrigger() == 1);
REQUIRE(x.GetNumTriggers() == 100);
}
TEST_CASE("DiffractionExperiment_DefaultDataProcessingSettings","[DiffractionExperiment]") {
REQUIRE_NOTHROW(DiffractionExperiment::CheckDataProcessingSettings(
DiffractionExperiment::DefaultDataProcessingSettings()));
@@ -624,7 +668,7 @@ TEST_CASE("DiffractionExperiment_FPGA_Summation_output","[DiffractionExperiment]
TEST_CASE("DiffractionExperiment_DetectorModuleHostname","[DiffractionExperiment]") {
std::vector<std::string> h = {"mx1", "mx2", "mx3"};
DiffractionExperiment x(DetectorSetup(3, "X", h));
DiffractionExperiment x(DetectorSetup(3, DetectorType::JUNGFRAU, "X", h));
std::vector<AcquisitionDeviceNetConfig> net_cfg;
@@ -690,17 +734,17 @@ TEST_CASE("DiffractionExperiment_OmegaStep","[DiffractionExperiment]") {
x.OmegaStep(std::optional<float>());
x.FillMessage(msg);
REQUIRE(!x.GetOmegaStep());
REQUIRE(msg.goniometer.empty());
REQUIRE(msg.omega.increment == 0.0f);
x.OmegaStep(0.0);
REQUIRE(!x.GetOmegaStep());
x.FillMessage(msg);
REQUIRE(msg.goniometer.empty());
REQUIRE(msg.omega.increment == 0.0f);
x.OmegaStep(1.0);
x.FillMessage(msg);
REQUIRE(x.GetOmegaStep());
REQUIRE(!msg.goniometer.empty());
REQUIRE(msg.omega.increment == 1.0f);
}
TEST_CASE("DiffractionExperiment_ConversionOnFPGA","[DiffractionExperiment]") {
@@ -726,3 +770,31 @@ TEST_CASE("DiffractionExperiment_ConversionOnFPGA","[DiffractionExperiment]") {
x.Mode(DetectorMode::Conversion).ConversionOnFPGA(true);
REQUIRE(x.IsConversionOnFPGA()); // conversion on FPGA back on
}
TEST_CASE("DiffractionExperiment_EIGER","[DiffractionExperiment]") {
DiffractionExperiment x(DetectorSetup(DetectorGeometry(4), DetectorType::EIGER));
x.Mode(DetectorMode::Conversion).FPGAOutputMode(FPGAPixelOutput::Auto);
REQUIRE(!x.IsConversionOnFPGA());
REQUIRE(!x.IsPixelSigned());
REQUIRE(x.GetPhotonEnergyMultiplier() == 1.0f);
REQUIRE_NOTHROW(x.PhotonEnergyMultiplayer(1.0f));
REQUIRE_THROWS(x.PhotonEnergyMultiplayer(2.0f));
}
TEST_CASE("DiffractionExperiment_PhotonEnergyMultiplayer","[DiffractionExperiment]") {
DiffractionExperiment x(DetectorSetup(DetectorGeometry(4)));
x.Mode(DetectorMode::Conversion).PhotonEnergy_keV(16.0);
REQUIRE(x.GetPhotonEnergyMultiplier() == 1.0f);
REQUIRE(x.GetPhotonEnergy_keV() == 16.0f);
REQUIRE(x.GetPhotonEnergyForConversion_keV() == 16.0f);
x.PhotonEnergyMultiplayer(0.25f);
REQUIRE(x.GetPhotonEnergyMultiplier() == 0.25f);
REQUIRE(x.GetPhotonEnergy_keV() == 16.0f);
REQUIRE(x.GetPhotonEnergyForConversion_keV() == 4.0f);
x.Mode(DetectorMode::Raw);
REQUIRE(x.GetPhotonEnergyMultiplier() == 1.0f);
REQUIRE(x.GetPhotonEnergy_keV() == 16.0f);
REQUIRE(x.GetPhotonEnergyForConversion_keV() == 16.0f);
}