Commit Graph
1262 Commits
Author SHA1 Message Date
leonarski_fandClaude Opus 5.5 ee86aa4bfe Battery: the time figures can count more arms, and a second one zooms on the first 60 s
paper_plots.py --time-arms (default open, so the paper figures do not change) widens the time
histogram to e.g. the open and in-house arms; time_zoom is the same histogram over 0-60 s in 5 s
bins, with the sets beyond it counted in the label. Also brings 8xtg's accepted-alternative note in
open.json up to the zone read at the other twin laws' fraction.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-06 08:00:09 +02:00
leonarski_f 3770f42c90 Merge branch 'perf-scale-c1' into rc174
Build Packages / Create release (push) Successful in 16s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m26s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m32s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 8m57s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 10m20s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 10m55s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 13m28s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 18m3s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 18m13s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 18m57s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 24m48s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 24m26s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 19m36s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 21m8s
Build Packages / Generate python client (push) Successful in 26s
Build Packages / Build documentation (push) Successful in 1m14s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 21m17s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m40s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 20m46s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 19m42s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 20m16s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 16m12s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 13m49s
Build Packages / Unit tests (push) Successful in 1h19m51s
2026-10-05 20:10:28 +02:00
leonarski_fandClaude Opus 5.5 9c72235783 Docs: rewrite the beam-centre section from the code
CPU_DATA_ANALYSIS_IMAGE §1.4 now follows the decision flow in Rugnux.cpp:
header provenance lines, the background measurement on every run (capture
+ walk, what the check lines mean), the second first pass and its five
outcomes, the merge-judged arms (metric-symmetry, lean-depth and the
same-lattice inner-shell CC1/2 < 0.9 retry), the search after a failed
pass, the post-refinement bound, --estimate-beam-center's acceptance rule,
stills, report keys and options. Removes the stale "where both work and
disagree, neither is chosen" and the "centroid of the radial background
profile" fall-through.

RUGNUX_ADVANCED: --beam-center-check lists every adoption route and that it
still runs with --beam-x/--beam-y; --beam-center-search re-finds spots per
rung (the table said spot finding was not repeated); --estimate-beam-center
states its acceptance rule. OVERVIEW and TUTORIAL brought in line.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:51:35 +02:00
leonarski_fandClaude Opus 5.5 dfb7f119af Acknowledgement: d*TREK SMV reader credits Pflugrath (1999) and dxtbx
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:42:57 +02:00
leonarski_fandClaude Opus 5.5 d9f3b32d46 Docs: overloaded rocking events are in neither the unmerged MTZ nor the .hkl
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:38:46 +02:00
leonarski_fandClaude Opus 5.5 5ee839b271 Docs: the viewer's merge window - subscripted space group and the pathology checklist
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:37:05 +02:00
leonarski_fandClaude Opus 5.5 989b3cdc5d Docs: jfjoch_viewer opens marCCD and SMV sweeps as well as miniCBF
The File > Open filter and the image reader have taken the CCD formats
since rc.171; the viewer page still listed miniCBF only.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:36:49 +02:00
leonarski_fandClaude Opus 5.5 e9833936bc Docs: README names rugnux; install page on the GPU pre-scan and flag-independent results
The root README described only data acquisition. The install page now
lists the pre-scan and the correction surfaces among what runs on the GPU,
and says that -march changes speed and not results (floating-point
contraction is off project-wide).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:36:29 +02:00
leonarski_fandClaude Opus 5.5 ea9e926d20 Battery README: KDP among the in-house small-molecule standards
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:35:46 +02:00
leonarski_fandClaude Opus 5.5 b7a440bcbd Docs: verified DOIs for Wilson (1949) and Whittaker; centre-of-symmetry references
Both DOIs were resolved against doi.org/Crossref (title, volume and pages
match), so the "DOI not verified" notes go. The analysis reference's
References list gains Wilson / Howells-Phillips-Rogers and Baur & Kassner,
whose methods 13.1 now describes (CLAUDE.md: a method described there is
listed there as well as in ACKNOWLEDGEMENT.md).

