diff --git a/rugnux/Rugnux.cpp b/rugnux/Rugnux.cpp index 5ceb6a80..242b60ee 100644 --- a/rugnux/Rugnux.cpp +++ b/rugnux/Rugnux.cpp @@ -594,12 +594,12 @@ ProcessResult Rugnux::Run(RugnuxObserver *observer) { // running merge with ScaleOnTheFly (fixed partiality), then merge directly. With an external // reference each image is already scaled against it during the per-image pass, so skip. if (config_.reference_data.empty()) { - for (int i = 0; i < config_.scaling_iter; i++) { - phase("Scaling images (" + label + ", iteration " + std::to_string(i + 1) + "/" - + std::to_string(config_.scaling_iter) + ")"); - auto merge_result = MergeAll(experiment_, indexer->GetIntegrationOutcome(), false); - indexer->ScaleAllImages(merge_result); - } + // One pass: the per-image scale G is the exact one-pass solution, so iterating only + // rebuilds the reference from the freshly-scaled (noisy) data - degrading weak stills + // instead of converging (measured CC1/2 collapse at the default 3 iters on weak data). + phase("Scaling images (" + label + ")"); + auto merge_result = MergeAll(experiment_, indexer->GetIntegrationOutcome(), false); + indexer->ScaleAllImages(merge_result); } const std::vector &merge_input = indexer->GetIntegrationOutcome(); diff --git a/rugnux/rugnux_cli.cpp b/rugnux/rugnux_cli.cpp index fa417766..78cde433 100644 --- a/rugnux/rugnux_cli.cpp +++ b/rugnux/rugnux_cli.cpp @@ -1035,7 +1035,12 @@ int main(int argc, char **argv) { merged_statistics = std::move(r.statistics); error_model_isa = r.isa; } else { - for (int i = 0; i < scaling_iter; i++) { + // The per-image scale G is the exact one-pass solution (Scale re-solves from raw I and never + // reads the prior correction), so with a self-rebuilt reference iterating only re-fits the + // freshly-scaled noise and degrades weak stills (measured CC1/2 collapse at the default 3 + // iters). Scale the self-reference merge once; a fixed external reference keeps scaling_iter. + const int n_self = reference_data.empty() ? 1 : scaling_iter; + for (int i = 0; i < n_self; i++) { if (reference_data.empty()) ScaleOnTheFly(experiment, MergeAll(experiment, reflections)).Scale(reflections, nthreads); else