f7cb701f43b07ca9b823548ea32458d6545ad489
ValidateAgainstModel was called after WriteReflections, so the two relabelings it makes - the change of hand where the data were merged in the model's enantiomorph, and the alternative indexing it picks by R-free where no reference MTZ had already fixed it - reached the R-factors, the maps and _maps.mtz and nothing else. The .mtz/.cif/.hkl beside them kept whichever indexing the merge happened to land in, so a file whose maps came from a model could not be refined against that model without being reindexed first. Validation now runs before the reflection files are written and returns the operators it applied. AdoptModelFrame puts the merged reflections through them with a proper ASU reduction - ReindexReflections only relabels, which is all its scoring callers need - and the Bijvoet halves follow the Friedel sign of that reduction. The integrated observations are relabelled too, so --export-unmerged describes the same indexing as the merged files rather than a second one. change_of_hand_op is the inversion, so adopting a model's hand exchanges I(+) and I(-). On a tetragonal crystal whose enantiomorphic pair share their whole absence pattern, the search picks one of the two arbitrarily, and the exported anomalous differences were the wrong way round whenever it picked the other member from the model's. The written space group follows the hand, and so does the report that describes those files. The _process.h5 is deliberately left alone: its per-image reflections went to disk as they were integrated, and recording a group that did not match them would mis-merge on a later --mode scale. Nothing is lost - an enantiomorphic pair has the same Laue class and the same absences, so it merges identically either way. Serial stills could not use a model for this at all: each crystal is indexed in its own hand, so by the time there is a merge to fit a model to, the hands have already been averaged together, and reindexing the merged result as a whole cannot separate them again. ModelReferenceIntensities computes |F_model|^2 from the structure - Fcalc plus a flat solvent term at the standard constants, which are not fitted because there are no observations yet - and hands it to the per-image resolver that a reference MTZ already drove. It needs the cell and the group up front, which serial indexing wants anyway. Measured on a serial dataset in a merohedral trigonal group, at a fixed resolution limit so the shells match: CC1/2 better in 8 of 10 shells (79.7 to 82.5 overall), R_meas better in 9 of 10 (111.1 to 104.7), ISa 1.11 to 1.20, and R-free against a structure the merge never saw 0.393 to 0.375. The ambiguity probe now logs the runner-up R-free as well as the winner. On the same data the margin is 0.016 when the hands are mixed, where the two global indexings are tied because both are already inside every reflection, and 0.193 once they are not - the difference between a decision and a coin toss, which the old single number hid. The warning about an unresolved ambiguity no longer fires when a model will resolve it, and names the flags that would; and the summary line no longer offers the adopted group as its own alternative, which it did once --model had moved the run onto the member the search had listed as the alternative. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vi1gV6Z45aZL5wLwe85Ksn
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.
Languages
C++
75.2%
HTML
7.6%
C
6.1%
TypeScript
4.2%
Cuda
2.2%
Other
4.6%