v1.0.0-rc.97
Some checks failed
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m11s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 9m9s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m18s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m14s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 10m3s
Build Packages / Generate python client (push) Successful in 15s
Build Packages / Build documentation (push) Successful in 50s
Build Packages / Create release (push) Has been skipped
Build Packages / build:rpm (rocky8) (push) Successful in 8m31s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 8m21s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 7m42s
Build Packages / build:rpm (rocky9) (push) Successful in 9m11s
Build Packages / Unit tests (push) Failing after 1h13m19s

This is an UNSTABLE release and not recommended for production use (please use rc.96 instead).

* jfjoch_broker: For DECTRIS detectors add dark data collection during initialization for bad pixel mask
* jfjoch_broker: Refactor of calibration logic for more clear code (likely to introduce problems)
* jfjoch_viewer: Add option to handle user pixel mask (experimental)
* jfjoch_viewer: More options for ROI
* jfjoch_viewer: Add window to display calibration

Reviewed-on: #2
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
Co-committed-by: Filip Leonarski <filip.leonarski@psi.ch>
This commit was merged in pull request #2.
This commit is contained in:
2025-11-09 12:42:27 +01:00
committed by leonarski_f
parent 8b356a7001
commit 4dbbf0e365
243 changed files with 4532 additions and 1832 deletions

View File

