diff --git a/receiver/JFJochReceiver.cpp b/receiver/JFJochReceiver.cpp index d43dc648..88015b11 100644 --- a/receiver/JFJochReceiver.cpp +++ b/receiver/JFJochReceiver.cpp @@ -8,7 +8,6 @@ #include "../jungfrau/JFPedestalCalc.h" #include "../image_analysis/IndexerWrapper.h" #include "../common/DiffractionGeometry.h" -#include "../common/ADUHistogram.h" inline std::string time_UTC(const std::chrono::time_point &input) { auto time_ms = std::chrono::duration_cast(input.time_since_epoch()).count(); @@ -20,14 +19,16 @@ inline std::string time_UTC(const std::chrono::time_point &in_aq_device, ImagePusher &in_image_sender, Logger &in_logger, int64_t in_forward_and_sum_nthreads, int64_t in_send_buffer_count, ZMQPreviewPublisher* in_preview_publisher, const NUMAHWPolicy &in_numa_policy) : - experiment(settings.jungfraujoch_settings()), + experiment(in_experiment), + calibration(in_calibration), acquisition_device(in_aq_device), logger(in_logger), image_pusher(in_image_sender), @@ -44,9 +45,8 @@ JFJochReceiver::JFJochReceiver(const JFJochProtoBuf::ReceiverInput &settings, send_buffer = (uint8_t *) malloc(send_buffer_size * send_buffer_count); try { - if (settings.has_calibration()) { - calib.emplace(settings.calibration()); - one_byte_mask = calib->CalculateOneByteMask(experiment); + if (calibration != nullptr) { + one_byte_mask = calibration->CalculateOneByteMask(experiment); } else { one_byte_mask.resize(experiment.GetPixelsNum()); for (auto &i: one_byte_mask) i = 1; @@ -141,11 +141,11 @@ JFJochReceiver::JFJochReceiver(const JFJochProtoBuf::ReceiverInput &settings, std::vector pixel_mask; std::vector > pedestal; - if (calib) { + if (calibration != nullptr) { size_t xpixel = experiment.GetXPixelsNum(); size_t ypixel = experiment.GetYPixelsNum(); - pixel_mask = compressor.Compress(calib->CalculateNexusMask(experiment, 0)); + pixel_mask = compressor.Compress(calibration->CalculateNexusMask(experiment, 0)); message.AddPixelMask(CBORImage{ .data = pixel_mask.data(), .size = pixel_mask.size(), @@ -160,7 +160,7 @@ JFJochReceiver::JFJochReceiver(const JFJochProtoBuf::ReceiverInput &settings, if (experiment.GetSaveCalibration()) { for (int sc = 0; sc < experiment.GetStorageCellNumber(); sc++) { for (int gain = 0; gain < 3; gain++) { - auto tmp = compressor.Compress(calib->GetPedestal(gain, sc)); + auto tmp = compressor.Compress(calibration->GetPedestal(gain, sc)); pedestal.emplace_back(tmp); std::string channel = "pedestal_G" + std::to_string(gain); @@ -241,8 +241,8 @@ void JFJochReceiver::AcquireThread(uint16_t data_stream) { } try { - if (calib) - acquisition_device[data_stream]->InitializeCalibration(experiment, calib.value()); + if (calibration != nullptr) + acquisition_device[data_stream]->InitializeCalibration(experiment, *calibration); if (rad_int_mapping) acquisition_device[data_stream]->InitializeIntegrationMap(experiment, @@ -339,6 +339,7 @@ void JFJochReceiver::FrameTransformationThread() { std::vector writer_buffer(experiment.GetMaxCompressedSize()); std::unique_ptr indexer; + if (experiment.HasUnitCell()) { indexer = std::make_unique(); indexer->Setup(experiment.GetUnitCell()); diff --git a/receiver/JFJochReceiver.h b/receiver/JFJochReceiver.h index dd475498..383ee5dd 100644 --- a/receiver/JFJochReceiver.h +++ b/receiver/JFJochReceiver.h @@ -31,9 +31,9 @@ #include "../common/ADUHistogram.h" class JFJochReceiver { - DiffractionExperiment experiment; + const DiffractionExperiment &experiment; + const JFCalibration *calibration; std::vector pedestal_result; - std::optional calib; std::vector one_byte_mask; Logger &logger; @@ -112,7 +112,8 @@ class JFJochReceiver { void UpdateMaxImage(int64_t image_number); void UpdateMaxDelay(int64_t delay); public: - JFJochReceiver(const JFJochProtoBuf::ReceiverInput &settings, + JFJochReceiver(const DiffractionExperiment& experiment, + const JFCalibration *calibration, std::vector &open_capi_device, ImagePusher &image_pusher, Logger &logger, int64_t forward_and_sum_nthreads, diff --git a/receiver/JFJochReceiverService.cpp b/receiver/JFJochReceiverService.cpp index ee075174..d0aed9a0 100644 --- a/receiver/JFJochReceiverService.cpp +++ b/receiver/JFJochReceiverService.cpp @@ -19,7 +19,11 @@ grpc::Status JFJochReceiverService::Start(grpc::ServerContext *context, const JF // ensure that everything was rolled back // But it is important to do it in correct order - first abort old receiver, close it, than start new one receiver.reset(); - receiver = std::make_unique(*request, aq_devices, image_pusher, + experiment = std::make_unique(request->jungfraujoch_settings()); + calibration = std::make_unique(request->calibration()); + + receiver = std::make_unique(*experiment, calibration.get(), + aq_devices, image_pusher, logger, nthreads, send_buffer_count, preview_publisher, numa_policy); try { diff --git a/receiver/JFJochReceiverService.h b/receiver/JFJochReceiverService.h index 08c5de09..10a387d1 100644 --- a/receiver/JFJochReceiverService.h +++ b/receiver/JFJochReceiverService.h @@ -14,7 +14,8 @@ class JFJochReceiverService final : public JFJochProtoBuf::gRPC_JFJochReceiver:: NUMAHWPolicy numa_policy; std::unique_ptr receiver; std::vector &aq_devices; - + std::unique_ptr calibration; + std::unique_ptr experiment; Logger &logger; ImagePusher &image_pusher;