Rugnux --model: report the anomalous map's mean height at the model's anomalous scatterers
ANOMALOUS_SCATTERER_MEAN_SIGMA= is the anomalous difference map, read at every model atom from phosphorus up (S of Met/Cys, metals, Cl, I) with the same cubic interpolation as ANOMALOUS_SITE_*, averaged in map sigma; ANOMALOUS_SCATTERERS= is their count. One number for the anomalous signal of a merge that does not depend on which ten atoms come out on top - what the battery tracks for the long-wavelength standard-protein sets. A new key only: no report version bump. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
This commit is contained in:
@@ -80,6 +80,10 @@ constexpr double ANOMALOUS_INVERSION_SIGMA = 5.0;
|
||||
// signal is there and what carries it; a full site list is what the map file is for.
|
||||
constexpr size_t MAX_ANOMALOUS_SITES = 10;
|
||||
|
||||
// The lightest element counted as an anomalous scatterer: phosphorus. Below it (C, N, O, Na, Mg) f''
|
||||
// is a fraction of sulfur's at any wavelength these data are taken at.
|
||||
constexpr int ANOMALOUS_SCATTERER_MIN_Z = 15;
|
||||
|
||||
// How many random placements of the same model the real fit is compared against. The verdict is
|
||||
// (real - mean)/sd of this sample, so what matters is not the mean but how well the SPREAD is
|
||||
// pinned: the relative error on an sd from n draws is 1/sqrt(2(n-1)), and a sample that happens to
|
||||
@@ -1290,6 +1294,7 @@ ModelValidationResult Validate(const std::vector<MergedReflection> &merged,
|
||||
const gemmi::Grid<float> grid = map_from_coefficients(mapanom);
|
||||
const double rms = write_ccp4(grid, output_prefix + "_anom.ccp4");
|
||||
std::vector<ModelValidationResult::AnomalousSite> sites;
|
||||
double scatterer_sum = 0;
|
||||
for (gemmi::Model &m : st.models)
|
||||
for (gemmi::Chain &ch : m.chains)
|
||||
for (gemmi::Residue &r : ch.residues)
|
||||
@@ -1300,7 +1305,13 @@ ModelValidationResult Validate(const std::vector<MergedReflection> &merged,
|
||||
r.seqid.str()),
|
||||
rms > 0 ? grid.interpolate_value(a.pos, MAP_INTERPOLATION_ORDER) / rms
|
||||
: 0.0});
|
||||
if (a.element.atomic_number() >= ANOMALOUS_SCATTERER_MIN_Z) {
|
||||
scatterer_sum += sites.back().sigma;
|
||||
result.anomalous_scatterers++;
|
||||
}
|
||||
}
|
||||
if (result.anomalous_scatterers > 0)
|
||||
result.anomalous_scatterer_mean_sigma = scatterer_sum / result.anomalous_scatterers;
|
||||
std::sort(sites.begin(), sites.end(),
|
||||
[](const auto &x, const auto &y) { return x.sigma > y.sigma; });
|
||||
|
||||
|
||||
Reference in New Issue
Block a user