// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JFJOCH_JFJOCHREADERIMAGE_H #define JFJOCH_JFJOCHREADERIMAGE_H #include #include #include #include #include #include "../common/TopPixels.h" #include "JFJochReaderDataset.h" #include "../common/CrystalLattice.h" #include "../common/Histogram.h" constexpr static int32_t GAP_PXL_VALUE = INT32_MIN + 1; constexpr static int32_t ERROR_PXL_VALUE = INT32_MIN; constexpr static int32_t SATURATED_PXL_VALUE = INT32_MAX; class JFJochReaderImage { std::shared_ptr dataset; std::vector image; // Image in the reader must be 32-bit signed, uncompressed DataMessage message; std::unordered_set saturated_pixel; std::unordered_set error_pixel; std::vector> valid_pixel; // Fast stats without storing/sorting all valid pixels int32_t valid_min = 0; int32_t valid_max = 0; size_t valid_count = 0; bool has_valid = false; // For overlay: track top pixels with a tiny O(K) structure; export to vector for UI TopPixels top_pixels_acc{20}; std::vector> top_pixels; // This histogram operates in square root of count from 0 to 10^20 Histogram count_histogram{100000}; constexpr static float auto_foreground_range = 99.0f; int32_t auto_foreground; void CalcAutoContrast(); template void ProcessInputImage(const void* image, size_t npixel, int64_t sat_value, int64_t special_value); void ProcessInputImage(const CompressedImage& image); public: JFJochReaderImage(const DataMessage &msg, const std::shared_ptr &dataset); JFJochReaderImage(const JFJochReaderImage &other); const DataMessage &ImageData() const; DataMessage &ImageData(); const std::vector &Image() const; const std::unordered_set &SaturatedPixels() const; const std::unordered_set &ErrorPixels() const; const JFJochReaderDataset &Dataset() const; std::optional> ValidMinMax() const; const std::vector> &GetTopPixels() const; void AddImage(const JFJochReaderImage& other); std::vector GetAzInt1D() const; std::vector GetAzInt1D_BinToQ() const; std::shared_ptr CreateMutableDataset(); int32_t GetAutoContrastValue() const; std::vector GetHistogram() const; }; #endif //JFJOCH_JFJOCHREADERIMAGE_H