Every other DOI in ACKNOWLEDGEMENT.md, the CPU_DATA_ANALYSIS* pages, the
RUGNUX* pages, README.md and the battery README resolves.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:34:59 +02:00
leonarski_fandClaude Opus 5.5 e2084895db Docs: data-analysis reference brought up to the rc.174 behaviour
Space group (13.1): every setting of a chosen rotation set is offered;
screws are claimed at 8 nats, with how that bound was set; the P1 search
merge is cut where a monotone fit of <I/sigma> drops under 1; the
operator-homogeneity gate reads the R gap between a subgroup and the rest;
a lattice-holohedral group is refused when merging under it narrows the
L-test like a twin.
Outliers (13.3): the rotation median is weighted at the expected
intensity, and the band's systematic part is multiplicative, with its
spread measured on the merge's own fulls.
Indexing: a sparse lattice is integrated on every frame; pass 1's lattice
is a hypothesis against a different re-index, and a pass sent back reuses
pass 1's indexing. Image: the flipped axis sign must beat chance; the
same-lattice beam-centre retry on an inconsistent merge.
Integration: five correction surfaces, not four; the .hkl carries no
amplitudes; the fulls' scale is smoothed differently from the partials'.
Tutorial: the correction surfaces are cross-validated on the half-set
correlation (as the reference says), not on an R_meas-like deviation.
Overview: the footprint, the 5 A indexing hypothesis, the centre of
symmetry, and the GPU pre-scan.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:34:31 +02:00
leonarski_fandClaude Opus 5.5 7f29215e71 rugnux: make the P1 cross-check merge beside the tail after the final merge
The P1 cross-check (p_P1.mtz, twin-immune zones, finalist ledger) was merged
after the reflection files were written, serially on the critical path of a
run without --model: in-house protein sets wait 0.3-1.5 s for it after tail
work (tNCS, twinning, Wilson, anisotropy, writing the merged files) that it
shares no data with, and on the largest sets the merge itself is 16-32 s.

