Rotation: a diagnostic that opens the prediction window on its own width

Prediction and partiality read one number, the per-image sigma_M, so a sigma_M
that moves takes the integrated reflection population with it and there is no
way to ask which of the two uses carries a downstream difference.
--prediction-mosaicity fixes the width the prediction window opens to while the
partiality keeps using the measured sigma_M, which separates them.

Measured with it on a rotation crystal whose lattice search returns two
different cells a few tens of microns of detector distance apart: widening the
prediction window from the narrower branch's 0.203 deg to the wider branch's
0.272 deg adds 28% more partials and moves the merged statistics by less than
half a percent (I/sigma 6.1 -> 6.2, R_meas 12.7 -> 12.6%, ISa 10.7 -> 10.9);
narrowing the wide branch the other way removes 26% of its partials and
recovers nothing. On a tetragonal reference crystal a 4.7x over-wide window
costs 11%. The prediction window is not where a mosaicity difference turns into
a merged-data difference - the captured-fraction gate and the partiality
weighting downstream absorb a generous window.

Diagnostic only; off by default, so nothing changes unless it is asked for.
This commit is contained in:
2026-08-12 01:17:51 +02:00
parent 677ece7b59
commit a0604ff244
4 changed files with 42 additions and 1 deletions
+6 -1
View File
@@ -479,7 +479,12 @@ void IndexAndRefine::QuickPredictAndIntegrate(DataMessage &msg,
mosaicity[msg.number] = *mos_measured;
}
}
const float mos_deg = mos_measured.value_or(0.1f);
// The width the prediction window opens to. It is the measured sigma_M unless a fixed prediction
// mosaicity was asked for: the reported (and therefore integrated-against) sigma_M below is left
// alone either way, so the two uses of the number can be separated.
float mos_deg = mos_measured.value_or(0.1f);
if (const auto forced_pred = experiment.GetBraggIntegrationSettings().GetForcedPredictionMosaicity_deg())
mos_deg = *forced_pred;
IntegrationOutcome i_outcome{
.geom = outcome.experiment.GetDiffractionGeometry(),