RESULT-CHANGING: Refinement: a displacement model is kept only where it displaces where the weights ended

The displacement hypotheses were compared with the first of them (the B factors refined on), and the one
chosen was taken whatever the state the weights ended at; only that first one had to displace it. Where the
trajectory held B and refining B is worse (a 3.6 A set with twelve copies: B held R-free 0.2797, B refined
0.3103), a per-atom U at 0.2939 was then adopted although it is worse than holding B. Now the chosen
hypothesis must displace the state as any step must, else the B factors stay as the weights left them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HVeDQqN9qRD57vnShzTC37
This commit is contained in:
leonarski_fandClaude Opus 5.5 committed 2026-10-27 20:27:52 +01:00
1 parent ae98b1e151
commit 89b37f9bc4
1 file changed
+6 -6
@@ -2717,14 +2717,14 @@ RefinementResult RefineOnce(const gemmi::Structure &placed, const std::vector<Me
o.trial.nll_free < outcomes[best].trial.nll_free))))
best = static_cast<int>(k);
}
// The B factors refined on are a step further on the same weights: kept where they displace where the
// weights ended, as any step.
if (best >= 0) {
// Each is a step further on the same weights: the one chosen is kept where it displaces where the weights
// ended, as any step (at low resolution the B factors refined on may all be worse than B held).
result.adp_model = iso.name;
if (best >= 0 && displaces(outcomes[best].trial, state.trial)) {
result.adp_model = outcomes[best].trial.adp;
logger.Info("Refinement: displacement model {}", result.adp_model);
}
if (best > 0 || (best == 0 && displaces(outcomes[0].trial, state.trial)))
state = std::move(outcomes[best]);
}
logger.Info("Refinement: displacement model {}", result.adp_model);
}
for (size_t s = 1; s < trial_slots.size(); s++)
ctx.evaluations += trial_slots[s].ctx->evaluations;