// Copyright (2019-2023) Paul Scherrer Institute #ifndef JUNGFRAUJOCH_STRONGPIXELSET_H #define JUNGFRAUJOCH_STRONGPIXELSET_H #include #include #include #include "../common/DiffractionExperiment.h" #include "../common/Coord.h" #include "../common/DiffractionSpot.h" #include "../acquisition_device/AcquisitionDevice.h" #include "SpotFindingSettings.h" inline uint32_t strong_pixel_coord(uint16_t col, uint16_t line) { return col + (static_cast(line) << 16u); } inline uint16_t line_from_strong_pixel(uint32_t strong_pixel) { return ((strong_pixel & 0xFFFF0000u) >> 16u); } inline uint16_t col_from_strong_pixel(uint32_t strong_pixel) { return (strong_pixel & 0x0000FFFFu); } void FilterSpotsByResolution(const DiffractionExperiment& experiment, const std::vector &input, std::vector &output); void FilterSpotsByCount(const DiffractionExperiment& experiment, const std::vector &input, std::vector &output); class StrongPixelSet { std::vector> single_pixels; std::unordered_map strong_pixel_map; static const constexpr uint32_t xpixel = RAW_MODULE_COLS; static const constexpr uint32_t ypixel = RAW_MODULE_LINES; uint32_t strong_pixel_count; std::vector strong_pixel_vector; void AddNeighbor(DiffractionSpot &spot, uint16_t col, uint16_t line); DiffractionSpot BuildSpot(std::unordered_map::iterator &it_frames); void ExtendSpot(DiffractionSpot &spot, std::unordered_map::iterator &it_frames); public: void ReadFPGAOutput(const DeviceOutput& output); StrongPixelSet(); size_t Count() const; void AddStrongPixel(uint16_t col, uint16_t line, int32_t photons = 1); void AddSingleStrongPixel(uint16_t col, uint16_t line, int32_t photons = 1); void FindSpots(const DiffractionExperiment &experiment, const SpotFindingSettings &settings, std::vector &spots, uint16_t module_number); size_t Common(const StrongPixelSet &set) const; uint32_t GetStrongPixelCount() const; }; #endif //JUNGFRAUJOCH_STRONGPIXELSET_H