From 12efbc1beb57ac2fcf750868f2bedfe8e990d59a Mon Sep 17 00:00:00 2001 From: leonarski_f Date: Fri, 10 Jul 2026 13:01:05 +0200 Subject: [PATCH] rugnux: emit non-standard mmCIF items under a "jfjoch" reserved prefix, not pdbx_ ISa and the twinning indicators (L-test means, second moment of I) have no standard mmCIF item. They were written as _reflns.pdbx_* names, borrowing the wwPDB PDBx/mmCIF dictionary's reserved prefix and so masquerading as standard items the dictionary does not actually define. Move them to the IUCr-sanctioned local-data-name extension: a private reserved prefix on the attribute of the existing _reflns category (_reflns.jfjoch_*), matching the DDL2 pattern the spec gives for private items. Write-only tags with no reader, so this is a self-contained, back-compatible rename. Co-Authored-By: Claude Opus 4.8 --- image_analysis/WriteReflections.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/image_analysis/WriteReflections.cpp b/image_analysis/WriteReflections.cpp index 15348a57..c2e10d7d 100644 --- a/image_analysis/WriteReflections.cpp +++ b/image_analysis/WriteReflections.cpp @@ -119,8 +119,11 @@ void WriteMmcifReflections(const std::vector &reflections, // ---------- merging statistics (_reflns overall + _reflns_shell loop) ---------- // cc_half and r_meas are stored as fractions (0-1), which is the mmCIF convention. ISa (the - // Diederichs asymptotic I/sigma, 1/b of the a*sigma^2 + (b*I)^2 error model) has no standard CIF - // item, so it is written as a free-text pdbx value. + // Diederichs asymptotic I/sigma, 1/b of the a*sigma^2 + (b*I)^2 error model) and the twinning + // indicators below have no standard mmCIF item. They are written under the "jfjoch" reserved + // prefix (_reflns.jfjoch_*), the IUCr-sanctioned local-data-name extension for private items - + // NOT the "pdbx_" prefix, which is owned by the wwPDB PDBx/mmCIF dictionary and must not label + // items that dictionary does not define. (The other pdbx_ items here are genuine PDBx items.) const auto mult = [](const MergeStatisticsShell &s) { return s.unique_reflections > 0 ? static_cast(s.total_observations) / s.unique_reflections : 0.0; }; const auto compl_pct = [](const MergeStatisticsShell &s) { @@ -137,16 +140,16 @@ void WriteMmcifReflections(const std::vector &reflections, out << "_reflns.pdbx_netI_over_sigmaI " << Fmt(ov.mean_i_over_sigma, 2) << "\n"; out << "_reflns.pdbx_Rrim_I_all " << Fmt(ov.r_meas, 4) << "\n"; out << "_reflns.pdbx_CC_half " << Fmt(ov.cc_half, 4) << "\n"; - out << "_reflns.pdbx_diffrn_ISa " << CifStr(isa) << " # asymptotic I/sigma (Diederichs)\n"; - // Twinning indicators (no standard CIF item, written as free-text pdbx values like ISa above). + out << "_reflns.jfjoch_diffrn_ISa " << CifStr(isa) << " # asymptotic I/sigma (Diederichs)\n"; + // Twinning indicators (no standard mmCIF item; same jfjoch local prefix as ISa above). if (twinning.l_test_pairs > 0) { - out << "_reflns.pdbx_L_test_mean_abs_L " << Fmt(twinning.mean_abs_l, 3) + out << "_reflns.jfjoch_L_test_mean_abs_L " << Fmt(twinning.mean_abs_l, 3) << " # Padilla-Yeates <|L|> (untwinned 0.500, perfect twin 0.375)\n"; - out << "_reflns.pdbx_L_test_mean_L_squared " << Fmt(twinning.mean_l_squared, 3) + out << "_reflns.jfjoch_L_test_mean_L_squared " << Fmt(twinning.mean_l_squared, 3) << " # (untwinned 0.333, perfect twin 0.200)\n"; } if (twinning.moment_reflections > 0) - out << "_reflns.pdbx_second_moment_I " << Fmt(twinning.second_moment, 3) + out << "_reflns.jfjoch_second_moment_I " << Fmt(twinning.second_moment, 3) << " # /^2 (untwinned 2.00, perfect twin 1.50)\n"; out << "#\n";