It is now started as soon as the final merge is settled and taken where it is
used. What tied it to the main thread was the space group: the engine read it
from the shared experiment, which the caller flipped to P1 around the merge.
Run now takes the group explicitly (RotationScaleMerge::Group() at the 13 sites
that read the experiment's group), so the experiment is left alone. Nothing
between the launch and the join calls the engine, changes the outcomes it was
ingested from, or changes the experiment; the engine writes no per-frame scale
back for this merge. The merge is therefore the one made before, on the same
engine state. The engine's log goes to a held buffer replayed at the join, so
the log keeps one order.

With --model the same merge already ran beside the validation; that is now the
same path, taken before the validation's relabelling is applied.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:34:24 +02:00
leonarski_fandClaude Opus 5.5 420d5d5844 Rotation scaling: sort the outlier band's spread on all threads
The band spread (the weighted median |ln(I / median)| over the merge's fulls,
added with the measured band) sorted every usable full on one thread, in every
merge with outlier rejection. Equal pairs are the same two doubles, so
ParallelSort returns the serial sequence byte for byte and the median's prefix
sum runs in the same order. Measured side by side on the same input in every
merge of 6 in-house GPU runs: bytes identical in all calls; a thaumatin run
0.261 -> 0.089 s, a cytochrome C run 0.130 -> 0.040 s, summed over its merges.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:34:24 +02:00
leonarski_fandClaude Opus 5.5 17f3c48cfc Rotation scaling: sort the ASU keys on all threads
ComputeAsuGroups sorted one key per distinct raw hkl on one thread, once per
merge (6-8 merges a run). Ties are now broken on the run index, which makes the
order total, so ParallelSort returns the same sequence; and the result never
depended on the order within a tie (every run in it reduces to the same ASU
reflection). Measured on the GPU build, both sorts side by side on the same
input in every merge of 6 in-house runs: keys identical in all calls; a cytochrome C
run 0.230 -> 0.058 s, a thaumatin run 0.186 -> 0.058 s, summed over its merges.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:34:24 +02:00
leonarski_fandClaude Opus 5.5 fc358720ed Rotation scaling: skip the fulls-alone merge when the partials' merge decides
The first non-search merge on an ingest was made both ways (partials scaled, and
the scale from the fulls alone) and PartialScalingWins picked one. When the prior
is to scale the partials and that merge resolves its error model, the decision is
the prior whatever the other arm says, so the fulls-alone merge was a whole final
merge thrown away - 16% of all scaling time over the battery (238 of 258
decisions), e.g. ~1.5 s of a 22 s GPU run on an in-house cytochrome C set, 8-13 s on
the largest open-arm sets.

That arm is now made only when the partials' merge fails to resolve its error
model (then the old sequence runs unchanged) or when the prior is the fulls
(small molecules; unchanged). The partials' arm starts from g_partial = 1, the
only state the fulls-alone arm left for the arm after it (corr is restored,
g_full reset by the combine, device g/scaled cleared per call, the sweep /
rejection / damage diagnostics reset where they are measured), so the merge is
bit-identical to the one the pair returned.

The log's decision line no longer quotes the fulls-alone ISa when that merge is
not made.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:34:24 +02:00
leonarski_fandClaude Opus 5.5 e7c4cb128c Docs: results report - rejection counters, every CENTRE_STATISTICS key, build flags
- OBSERVATIONS_REJECTED / _WILSON / _OVERLOAD: what each counts and how
  they relate (the overload count is not part of OBSERVATIONS_REJECTED).
- CENTRE_STATISTICS_REFLECTIONS and the three per-statistic _F keys are
  named; NOT_APPLICABLE is stated as the code decides it (any of the three
  outside -0.3..1.3, or the control below 0.5).
- BUILD_CXX_FLAGS no longer says that -march moves the results: the build
  turns floating-point contraction off and the indexer's reductions no
  longer depend on SIMD width, so CPU levels agree. The RUGNUX_GIT and
  BUILD_CXX_FLAGS keys were also listed twice in the header paragraph.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:32:36 +02:00
leonarski_fandClaude Opus 5.5 39abdb9f58 Docs: processing small-molecule data, and taking it into SHELXT / SHELXL
Running Rugnux gains a "Small-molecule data" section: what the default run
does about short axes, wide and split spots, sparse patterns, overloads and
glide / centre-of-symmetry space groups, the two settings worth checking
(polarization on a laboratory source, the resolution cut), and what the
unmerged HKLF 4 file holds. Rugnux with other programs gains a worked
SHELXT -> SHELXL route (instruction file built from the report keys, what
SHELXL does with the unmerged file). The SHELXT/SHELXL commands were run on
a battery set's output to check they work as written.

The quick start's file list now includes <prefix>_detector.jpg, which every
default rotation run writes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:32:10 +02:00
leonarski_fandClaude Opus 5.5 d80579221b Docs: Rigaku d*TREK SMV headers; SMV saturation is read where stated
What Rugnux reads now describes the d*TREK vocabulary the SMV reader
learned in this release (pixel size, image directions, 2theta arm,
wavelength, encoded overflows), and no longer says that SMV never states a
saturation value: CCD_IMAGE_SATURATION / SATURATED_VALUE are read where
present.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:29:41 +02:00
leonarski_fandClaude Opus 5.5 db7cd6282e Docs: repair sigma_rho / sigma_tau in the spot-footprint paragraph
The backslash escapes \r and \t had been turned into a line break and a tab,
which broke the LaTeX and split the paragraph.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:23:41 +02:00
leonarski_fandClaude Opus 5.5 09ba6d7225 CHANGELOG: rc.174 Rugnux entries most important first; SMV reader with the home-source battery sets
Build Packages / Create release (push) Successful in 18s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m17s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m34s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 10m35s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 12m6s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 9m34s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 6m49s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 18m46s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 23m3s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 24m21s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 13m56s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 16m14s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 18m27s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 18m38s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m51s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 18m24s
Build Packages / Generate python client (push) Successful in 13s
Build Packages / Build documentation (push) Successful in 1m25s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 18m3s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 15m40s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 16m22s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 14m49s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 15m9s
Build Packages / Unit tests (push) Successful in 1h24m9s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:21:52 +02:00
leonarski_fandClaude Opus 5.5 e5e93893b6 CLAUDE.md: changelog entries are written only on the maintainer's request, once per branch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:21:52 +02:00
leonarski_fandClaude Opus 5.5 ca8eff396a CHANGELOG: rc.174 release notes
Build Packages / Create release (push) Successful in 18s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m16s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m36s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 9m7s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 10m5s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 11m18s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 13m50s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 17m35s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 18m38s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 19m55s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 24m4s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 24m42s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 19m39s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 21m1s
Build Packages / Generate python client (push) Successful in 21s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 20m40s
Build Packages / Build documentation (push) Successful in 1m30s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m18s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 20m41s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 19m23s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 20m56s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 20m42s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 19m29s
Build Packages / Unit tests (push) Successful in 1h44m19s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 16:15:28 +02:00
leonarski_f aa4455b18e Merge branch 'rc174-all3' into rc174
Build Packages / Create release (push) Successful in 17s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m24s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m33s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 8m38s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 10m32s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 10m30s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 13m6s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 18m19s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 19m13s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 19m33s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 23m49s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 24m43s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 20m45s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 19m3s
Build Packages / Generate python client (push) Successful in 22s
Build Packages / Build documentation (push) Successful in 1m2s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 20m56s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 20m41s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m17s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 19m1s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 19m32s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 17m42s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 14m0s
Build Packages / Unit tests (push) Successful in 1h18m36s
2026-10-05 14:51:27 +02:00
leonarski_fandClaude Opus 5.5 aeae9adb27 Docker: build Qt without JPEG and TIFF support
Build Packages / Create release (push) Successful in 17s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m15s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m32s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 8m17s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 10m48s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 10m56s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 12m38s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 18m28s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 19m2s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 19m37s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 25m0s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 25m35s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 17m47s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 19m23s
Build Packages / Generate python client (push) Successful in 32s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 19m53s
Build Packages / Build documentation (push) Successful in 1m20s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m33s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 21m5s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 19m4s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 19m57s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 15m37s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 17m4s
Build Packages / Unit tests (push) Successful in 1h20m34s
The viewer has its own libjpeg-turbo and libtiff; Qt's copies only risk being mixed into the
static link. Takes effect when the build images are rebuilt.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:47:55 +02:00
leonarski_fandClaude Opus 5.5 9459444b6a Viewer: link one libjpeg - drop Qt's JPEG and TIFF plugins
With the static Qt of the Linux viewer, QJpegPlugin brings Qt's bundled libjpeg-turbo
(3.1.4, JPEG_LIB_VERSION 80) next to ours from preview/ (3.2.0, ABI 62). Both export the
same jpeg_* symbols and the linker silently kept Qt's, so WriteJPEGToMem - compiled against
our headers - failed with "Wrong JPEG library version". In the viewer that aborted an
in-process rugnux run at the end, where _detector.jpg is collected. The rc173 artifact shows
it directly: jpeg_CreateCompress checks for 80 and the only libjpeg version string is 3.1.4.

The viewer now excludes Qt::QJpegPlugin and the unused Qt::QTiffPlugin (which bound to
whichever libtiff the link offered), and its clipboard copy and "Save image as JPEG" encode
through WriteJPEGToMem instead of QImage::save. The Linux viewer CI job checks the binary
holds no Qt JPEG/TIFF handler and exactly one libjpeg-turbo.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:47:55 +02:00
leonarski_f 379a24393e Merge branch 'dq-reg1' into rc174-all3 2026-10-05 10:22:27 +02:00
leonarski_f 51e612b54b Merge branch 'battery-cytc-model' into rc174-all3 2026-10-05 10:15:26 +02:00
leonarski_fandClaude Opus 5.5 9d1650680e Battery report: 8xtg's twin-immune zone is now read at the other twin laws' fraction
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 10:15:04 +02:00
leonarski_f 3167b4ce14 Merge branch 'battery-inhouse-model' into rc174-all3
# Conflicts:
#	docs/CHANGELOG.md
2026-10-05 10:14:54 +02:00
leonarski_f 0741b2b298 Merge branch 'dq-reg4' into rc174-all3
# Conflicts:
#	docs/CHANGELOG.md
2026-10-05 10:14:47 +02:00
leonarski_fandClaude Opus 5.5 0d31d60f3e 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
2026-10-05 10:14:46 +02:00
leonarski_f 5575558c5f Merge branch 'dq-reg3' into rc174-all3 2026-10-05 10:14:40 +02:00
leonarski_f 537544e958 Merge branch 'dq-reg2' into rc174-all3 2026-10-05 10:14:40 +02:00
leonarski_fandClaude Opus 5.5 f9ffc3d837 SearchSpaceGroup: ask a promotion's twin-immune zone on a twinned merge, read at the other twin laws' fraction
6iu9 (deposited P3_1, merohedrally twinned at 0.4 or more by its 321 law: H 0.097, CC 0.79) went
from P3_1 to P3_121 when the penalised per-frame scale smoother (495f6a97b) landed; the ingest
partiality fix alone (7d6c201e9) keeps P3_1. Bisected on the two binaries: smoother-only 6iu9 P3_121,
partiality-only P3_1. The smoother only removed the luck: the P3_1 answer rested on the
Lorentz-filtered arm's added-operator R contrast reading 0.71 against a bound of 0.72 (the
all-observation arm already passed 32 at 0.82); better scaling moved it to 0.87, no gate refused, and
the twin-immune zone - which reads -401 nats, acentric - is only consulted where a gate fired.