@@ -172,7 +172,7 @@ TEST_CASE("DiffractionExperiment_DataStreams","[DiffractionExperiment]") {
TEST_CASE("DiffractionExperiment_DetectorGeometry","[DiffractionExperiment]") {
DiffractionExperiment x(DetJF(18)); // 9M configuration #1 - via constructor
x.Mode(DetectorMode::Conversion);
x.Conversion();
x.DataStreams(4);
REQUIRE(x.GetDataStreamsNum() == 4);
@@ -191,13 +191,13 @@ TEST_CASE("DiffractionExperiment_DetectorGeometry","[DiffractionExperiment]") {
REQUIRE(x.GetPixelsNum() == 18 * 514 * 1030);
x.Mode(DetectorMode::Raw);
x.Raw();
REQUIRE(x.GetPixelsNum() == 18 * 512 * 1024);
REQUIRE(x.GetXPixelsNum() == 1024);
REQUIRE(x.GetYPixelsNum() == 512 * 18);
x.Mode(DetectorMode::Conversion);
x.Conversion();
x = DiffractionExperiment(DetJF(18, 2)); // 9M configuration #2
@@ -219,7 +219,7 @@ TEST_CASE("DiffractionExperiment_DetectorGeometry","[DiffractionExperiment]") {
REQUIRE_THROWS(x.GetPixel0OfModuleConv(18));
x.Mode(DetectorMode::Raw);
x.Raw();
REQUIRE(x.GetPixelsNum() == 1024 * 512 * 18);
REQUIRE(x.GetXPixelsNum() == 1024);
@@ -232,7 +232,7 @@ TEST_CASE("DiffractionExperiment_DetectorGeometry_gaps","[DiffractionExperiment]
const size_t gap_y = 36;
DiffractionExperiment x(DetJF(18, 2, gap_x, gap_y, false));
x.Mode(DetectorMode::Conversion);
x.Conversion();
x.DataStreams(4);
REQUIRE(x.GetDataStreamsNum() == 4);
@@ -266,7 +266,7 @@ TEST_CASE("DiffractionExperiment_DetectorGeometry_gaps_mirror_y","[DiffractionEx
const size_t gap_y = 36;
DiffractionExperiment x(DetJF(20, 2, gap_x, gap_y, true));
x.Mode(DetectorMode::Conversion);
x.Conversion();
REQUIRE(x.GetPixel0OfModuleConv(0) == (2*1030+gap_x) * 513 + (2*1030 + gap_x) * 9 * (514 + gap_y));
REQUIRE(x.GetPixel0OfModuleConv(1) == (2*1030+gap_x) * 513 + (2*1030 + gap_x) * 9 * (514 + gap_y) + 1030 + gap_x);
@@ -425,17 +425,15 @@ TEST_CASE("DiffractionExperiment_InternalPacketGenerator", "[DiffractionExperime
}
TEST_CASE("DiffractionExperiment_CopyConstructor", "[DiffractionExperiment]") {
DiffractionExperiment a = DiffractionExperiment().Mode(DetectorMode::Raw);
DiffractionExperiment a = DiffractionExperiment();
a.BeamX_pxl(150);
REQUIRE(a.GetBeamX_pxl() == 150.0);
REQUIRE(a.GetDetectorMode() == DetectorMode::Raw);
DiffractionExperiment b(a);
REQUIRE(b.GetBeamX_pxl() == 150.0);
b.BeamX_pxl(100);
REQUIRE(a.GetBeamX_pxl() == 150.0);
REQUIRE(b.GetBeamX_pxl() == 100.0);
REQUIRE(b.GetDetectorMode() == DetectorMode::Raw);
DiffractionExperiment c = b;
REQUIRE (c.GetBeamX_pxl() == 100.0);
@@ -646,7 +644,7 @@ TEST_CASE("DiffractionExperiment_PulsedSource","[DiffractionExperiment]") {
DiffractionExperiment x;
REQUIRE(!x.IsPulsedSource()); // default must be off
x.ImagesPerTrigger(50).NumTriggers(100).Mode(DetectorMode::Conversion).PedestalG0Frames(1000)
x.ImagesPerTrigger(50).NumTriggers(100).Mode(DetectorMode::Standard).PedestalG0Frames(1000)
.PedestalG1Frames(200).PedestalG2Frames(100);
x.PulsedSource(true);
@@ -659,7 +657,7 @@ TEST_CASE("DiffractionExperiment_PulsedSource","[DiffractionExperiment]") {
REQUIRE(x.GetFrameNum() == 100 * 10);
REQUIRE(x.GetImageNum() == 100);
x.Mode(DetectorMode::Raw);
x.Raw();
REQUIRE(x.GetSummation() == 1);
REQUIRE(x.GetFrameNumPerTrigger() == 1);
REQUIRE(x.GetNumTriggers() == 100);
@@ -690,32 +688,32 @@ TEST_CASE("DiffractionExperiment_DefaultDataProcessingSettings","[DiffractionExp
TEST_CASE("DiffractionExperiment_FPGA_PixelSigned_JUNGFRAU","[DiffractionExperiment]") {
DiffractionExperiment x(DetJF(4));
x.Mode(DetectorMode::Conversion).PixelSigned({});
x.Conversion().PixelSigned({});
REQUIRE(x.IsPixelSigned());
x.Mode(DetectorMode::Raw).PixelSigned({});
x.Raw().PixelSigned({});
REQUIRE(!x.IsPixelSigned());
x.Mode(DetectorMode::Conversion).PixelSigned(false);
x.Conversion().PixelSigned(false);
REQUIRE(!x.IsPixelSigned());
x.Mode(DetectorMode::Raw).PixelSigned(true);
x.Raw().PixelSigned(true);
REQUIRE(x.IsPixelSigned());
}
TEST_CASE("DiffractionExperiment_FPGA_PixelSigned_EIGER","[DiffractionExperiment]") {
DiffractionExperiment x(DetEIGER(4));
x.Mode(DetectorMode::Conversion).PixelSigned({});
x.Conversion().PixelSigned({});
REQUIRE(!x.IsPixelSigned());
x.Mode(DetectorMode::Raw).PixelSigned({});
x.Raw().PixelSigned({});
REQUIRE(!x.IsPixelSigned());
x.Mode(DetectorMode::Conversion).PixelSigned(false);
x.Conversion().PixelSigned(false);
REQUIRE(!x.IsPixelSigned());
x.Mode(DetectorMode::Raw).PixelSigned(true);
x.Raw().PixelSigned(true);
REQUIRE(x.IsPixelSigned());
}
@@ -876,12 +874,47 @@ TEST_CASE("DiffractionExperiment_Appendix","") {
REQUIRE(message.user_data == "HeaderAppendix");
}
TEST_CASE("DiffractionExperiment_DarkMask","[DiffractionExperiment]") {
DiffractionExperiment x(DetJF4M());
REQUIRE_THROWS(x.Mode(DetectorMode::DarkMask));
REQUIRE(x.GetDetectorMode() == DetectorMode::Standard);
x.Detector(DetEIGER(1));
REQUIRE_THROWS(x.Mode(DetectorMode::DarkMask));
REQUIRE(x.GetDetectorMode() == DetectorMode::Standard);
x.Detector(DetDECTRIS(1024,1024, "Det1", ""));
x.FrameTime(std::chrono::milliseconds(100)).ImagesPerTrigger(100).NumTriggers(3);
x.IncidentEnergy_keV(10.0);
DarkMaskSettings dark_mask_settings;
dark_mask_settings.FrameTime(std::chrono::milliseconds(20)).NumberOfFrames(456).Threshold_keV(3.4);
x.ImportDarkMaskSettings(dark_mask_settings);
CHECK(x.GetNumTriggers() == 3);
CHECK(x.GetImageNum() == 3 * 100);
CHECK(x.GetEigerThreshold_keV() == Catch::Approx(5.0));
CHECK(x.GetDarkMaskNumberOfFrames() == 456);
REQUIRE_NOTHROW(x.Mode(DetectorMode::DarkMask));
REQUIRE(x.GetDetectorMode() == DetectorMode::DarkMask);
CHECK(x.GetNumTriggers() == 1);
CHECK(x.GetFrameNumPerTrigger() == 456);
CHECK(x.GetFrameNum() == 456);
CHECK(x.GetEigerThreshold_keV() == Catch::Approx(3.4));
CHECK(x.GetFrameTime() == std::chrono::milliseconds(20));
CHECK(x.GetImageTime() == std::chrono::milliseconds(20));
CHECK(x.GetImageNum() == 0);
}
TEST_CASE("DiffractionExperiment_ConversionOnFPGA","[DiffractionExperiment]") {
DiffractionExperiment x;
x.Mode(DetectorMode::Conversion);
x.Conversion();
REQUIRE(x.IsJungfrauConvPhotonCnt()); // conversion on FPGA must be default true!
x.Mode(DetectorMode::Raw);
x.Raw();
REQUIRE(!x.IsJungfrauConvPhotonCnt()); // conversion on FPGA off for raw mode
x.Mode(DetectorMode::PedestalG0);
@@ -893,16 +926,17 @@ TEST_CASE("DiffractionExperiment_ConversionOnFPGA","[DiffractionExperiment]") {
x.Mode(DetectorMode::PedestalG2);
REQUIRE(!x.IsJungfrauConvPhotonCnt()); // conversion on FPGA off for pedestal modes
x.Mode(DetectorMode::Conversion).JungfrauConvPhotonCnt(false);
x.Mode(DetectorMode::Standard);
x.JungfrauConvPhotonCnt(false);
REQUIRE(!x.IsJungfrauConvPhotonCnt()); // conversion on FPGA turned explicitly off
x.Mode(DetectorMode::Conversion).JungfrauConvPhotonCnt(true);
x.JungfrauConvPhotonCnt(true);
REQUIRE(x.IsJungfrauConvPhotonCnt()); // conversion on FPGA back on
}
TEST_CASE("DiffractionExperiment_EIGER","[DiffractionExperiment]") {
DiffractionExperiment x(DetEIGER(4));
x.Mode(DetectorMode::Conversion);
x.Conversion();
REQUIRE(!x.IsJungfrauConvPhotonCnt());
REQUIRE(!x.IsPixelSigned());
x.ImagesPerTrigger(245).NumTriggers(100);
@@ -911,7 +945,7 @@ TEST_CASE("DiffractionExperiment_EIGER","[DiffractionExperiment]") {
TEST_CASE("DiffractionExperiment_JungfrauConversionFactor","[DiffractionExperiment]") {
DiffractionExperiment x(DetJF(4));
x.Mode(DetectorMode::Conversion).IncidentEnergy_keV(16.0);
x.Conversion().IncidentEnergy_keV(16.0);
REQUIRE(!x.GetJungfrauConversionFactor_keV().has_value());
REQUIRE(x.GetIncidentEnergy_keV() == 16.0f);
REQUIRE(x.GetPhotonEnergyForConversion_keV() == 16.0f);
@@ -979,11 +1013,11 @@ TEST_CASE("DiffractionExperiment_AutoSummation", "[DiffractionExperiment]") {
DiffractionExperiment x(DetJF4M());
x.Summation(4).AutoSummation(true);
x.Mode(DetectorMode::Conversion).StorageCells(1);
x.Conversion().StorageCells(1);
x.AutoSummation(true);
REQUIRE(x.GetSummation() == 4);
x.Mode(DetectorMode::Raw).StorageCells(1);
x.Raw().StorageCells(1);
x.AutoSummation(true);
REQUIRE(x.GetSummation() == 4);
@@ -991,22 +1025,22 @@ TEST_CASE("DiffractionExperiment_AutoSummation", "[DiffractionExperiment]") {
x.AutoSummation(true);
REQUIRE(x.GetSummation() == 1);
x.Mode(DetectorMode::Conversion).StorageCells(2);
x.Conversion().StorageCells(2);
x.AutoSummation(true);
REQUIRE(x.GetSummation() == 1);
x.Mode(DetectorMode::Conversion).StorageCells(1);
x.Conversion().StorageCells(1);
x.AutoSummation(false);
REQUIRE(x.GetSummation() == 1);
x.Mode(DetectorMode::Raw).StorageCells(1);
x.Raw().StorageCells(1);
x.AutoSummation(false);
REQUIRE(x.GetSummation() == 1);
}
TEST_CASE("DiffractionExperiment_ExportROIMask", "[DiffractionExperiment]") {
DiffractionExperiment x(DetJF4M());
x.Mode(DetectorMode::Raw);
x.Raw();
x.ROI().SetROI(ROIDefinition{.boxes = {
ROIBox("roi0", 800 , 800, 0, 4),