Build Packages / Create release (push) Successful in 24s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m29s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m43s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 8m27s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 9m53s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 9m58s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 11m22s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 13m39s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 18m37s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 16m32s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 24m11s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 25m30s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 19m3s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 20m23s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 19m41s
Build Packages / Generate python client (push) Successful in 50s
Build Packages / Build documentation (push) Successful in 1m16s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 21m0s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 18m38s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m33s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 17m55s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 20m50s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 18m38s
Build Packages / Unit tests (push) Successful in 1h46m14s
* jfjoch_broker: Optional per-dataset authentication - statistics, images and plots can require a bearer token, which jfjoch_viewer supports. * jfjoch_viewer: Dark mode and a theme-matched colour scheme, a magnifier panel, and simpler contrast and background controls. * Rugnux: Multiple performance improvements on GPU and CPU (CPU-only processing up to 40% faster, faster image decoding on ARM), with unchanged results. * Rugnux: `--model` rigid-body refinement runs on the GPU, and the model-validation check is faster and more reliable. * Rugnux: Improved scaling and merging - error model, outlier rejection, absorption correction and French-Wilson amplitudes now agree more closely with XDS and ctruncate. * Rugnux: Improved integration - radial background on powder and ice rings, crowded rotation data keep their reflections, and CPU-only builds integrate large unit cells as GPU builds do. * Rugnux: More robust detector geometry - measured beam centre, X-ray bandwidth and goniometer rate, and geometry refinement accepted only on significant evidence. * Rugnux: Merged files are written in the standard setting, or in the setting of a reference MTZ, structure-factor mmCIF or model, with its free-R flags. * Rugnux: Richer report - ice and powder rings, further lattices, superstructure candidates and mosaicity, with warnings worded as prompts to check. * Rugnux: Clear error messages when a data set needs more GPU or host memory than is available. Reviewed-on: #83 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
67 lines
4.3 KiB
Markdown
67 lines
4.3 KiB
Markdown
# What Rugnux does
|
||
|
||
The map of a run, in the order it happens — one paragraph per stage, each linking into the
|
||
[data-analysis reference](CPU_DATA_ANALYSIS.md) where the algorithm lives. The walk-through is a
|
||
rotation run with the defaults; stills differences are at the end.
|
||
|
||
**Open the dataset.** The geometry, wavelength and goniometer come from the file
|
||
([What Rugnux reads](RUGNUX_FORMATS.md)). A goniometer axis makes it a rotation run, none makes it
|
||
serial stills — nothing is asked of the user.
|
||
|
||
**Pre-scan.** A projection of the first frames (60 by default) finds the beam-stop shadow and masks
|
||
it ([§1.5](CPU_DATA_ANALYSIS_IMAGE.md)), masks pixels its frames show to be defective
|
||
([§1.6](CPU_DATA_ANALYSIS_IMAGE.md)), measures the beam centre from the isotropy of the
|
||
scattered background and compares it with the file's ([§1.4](CPU_DATA_ANALYSIS_IMAGE.md)), and
|
||
reads how wide this crystal's spots are, which sets the integration radius
|
||
([§9.5](CPU_DATA_ANALYSIS_INTEGRATION.md)), and how much longer they are along their radius than
|
||
across it, which is the beam's bandwidth where the file does not state one
|
||
([§9.6](CPU_DATA_ANALYSIS_INTEGRATION.md)).
|
||
|
||
**Spots.** Every image is decoded — on the GPU straight from the compressed chunk
|
||
([§0](CPU_DATA_ANALYSIS_IMAGE.md)) — and one fused pass computes the azimuthal profile and finds
|
||
the spots against each image's own per-resolution-ring noise
|
||
([§2–§3](CPU_DATA_ANALYSIS_IMAGE.md)). The ice-ring score is read off the same profile.
|
||
|
||
**Indexing.** The spots of a sample of frames are rotated back to a common crystal frame and the
|
||
FFT search looks for periodicity over thousands of directions; candidate cells are
|
||
Niggli-reduced, classified by Bravais lattice, refined both constrained and triclinic, and decided
|
||
on how many validation frames each actually indexes
|
||
([§4–§7](CPU_DATA_ANALYSIS_INDEXING.md)). A failed pass triggers the discrete rescues — the
|
||
rotation-axis sign, the beam-centre search — before anything is given up on.
|
||
|
||
**First integration pass.** At the geometry in the file, every frame is predicted
|
||
([§8](CPU_DATA_ANALYSIS_INTEGRATION.md)) and profile-fit integrated
|
||
([§9](CPU_DATA_ANALYSIS_INTEGRATION.md)); partials are combined into fulls, scaled and merged
|
||
([§10](CPU_DATA_ANALYSIS_INTEGRATION.md)).
|
||
|
||
**Geometry post-refinement.** From those reflections the detector distance, beam centre and the
|
||
cell scale / rotation axis are refined over all frames at once, each step committed only if it
|
||
improves a held-out residual ([§7.5](CPU_DATA_ANALYSIS_INDEXING.md)).
|
||
|
||
**Second pass.** The sweep is re-indexed de novo and re-integrated at the refined geometry; this
|
||
pass is the canonical output, and a guard compares the two passes and keeps the better one
|
||
(reported as `PASS=` / `PASS_DECISION=` in [the report](RUGNUX_REPORT.md)).
|
||
|
||
**Space group.** On the P1 merge of the final pass, the point group is scored operator by operator
|
||
on resolution-normalised intensities and the screw axes, glide planes and centring are read from the
|
||
systematic absences ([§13.1](CPU_DATA_ANALYSIS_DECISIONS.md)); twinning and translational
|
||
pseudo-symmetry are checked beside it ([§13.2](CPU_DATA_ANALYSIS_DECISIONS.md)). `CANNOT_DETERMINE` and an enantiomorphic pair are real
|
||
answers here, not evasions.
|
||
|
||
**Scale and merge.** In the determined group: per-frame scales, the cross-validated correction
|
||
surfaces (decay, absorption, modulation), the error model and ISa, outlier rejection, the
|
||
CC1/2-based resolution cut, the anisotropy description, French–Wilson amplitudes and the R-free
|
||
flags ([§10](CPU_DATA_ANALYSIS_INTEGRATION.md),
|
||
[§13.3–§13.5](CPU_DATA_ANALYSIS_DECISIONS.md)).
|
||
|
||
**Write.** The merged `.mtz` / `.cif` / `.hkl`, the unmerged MTZ, the P1 cross-check and the
|
||
results report land next to each other ([Output files](RUGNUX_TUTORIAL.md#output-files)); with
|
||
`--model`, validation runs first and the maps and the placed model are written too
|
||
([§14](CPU_DATA_ANALYSIS_DECISIONS.md)).
|
||
|
||
**Stills instead.** Serial data skip the two-pass machinery: each image is indexed independently
|
||
(with the known-cell `ffbidx` indexer where a cell is given), partiality comes from a per-crystal
|
||
orientation-tilt post-refinement rather than a rocking curve, and a merohedral indexing ambiguity
|
||
has to be broken per image, at integration time, against a reference or a model
|
||
([Advanced ▸ the indexing ambiguity](RUGNUX_ADVANCED.md#the-indexing-ambiguity)).
|