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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HVeDQsU5a8AJUdJPgWevAK
This commit is contained in:
leonarski_fandClaude Opus 5.5 committed 2026-11-11 13:39:47 +01:00
1 parent 3c001eb7a3
commit 896953af6e
1 file changed
+13 -1
+13 -1
View File
@@ -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<float, 2>{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 "