Scaling: the low-resolution limit bounds the scale fit, not the merge
Reflections coarser than --scaling-low-resolution (default 50 A) are now merged and written - what maps and refinement want of the lowest resolutions - but stay out of every fit of the scale model, by the same path an ice-ring observation takes (excluded from scaling, kept for merging), under a name of its own: RotationScaleMerge's per-observation flag is now `unscaled` (UNSCALED_ICE | UNSCALED_LOW_RES; on the device OBS_UNSCALED = OBS_ON_ICE_FLAG | OBS_LOW_RES_FLAG), set from the reflection on the host and in the device ingest, and only its ice bit marks a merged reflection as on an ice ring. The stills merge drops its low-resolution cut; ScaleOnTheFly, StillsPartialityRefine and the reindexing correlation keep it. The merge statistics run over the whole sphere unless --report-resolution declares a range, so the reflections the beam stop hides count as missing. Which coarse reflections exist at all is the beam-stop shadow test's decision (a7610d847). Why not simply lift the limit: on 5nw5, 35 reflections beyond 50 A bent the scale model enough to move the merged 20-50 A intensities by +61 % and 10-20 A by +19 % (Wilson B 319 -> 382, REFMAC R-free +0.006). Kept out of the fit, the merged intensities at 10-50 A are unchanged to 0.2 % and Wilson B is 307. CPU subset battery against the previous commit (lp-cpu-v2 / lp-cpu-v1): REFMAC 0-cycle R-free 5nw5 +0.0004, 6oel +0.0005, others within 0.0001; rugnux's own R-free/R_model rise where the new >50 A terms enter it (lyso R_model 0.2714 -> 0.2739; the model is poorest there). Kept beyond 50 A: 7qij 61, 5nw5 35, 6oel 14 unique. In-house photon-counting sets unchanged, except insu_I_x06da_ref, where the delta-CC1/2 frame exclusion now removes 449 instead of 78 frames: refres R_meas 0.246 -> 0.167, ISa 33.5 -> 35.4, R_free 0.2443 -> 0.2427, anomalous signal 3.31 -> 3.38 (XDS: R_meas 0.349, ISa 25.1). Stills (lcls242_s/t, lcls222, euxfel83, sacla236) within 0.0002 of the previous commit. GPU (device ingest) and CPU give the same 5nw5 merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015CeEGgpKdfkCTJb3YNMJcu (cherry picked from commit 32a9fbcb3ca67879ceb051c13f58d61fe85530f4)
This commit is contained in:
1 parent
e97b902603
commit
fca2a77b0c
12 files changed
+99
-79
No files matched your search
@@ -162,19 +162,25 @@ namespace {
|
||||
return out;
|
||||
}
|
||||
|
||||
// The statistics over a declared low-resolution bound (--report-resolution), or over the whole sphere
|
||||
// without one: the scaling's own low-resolution limit bounds the scale fit, not the merge.
|
||||
MergeStatistics StatsWithLowLimit(const gemmi::SpaceGroup &sg, const std::optional<UnitCell> &cell,
|
||||
const std::vector<MergedReflection> &merged,
|
||||
std::optional<double> low_limit, bool merge_friedel) {
|
||||
DiffractionExperiment x;
|
||||
x.SetSpaceGroup(sg);
|
||||
ScalingSettings s = x.GetScalingSettings();
|
||||
s.LowResolutionLimit_A(low_limit);
|
||||
s.MergeFriedel(merge_friedel);
|
||||
x.ImportScalingSettings(s);
|
||||
|
||||
MergeOnTheFly merge(x);
|
||||
merge.ReferenceCell(cell);
|
||||
return merge.MergeStats(merged, {});
|
||||
const auto own = merge.MergeStats(merged, {});
|
||||
if (!low_limit)
|
||||
return own;
|
||||
// Down to the data's own d_min, padded as MergeStats pads it.
|
||||
return merge.MergeStats(merged, {}, {}, std::nullopt,
|
||||
ReportResolutionRange{.d_min = own.overall.d_min * 0.999, .d_max = *low_limit});
|
||||
}
|
||||
|
||||
double Completeness(const MergeStatisticsShell &s) {
|
||||
|
||||
Reference in new issue
Block a user