From e70d71912b68afb5fbe4ca0f205234dc8a2e9f5a Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Wed, 13 May 2026 14:36:41 +0200 Subject: [PATCH] Merge: Add partiality limit --- common/ScalingSettings.cpp | 4 +++- common/ScalingSettings.h | 3 +++ image_analysis/scale_merge/Merge.cpp | 6 ++++++ image_analysis/scale_merge/Merge.h | 6 +++--- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/common/ScalingSettings.cpp b/common/ScalingSettings.cpp index 04f0f8b1..16d5e9de 100644 --- a/common/ScalingSettings.cpp +++ b/common/ScalingSettings.cpp @@ -97,4 +97,6 @@ std::optional ScalingSettings::GetRotationWedgeForScaling() const { return wedge_for_scaling; } - +double ScalingSettings::GetMinPartiality() const { + return min_partiality; +} diff --git a/common/ScalingSettings.h b/common/ScalingSettings.h index 941b6dea..f86c5a2b 100644 --- a/common/ScalingSettings.h +++ b/common/ScalingSettings.h @@ -20,6 +20,7 @@ class ScalingSettings { bool merge_friedel = true; std::optional high_resolution_limit_A; std::optional wedge_for_scaling; + constexpr static double min_partiality = 0.02; public: ScalingSettings& SetPartialityModel(PartialityModel mode); ScalingSettings& RefineB(bool input); @@ -46,4 +47,6 @@ public: [[nodiscard]] std::optional GetPartialityModel() const; [[nodiscard]] std::optional GetHighResolutionLimit_A() const; + + [[nodiscard]] double GetMinPartiality() const; }; diff --git a/image_analysis/scale_merge/Merge.cpp b/image_analysis/scale_merge/Merge.cpp index 2cad3d64..a54ffdd7 100644 --- a/image_analysis/scale_merge/Merge.cpp +++ b/image_analysis/scale_merge/Merge.cpp @@ -15,6 +15,7 @@ std::vector MergeAll(const DiffractionExperiment &x, const std auto scaling_settings = x.GetScalingSettings(); HKLKeyGenerator key_generator(scaling_settings.GetMergeFriedel(), x.GetSpaceGroupNumber().value_or(1)); const std::optional high_resolution_limit = scaling_settings.GetHighResolutionLimit_A(); + auto min_partiality = scaling_settings.GetMinPartiality(); struct Accum { // Keep anomalous + / - together, but separate @@ -37,6 +38,8 @@ std::vector MergeAll(const DiffractionExperiment &x, const std continue; if (!AcceptReflection(r, high_resolution_limit)) continue; + if (r.partiality < min_partiality) + continue; const float I_corr = r.I * r.scaling_correction; const float sigma_corr = r.sigma * r.scaling_correction; @@ -106,6 +109,7 @@ MergeStatistics MergeStats(const DiffractionExperiment &x, float d_min = std::numeric_limits::max(); float d_max = 0.0f; + auto min_partiality = x.GetScalingSettings().GetMinPartiality(); auto d_min_limit_A = x.GetScalingSettings().GetHighResolutionLimit_A(); for (const auto &m: merged) { if (!std::isfinite(m.d) || m.d <= 0.0f) @@ -159,6 +163,8 @@ MergeStatistics MergeStats(const DiffractionExperiment &x, if (!AcceptReflection(r, d_min_limit_A)) continue; + if (r.partiality < min_partiality) + continue;; const auto shell = shells.GetShell(r.d); if (!shell.has_value()) diff --git a/image_analysis/scale_merge/Merge.h b/image_analysis/scale_merge/Merge.h index 3ed79f83..a40fb83a 100644 --- a/image_analysis/scale_merge/Merge.h +++ b/image_analysis/scale_merge/Merge.h @@ -33,8 +33,8 @@ struct MergeResult { }; std::vector MergeAll(const DiffractionExperiment &x, - const std::vector > &reflections); + const std::vector > &reflections); MergeStatistics MergeStats(const DiffractionExperiment &x, - const std::vector &merged, - const std::vector > &reflections); \ No newline at end of file + const std::vector &merged, + const std::vector > &reflections);