From b87a6502a7f34f88da445cdefef14c63fa8d29d9 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Sun, 11 Oct 2026 02:17:44 +0200 Subject: [PATCH] rugnux: supercell probe only on output passes, whose result is the one read The doubled-cell probe (eight parity classes over 20-3 A plus the to-the-limit trend) was armed on every full rotation image pass: the geometry pre-pass, the beam-centre arm, the metric-symmetry demoted arm, the geometry-walk and rotation-scale probe passes, the speculative geometry probes and the output passes. Its only consumer is ProcessResult::supercell of the answer (DoubledCellHypothesis and the report), and every answer RunAllPasses returns comes from a write_output, non-pre-pass RunPipeline call (single pass, pass 2, the walk's rewrite, the quality-guard redo, the lost-arm rerun, the doubled pass). The indexer is built fresh per pass, so an unarmed pass reads nothing. Output-identical: ci tier + 7 doubled-cell/supercell sets (35 sets), base e34a5fb88 vs this: every .hkl byte-identical, 69/69 MTZ files identical in reflection data/cell/SG (gemmi), p_report.txt identical apart from DATE, WALL_TIME and RUGNUX_GIT; battery compare: 0 sets changed. The log loses only the non-output passes' "Supercell probe" lines (e.g. 4 -> 2 on a two-pass set). Indicative only (shared GPU): summed "image pass" time over the 35 sets 328.4 -> 320.4 s, geometry pre-pass integration 99.5 -> 93.7 s. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01EizBKhTqrAYago9KJG3dA3 --- rugnux/Rugnux.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rugnux/Rugnux.cpp b/rugnux/Rugnux.cpp index 9fdd59ca9..0585ac3e5 100644 --- a/rugnux/Rugnux.cpp +++ b/rugnux/Rugnux.cpp @@ -883,7 +883,10 @@ ProcessResult Rugnux::RunPipeline(RugnuxObserver *observer, bool write_output, b // at the half-integer nodes of crystals whose cell is right, so the run carries the doubled cell as a // second hypothesis where the class stands clear out to the limit (DoubledCellHypothesis), and merges // both. - if (full && indexer && experiment_.IsRotationIndexing()) { + // + // Only an output pass probes: the answer the run returns is always one (RunAllPasses), and no other + // pass's probe is read - the pre-pass, the beam-centre arm and the probe passes leave theirs unread. + if (full && indexer && experiment_.IsRotationIndexing() && write_output && !geometry_prepass) { std::vector frames; for (const int o : select_equally_spaced_image_ordinals(images_to_process, 60)) frames.push_back(o);