// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include #include "../writer/HDF5Objects.h" #include "../receiver/JFJochReceiverService.h" #include "../writer/StreamWriter.h" #include "../image_pusher/HDF5FilePusher.h" #include "../image_puller/TestImagePuller.h" TEST_CASE("JFJochReceiverLite", "[JFJochReceiver]") { Logger logger("JFJochIntegrationTest_ZMQ_lysozyme_spot_and_index"); RegisterHDF5Filter(); const uint16_t nthreads = 4; DiffractionExperiment experiment(DetDECTRIS(2068, 2164, "Test", {})); experiment.ImagesPerTrigger(5).NumTriggers(1).UseInternalPacketGenerator(true).ImagesPerFile(2) .FilePrefix("lyso_test_lite").JungfrauConvPhotonCnt(false).SetFileWriterFormat( FileWriterFormat::NXmxVDS).OverwriteExistingFiles(true) .DetectorDistance_mm(75).BeamY_pxl(1136).BeamX_pxl(1090).IncidentEnergy_keV(12.4) .SetUnitCell(UnitCell{.a = 36.9, .b = 78.95, .c = 78.95, .alpha =90, .beta = 90, .gamma = 90}); PixelMask pixel_mask(experiment); // Load example image HDF5ReadOnlyFile data("../../tests/test_data/compression_benchmark.h5"); HDF5DataSet dataset(data, "/entry/data/data"); HDF5DataSpace file_space(dataset); REQUIRE(file_space.GetDimensions()[2] == experiment.GetXPixelsNum()); REQUIRE(file_space.GetDimensions()[1] == experiment.GetYPixelsNum()); std::vector image_conv (file_space.GetDimensions()[1] * file_space.GetDimensions()[2]); std::vector start = {4,0,0}; std::vector file_size = {1, file_space.GetDimensions()[1], file_space.GetDimensions()[2]}; dataset.ReadVector(image_conv, start, file_size); HDF5FilePusher pusher; auto puller = std::make_shared(); StartMessage start_msg; experiment.FillMessage(start_msg); puller->Put(ImagePullerOutput{ .cbor = std::make_shared(start_msg) }); DataMessage data_msg; data_msg.image = CompressedImage(image_conv, file_space.GetDimensions()[2], file_space.GetDimensions()[1]); for (int i = 0; i < 5; i++) { 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()); SpotFindingSettings settings = DiffractionExperiment::DefaultDataProcessingSettings(); settings.signal_to_noise_threshold = 2.5; settings.photon_count_threshold = 5; settings.min_pix_per_spot = 1; settings.max_pix_per_spot = 200; settings.high_resolution_limit = 2.0; settings.low_resolution_limit = 50.0; service.SetSpotFindingSettings(settings); service.Indexing(experiment.GetIndexingSettings()); service.Start(experiment, pixel_mask, nullptr, puller); auto receiver_out = service.Stop(); CHECK(receiver_out.efficiency == 1.0); REQUIRE(receiver_out.status.indexing_rate); CHECK(receiver_out.status.indexing_rate.value() == 1.0); CHECK(receiver_out.status.images_sent == experiment.GetImageNum()); CHECK(!receiver_out.status.cancelled); // No progress value at the end of the measurement REQUIRE(!service.GetProgress().has_value()); } TEST_CASE("JFJochReceiverLite_Cancel", "[JFJochReceiver]") { Logger logger("JFJochIntegrationTest_ZMQ_lysozyme_spot_and_index"); RegisterHDF5Filter(); const uint16_t nthreads = 4; DiffractionExperiment experiment(DetDECTRIS(2068, 2164, "Test", {})); experiment.ImagesPerTrigger(5).NumTriggers(1).UseInternalPacketGenerator(true).ImagesPerFile(2) .FilePrefix("lyso_test_lite").JungfrauConvPhotonCnt(false).SetFileWriterFormat( FileWriterFormat::NXmxVDS).OverwriteExistingFiles(true) .DetectorDistance_mm(75).BeamY_pxl(1136).BeamX_pxl(1090).IncidentEnergy_keV(12.4) .SetUnitCell(UnitCell{.a = 36.9, .b = 78.95, .c = 78.95, .alpha =90, .beta = 90, .gamma = 90}); PixelMask pixel_mask(experiment); HDF5FilePusher pusher; auto puller = std::make_shared(); AcquisitionDeviceGroup group; JFJochReceiverService service(group, logger, pusher); service.Indexing(experiment.GetIndexingSettings()); service.NumThreads(nthreads); // No progress value at the start of measurement REQUIRE(!service.GetProgress().has_value()); service.Start(experiment, pixel_mask, nullptr, puller); std::this_thread::sleep_for(std::chrono::seconds(10)); service.Cancel(false); auto receiver_out = service.Stop(); CHECK(receiver_out.efficiency == 0.0); CHECK(receiver_out.status.cancelled); }