Skip to content

Dev - #57

Merged
HatPdotS merged 20 commits into
mainfrom
dev
Aug 12, 2026
Merged

Dev#57
HatPdotS merged 20 commits into
mainfrom
dev

Conversation

@HatPdotS

@HatPdotS HatPdotS commented Aug 7, 2026

Copy link
Copy Markdown
Owner
  • Added switch to turn off caching mixin
  • Switched the ADP distribution restraint from a Gaussian in log(B) to the shifted inverse-gamma distribution of Masmaliyeva & Murshudov (2019)
  • Reworked outlier rejection to follow wilson criteria
  • Reworked free flag generation so Friedel pairs get matching flags
  • Fixed breaking bug were sigma_A estimation did not work on mps

HatPdotS and others added 20 commits August 7, 2026 11:12
Measured R-factor deltas, structure counts, p-values, and GPU/hardware
speedups/timings are removed from docstrings and comments across the package;
such results belong in the paper, not the code, where they go stale. Also drops
the incorrect 'ml_noalpha is best on R_free' docstring claims. No behavioural
change (docstrings/comments only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The monomer library defines each amino acid free — ALA carries OXT and a
protonated N, with carboxylate and ammonium geometry — and the in-chain form
comes from the modifications the chem_link table names (DEL-OXT on the residue
donating its C, DEL-HN1 or DEL-HNP on the one donating its N). Those chem_mod
records were never read, so every linked residue kept its free-amino-acid
restraints.

The result was not merely a shifted target but an unreachable geometry: around a
peptide carbonyl carbon the restrained CA-C-O, CA-C-N and O-C-N summed to
356.53° while the same carbon was restrained planar. With the modification
applied they sum to exactly 360°, and likewise at the amide nitrogen
(350.88° -> 360°).

On deposited 1DAW the corrected targets move CA-C-O 117.15 -> 120.614°,
CA-N-H 109.6 -> 118.729°, N-CA 1.488 -> 1.453 Å and C=O 1.251 -> 1.229 Å,
dropping the bond RMSD from 0.0182 to 0.0131 Å and mean |z| from 1.14 to 0.83.
Chain termini are left unmodified, so a real C-terminus keeps its OXT.

- modifications.py parses the data_mod_* blocks and applies add/change/delete
  to bonds, angles, torsions, planes and chirals, matching atoms
  order-insensitively
- the intra-residue builders take an optional per-residue key so a linked and a
  terminal residue of the same type draw from different components
- the four duplicated copies of the residue-pairing helpers are hoisted to
  module level, so the modification assignment and the link builders cannot
  disagree about what a peptide pair is
- mon_lib_list.cif is parsed once per process instead of once per build

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every data-driven figure was last produced on 2026-08-05 by a build that had since
moved on. This is a single-build regeneration: the old result directories were
deleted first so no stale run could be mistaken for a current one, every benchmark
re-run, and all eight plots re-rendered with their source-data CSVs and
FIGURE_MEDIANS.md.

Figure 2 (AF-start benchmark), conserved set n=723, PHENIX-scored. Run accounting
per arm: af_initial 759/8, phenix 760/7, refmac 734/33, torchref 748/19. The PHENIX
and AF-start arms came back bit-identical to the archive (734/734 and 759/759 ties),
which is the null control that makes the rest of the comparison readable.

The gap to REFMAC widened by +0.0019 paired R-free, of which +0.0016 is REFMAC
itself moving 7.1 -> 8.0 (the AFS 7.1 install disappeared cluster-wide mid-rerun, so
this was forced rather than chosen) and only +0.0003 is TorchRef 0.6.3. That split is
attributable because PHENIX scoring is deterministic and unchanged.

Figure 3a/3b pinned to cpu_xeon6230R, generation-matched to the A100 the quoted
speedup depends on. The unchanged cctbx single-thread control reproduces the archive
within ~1% on 9 of 10 structures (max 3%), so the measurement did not drift.

ExtFig 1: 100-cell weight grid x 47 structures; the locked default
(geometry 0.2154 / adp 0.02154) still wins -- not one of the other 99 cells beats it
on paired R-free with a 95% bootstrap CI excluding zero. ExtFig 5: n=748,
ml 0.3201 < ml_full 0.3211 < ml_noalpha 0.3247 < nll_beta 0.3258.

figure_weight_screen.png is deleted rather than regenerated: the weight landscape is
exF1/output/extended_figure1.png, and keeping a second stale copy in the figure2
directory invites citing the wrong one.

Also fixes source-data corruption in figure_source_data.rounded(), which passed PDB
codes through float(): '3E98' became '3e+98'. Present in the archived CSVs too.

NB the plot and analysis scripts that generated these outputs are modified but are
NOT in this commit, so it is not self-reproducing on its own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ldd5qF6gWrhgHMiv7FcfW1
Commit 461d502b added the figures, source-data CSVs and FIGURE_MEDIANS.md but not the
code that produces them, so it could not regenerate itself. This closes that, narrowly:
given the benchmark runs, these eleven files reproduce every committed output. Nothing
that *creates* runs or inputs is included -- submitters, worklist builders and the
pipeline driver stay out, since the runs are deliberately not in the repository.

paper/figure_source_data.py was untracked, which was the load-bearing gap: all seven
plot scripts do `from figure_source_data import dump`, so without it none of them import
and none of the committed CSVs can be rebuilt.

The chain per figure, all of it now tracked:
  Figure 2, ExtFig 5   aggregate_figure_metrics.py -> plot_figure_af.py
  Figure 3a/3b         plot_figure3a.py / plot_figure3b.py (read the results dirs)
  ExtFig 1             aggregate_weight_grid.py (already tracked) -> plot_exF1.py
  ExtFig 2             collect_exF2_data.py (already tracked) -> plot_exF2.py
  ExtFig 3             aggregate_crossscore.py (already tracked) -> plot_exF3.py
  ExtFig 4             aggregate_singlecore.py -> plot_singlecore.py
  FIGURE_MEDIANS.md    summarize_medians.py

figure_source_data.dump() refuses to write a zero-row file, so an empty panel surfaces as
an error rather than a plausible-looking CSV. It also short-circuits on str, without
which PDB codes went through float() and '3E98' became '3e+98' -- the corruption fixed in
461d502b.

Run-derived intermediates (exF2/data, exF4/data, results.csv) are left uncommitted: they
are outputs of the aggregation step above, not code, and are rebuilt from the runs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ldd5qF6gWrhgHMiv7FcfW1
`.out` and `.err` were literal filenames, not `*.out` / `*.err`, so they matched nothing
and every SLURM log in the tree showed up as untracked and committable: 10,820 of them
under paper/ alone. One `git add -A` would have put all of them in the repository.

Also ignores the result and snapshot directories the submitters regenerate (paper/archive,
figure3_performance/archive, SF_calc_comparison/results_*, data/*/results_*), and
generalises the per-structure run-output rule from paper/extended_figures/*/runs/ to
paper/*/runs/, which is where scaling_benchmark and seeded_warm_corefine put theirs.

Untracked files under paper/ drop from >10,820 to 360, and what remains is visible rather
than buried: mostly small ancillary scripts that are genuinely uncommitted work. Nothing
already tracked is affected -- the 73 files under data/fcalc/results_20260805_124020/ stay
tracked, since .gitignore does not untrack.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ldd5qF6gWrhgHMiv7FcfW1
The front-page benchmark caption still described the pre-0.6.3 run while the figure above it
had already been regenerated, so the two disagreed. Notably it said the restraints ran
"slightly looser than PHENIX/REFMAC (bond RMSZ ~1.3)" when bond RMSZ is now 0.58, matching
REFMAC and tighter than PHENIX. Every number is taken from paper/FIGURE_MEDIANS.md: R-free
0.3197 / 0.3165 / 0.3136, paired median differences +0.0006 and +0.0047, geometry RMS Z,
runtime 0.77 / 0.25 / 3.09 min, n=723, 1.40-3.00 A. Each panel now states what it plots.

Installation recommends a partial + sparse clone. A plain clone is ~436 MB, of which only
~50 MB is the library; the rest is paper/ history, and figure4_difference_refinement alone is
57% of the repository. The recommended command fetches ~40 MB. Measured, not estimated, and
the flow was verified end to end: the sparse clone installs (pyproject.toml is present in cone
mode) and `git sparse-checkout add paper` recovers the paper material without re-cloning.

Also drops em-dashes from the prose, keeping them in the feature bullet and notebook table
where they separate a label from its description.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ldd5qF6gWrhgHMiv7FcfW1
Forwarding dev to make sure main changes are compatible
@HatPdotS
HatPdotS merged commit 0053149 into main Aug 12, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant