Files
Jungfraujoch/receiver/JFJochReceiver.h

151 lines
5.1 KiB
C++

// Copyright (2019-2023) Paul Scherrer Institute
#ifndef JUNGFRAUJOCH_JFJOCHRECEIVER_H
#define JUNGFRAUJOCH_JFJOCHRECEIVER_H
#include <optional>
#include <condition_variable>
#include <atomic>
#include <future>
#include <latch>
#include <semaphore>
#include "AcquisitionDevice.h"
#include "../common/DiffractionExperiment.h"
#include "../common/JFJochException.h"
#include "../common/FrameTransformation.h"
#include "../common/ImagePusher.h"
#include "../common/Logger.h"
#include "../common/ThreadSafeFIFO.h"
#include "../common/ZMQPreviewPublisher.h"
#include "../common/NUMAHWPolicy.h"
#include "../common/StatusVector.h"
#include "../common/Histogram.h"
#include "../image_analysis/StrongPixelSet.h"
#include "../image_analysis/RadialIntegrationMapping.h"
#include "../image_analysis/RadialIntegrationProfile.h"
#include "../jungfrau/JFCalibration.h"
#include "../jungfrau/JFConversionFixedPoint.h"
#include "../common/ADUHistogram.h"
class JFJochReceiver {
DiffractionExperiment experiment;
std::vector<JFModulePedestal> pedestal_result;
std::optional<JFCalibration> calib;
std::vector<JFConversionFixedPoint> fixed_point_conversion;
std::vector<uint8_t> one_byte_mask;
Logger &logger;
std::vector<std::future<void>> frame_transformation_futures;
std::vector<std::future<void>> data_acquisition_futures;
ADUHistogram adu_histogram_total;
std::vector<ADUHistogram> adu_histogram_module;
std::unique_ptr<RadialIntegrationMapping> rad_int_mapping;
std::unique_ptr<RadialIntegrationProfile> rad_int_profile;
std::vector<std::unique_ptr<RadialIntegrationProfile>> rad_int_profile_per_file;
std::vector<float> rad_int_corr;
std::vector<float> rad_int_corr_raw;
std::vector<uint8_t> spot_finder_mask;
std::future<void> measurement;
ThreadSafeFIFO<uint64_t> images_to_go;
ZMQPreviewPublisher *preview_publisher = nullptr;
ImagePusher &image_pusher;
bool push_images_to_writer;
volatile bool cancelled{false};
std::vector<AcquisitionDevice *> &acquisition_device;
uint16_t ndatastreams{0};
int64_t max_delay = 0;
std::mutex max_delay_mutex;
std::atomic<size_t> compressed_size{0};
std::atomic<size_t> images_sent{0};
const int64_t frame_transformation_nthreads;
std::latch frame_transformation_ready;
std::latch data_acquisition_ready;
std::chrono::time_point<std::chrono::system_clock> start_time;
std::chrono::time_point<std::chrono::system_clock> end_time;
JFJochProtoBuf::DataProcessingSettings data_processing_settings;
std::mutex data_processing_settings_mutex;
StatusVector<float> bkg_estimate;
StatusVector<uint64_t> spot_count;
StatusVector<uint64_t> indexing_solution;
Histogram<uint64_t> indexing_solution_per_file;
// TODO: Histogram a,b,c,alpha,beta,gamma
int64_t preview_stride;
int64_t spotfinder_stride;
int64_t max_image_number_sent = 0;
std::mutex max_image_number_sent_mutex;
const size_t send_buffer_size = experiment.GetMaxCompressedSize() + 1024*1024;
// max compressed size + 1 MiB reserve for spots and rad. integration results
const size_t send_buffer_count;
ThreadSafeFIFO<uint32_t> send_buffer_avail;
uint8_t *send_buffer;
std::vector<ZeroCopyReturnValue> send_buffer_zero_copy_ret_val;
NUMAHWPolicy numa_policy;
void PrepareConversionOnCPU(std::vector<JFConversionFixedPoint> &conv);
void AcquireThread(uint16_t data_stream);
void FrameTransformationThread();
void MeasurePedestalThread(uint16_t data_stream, uint16_t module_number, uint16_t storage_cell);
void MiniSummationThread(int d, int m, size_t image_number, bool &send_image,
FrameTransformation &transformation, DataMessage &message,
RadialIntegrationProfile *profile);
void Cancel(const JFJochException &e);
void FinalizeMeasurement();
JFJochProtoBuf::DataProcessingSettings GetDataProcessingSettings();
void UpdateMaxImage(int64_t image_number);
void UpdateMaxDelay(int64_t delay);
public:
constexpr static const int64_t threaded_summation_threshold = 50;
JFJochReceiver(const JFJochProtoBuf::ReceiverInput &settings,
std::vector<AcquisitionDevice *> &open_capi_device,
ImagePusher &image_pusher,
Logger &logger, int64_t forward_and_sum_nthreads,
int64_t send_buffer_count,
ZMQPreviewPublisher* preview_publisher,
const NUMAHWPolicy &numa_policy);
~JFJochReceiver();
JFJochReceiver(const JFJochReceiver &other) = delete;
JFJochReceiver& operator=(const JFJochReceiver &other) = delete;
void StopReceiver();
void GetStatistics(JFJochProtoBuf::ReceiverOutput &out) const;
void Cancel();
float GetProgress() const;
float GetIndexingRate() const;
void SetDataProcessingSettings(const JFJochProtoBuf::DataProcessingSettings &data_processing_settings);
float GetAvailableSendBuffers() const;
JFJochProtoBuf::Plot GetPlots(const JFJochProtoBuf::PlotRequest& request);
JFJochProtoBuf::RadialIntegrationProfiles GetRadialIntegrationProfiles();
};
#endif //JUNGFRAUJOCH_JFJOCHRECEIVER_H