From 896953af6e55c70556cecdb2b8a5b545d4378b83 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Wed, 11 Nov 2026 12:06:21 +0100 Subject: [PATCH] RESULT-CHANGING: a harmonic pair of beam centres is carried to the merges instead of kept at the file's Where the file's centre and the measured one index lattices whose primitive volumes differ by an integer factor (2-4), the pooled excess over chance decided between them, and where it did not prefer the measured centre the file's was kept outright. On a harmonic pair that excess is often a near tie - the larger cell's extra nodes catch the spots a wrong centre displaces and its own null grows with them. Measured on an F-cubic small-molecule crystal whose file centre sits 4 px out across the spindle: 12.8x over chance on the doubled cell at the file's centre against 13.9x on the true cell at the measured one; the file's centre was kept, the first pass fell to the triclinic cell, the distance refined 2.9 mm long and the run ended on a cell 1.6 % long. Now, when the pooled spots do not adopt the measured centre, it is carried as beam_center_alternative_ - the mechanism the same-cell case already uses - and RunAllPasses runs the first pass again there and adopts whichever arm merges better. On that crystal: CC1/2 before corrections 0.913 at the measured centre against 0.564, cubic F at the true cell; R_meas 16.2 %, CC1/2 0.998. Costs one more first pass on runs whose two centres give a harmonic pair. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01HVeDQsU5a8AJUdJPgWevAK --- rugnux/RugnuxFirstPassRescues.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/rugnux/RugnuxFirstPassRescues.cpp b/rugnux/RugnuxFirstPassRescues.cpp index e3baace32..0c7b4b0c7 100644 --- a/rugnux/RugnuxFirstPassRescues.cpp +++ b/rugnux/RugnuxFirstPassRescues.cpp @@ -855,7 +855,19 @@ auto Rugnux::FirstPassRun::CentresDisagree(FirstPass best, const FirstPass &alt, RestoreBeamCenter(header_x, header_y); } } - if (!adopted_measured) + // The pooled excess is a near tie on a harmonic pair more often than not: the larger cell's extra + // nodes catch the spots a wrong centre displaces, and its own null grows with them. Measured on a + // small-molecule crystal whose file centre sat 4 px out across the spindle: 12.8x over chance at + // the file's centre on the doubled cell against 13.9x at the measured one on the true cell, so the + // file's centre was kept and the run ended on a cell 1.6 % long. Rather than decide on that, carry + // the measured centre forward and judge the two arms on their merges (RunAllPasses), as the + // same-cell case above does. + if (!adopted_measured && integer_harmonic && geometry_prepass) { + rx.beam_center_alternative_ = std::array{measured_x, measured_y}; + logger.Warning("Beam centre check: the pooled spots do not settle which of the two " + "cells is the centre error, so the run keeps the file's centre for now " + "and carries the measured one forward, adopting whichever merges better"); + } else if (!adopted_measured) logger.Warning("Beam centre check: the run keeps the file's centre. The " "frame counts cannot arbitrate this - a cell twice as long " "must place every spot twice as accurately to score the "