Battery: cytochrome C sets are scored against our own reference model

The in-house cytochrome C crystals are bovine heart cytochrome c in a form
with no deposited entry: P 32 2 1, three molecules per asymmetric unit (two
related by a 33% pseudo-translation 0.30 0.70 0.33), c 86.0-88.6 between
crystals. Neither 8RKP (cytochrome c', P 62 2 2: Laue -3m1 data, 6/mmm CC 0.5)
nor 6FF5 (H32: R-forbidden reflections as strong as allowed) is this form.

Phaser with 6FF5 places three copies in P 32 2 1 (LLG 11375 against 10483 in
P 31 2 1; refined R-free 0.310 against 0.345); no CB density at 60/89 says
bovine. Each set gets its own model, refined with phenix.refine against its
XDS data with rugnux's free flags and stored beside the data as
reference_model.cif: one model placed in the other crystals loses ~5 points of
R-free to the 3% spread in c. Refined R-free 0.340 / 0.296 / 0.286.

A set's `model` may now name an mmCIF file beside its data; rfree_deposited
is that file's own _refine R-free.

rugnux --model R-free (6FF5 -> own model): cytc_x10sa 0.505 -> 0.357,
cytc_x06da_1 0.486 -> 0.335, cytc_x06da_2 0.479 -> 0.306; anomalous mean
sigma at the irons 1.7 -> 2.7, 3.3 -> 5.4, 4.1 -> 6.3. Processing unchanged.

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:
2026-10-05 10:14:46 +02:00
co-authored by Claude Opus 5.5
parent 442cf8889d
commit 0d31d60f3e
4 changed files with 20 additions and 9 deletions
+4 -2
View File
@@ -104,7 +104,9 @@ the reference:
data's own determination instead (`SOHNCKE_SPACE_GROUP` where `SPACE_GROUP_ENANTIOMORPH` is
`ASSUMED_FROM_MODEL`) and keeps the label in `sg_label`.
- **`--model`** (in-house standard proteins): a set may name the PDB entry of its crystal form in
its `model` field; it is fetched and cached like an open-arm entry and passed to `--model`, so
its `model` field - or an mmCIF file beside its data, for a crystal form with no deposited entry
(`rfree_deposited` is then the file's own `_refine` R-free); it is fetched and cached like an
open-arm entry and passed to `--model`, so
the row carries the same model fields (`rfree`, `rmodel_shell_scaled`, `rfree_deposited`,
`rfree_ratio`, `anom_sigma`, ...) - quality on an external yardstick beside the XDS statistics.
They are reported, never scored: the arm is scored against XDS exactly as without them. One
@@ -117,7 +119,7 @@ the reference:
| `thau*` (P4₁2₁2) | 5A47 | thaumatin from *T. daniellii*, 1.2 Å, a 57.9 c 150.6 (6G89, 2.4 Å: R-free +0.06) |
| `insu_I*` (I2₁3) | 2BN3 | bovine insulin, cubic, 1.4 Å, 100 K, a 77.9 (9INS, pig, a 78.9, no R-free deposited: R-free +0.07) |
| `insu_H*` (H3) | 4E7T | bovine T6 2Zn insulin, 1.4 Å, a 81.0 c 33.5 (1MSO, human: R-free +0.08 - our insulin is bovine) |
| `cytc*` (P3₁21 / P3₂21) | 6FF5 | bovine heart cytochrome c at high ionic strength, H32, a 83.4 c 92.5. Our crystals are a primitive relative of that form - the R centring survives as a pseudo-translation (TNCS, 1/3 2/3 1/3) and c is 4-6% shorter - so the model explains the centred part only and R-free stays near 0.48; the heme iron is still the strongest anomalous peak (17 sigma). Trend only. (8RKP, the cytochrome c' whose P6₂22 cell matches ours, does not fit: R-free 0.63, no density at the iron) |
| `cytc*` (P3₂21) | `reference_model.cif` beside each set's data | bovine heart cytochrome c in a form with no deposited entry: P3₂21, three molecules in the asymmetric unit (two related by a pseudo-translation 0.30 0.70 0.33), c 86.0-88.6 between crystals. Our own model, placed by molecular replacement with 6FF5 and refined against each set's XDS data with rugnux's free flags - one per set, because the 3% spread in c costs a single model ~5 points of R-free in the other crystals. The data cannot tell the hand: the model's settles it. `rfree_deposited` is the R-free of that refinement |
| `myob*` (P2₁) | 4DC8 | horse heart myoglobin (b 28.8 Å; sperm whale's P2₁ form has b 30.8), met form with sulfate, 1.5 Å, 100 K, a 35.4 b 28.8 c 63.1 β 106.1 - our setting; the unexposed control of its deposition, so no ligand or modified heme (5ZZE, same form, R-free 0.235 vs 0.233) |
- **`--report-resolution`** (XDS arms): a second statistics table from the same merge, binned over
+5 -1
View File
@@ -326,7 +326,11 @@ def failure_note(log):
def deposited_model(e, opts):
"""(deposition record from model_check's RCSB cache, None) for the entry a set belongs to, or
(None, why not). A set id may carry a suffix (6h2p_native); the entry is the part before it.
An in-house set names the entry of its crystal form in its `model` field instead."""
An in-house set names the entry of its crystal form in its `model` field instead, or an mmCIF
file beside its data: a reference model of our own, refined against that set."""
local = os.path.join(os.path.dirname(e["input_path"]), e.get("model") or "")
if e.get("model") and os.path.isfile(local):
return model_check.refinement_record(e["model"], local), None
pdb = (e.get("model") or e["id"].split("_")[0]).lower()
if not PDB_ID.match(pdb):
return None, "no model: not a PDB entry (small molecule or unpublished set)"
+3 -3
View File
@@ -27,9 +27,9 @@
{"id": "insu_I_x06da_5keV", "input": "insu_I_x06da_5keV/Ins_I_6_006_master.h5", "wavelength": 2.47923, "ref": {"sgno": 197, "cell": [77.785, 77.785, 77.785, 90.0, 90.0, 90.0], "anomalous": true, "isa": 17.54, "completeness": 91.7, "r_meas": 0.073, "cc_half": 0.999, "multiplicity": 11.17, "dmin_low": 7.21, "r_meas_low": 0.048, "dmin": 2.45, "dmin_rule": "xds_range", "dmin_xds": 2.45, "dmax": 50.0}, "tags": ["h5", "insulin", "long-wavelength"], "model": "2bn3"},
{"id": "insu_I_x06da_6keV", "input": "insu_I_x06da_6keV/Ins_I_6_004_master.h5", "wavelength": 2.06648, "ref": {"sgno": 197, "cell": [77.71, 77.71, 77.71, 90.0, 90.0, 90.0], "anomalous": true, "isa": 17.95, "completeness": 92.4, "r_meas": 0.065, "cc_half": 0.999, "multiplicity": 12.42, "dmin_low": 6.03, "r_meas_low": 0.047, "dmin": 2.04, "dmin_rule": "xds_range", "dmin_xds": 2.04, "dmax": 50.0}, "tags": ["h5", "insulin", "long-wavelength"], "model": "2bn3"},
{"id": "insu_I_x06da_5keV_2", "input": "insu_I_x06da_5keV_2/Ins_I_7_001_master.h5", "wavelength": 2.47923, "ref": {"sgno": 197, "cell": [77.694, 77.694, 77.694, 90.0, 90.0, 90.0], "anomalous": true, "isa": 20.01, "completeness": 91.8, "r_meas": 0.076, "cc_half": 0.999, "multiplicity": 12.73, "dmin_low": 7.21, "r_meas_low": 0.048, "dmin": 2.45, "dmin_rule": "xds_range", "dmin_xds": 2.45, "dmax": 50.0}, "tags": ["h5", "insulin", "long-wavelength"], "tiers": {"smoke": "cubic insulin at 5 keV (long wavelength), fast"}, "model": "2bn3"},
{"id": "cytc_x10sa", "input": "cytc_x10sa/cytC_10_002_master.h5", "wavelength": 0.99989, "ref": {"sgno": 152, "cell": [83.659, 83.659, 86.011, 90.0, 90.0, 120.0], "anomalous": true, "isa": 31.75, "completeness": 99.8, "r_meas": 0.232, "cc_half": 0.999, "multiplicity": 10.65, "dmin_low": 6.05, "r_meas_low": 0.036, "dmin": 2.267, "dmin_rule": "cc_half_0.30", "dmin_xds": 2.039, "dmax": 50.0}, "tags": ["h5", "cytochrome-c"], "model": "6ff5"},
{"id": "cytc_x06da_1", "input": "cytc_x06da_1/cytC_2_0770b5_master.h5", "wavelength": 0.95375, "ref": {"sgno": 152, "cell": [83.836, 83.836, 86.733, 90.0, 90.0, 120.0], "anomalous": true, "isa": 24.49, "completeness": 99.9, "r_meas": 0.084, "cc_half": 0.999, "multiplicity": 7.67, "dmin_low": 5.58, "r_meas_low": 0.033, "dmin": 1.875, "dmin_rule": "xds_range", "dmin_xds": 1.875, "dmax": 50.0}, "tags": ["h5", "cytochrome-c"], "model": "6ff5"},
{"id": "cytc_x06da_2", "input": "cytc_x06da_2/cytC_3_874285_master.h5", "wavelength": 0.95375, "ref": {"sgno": 152, "cell": [83.719, 83.719, 88.617, 90.0, 90.0, 120.0], "anomalous": true, "isa": 26.98, "completeness": 99.9, "r_meas": 0.097, "cc_half": 0.999, "multiplicity": 7.82, "dmin_low": 5.03, "r_meas_low": 0.032, "dmin": 1.69, "dmin_rule": "xds_range", "dmin_xds": 1.69, "dmax": 50.0}, "tags": ["h5", "cytochrome-c"], "model": "6ff5"},
{"id": "cytc_x10sa", "input": "cytc_x10sa/cytC_10_002_master.h5", "wavelength": 0.99989, "ref": {"sgno": 152, "cell": [83.659, 83.659, 86.011, 90.0, 90.0, 120.0], "anomalous": true, "isa": 31.75, "completeness": 99.8, "r_meas": 0.232, "cc_half": 0.999, "multiplicity": 10.65, "dmin_low": 6.05, "r_meas_low": 0.036, "dmin": 2.267, "dmin_rule": "cc_half_0.30", "dmin_xds": 2.039, "dmax": 50.0}, "tags": ["h5", "cytochrome-c"], "model": "reference_model.cif"},
{"id": "cytc_x06da_1", "input": "cytc_x06da_1/cytC_2_0770b5_master.h5", "wavelength": 0.95375, "ref": {"sgno": 152, "cell": [83.836, 83.836, 86.733, 90.0, 90.0, 120.0], "anomalous": true, "isa": 24.49, "completeness": 99.9, "r_meas": 0.084, "cc_half": 0.999, "multiplicity": 7.67, "dmin_low": 5.58, "r_meas_low": 0.033, "dmin": 1.875, "dmin_rule": "xds_range", "dmin_xds": 1.875, "dmax": 50.0}, "tags": ["h5", "cytochrome-c"], "model": "reference_model.cif"},
{"id": "cytc_x06da_2", "input": "cytc_x06da_2/cytC_3_874285_master.h5", "wavelength": 0.95375, "ref": {"sgno": 152, "cell": [83.719, 83.719, 88.617, 90.0, 90.0, 120.0], "anomalous": true, "isa": 26.98, "completeness": 99.9, "r_meas": 0.097, "cc_half": 0.999, "multiplicity": 7.82, "dmin_low": 5.03, "r_meas_low": 0.032, "dmin": 1.69, "dmin_rule": "xds_range", "dmin_xds": 1.69, "dmax": 50.0}, "tags": ["h5", "cytochrome-c"], "model": "reference_model.cif"},
{"id": "myob_x10sa", "input": "myob_x10sa/MyoB_13_110ee0_master.h5", "wavelength": 0.99988, "ref": {"sgno": 4, "cell": [35.229, 28.461, 63.076, 90.0, 106.504, 90.0], "anomalous": true, "isa": 5.21, "completeness": 97.7, "r_meas": 0.247, "cc_half": 0.965, "multiplicity": 3.29, "dmin_low": 5.16, "r_meas_low": 0.186, "dmin": 1.742, "dmin_rule": "xds_range", "dmin_xds": 1.742, "dmax": 50.0}, "tags": ["h5", "myoglobin"], "model": "4dc8"},
{"id": "myob_x06da", "input": "myob_x06da/MyoB_9_446b70_master.h5", "wavelength": 0.95365, "ref": {"sgno": 3, "cell": [35.182, 28.544, 62.83, 90.0, 106.138, 90.0], "anomalous": true, "isa": 7.59, "completeness": 99.4, "r_meas": 0.232, "cc_half": 0.987, "multiplicity": 3.47, "dmin_low": 4.23, "r_meas_low": 0.105, "dmin": 1.422, "dmin_rule": "xds_range", "dmin_xds": 1.422, "dmax": 50.0}, "tags": ["h5", "myoglobin"], "tiers": {"smoke": "monoclinic myoglobin, screw not arbitrable by XDS"}, "ref_override": {"sg": "P 1 21 1", "sgno": 4}, "ref_override_why": "myoglobin, P 1 21 1. XDS does not judge screw axes (it reports P 2)", "model": "4dc8"},
{"id": "myob_x06da_powder_1", "input": "myob_x06da_powder_1/MyoB2-1_75979a_master.h5", "wavelength": 0.95373, "ref": {"sgno": 1, "cell": [28.705, 34.796, 64.373, 74.314, 89.879, 90.057], "anomalous": false, "isa": 5.54, "completeness": 74.2, "r_meas": 0.493, "cc_half": 0.966, "multiplicity": 2.87, "dmin_low": 4.44, "r_meas_low": 0.125, "dmin": 1.495, "dmin_rule": "xds_range", "dmin_xds": 1.495, "dmax": 50.0}, "tags": ["h5", "myoglobin", "twin"], "tiers": {"smoke": "known hard: triclinic twin"}, "ref_override": {"sg": "P 1 21 1", "sgno": 4, "cell": [35.14, 28.88, 64.64, 90.0, 105.9, 90.0]}, "ref_override_why": "myoglobin, P 1 21 1. XDS indexed this sweep (a powder-contaminated crystal) in P 1 on a reduced cell (28.7 34.8 64.4 74.3 89.9 90.1); the monoclinic cell is that cell's conventional setting", "model": "4dc8"},
+8 -3
View File
@@ -86,6 +86,13 @@ def deposition(pdb_id, cache_dir):
return None
if os.path.exists(meta_path):
return json.load(open(meta_path))
meta = refinement_record(pdb_id, xyz)
json.dump(meta, open(meta_path, "w"), indent=1)
return meta
def refinement_record(name, xyz):
"""The refinement statistics an mmCIF coordinate file states about itself (_refine)."""
block = gemmi.cif.read(xyz).sole_block()
methods = [m.strip("'\"") for m in block.find_values("_exptl.method")]
rows = block.find("_refine.", ["pdbx_refine_id", "?ls_R_factor_R_free", "?ls_R_factor_R_work",
@@ -95,10 +102,8 @@ def deposition(pdb_id, cache_dir):
if "X-RAY" in row.str(0).upper():
ref = {k: (float(row[i]) if row.has(i) and gemmi.cif.is_null(row[i]) is False else None)
for k, i in (("rfree", 1), ("rwork", 2), ("dmin", 3))}
meta = {"id": pdb_id, "methods": methods, "rfree": ref.get("rfree"), "rwork": ref.get("rwork"),
return {"id": name, "methods": methods, "rfree": ref.get("rfree"), "rwork": ref.get("rwork"),
"dmin": ref.get("dmin"), "xyz": xyz}
json.dump(meta, open(meta_path, "w"), indent=1)
return meta
# ------------------------------------------------------------------ lattice / setting matching