A change that touches partiality - a mosaicity estimator, a rocking-curve model, a background change - cannot be judged by the statistics we normally reach for, and this was learned the expensive way. ISa is anti-correlated with external accuracy and is the largest mover of any statistic; last-shell R_meas moves with its denominator, i.e. the wrong way by construction; `--model` R-free tracks its own zero-information floor, which shifts ~22x more than R-free itself over the same sweep; and per-shell agreement with XDS is biased, because XDS never divides by partiality, so "divide less" moves us toward it mechanically - measured to put the optimum ~1.4x too low. Anomalous difference density at known scatterer sites has none of those problems. It is read in units of the map's own sigma, so the uniform intensity rescale a partiality change produces cancels exactly, and it is referenced to the structure rather than to another program's partiality model. The script runs SHELXC + ANODE per arm against a model placed ONCE and then held fixed, and reports the mean site height, the off-site noise floor, and the paired per-site change between arms. Numeric arm labels turn a set of arms into a curve with a per-dataset optimum. The dataset table lives outside the repository, as rugnux_vs_xds.py already does for the battery, because dataset and sample identities are not committed. It reproduces the measurements it was built from: all nine points of three pooled curves, every per-crystal optimum, the site heights, the paired t statistics, and the adversarial control in which a model refined against the worst arm reproduces the curves to <=0.005 and the same optimum on 4/4. Four things the ad-hoc scripts it replaces got wrong, all now handled: * Keying sites on the ANODE atom label silently drops an alternate conformation sharing that label - one dataset class has 18 sulfur sites, not 17, and the uncorrected mean read 15.03 against a true 14.49. * The off-site floor skipped any peak within 1.0 A of ANY atom, so a ripple sitting on a light atom was not counted as background; requiring 1.5 A from an anomalous scatterer raises one floor from 7.12 to 9.48 sigma. * Special-position peaks are Fourier ripples, not background. Excluding them is load-bearing on 3 of 9 datasets and they are now reported in their own column rather than dropped silently. * Enantiomorph care turned out to be unnecessary - passing the merged file's screw label to ANODE while the model sits in the other hand gives byte identical peaks. What does matter is the pair whose absences are identical, I23 vs I2_13, which phaser's automatic hand test does not cover. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
34 lines
1.0 KiB
Plaintext
34 lines
1.0 KiB
Plaintext
cmake-build-debug/
|
|
cmake-build-release/
|
|
build*/
|
|
python-client/
|
|
openapi-generator-cli.jar
|
|
|
|
# make_doc.sh: rendered HTML (default output dir) and the throw-away venv it builds in. The venv is
|
|
# normally deleted at the end, but stays behind when the build fails.
|
|
public/
|
|
tmp_venv/
|
|
|
|
# gen_python_client.sh: the built sdist/wheel.
|
|
/dist/
|
|
|
|
# rugnux_vs_xds.py output dirs (the default, and the ad-hoc ones used when comparing runs)
|
|
rugnux_cmp*/
|
|
|
|
# rugnux_anomalous.py ANODE work dir, when the config does not point it at the data
|
|
rugnux_anomalous*/
|
|
!rugnux_anomalous.py
|
|
|
|
# Processing output and the data it came from. These are USER DATA: a merged .mtz/.cif or a model
|
|
# carries a sample's measured unit cell, and its filename usually carries the sample's name - neither
|
|
# of which may enter this repository (see CLAUDE.md). They accumulate in the working tree while
|
|
# testing, so keep them un-addable rather than relying on everyone typing the right paths.
|
|
*.mtz
|
|
*.cif
|
|
*.pdb
|
|
*.hkl
|
|
*_image.dat
|
|
|
|
# Test fixtures are checked in deliberately; add them with an explicit path.
|
|
!tests/**
|