leonarski_fandClaude Opus 5 94ed864dbe model validation: the model is put into the data's description of the lattice before it is placed
A deposited model arrives in the cell its depositor chose and rugnux indexes in the cell its
own reduction chose. The two are frequently different descriptions of the SAME lattice -
I-centred where the other is C-centred, unique axis c where the other took b, a cyclic
permutation of an orthorhombic cell - and the space-group NUMBER is identical in every one
of those, so the existing enantiomorph check, which compares numbers, cannot see any of them.
Re-fractionalizing straight across such a pair scrambles the model, and the rigid body cannot
undo it: six parameters about a centroid are not a change of basis. The run then reported a
placement R-free near 0.6, CC(model,data) around 0.3 and MODEL_FIT= NOT_TESTED, with no
warning, for data that were perfectly good.

Before re-fractionalizing, every integer change of basis with entries in {-1,0,1} and
determinant +1 that carries the model cell onto the data cell is enumerated, quotiented by the
model's own point-group rotations, and scored on an 8-3.5 A shell after an overall scale and an
isotropic B. The lowest wins. The identity is always among the candidates, so a probe that
finds nothing better than leaving the model alone leaves it alone; and on the ordinary
isomorphous run the only operators that map the cell are the identity and its own symmetry
equivalents, so they collapse to one candidate and the scoring is never reached.

A change of basis is a matrix AND an origin shift, and the shift is not optional. An odd
permutation of a screw-axis group lands on the same group on a moved origin, whose operator
list GEMMI cannot name because it compares those lists exactly - swapping b and c in P 21 21 21
needs (1/4, 1/4, 1/4) first. Where the bare matrix names nothing, the shift that makes it name
something is searched for on the twelfths every crystallographic origin shift lies on.

The coarse shell is what makes trying every candidate affordable: a frame that is wrong is
wrong at low resolution. The lowest resolution is excluded with it, because there an unmodelled
bulk solvent would dominate - equally for every candidate, so it would only add noise. Measured
cost 0.04-0.52 s, and only on runs whose cells actually differ.

A halved or a doubled axis is deliberately outside the search space: those are indexing errors,
not a choice of description, and a probe that silently repaired one would hide a real defect.
So is the case where the lattice is right but the symmetry was undercalled to P1, which would
need the model expanded to P1 and a centred-to-primitive basis change.

Measured over the deposited-data battery: eight runs whose model had never been placed now
place it, R-free falling by 0.14 to 0.36 and CC(model,data) rising from 0.14-0.47 to 0.51-0.96;
density at atom centres 0.35-2.1 sigma to 1.5-4.8, map mean FOM 0.13-0.28 to 0.36-0.93. Five
controls chosen to exercise the probe moved by no more than run-to-run noise and took no
operator, one of them after correctly rejecting a real alternative frame at coarse R 0.56
against 0.19 for the identity.

The reflections are not touched: they keep the indexing the reduction determined, and it is the
model that is expressed in it. What this fixes is that the written model and the written
reflections now agree - Fcalc from the placed model against the merged amplitudes, both as
written, gives R 0.18-0.31 where it gave 0.54-0.65. The CRYST1 header was already correct
before, since WriteModel forces the data's cell and group, so a downstream program would have
loaded the pair without complaint and refined against scrambled atoms.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbMaLuuwX4D58QCxZ686Ku
2026-09-08 11:06:07 +02:00
2026-08-26 22:47:00 +02:00
2026-08-13 17:03:10 +02:00
2026-09-02 21:17:31 +02:00
2026-08-25 08:21:39 +02:00
2026-08-26 22:47:00 +02:00
2026-09-02 21:17:31 +02:00
2026-09-06 22:45:37 +02:00
2026-09-02 21:17:31 +02:00
2026-08-27 22:16:54 +02:00
2026-08-27 22:16:54 +02:00
2026-03-26 20:50:33 +01:00
2026-06-23 20:29:49 +02:00
2026-08-27 22:16:54 +02:00
2026-07-19 09:39:28 +02:00
2026-08-26 22:47:00 +02:00
2026-06-13 21:27:41 +02:00
2026-06-23 20:29:49 +02:00
2026-08-25 08:21:39 +02:00
2024-11-22 21:25:20 +01:00
2026-09-02 21:17:31 +02:00
2026-08-26 22:47:00 +02:00
2024-12-02 21:17:14 +01:00
2026-08-13 17:03:10 +02:00
2025-10-25 22:05:47 +02:00
2026-07-03 19:18:56 +02:00
2026-06-23 20:29:49 +02:00
2026-08-13 17:03:10 +02:00
2024-12-02 21:17:14 +01:00
2026-08-25 08:21:39 +02:00
2026-09-02 21:17:31 +02:00
2026-09-02 21:17:31 +02:00
2026-08-26 22:47:00 +02:00
2026-08-27 22:16:54 +02:00
2026-08-13 17:03:10 +02:00
2026-09-06 22:45:37 +02:00

Jungfraujoch

Application to receive data from the PSI JUNGFRAU and EIGER detectors.

All documentation is now placed in docs/ subdirectory and for the current version hosted on Jungfraujoch Read The Docs page.

S
Description
Jungfraujoch Data Acquisition System
Readme GPL-3.0
3 GiB
Languages
C++ 78%
HTML 6.4%
C 5.1%
TypeScript 3.6%
Cuda 2.1%
Other 4.7%