0e6ece3c38c67a8554991905d90908c0d6724cdc
BuildObservationCells strides whole ASU clusters down to MAX_CLUSTERS = 20000 and keeps 1.4% of what it is handed - so the assembly before it sorted and summed every integrated partial in the sweep to throw 98.6% of the result away on the next line. The comment there says the striding "costs nothing and bounds the work"; it bounded it after the expensive part. Sample first instead: keep a partial iff a splitmix64 hash of its ASU key falls in the low one part in 2^n. Whole ASU clusters are mandatory rather than convenient - the cluster-robust sandwich sums one score per cluster, and the forbidden-direction signal IS the contrast between mates, so a raw-hkl sample would collapse that onto the independent covariance and inflate the floor. The hash rather than the key matters too: HKLKey::pack puts h in the low bits, so masking the key directly would select lattice planes instead of a sample. The rate comes from the partial count, not from merged.size(): the merged list is resolution-cut, and taking the rate from it made the first version never fire at all on the crystal it was written for. One part in 2^n of the partials is one unique reflection in 2^n, so the count already computed for the reserve is the right one. DELTA_B is unchanged by construction, not by luck. AnalyzeAnisotropy touches the unmerged observations in exactly two places - an empty test and MeasureSystematicFloor - so the tensor, the shape verdict and the directional limits come from the merged list alone. Over the battery: 0 verdict flips of 38; DELTA_B, DELTA_B_LINEAR, SHAPE, FREE_DIRECTIONS and the D_MIN keys differ on none of the 38, byte-identical rather than within noise; every reported key identical on 26; the mmCIF diff is exactly _reflns.jfjoch_aniso_floor and _significance; no caution appears or disappears anywhere. The spread those two keys move within was measured rather than assumed, and re-running cannot measure it because the code is deterministic. The shipped code already samples - by striding cluster order - so moving the phase of its own stride gives the sampling spread it has always carried. Against that control the change moves the floor less: ratio range 0.803-1.481 against 0.497-1.343, geomean 1.031 against 0.941. The gate therefore did not get easier to trip - the floor's geomean moves +3.1% here against -5.9% for the phase control, the crystal nearest the gate is not sampled at all and is bit-identical, and the two sampled crystals nearest the gate both move away from it. N_OBSERVATIONS goes up, not down, because a smaller pool lands the downstream integer stride slightly above the cluster cap. The ASU reduction is 14-45 ns a call in isolation, which nearly sank the design; in place it is free, because it overlaps the memory stalls of the Reflection stream it walks. The 24 crystals below the sampling cap run the shipped algorithm plus the reduction and cost +1.79 s in total, median +0.04 s. The block that introduced this measures 8.07 s before and 1.97 s after, which is 5.74 s off the largest crystal (-12.3%) and -11.9 s of anisotropy time over the battery. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CHMmeM1d489zvNFT7ZMN2P
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.4%
HTML
7.5%
C
6%
TypeScript
4.2%
Cuda
2.2%
Other
4.6%