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 "