DiffractionExperiment: Fix loading 2x2 binning/solid angle/apply pixel mask

This commit is contained in:
2023-05-10 13:55:21 +02:00
parent 741fc5c1d8
commit 2aa8b5cf91
3 changed files with 134 additions and 2 deletions

View File

@@ -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;

View File

@@ -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]") {

View File

@@ -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<uint16_t> image(RAW_MODULE_SIZE);
std::vector<std::unique_ptr<AcquisitionDevice>> 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<AcquisitionDevice *> 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<JFJochProtoBuf::PreviewFrame>(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<JFJochProtoBuf::PreviewFrame>(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<char> 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");