diff --git a/image_analysis/scale_merge/IceRingMask.cpp b/image_analysis/scale_merge/IceRingMask.cpp index eb68aefb..eb511f98 100644 --- a/image_analysis/scale_merge/IceRingMask.cpp +++ b/image_analysis/scale_merge/IceRingMask.cpp @@ -28,8 +28,15 @@ std::vector FindDecorrelatedIceRings(const std::vector & if (dq < w) { ring.Add(m.I_half[0], m.I_half[1]); ++n_ring; } else if (dq < 3.0f * w) { shoulder.Add(m.I_half[0], m.I_half[1]); ++n_shoulder; } } + // The 0.10 margin is the 99th percentile of this statistic measured on DECOY bands - the same + // ring/shoulder geometry evaluated at q positions carrying no ice ring - over the 37-crystal + // rotation battery. At the 0.05 it replaces, 4% of ice-free bands cleared the bar; at 0.10, + // 1%. (A margin in CC is not a fixed significance: at the observed populations 0.05 ranges + // from 1.1 to 7.3 sigma across firings, and the nominal Fisher-z error underestimates the + // real scatter of these heavy-tailed intensities by ~2.7x, so the null was measured, not + // derived.) if (n_ring >= 20 && n_shoulder >= 20 && shoulder.GetCC() > 0.5 - && ring.GetCC() < shoulder.GetCC() - 0.05) { + && ring.GetCC() < shoulder.GetCC() - 0.10) { mask[i] = 1; logger.Info("Ice-ring mask: {:.2f} A ring CC1/2 {:.3f} << shoulders {:.3f}; masked from merge", ICE_RING_RES_A[i], ring.GetCC(), shoulder.GetCC());