// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include #include #include #include "JFJochReceiver.h" #include "../acquisition_device/AcquisitionDeviceGroup.h" #include "../common/DiffractionExperiment.h" #include "../common/JFJochException.h" #include "FrameTransformation.h" #include "../image_pusher/ImagePusher.h" #include "../common/Logger.h" #include "../common/ThreadSafeFIFO.h" #include "../common/ImageBuffer.h" #include "../common/PixelMask.h" #include "../image_analysis/spot_finding/StrongPixelSet.h" #include "../common/AzimuthalIntegrationMapping.h" #include "../common/AzimuthalIntegrationProfile.h" #include "../jungfrau/JFCalibration.h" #include "../common/ADUHistogram.h" #include "../common/Plot.h" #include "../common/JFJochReceiverPlots.h" #include "../preview/PreviewImage.h" #include "LossyFilter.h" #include "JFJochReceiverCurrentStatus.h" #include "../jungfrau/JFPedestalCalc.h" #include "../preview/ZMQPreviewSocket.h" #include "../preview/ZMQMetadataSocket.h" #include "ImageMetadata.h" #include "../common/ModuleSummation.h" #include "../image_analysis/MXAnalysisAfterFPGA.h" #include "../common/MovingAverage.h" #include "JFJochReceiverOutput.h" class JFJochReceiverFPGA : public JFJochReceiver { const JFCalibration *calibration; std::vector> pedestal; std::vector roi_map; std::vector> frame_transformation_futures; std::vector> data_acquisition_futures; std::future measurement; ThreadSafeFIFO images_to_go; AcquisitionDeviceGroup &acquisition_device; uint16_t ndatastreams{0}; const int64_t frame_transformation_nthreads; const int64_t pedestal_nthreads; const int64_t summation_nthreads; int64_t expected_packets_per_image; bool only_2nd_sc_pedestal = false; // special mode used for pedestal G1/G2 with storage cells std::latch frame_transformation_ready; std::latch data_acquisition_ready; void AcquireThread(uint16_t data_stream); void LoadCalibrationToFPGA(uint16_t data_stream); void FrameTransformationThread(uint32_t threadid); void MeasurePedestalThread(uint16_t data_stream, uint16_t module_number, uint16_t storage_cell, uint32_t threadid, bool ignore); int64_t SummationThread(uint16_t data_stream, int64_t image_number, uint16_t module_number, uint32_t threadid, ModuleSummation &summation); void Cancel(const JFJochException &e) override; void FinalizeMeasurement(); void SendCalibration(); void SendPedestal(const std::string &prefix, const std::vector &v, int gain, int sc); void RetrievePedestal(std::vector &output) const; public: JFJochReceiverFPGA(const DiffractionExperiment& experiment, const PixelMask &pixel_mask, const JFCalibration *calibration, AcquisitionDeviceGroup &acquisition_devices, ImagePusher &image_pusher, Logger &logger, int64_t forward_and_sum_nthreads, const SpotFindingSettings &spot_finding_settings, JFJochReceiverCurrentStatus ¤t_status, JFJochReceiverPlots &plots, ImageBuffer &image_buffer, ZMQPreviewSocket *zmq_preview_socket, ZMQMetadataSocket *zmq_metadata_socket, IndexerThreadPool *indexing_thread_pool); ~JFJochReceiverFPGA(); JFJochReceiverFPGA(const JFJochReceiverFPGA &other) = delete; JFJochReceiverFPGA& operator=(const JFJochReceiverFPGA &other) = delete; void StopReceiver() override; float GetEfficiency() const override; void Cancel(bool silent) override; float GetProgress() const override; void SetSpotFindingSettings(const SpotFindingSettings &spot_finding_settings) override; JFJochReceiverOutput GetFinalStatistics() const override; };