A near-perfect twin passes every agreement gate by construction (H ratio 0.97 here); only the zone
can refuse it. It was confined to refusals because a genuine trigonal crystal read -46 nats with no
gate firing; on the battery 5uth (genuine P3_121, twinned by a 622 law, other-law CC 0.14) reads
-206. The reason: the centric density was untwinned, but a twin by a law OTHER than the zone's
operators reaches the zone as it reaches every reflection, so a genuine zone reads 0.81 at a = 0.2.
The operators' own twin law cannot reach their zone, so only the centric side needs it.

- TwinningAnalysis: the zone's centric density is the twinned one at a caller-given fraction
  (weighted sum of two chi^2_1, via exp(-y) I0(y)); the control's calibration expectation is taken
  at the same fraction (-KL(acentric || centric_a), -0.130 at a = 0 as before). At a = 0 nothing
  changes.
- SearchSpaceGroup: twin_fraction_outside = the fraction implied by the strongest CC of a lattice
  rotation outside the group, relative to the group's own mean CC, through rho = 2a(1-a)/((1-a)^2+a^2);
  exported for the adopted group and used by Rugnux's TwinZoneVerdict and the zone report.
- New Stage A test: a candidate that does not hold every lattice rotation, on a P1 merge whose <|L|>
  is in the partial-twin band [0.375, 0.44), is refused when the zone over one of its index-2
  subgroups reads acentric by 20 nats (the TwinZoneVerdict bound), unless zones_ambiguous. The band's
  lower end is the L-test gate's: below it something else compresses the zones too (a pseudo-cubic
  small-molecule set, cuhf2, read its 422 zone at 0.64 beside a control at 0.58 and was turned to
  P222 without it).

