diff --git a/image_analysis/scale_merge/RotationScaleMerge.cpp b/image_analysis/scale_merge/RotationScaleMerge.cpp index 27012c7a..324a6c40 100644 --- a/image_analysis/scale_merge/RotationScaleMerge.cpp +++ b/image_analysis/scale_merge/RotationScaleMerge.cpp @@ -1520,6 +1520,12 @@ RotationScaleMerge::Result RotationScaleMerge::MergeAndStats(int n_groups, bool if (b_asy <= 0.0) b_asy = asymptote_above(10.0, 50); // relaxed for weak / damaged data if (b_asy > 0.0) error_model_b_asymptotic = b_asy; } + // Guard a degenerate low-multiplicity fit: with too few symmetry equivalents both the (a, b) fit and + // the per-group scatter collapse toward zero, and 1/b then reports an impossibly high asymptotic + // I/sigma. Real macromolecular data does not exceed ISa ~50; past a generous cap treat the asymptote + // as unmeasured (result.isa left undetermined) rather than emit a spurious extreme. + constexpr double MIN_ASYMPTOTIC_B = 0.01; // ISa cap 100 + if (error_model_b_asymptotic < MIN_ASYMPTOTIC_B) error_model_b_asymptotic = 0.0; if (error_model_active) logger.Info("Error model: a={:.3f} b={:.3f} ISa={:.1f} chi2={:.2f}", error_model_a, error_model_b, error_model_b_asymptotic > 0 ? 1.0 / error_model_b_asymptotic : 0.0, error_model_chi2);