rugnux: no MODEL_FREE_SET warning

A model placed as given on a free set drawn by the run was flagged on nearly every run with a
model (an orange triage row on 238 of 262 battery rotation sets), although it says nothing about
the data. The warning and its code are gone; the refinement still does not let the as-given model
compete on such a free set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HVeDQsU5a8AJUdJPgWevAK
This commit is contained in:
leonarski_fandClaude Opus 5.5 committed 2026-11-11 20:23:03 +01:00
1 parent bae1cc3b7b
commit fa94f24777
6 files changed
+7 -23

No files matched your search

+2 -2
View File
@@ -169,8 +169,8 @@ rugnux -o sacla236 -C 79.45,79.45,38.15,90,90,90 -S P43212 --model 9V3D.pdb sacl
It takes about 35 s and ends with
```
Result WARNINGS: Merged to 1.69 A in P 43 21 2. 2 conditions need
attention: MODEL_FREE_SET, OVERLOADS.
Result WARNINGS: Merged to 1.69 A in P 43 21 2. 1 condition needs
attention: OVERLOADS.
Space group P 43 21 2
Unit cell 79.343 79.343 38.121 90.000 90.000 90.000
Resolution 1.69 A written; the CC1/2 fall-off is fitted at 1.72 A
+1 -1
View File
@@ -331,7 +331,7 @@ are:
rule every trial is held to (its geometry within bounds and R-free lower beyond the tie), the model is written as
it came, scaled to the data, and the solvent build's edits are undone (`REFINE_AS_GIVEN`). What comes out is never
worse on the free set than what went in. This holds only where the free set is free to the model as given: a model
placed as given on a free set drawn by the run (`MODEL_FREE_SET`; in `--mode refine`, a file without free flags) has
placed as given on a free set drawn by the run (in `--mode refine`, a file without free flags) has
most likely been refined against those reflections, and its R-free as given does not compete.
Where the model has copies (§15.5), the NCS restraints are one more weight: every rung of the first ladder is run
+1 -2
View File
@@ -364,8 +364,7 @@ the reflections it was refined against (the deposited `-sf.cif`, or an MTZ) and
`-z` it fixes no group, cell or frame and steers no processing. The flags are put on the merge once it is on the
model's axes, where the merge matches the file's intensities as `-z` requires (CC at least 0.5 over at least half
of its reflections); the validation is then made again on them, and the refinement and the merged files carry
them. `R_FREE_FLAGS=` says which set `R_FREE` and the refinement used: `DRAWN`, `REFERENCE` (`-z`) or `FILE`. A
model placed as given and scored on a set drawn here is warned about (`MODEL_FREE_SET`).
them. `R_FREE_FLAGS=` says which set `R_FREE` and the refinement used: `DRAWN`, `REFERENCE` (`-z`) or `FILE`.
**What is fitted on which reflections.** Everything fitted to place and scale the model — the
overall scale, the anisotropic *B*, the bulk solvent, the rigid body — is fitted on the working
+1 -1
View File
@@ -287,7 +287,7 @@ hundred lines.
consumer switches on a code rather than parsing a sentence: `NO_LATTICE`, `INDEXING_AMBIGUITY`,
`SYMMETRY_AMBIGUITY`, `CENTERING_UNTESTED`, `UNUSABLE_MERGE`, `LOW_COMPLETENESS`, `SWEEP_GAPS`,
`GONIO_SCALE`, `SPINDLE_CAP`, `ANISOTROPY`, `TWINNING`, `PSEUDO_TRANSLATION`,
`LATTICE_TRANSLATION`, `MODEL_HAND`, `MODEL_NOT_VALIDATED`, `MODEL_FREE_SET`, `MODEL_SPACE_GROUP`, `REFERENCE_MISMATCH`, `CANCELLED`, `RESOLUTION_FIT`,
`LATTICE_TRANSLATION`, `MODEL_HAND`, `MODEL_NOT_VALIDATED`, `MODEL_SPACE_GROUP`, `REFERENCE_MISMATCH`, `CANCELLED`, `RESOLUTION_FIT`,
`FLIGHT_PATH`, `GEOMETRY_NOT_CONVERGED`, `SCALING_NOT_CONVERGED`, `HARMONIC_CONTAMINATION`,
`SUPERCELL_POSSIBLE`, `MULTIPLE_LATTICES`, `LATTICE_EXPLAINS_FEW_SPOTS`, `CELL_FORMS`, `ICE_RINGS`, `POWDER_RINGS`, `BEAM_CENTRE_OFF`, `OVERLOADS`, `OVERLAPS`, `SWEEP_LEFT_OUT`. `NONE` when nothing fired. A code appears if and only if its
warning fired, so the flags and the `WARNING:` lines are two renderings of one list. Thresholds are
-1
View File
@@ -36,7 +36,6 @@ namespace PathologyCode {
constexpr const char *TWINNING = "TWINNING"; // twinning indicated
constexpr const char *MODEL_HAND = "MODEL_HAND"; // data and model in opposite hands
constexpr const char *MODEL_NOT_VALIDATED = "MODEL_NOT_VALIDATED"; // a model was given, not usable
constexpr const char *MODEL_FREE_SET = "MODEL_FREE_SET"; // the model as given was scored on a free set drawn here
constexpr const char *MODEL_SPACE_GROUP = "MODEL_SPACE_GROUP"; // the model's group replaced the one fixed with -S
constexpr const char *REFERENCE_MISMATCH = "REFERENCE_MISMATCH"; // the reference MTZ does not match; free flags not inherited
constexpr const char *CANCELLED = "CANCELLED"; // the run did not finish
+2 -16
View File
@@ -5249,20 +5249,6 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) {
}
}
placed_by_rigid_body = validation.ok && validation.model_fits;
// A model placed as given was refined, most likely, against reflections of this crystal - the deposited
// ones, or an earlier dataset's - and so has seen every reflection of a free set drawn here.
if (placed_by_rigid_body && result.free_flags_source == "DRAWN") {
std::string msg = "R-free may not be a free statistic: the free set was drawn by this run, and a model "
"refined against these reflections (a deposited model, or one refined against earlier "
"data of this crystal) has been fitted to all of them";
msg += config_.free_flags.empty()
? ". Give the reflections it was refined against with --free-flags <mtz|sf.cif> to take their test set"
: fmt::format(". The --free-flags file does not match these data on the model's axes (CC {:.3f} "
"over {:.0f}% of the merged reflections), so its test set was not taken",
free_flags_match.cc, 100.0 * free_flags_match.matched_fraction);
logger.Warning("{}", msg);
result.warnings.push_back({PathologyCode::MODEL_FREE_SET, msg});
}
// The coordinates that go with the maps just written, in the frame the reflection files
// beside them carry. Written whenever the validation ran, not only where the rigid-body
// step moved the model: it is also re-fractionalized into the data cell and may be
@@ -5633,8 +5619,8 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) {
// refinement takes a law at a smaller lead over its null (AdoptTwinLaw).
settings.twin_data_indicated = TwinningVerdictKey(result) == "INDICATED"
&& result.twinning.twin_fraction_source == TwinFractionSource::LTest;
// a model placed as given on a free set drawn here has seen those reflections (MODEL_FREE_SET): its R-free
// as given is no free statistic to keep it by
// a model placed as given on a free set drawn here was most likely refined against those reflections: its
// R-free as given is no free statistic to keep it by
settings.as_given_competes = !(result.model_placement == "RIGID_BODY" && result.free_flags_source == "DRAWN");
const PlacedModelOutput p = *placed_model_out; // a copy: a rival taken below replaces *placed_model_out
// In the group RefinableIn chose: the model's own where it has the rotations of the group written -