From 39cb3907bdae1c41bddf1640a2eca725745d2a32 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Wed, 5 Nov 2025 07:41:59 +0100 Subject: [PATCH] JFJochReceiverLite: Dark mask analysis integrated and tested --- receiver/JFJochReceiverLite.cpp | 7 ++- tests/JFJochReceiverLiteTest.cpp | 85 +++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/receiver/JFJochReceiverLite.cpp b/receiver/JFJochReceiverLite.cpp index 5bc3947b..dc0f3359 100644 --- a/receiver/JFJochReceiverLite.cpp +++ b/receiver/JFJochReceiverLite.cpp @@ -195,6 +195,9 @@ void JFJochReceiverLite::MaskThread(uint32_t id) { } else if (msg->cbor->data_message) { ++images_collected; DataMessage data_msg = msg->cbor->data_message.value(); + + dark_mask_analysis.AnalyzeImage(data_msg, buffer); + compressed_size += data_msg.image.GetCompressedSize(); uncompressed_size += data_msg.image.GetUncompressedSize(); UpdateMaxImageReceived(data_msg.number); @@ -352,9 +355,9 @@ void JFJochReceiverLite::StopReceiver() { } float JFJochReceiverLite::GetEfficiency() const { - if (experiment.GetImageNum() == 0) + if (experiment.GetFrameNum() == 0) return 0; - return static_cast(images_collected) / static_cast(experiment.GetImageNum()); + return static_cast(images_collected) / static_cast(experiment.GetFrameNum()); } float JFJochReceiverLite::GetProgress() const { diff --git a/tests/JFJochReceiverLiteTest.cpp b/tests/JFJochReceiverLiteTest.cpp index 8dfd2ba4..c306efcc 100644 --- a/tests/JFJochReceiverLiteTest.cpp +++ b/tests/JFJochReceiverLiteTest.cpp @@ -12,7 +12,7 @@ #include "../image_puller/TestImagePuller.h" TEST_CASE("JFJochReceiverLite", "[JFJochReceiver]") { - Logger logger("JFJochIntegrationTest_ZMQ_lysozyme_spot_and_index"); + Logger logger("FJochReceiverLite"); RegisterHDF5Filter(); @@ -135,4 +135,87 @@ TEST_CASE("JFJochReceiverLite_Cancel", "[JFJochReceiver]") { CHECK(receiver_out.efficiency == 0.0); CHECK(receiver_out.status.cancelled); +} + +TEST_CASE("JFJochReceiverLite_DarkMask", "[JFJochReceiver]") { + Logger logger("JFJochReceiverLite_DarkMask"); + + RegisterHDF5Filter(); + + const uint16_t nthreads = 4; + + DiffractionExperiment experiment(DetDECTRIS(2068, 2164, "Test", {})); + + auto det_settings = experiment.GetDetectorSettings(); + det_settings.Import(DarkMaskSettings{}.NumberOfFrames(10).MaxCounts(1).MaxFramesWithCounts(5)).FrameTime(std::chrono::milliseconds(5)); + experiment.Mode(DetectorMode::DarkMask).ImportDetectorSettings(det_settings); + + PixelMask pixel_mask(experiment); + + HDF5FilePusher pusher; + + auto puller = std::make_shared(); + + StartMessage start_msg; + experiment.FillMessage(start_msg); + + puller->Put(ImagePullerOutput{ + .cbor = std::make_shared(start_msg) + }); + + + std::vector image(experiment.GetPixelsNum(), 0); + image[1] = 1; + image[2] = 2; + image[3] = 3; + + std::vector image_last(experiment.GetPixelsNum(), 0); + image_last[1] = 0; + image_last[2] = 0; + image_last[3] = 0; + image_last[68] = 10000; + + for (int i = 0; i < experiment.GetFrameNum(); i++) { + DataMessage data_msg; + if (i == experiment.GetFrameNum() - 1) + data_msg.image = CompressedImage(image_last, experiment.GetXPixelsNum(), experiment.GetYPixelsNum()); + else + data_msg.image = CompressedImage(image, experiment.GetXPixelsNum(), experiment.GetYPixelsNum()); + data_msg.number = i; + puller->Put(ImagePullerOutput{ + .cbor = std::make_shared(data_msg) + }); + } + + EndMessage end_msg{}; + + puller->Put(ImagePullerOutput{ + .cbor = std::make_shared(end_msg) + }); + + AcquisitionDeviceGroup group; + JFJochReceiverService service(group, logger, pusher); + + service.NumThreads(nthreads); + + // No progress value at the start of measurement + REQUIRE(!service.GetProgress().has_value()); + + service.Start(experiment, pixel_mask, nullptr, puller); + auto receiver_out = service.Stop(); + + CHECK(receiver_out.efficiency == 1.0); + CHECK(receiver_out.status.images_sent == 0); + CHECK(receiver_out.dark_mask_result.size() == experiment.GetPixelsNum()); + CHECK(receiver_out.dark_mask_result[0] == 0); + CHECK(receiver_out.dark_mask_result[1] == 0); + CHECK(receiver_out.dark_mask_result[2] != 0); + CHECK(receiver_out.dark_mask_result[3] != 0); + CHECK(receiver_out.dark_mask_result[4] == 0); + CHECK(receiver_out.dark_mask_result[68] == 0); + + CHECK(!receiver_out.status.cancelled); + + // No progress value at the end of the measurement + REQUIRE(!service.GetProgress().has_value()); } \ No newline at end of file