Merge branch 'd-tncs-report' into rc172-2

This commit is contained in:
leonarski_f committed 2026-09-20 19:57:48 +02:00
commit 38f9fa7f03
2 files changed
+18 -3

No files matched your search

@@ -767,9 +767,12 @@ std::string TranslationalNCSToText(const TranslationalNCSResult &result) {
os << "\n [z = " << std::setprecision(1) << result.peak_z << " against a permutation null of "
<< result.null_mean << " +- " << std::setprecision(2) << result.null_sd << "%]\n";
if (result.modulation_measured)
os << " Intensity modulation along that vector: " << std::setprecision(1) << result.modulation
os << " Intensity modulation: " << std::setprecision(1) << result.modulation
<< "x between the strongest and weakest phase class [random-vector control "
<< result.modulation_null << "x]\n";
<< result.modulation_null << "x]\n"
<< " [read on the search's own vector over d >= 4 A, which is what the control is drawn\n"
<< " against; the vector reported above is that one re-refined on the whole data, so it\n"
<< " points more accurately and this number is not re-read off it]\n";
if (!result.modulation_measured) {
os << " The modulation test could not be run - too few acentric reflections beyond 4 A - so\n"
<< " the peak above stands alone.\n"
+13 -1
View File
@@ -7502,9 +7502,21 @@ ProcessResult Rugnux::RunPipeline(RugnuxObserver *observer, bool write_output, b
// because it is folded under no symmetry, at full resolution and production-scaled.
// Report-only: nothing reads it back.
if (determined != nullptr && determined->number > 1) {
// The pseudo-translation the zone is normalised by is measured on THIS merge, not
// taken from `result.tncs`. That one is fitted on the adopted group's merge, and
// where the pseudo-translation is not compatible with the adopted symmetry that
// merge has already averaged across its own phase classes, so the vector fitted
// there is poorly determined - measured on one crystal, the correlation between E^2
// and cos(2 pi h.u) reads 0.04 on the group merge against 0.25 here, with the
// optimum elsewhere entirely, and a vector that names the wrong classes normalises
// the zone by noise. It is also the basis this merge is indexed on: a change of
// basis committed by the search leaves a vector measured before it pointing
// somewhere else.
const auto p1_tncs = AnalyzeTranslationalNCS(
p1.merged, gemmi::UnitCell(*result.consensus_cell));
result.twin_immune_zones = AnalyzeTwinImmuneZones(
p1.merged, gemmi::UnitCell(*result.consensus_cell), *determined,
TranslationalNCSVectorForLTest(result.tncs));
TranslationalNCSVectorForLTest(p1_tncs));
if (!result.twin_immune_zones->zones.empty())
logger.Info("{}", TwinImmuneZonesToText(*result.twin_immune_zones));
}