From 2aa8b5cf915f15a4b5daa5a86bf2a25b6dfd15ea Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Wed, 10 May 2023 13:55:21 +0200 Subject: [PATCH] DiffractionExperiment: Fix loading 2x2 binning/solid angle/apply pixel mask --- common/DiffractionExperiment.cpp | 4 +- tests/DiffractionExperimentTest.cpp | 12 ++- tests/JFJochFullIntegrationTest.cpp | 120 ++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 2 deletions(-) diff --git a/common/DiffractionExperiment.cpp b/common/DiffractionExperiment.cpp index 0dce2829..0e6b26aa 100644 --- a/common/DiffractionExperiment.cpp +++ b/common/DiffractionExperiment.cpp @@ -936,7 +936,9 @@ void DiffractionExperiment::LoadDatasetSettings(const JFJochProtoBuf::DatasetSet if (settings.has_scattering_vector()) ScatteringVector({0,0,1}); Compression(settings.compression()); - + ApplyPixelMaskInFPGA(settings.apply_pixel_mask()); + Binning2x2(settings.binning2x2()); + RadIntSolidAngleCorr(settings.rad_int_solid_angle_corr()); } catch (...) { dataset = tmp; throw; diff --git a/tests/DiffractionExperimentTest.cpp b/tests/DiffractionExperimentTest.cpp index 63530adf..4c9cb2d8 100644 --- a/tests/DiffractionExperimentTest.cpp +++ b/tests/DiffractionExperimentTest.cpp @@ -746,14 +746,24 @@ TEST_CASE("DiffractionExperiment_LoadDatasetSettings", "[DiffractionExperiment]" settings.set_data_file_count(5); settings.set_space_group_number(45); settings.set_sample_name("lyso1"); + settings.set_apply_pixel_mask(true); + settings.set_binning2x2(true); + settings.set_rad_int_solid_angle_corr(true); REQUIRE_NOTHROW(x.LoadDatasetSettings(settings)); REQUIRE(x.GetScatteringVector().x == 0); REQUIRE(x.GetImageNumPerTrigger() == 234); - REQUIRE(x.GetBeamY_pxl() == Approx(123.4)); + REQUIRE(x.GetBeamX_pxl() == Approx(23.4/2)); + REQUIRE(x.GetBeamY_pxl() == Approx(123.4/2)); REQUIRE(x.GetSpaceGroupNumber() == 45); REQUIRE(x.GetCompressionAlgorithm() == JFJochProtoBuf::BSHUF_LZ4); + REQUIRE(x.GetSampleName() == "lyso1"); + REQUIRE(x.GetDataFileCount() == 5); + REQUIRE(x.GetDetectorDistance_mm() == Approx(57.6)); + REQUIRE(x.GetApplyPixelMaskInFPGA()); + REQUIRE(x.GetBinning2x2()); + REQUIRE(x.GetSolidAngleCorrection()); } TEST_CASE("DiffractionExperiment_ImageTimeUs", "[DiffractionExperiment]") { diff --git a/tests/JFJochFullIntegrationTest.cpp b/tests/JFJochFullIntegrationTest.cpp index 1da308a1..a1ec25dc 100644 --- a/tests/JFJochFullIntegrationTest.cpp +++ b/tests/JFJochFullIntegrationTest.cpp @@ -919,6 +919,126 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_with_preview_no_writer", "[JFJochReceiver]" writer_server->Shutdown(); } +TEST_CASE("JFJochIntegrationTest_ZMQ_with_preview_no_writer_binning2x2", "[JFJochReceiver]") { + Logger logger("JFJochIntegrationTest_ZMQ_with_preview_no_writer"); + + RegisterHDF5Filter(); + + int64_t nimages = 5; + int64_t ndatastream = 2; + int64_t nmodules = 4; + + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + state_machine.AddDetectorSetup(DetectorGeometry(ndatastream * nmodules, 2, 8, 36)); + + state_machine.NotThreadSafe_Experiment().DataStreams(ndatastream); + state_machine.NotThreadSafe_Experiment().PedestalG0Frames(0).PedestalG1Frames(0).PedestalG2Frames(0).PreviewPeriod( + 5ms); + services.Writer("unix:writer_test", "inproc://#1").Receiver("unix:fpga_receiver_test"); + + logger.Verbose(true); + + std::vector image(RAW_MODULE_SIZE); + + std::vector> aq_devices; + + for (int i = 0; i < ndatastream; i++) { + auto *test = new MockAcquisitionDevice(i, 256); + for (int m = 0; m < state_machine.NotThreadSafe_Experiment().GetModulesNum(i); m++) { + for (int image_num = 1; image_num <= nimages; image_num++) + test->AddModule(image_num, m, image.data()); + } + test->Terminate(); + aq_devices.emplace_back(test); + } + ZMQContext zmq_context; + + std::vector tmp_devices; + for (const auto &i: aq_devices) + tmp_devices.emplace_back(i.get()); + + ZMQImagePusher pusher(zmq_context, {"inproc://#1"}); + JFJochReceiverService fpga_receiver(tmp_devices, logger, pusher); + JFJochWriterService writer(zmq_context, logger); + + ZMQPreviewPublisher preview(zmq_context, "inproc://#2"); + fpga_receiver.PreviewPublisher(&preview); + + ZMQSocket rcv_preview_socket(zmq_context, ZMQSocketType::Sub); + REQUIRE_NOTHROW(rcv_preview_socket.Connect("inproc://#2")); + rcv_preview_socket.SubscribeAll(); + + auto fpga_receiver_server = gRPCServer("unix:fpga_receiver_test", fpga_receiver); + auto writer_server = gRPCServer("unix:writer_test", writer); + + REQUIRE_NOTHROW(state_machine.Initialize()); + logger.Info("Initialized"); + + JFJochProtoBuf::DatasetSettings setup; + setup.set_ntrigger(1); + setup.set_detector_distance_mm(100); + setup.set_images_per_trigger(5); + setup.set_photon_energy_kev(12.4); + setup.set_beam_x_pxl(123.0); + setup.set_beam_y_pxl(878.0); + setup.set_summation(1); + setup.set_data_file_count(1); + setup.set_binning2x2(true); + + REQUIRE_NOTHROW(state_machine.Start(setup)); + logger.Info("Started measurement"); + + REQUIRE_NOTHROW(state_machine.Stop()); + logger.Info("Stopped measurement"); + + std::string s; + + // Pixel mask + REQUIRE(rcv_preview_socket.Receive(s, false) > 0); + JFJochProtoBuf::PreviewFrame frame; + REQUIRE_NOTHROW(frame = jsonToGrpc(s)); + + // Check header + REQUIRE(frame.image_number() == -1); + REQUIRE(frame.width() == state_machine.NotThreadSafe_Experiment().GetXPixelsNumFullImage() / 2); + REQUIRE(frame.height() == state_machine.NotThreadSafe_Experiment().GetYPixelsNumFullImage() / 2); + REQUIRE(frame.pixel_depth() == 4); + + // First frame + REQUIRE(rcv_preview_socket.Receive(s, false) > 0); + + REQUIRE_NOTHROW(frame = jsonToGrpc(s)); + + // Check header + REQUIRE(frame.image_number() == 0); + REQUIRE(frame.beam_x_pxl() == Approx(setup.beam_x_pxl()/2.0f)); + REQUIRE(frame.beam_y_pxl() == Approx(setup.beam_y_pxl()/2.0f)); + REQUIRE(frame.width() == state_machine.NotThreadSafe_Experiment().GetXPixelsNumFullImage() / 2); + REQUIRE(frame.height() == state_machine.NotThreadSafe_Experiment().GetYPixelsNumFullImage() / 2); + REQUIRE(frame.pixel_depth() == 2); + + // Check compressed image + size_t npixel = state_machine.NotThreadSafe_Experiment().GetPixelsNum(); + + std::vector rcv_image(frame.data().size()); + rcv_image = {frame.data().begin(), frame.data().end()}; + REQUIRE(rcv_image.size() == state_machine.NotThreadSafe_Experiment().GetPixelsNum() * sizeof(int16_t)); + + // Check no more frames waiting + REQUIRE(rcv_preview_socket.Receive(s, false) == -1); + + auto tmp = state_machine.GetMeasurementStatistics(); + REQUIRE(tmp.has_value()); + auto statistics = tmp.value(); + + REQUIRE(statistics.collection_efficiency() == 1.0); + REQUIRE(statistics.images_collected() == 5); + REQUIRE(statistics.images_written() == 0); + fpga_receiver_server->Shutdown(); + writer_server->Shutdown(); +} + TEST_CASE("JFJochIntegrationTest_ZMQ_background_estimation", "[JFJochReceiver]") { Logger logger("JFJochIntegrationTest_ZMQ_background_estimation");