// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include "BraggIntegrationSettings.h" #include "JFJochException.h" #define check_max(param, val, max) if ((val) > (max)) throw JFJochException(JFJochExceptionCategory::InputParameterAboveMax, param) #define check_min(param, val, min) if ((val) < (min)) throw JFJochException(JFJochExceptionCategory::InputParameterBelowMin, param) #define check_finite(param, val) if (!std::isfinite(val)) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, param) BraggIntegrationSettings &BraggIntegrationSettings::R1(float input) { check_finite("Integration radius R1", input); check_min("Integration radius R1", input, 0.1); check_max("Integration radius R1", input, 20.0); r_1 = input; return *this; } BraggIntegrationSettings &BraggIntegrationSettings::R2(float input) { check_finite("Background inner radius R2", input); check_min("Background inner radius R2", input, 0.1); check_max("Background inner radius R2", input, 30.0); if (input <= r_1) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Background inner radius (R2) must be larger than integration radius (R1)"); r_2 = input; return *this; } BraggIntegrationSettings &BraggIntegrationSettings::R3(float input) { check_finite("Background outer radius R3", input); check_min("Background outer radius R3", input, 0.1); check_max("Background outer radius R3", input, 40.0); if (input <= r_2) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Background outer radius (R3) must be larger than background inner radius (R2)"); r_3 = input; return *this; } BraggIntegrationSettings &BraggIntegrationSettings::AngleFromEwald_deg(float input) { check_finite("Angle from Ewald sphere", input); check_min("Angle from Ewald sphere", input, 0.0); check_max("Angle from Ewald sphere", input, 45); angle_from_ewald_deg = input; return *this; } BraggIntegrationSettings &BraggIntegrationSettings::DMinLimit_A(float input) { check_finite("Minimum d-spacing", input); check_min("Minimum d-spacing", input, 0.5); check_max("Minimum d-spacing", input, 100.0); d_min_limit_A = input; return *this; } float BraggIntegrationSettings::GetR1() const { return r_1; } float BraggIntegrationSettings::GetR2() const { return r_2; } float BraggIntegrationSettings::GetR3() const { return r_3; } float BraggIntegrationSettings::GetAngleFromEwald_deg() const { return angle_from_ewald_deg; } float BraggIntegrationSettings::GetDMinLimit_A() const { return d_min_limit_A; }