JFJochReceiverLite: Dark mask analysis integrated and tested

This commit is contained in:
2025-11-05 07:41:59 +01:00
parent 2fb98a700a
commit 39cb3907bd
2 changed files with 89 additions and 3 deletions

View File

@@ -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<float>(images_collected) / static_cast<float>(experiment.GetImageNum());
return static_cast<float>(images_collected) / static_cast<float>(experiment.GetFrameNum());
}
float JFJochReceiverLite::GetProgress() const {

View File

@@ -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<TestImagePuller>();
StartMessage start_msg;
experiment.FillMessage(start_msg);
puller->Put(ImagePullerOutput{
.cbor = std::make_shared<CBORStream2DeserializerOutput>(start_msg)
});
std::vector<uint16_t> image(experiment.GetPixelsNum(), 0);
image[1] = 1;
image[2] = 2;
image[3] = 3;
std::vector<uint16_t> 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<CBORStream2DeserializerOutput>(data_msg)
});
}
EndMessage end_msg{};
puller->Put(ImagePullerOutput{
.cbor = std::make_shared<CBORStream2DeserializerOutput>(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());
}