DiffractionExperiment: Fix loading 2x2 binning/solid angle/apply pixel mask
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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]") {
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user