// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include "../../common/DiffractionSpot.h" void GenerateSpotPlot(DataMessage &msg, const std::vector &spots, float d_min_A); void CountSpots(DataMessage &msg, const DiffractionExperiment& experiment, const std::vector &spots, float d_min_A); void CountSpots(DataMessage &msg, const std::vector &spots, float d_min_A); float CountIceRingControlSpots(const std::vector &spots, float half_width_q_recipA); void MarkIceRings(std::vector &spots, float tolerance_q_recipA); // Keep the strongest `count` spots. With deprioritise_ice, spots on the hexagonal ice bands are ordered // last and so are the first to go; pass false where the run has no measurable ice, in which case the // flag marks ordinary reflections and ordering on it would discard good data. void FilterSpotsByCount(std::vector &input, int64_t count, bool deprioritise_ice); void FilterSpuriousHighResolutionSpots(std::vector &spots, float threshold); // Ignore high res. spots if there is a gap in (1/d) between two spots of dist_threshold (default: 0.25 A^-1) // For less than 4 spots - don't provide resolution estimation // For less than 20 spots - take the third best high resolution // For 20 spots or more - take the 95% percentile best high resolution spot std::optional GetResolution(const std::vector &spots); void SpotAnalyze(const DiffractionExperiment &experiment, const SpotFindingSettings &settings, const std::vector &spots, DataMessage &message);