From 3d905099cabb8e46e013d9bb0f01113086ee4cc4 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Mon, 9 Nov 2026 16:10:38 +0100 Subject: [PATCH] Molecular replacement: a model's chains searched by themselves; tNCS half-vector moves told apart by a paired test A model of several chains is searched for as a whole and then, side by side, as one chain of each molecule in it (chains with the same residue at every number they share are one molecule; the most complete one is searched), with the PAE domains' machinery. The whole model's choice stands unless a chain's search chose a placement better by the R-free margin (0.03), or the whole model chose none; the chains that chose must agree on the space group. MR_SEARCH_MODEL names the winner ("chain A, one of 2 alike"). An experimental dimer from another crystal form, placed as one rigid unit where the target crystal holds the two copies at another separation (tNCS), was placed 3.4 A off per chain (R-free 0.47); the chain search places both copies (R-free 0.28 before refinement, refined 0.27), and where the dimer is right the whole model is kept (R-free 0.26 against the chain's 0.29). MR takes about twice as long on such a model (0.55 -> 1.1 s). With tNCS by half a lattice vector, the placement and its moves by (v + o)/2 are now told apart by a paired per-reflection test of |F_obs - F_calc| on the weak reflections (3 standard errors, as the equal-copies group comparison) instead of a 0.01 margin in R over them; UNDECIDED only where the best is not ahead of every other by that. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01HVeDQsU5a8AJUdJPgWevAK (cherry picked from commit 690ee4784ddd8e046fec19edb558f28808d0a825) --- docs/CPU_DATA_ANALYSIS_DECISIONS.md | 8 +- docs/RUGNUX_CLI.md | 2 +- docs/RUGNUX_MODEL_AND_REFERENCE.md | 4 +- docs/RUGNUX_REPORT.md | 17 +- .../MolecularReplacement.cpp | 263 ++++++++++++++---- .../MolecularReplacement.h | 9 +- tests/MolecularReplacementTest.cpp | 51 ++++ 7 files changed, 287 insertions(+), 67 deletions(-) diff --git a/docs/CPU_DATA_ANALYSIS_DECISIONS.md b/docs/CPU_DATA_ANALYSIS_DECISIONS.md index ed5c56e79..c6e7d0927 100644 --- a/docs/CPU_DATA_ANALYSIS_DECISIONS.md +++ b/docs/CPU_DATA_ANALYSIS_DECISIONS.md @@ -314,8 +314,12 @@ Translational NCS changes what the search can tell apart (Read, Adams & McCoy, 2 pseudo-translation, one copy beside a translated twin of itself fits the data as well in a group whose screw axes the translation turns into the chosen group's, so such a choice is left undecided unless the copies, carried into the other group and refined there, fit clearly worse; and where the vector is half -a lattice vector, the placement is compared with every move of itself the vector allows, on the weak -reflections it modulates. +a lattice vector, the placement is compared with every move of itself the vector allows, each refined, +on the weak reflections it modulates, and left undecided only where the best is not ahead of every other +by 3 standard errors of the paired per-reflection difference there. A model of several chains is searched +for as a whole and, side by side, as one chain of each molecule in it: the chains of an experimental model +from another crystal form need not sit in this crystal as they sat in that one, and the whole model's +choice gives way to a chain's where the chain's fits better by the R-free margin. The choice between groups and merges is a hypothesis comparison like §14.5: the candidate the choice falls on has to beat a null of the same model placed from random orientations, and lead the other diff --git a/docs/RUGNUX_CLI.md b/docs/RUGNUX_CLI.md index d09fd2dcc..040f230a3 100644 --- a/docs/RUGNUX_CLI.md +++ b/docs/RUGNUX_CLI.md @@ -313,7 +313,7 @@ serial stills; `fft` (GPU) / `fftw` (CPU) index **de novo** and suit strong rota | `--free-flags ` | Take only the R-free test set of this MTZ or structure-factor mmCIF - e.g. the deposited reflections of the `--model` - for the validation, the refinement and the merged files; nothing else of the file is used, so unlike `-z` it fixes no space group, cell or frame. Taken on the model's axes where the merge matches the file's intensities (`R_FREE_FLAGS=`, see [Free set and model bias](RUGNUX_MODEL_AND_REFERENCE.md#free-set-and-model-bias)) | | `--reference-column