Zone evidence (calibrated, at the other-law fraction): 6iu9 32 -230 / -143 (refused, P3_1);
5uth +209 / +33 (P3_121 kept); 8xtg +324 / +65; 6vww P6 +20 / +8.5; 7k1l P6 +8 / +7.5.

Battery (open+inhouse, targeted, against 20261004-2350 all2-full; only beyond-noise change listed):
- 6iu9: fail -> pass, P3_121 -> P3_1, R_meas 17.4% -> 14.4%, ISa 4.6 -> 5.4, R-free 0.318 -> 0.327.
- unchanged: 6iu5, 6iu6, 6iu8 (P3_1), 5uth, 5j23, insu_H_x06da_twin/notwin, 6vww, 7k1l, 8xte, 8xtg,
  9i80, 4bwl, 2wnq, 8c3e, 2wnn, 2xfw, 5ebi, 6p8j, 6z9g, 6rlr, 6toc, 3mc4; 321/312 controls 5lzl,
  6w4h, 9gqg, 6pxb, 9z72; all 14 small-molecule sets (cuhf2 checked again after the band).
- private subset (8 sets): no change beyond noise.
Tests: [twinning] (new: zones read at the other twin laws' fraction), SearchSpaceGroup*.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 10:13:50 +02:00
leonarski_fandClaude Opus 5.5 636c6a3067 SearchSpaceGroup: operator-homogeneity gate reads the R gap between a subgroup and the rest
The gate that refuses a point group whose own operators "disagree among
themselves" read worst-agreeing over best-agreeing operator R. That divides
by an extreme order statistic - the pole the contrast gate was introduced to
remove - so a genuine group whose operators merely spread in a continuum is
refused as soon as one operator happens to agree unusually well.

That is what refused 432 on a private cubic F432 crystal after the overload
drop (37a8c8e24; bisected: that commit alone gives F23, b126b9fc1 does not
change the search). The crystal's intensity-weighted R is dominated by a few
dozen strong low-order reflections. Dropping the overloaded ones (whose
flank-extrapolated values disagreed ~2x with their mates) raised every
operator CC and made the cleanest 432 operator cleaner still, while
anisotropic systematic error keeps the genuine 23 operators spread ~2x
among themselves: worst-over-best went 2.68 -> 4.0 against the 3.2 bound.
H ratio (1.25) and contrast (0.78) passed throughout.

A mixture of real and false operators is specific: the real ones form a
subgroup (the true group's intersection with the candidate) and everything
outside it is false. The statistic is now the largest factor by which every
operator outside some subgroup reads worse than every operator inside it -
a gap, found by walking the operators sorted by R and reading each prefix
that closes into a group. It is never above worst-over-best, so nothing
admitted before can be refused; the bound stays 3.2. Read off the operator
tables of the all2 full battery and run 3: genuine adopted groups reach at
most 2.5 (the cubic crystal 1.8-2.0), the 5ebi 622 mixture reads 3.6
(was 6.0), 9hnc's false 422 3.4, and 2wnn's false 222 3.8 (unchanged, still
refused by this gate).

Targeted runs vs all2-full (f64f76): the private cubic set F23 -> F432
(pass); every other set identical to the last digit - five other private sets; open 5epe 8sqt 3inp 9fhc 6oel 7orr
8tyy 3ky7 6h5t 6moj 2wnn 5ebi 9hnc; lyso_x06da_ref, lyso_x06da_5keV,
myob_x06da_split; all small-molecule sets (citric R1 .0374, aspirin
.0363/.0358, hepes .0310, yag .1021, kdp, lcystine, cytidine, dnba,
lalanine, metformin, nidppe, cuhf2); and the high-spread trigonal/
tetragonal/hexagonal panel (insu_H twin/notwin, insu_I weak/low_isa, 6v2r,
8xtg, 5j23, 6iu6, 6iu8, 3mc4, 6vww, 7k1l, 9i80, 6pxb, 9hs7).
SearchSpaceGroup* and [SearchSpaceGroup] test cases pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 09:29:18 +02:00
leonarski_fandClaude Opus 5.5 a628f06868 Space-group search: an ask that promotes over a twin-gate refusal is decided by the twin-immune zone
Open set 5ebi (deposited P2_1, a = c and beta = 120: a monoclinic crystal on a hexagonal metric,
pseudo-merohedrally twinned, <|L|> 0.433) regressed from P2_1 to C222_1 with dq-sm2-rest baf2017c9.
Of that commit's two changes it is the sub-lattice ask's R-contrast operator test, not the hot-patch
mask: 5ebi is a CCD (.img) sweep, so HotPixelFinder never runs on it. Without the R contrast every
metric two-fold that passes min_operator_cc was kept, LePage closed them into the whole hexagonal
metric and no sub-lattice ask was made. With it the false hexagonal two-folds drop out, the two
in-plane two-folds of the C-centred orthohexagonal cell survive (CC 0.97, R 0.061 against 0.045 for
the genuine screw: contrast 0.96), and the ask on that sub-lattice adopted C222_1. The main search
had refused 622 on the added-operator R (contrast 0.70 against 0.72), but the ask's own search
cannot see that: the gates there are relative and the twin law passes them on its own. Stage A's
L-test-under-merge gate does not reach it either - C222_1 is not holohedral on a hexagonal metric -
and read per operator it does not separate it: merging under the in-plane two-fold moves <|L|> only
0.425 -> 0.418 (14% of the gap to 0.375).

Fix: where a twin gate of the search in hand refused a higher group, an ask that would promote
re-opens what that gate answered, so it is arbitrated as every other promotion over a refusal is -
by TwinZoneVerdict on the operators it adds over the group in hand (that group carried into the
ask's setting). Acentric with margin and the group in hand stands. 5ebi: zone 222 over 2,
n 1865, calibrated -23.9 nats -> twin law, P 1 21 1 kept. cuhf2 (the case baf2017c9 fixed) has no
twin-gate refusal in hand, so its zone is not read and P422 stands.

Targeted battery vs the rc174-all2 full run (20261004-2350_f64f76_all2-full), same base:
reg4-v1 (32 sets: 5ebi, cuhf2, sub-lattice sets 6iu6 6iu8 6iu9 6z8o 8t7r 9ea5, twinned/pseudo-
merohedral 9hnc 3meb 2wnn 2xfw 2wnz 4bwl 2wnq insu_H_x06da_twin, controls lyso_x06da_ref
thau_x10sa_0p1deg 5reo, all 14 small-molecule sets): only 5ebi changes - C2221 -> P1211 (pass),
ISa 10.9 -> 14.8, R_meas 12.3% -> 10.2%, R_free (deposited model) 0.571 -> 0.537, cell dev 40% ->
0.05%. Every other set identical in space group, ISa, R_meas, R_free, d_min and SHELXL R1.
reg4-v1b (the 12 other open/in-house sets whose run adopts a metric or sub-lattice ask): identical.
Private arm (the 7 sets whose mask changed with baf2017c9 and the 4 that take an ask): identical.
Still failing as before: 4bwl, 2wnq (near-perfect twins, C222_1 via the metric ask with no refusal
in hand), 6iu9, 9hnc, kdp.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 09:06:16 +02:00
leonarski_fandClaude Opus 5.5 442cf8889d Battery: in-house standard proteins carry a reference model for R-free and anomalous signal
Each lysozyme, thaumatin, insulin, cytochrome c and myoglobin set names the PDB
entry of its crystal form in a `model` field; the runner fetches it like an
open-arm deposition and passes it to --model, so the row carries rfree,
rmodel_shell_scaled, rfree_deposited/rfree_ratio and the new anom_sigma
(ANOMALOUS_SCATTERER_MEAN_SIGMA) - an external yardstick beside the XDS
statistics. Reported only: the arm's scoring is unchanged, and the processing is
identical with and without the model (19 sets vs all2-full: same space group
modulo the model's enantiomorph label, d_min, R_meas, CC1/2, ISa, cell and
REFRES table). depdata_check stays open-arm only.

Models, chosen by cell/space group and confirmed by rugnux --model:
4AXT lysozyme (6G8A, the coordinates beside the data, has c 2% short: R-free
+0.04), 5A47 thaumatin (6G89 +0.06), 2BN3 cubic and 4E7T rhombohedral insulin
(bovine; pig 9INS +0.07, human 1MSO +0.08), 4DC8 horse heart myoglobin (b 28.8,
not sperm whale's 30.8; 5ZZE equal), 6FF5 bovine cytochrome c - our crystals
are a primitive relative of its H32 form (pseudo-centring TNCS), so R-free
~0.49 but the heme iron is the top anomalous peak; 8RKP, the cytochrome c'
beside the data, does not fit at all (R-free 0.63, nothing at the iron).

Run 20261005-0735_2624a6_inhouse-model (19 sets): R-free 0.18-0.30 on the
good sets, 0.37-0.57 on the ISa~2 powder/split myoglobin sweeps and ~0.49 on
cytochrome c; anom_sigma rises with wavelength (thaumatin 2.3 at 16 keV, 6.7
at 6.5 keV, 8.9 at 3.8 keV).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 08:47:21 +02:00
leonarski_fandClaude Opus 5.5 7eb8e93a0a Rugnux --model: report the anomalous map's mean height at the model's anomalous scatterers
ANOMALOUS_SCATTERER_MEAN_SIGMA= is the anomalous difference map, read at every
model atom from phosphorus up (S of Met/Cys, metals, Cl, I) with the same cubic
interpolation as ANOMALOUS_SITE_*, averaged in map sigma; ANOMALOUS_SCATTERERS=
is their count. One number for the anomalous signal of a merge that does not
depend on which ten atoms come out on top - what the battery tracks for the
long-wavelength standard-protein sets. A new key only: no report version bump.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 07:56:32 +02:00
leonarski_fandClaude Opus 5.5 94cc5d7267 Anisotropy: a cubic result carries a principal frame, so its French-Wilson tensor is zero, not NaN
In a cubic Laue class AnalyzeAnisotropy returns before any fit with the eigenvalues set to
zero but the eigenvectors left at their NaN defaults. AnisotropyTensorHKL multiplies them
(0 * NaN), so the anisotropic French-Wilson prior of 4979f8aa6 was NaN for every cubic
data set: every shell mean became NaN and the second French-Wilson pass rewrote all
weak amplitudes from a NaN prior (on 5epe the weak-reflection F rose by 2% at low and
14% at high resolution against the merge-time pass, IMEAN unchanged). The cubic result
now carries the crystal axes as its (arbitrary) principal frame, so the tensor is zero
and the prior isotropic, as the commit intended.

The second pass otherwise sees exactly the merge-time pass's input (same reflections,
d range, shells and space group; checked on 5epe), so in non-cubic groups the
difference between the two passes is the tensor alone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 07:03:45 +02:00
leonarski_fandClaude Opus 5.5 2624a69726 Merge branch 'battery-myob-ref' into rc174-all2
Build Packages / Create release (push) Successful in 16s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m25s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m34s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 8m58s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 10m37s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 10m34s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 12m58s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 18m8s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 18m49s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 19m20s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 24m39s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 25m5s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 19m0s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 20m41s
Build Packages / Generate python client (push) Successful in 22s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 20m42s
Build Packages / Build documentation (push) Successful in 1m18s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m31s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 21m9s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 19m13s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 19m49s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 16m21s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 13m34s
Build Packages / Unit tests (push) Successful in 1h18m42s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 06:50:45 +02:00
leonarski_fandClaude Opus 5.5 0348462521 Battery: myoglobin in-house sets are scored against P 1 21 1
XDS does not judge screw axes and indexed one powder-contaminated sweep
in P 1 on a reduced cell; the references now name the myoglobin group.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-05 06:50:45 +02:00
leonarski_fandClaude Opus 5.5 f64f764d40 Merge branch 'dq-kdp-int' into rc174-all2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-04 23:49:16 +02:00
leonarski_fandClaude Opus 5.5 0e35cad1e2 Docs: split reflections in the measured footprint
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-04 23:32:29 +02:00
leonarski_f 9223c27c1b Merge branch 'dq-sym-glide' into rc174-all2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB

# Conflicts:
#	docs/CHANGELOG.md
2026-10-04 23:29:11 +02:00
leonarski_fandClaude Opus 5.5 98f678ae89 Merge branch 'dq-sm2-rest' into rc174-all2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-04 23:29:07 +02:00
leonarski_fandClaude Opus 5.5 01c7d4636b Merge branch 'dq-sm2-int' into rc174-all2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-04 23:29:07 +02:00
leonarski_fandClaude Opus 5.5 6f42ca518f Merge branch 'dq-sm2-scale-band' into rc174-all2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-04 23:29:07 +02:00
leonarski_fandClaude Opus 5.5 60b7fb86fa SearchSpaceGroup: glide groups without a centre of symmetry; the centre decided by absences, a default, or the intensity distribution
Non-Sohncke candidates were enumerated only when their PROPER rotations equalled the measured
point group's, which only centrosymmetric groups satisfy. Groups without a centre (Pc, Pna2_1,
I-42d, I4_1md, Fdd2, P-42_1c, I-43d) were never candidates: where a centrosymmetric group shares
their absences rugnux wrote it silently (Pc -> P2/c), and where none does the dead glide zone was
dropped and a Sohncke subgroup written (KDP-type I-42d data -> I4_122).

- Enumerate non-Sohncke groups by Laue class. The Sohncke-signature dedup, CellHostsRotations and
  the glide-evidence bar are unchanged. Groups with identical absences in the same Laue class are
  scored once and carried as `same_absences`; a selected candidate brings them into
  `alternatives`.
- Convention for which twin is written: the centrosymmetric one where it exists (missed centres are
  the common error, Baur & Kassner 1992), otherwise the lowest-numbered (I4_1md over I-42d).
- The centrosymmetric default gives way only when, on the general reflections of the Laue class of
  the final merge, <|L|>, <|E^2-1|> and N(0.1), each calibrated against acentric/centric intensities
  simulated with the reflections' own sigmas (fixed-seed mt19937_64, own deviate transforms), read
  acentric (L f <= 0.3, others <= 0.5), every f lies in [-0.3, 1.3], the always-centric control reads
  centric (f >= 0.5), and the lattice excludes twinning (gemmi Le Page metric admits no rotation
  beyond the Laue class, no TWIN_DOMAIN leftover lattice). Then the group is switched and re-merged.
- Report: SPACE_GROUP_CENTRE (IMPLIED_BY_ABSENCES / ABSENT_BY_ABSENCES / NOT_DETERMINED /
  ABSENT_BY_STATISTICS), CENTRE_TWINNING_EXCLUDED, CENTRE_STATISTICS_* on every searched run, and
  prose for the absence-equivalent alternatives.

Battery (targeted): all 14 small-molecule sets vs 58a4bf (smt-all, kdp-all): every group
unchanged except kdp_x10sa_20keV I 41 2 2 -> I 41 m d with I -4 2 d as the alternative; dnba stays
C 1 2/c 1, now NOT_DETERMINED with C 1 c 1 listed (statistics read centric, f 0.96-1.24). The
P2_1/c, Pbca and Ia-3d sets read IMPLIED_BY_ABSENCES with no alternative.
Protein panel (19 sets, twinned panel + controls, run glide-prot): every space group equals the
rc174-all base (3r6o re-run with the base binary: I 41 2 2 both); no SPACE_GROUP_CENTRE on any.
Twinned proteins read the centre statistics NOT_APPLICABLE (L f -0.3 to -1.7) or ACENTRIC.
Private subset (8 sets): 8/8 groups unchanged vs 58a4bf.
The glide-zone evidence scan over battery 3 (every non-Sohncke group of each run's Laue class,
centrosymmetric or not) peaks at 0.69 nats/reflection on proteins against the 2.0 bar.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-04 23:18:02 +02:00
leonarski_fandClaude Opus 5.5 fb9d4992bd Integration: the spot footprint includes how far the spots sit from their predicted reflections
A crystal of slightly misaligned domains (a ferroelastic domain twin below a phase transition, a
split crystal) records each reflection as two or more compact spots around the averaged lattice's
prediction, moving apart with resolution. The pre-scan footprint is measured about each spot, so it
saw compact spots; the r1 disk held the gap between them and the background ring sat on them.

The geometry pre-pass now compares every indexed spot with the predicted position of its own
reflection on the same frame and adds the mean square offset (radial and tangential, by distance
from the beam) to the pre-scan widths; the canonical pass integrates with that table. Where spots sit
on their predictions this moves the widths by the prediction error alone (lysozyme: 0.2-1.0 px, no
reflection outgrows r1); on a 100 K KDP domain twin the offsets reach 8-16 px at the edge.

KDP (kdp_x10sa_20keV), battery SHELXL recipe on the COD model: R1 0.272 -> 0.048, wR2 0.685 ->
0.129, EXTI 26.9 -> 0.025, GooF 3.2 -> 1.29 (XDS: 0.112 / 0.333 / 0.054 / 1.25); R_meas 21.6% -> 5.3%.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB
2026-10-04 22:48:04 +02:00
leonarski_f 11199596b4 Merge branch 'battery-kdp' into dq-kdp-int 2026-10-04 21:27:20 +02:00