// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include // Spot-intensity extraction method used by the Bragg integration engine. ProfileGaussian (default) // profile-fits with a measured-width Gaussian (Kabsch-style) - more accurate intensities than the // classical uniform BoxSum; validated on anomalous data (stronger S/Cl peaks vs box-sum). BoxSum is // the simpler, faster fallback. ProfileEmpirical learns the profile per resolution shell from strong // spots - see docs/CPU_DATA_ANALYSIS.md (Bragg integration). enum class IntegratorMode { BoxSum, ProfileGaussian, ProfileEmpirical }; class BraggIntegrationSettings { IntegratorMode integrator_mode = IntegratorMode::ProfileGaussian; float r_1 = 4; float r_2 = 6; float r_3 = 10; float d_min_limit_A = 1.0; std::optional fixed_profile_radius; float minimum_sigma_in_regards_to_i = 0.02; // Symmetric trimmed-mean fraction for the r2..r3 background ring: drop the lowest and highest this // fraction of ring pixels before averaging. Resists the high-side contamination (neighbour-spot // wings, tails, zingers) that biases the plain ring mean up and makes it over-subtract weak // high-angle reflections. Applied to monochromatic data (rotation and still); the integration engine // keeps the tuned high-side sigma-clip for broadband (non-zero bandwidth) data instead. 0 = plain ring // mean (rugnux --background-trim). float bkg_trim_fraction = 0.10f; public: BraggIntegrationSettings& R1(float input); BraggIntegrationSettings& R2(float input); BraggIntegrationSettings& R3(float input); BraggIntegrationSettings& DMinLimit_A(float input); BraggIntegrationSettings& FixedProfileRadius_recipA(std::optional input); BraggIntegrationSettings& Integrator(IntegratorMode input); BraggIntegrationSettings& BackgroundTrimFraction(float input); [[nodiscard]] IntegratorMode GetIntegrator() const; [[nodiscard]] float GetR1() const; [[nodiscard]] float GetR2() const; [[nodiscard]] float GetR3() const; [[nodiscard]] std::optional GetFixedProfileRadius_recipA() const; [[nodiscard]] float GetDMinLimit_A() const; [[nodiscard]] float GetMinimumSigmaInRegardsToI() const; [[nodiscard]] float GetBackgroundTrimFraction() const; };