151 lines
5.1 KiB
C++
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
|
|
|