* `rugnux --mode calibration` writes `<prefix>.json` beside the `.poni`, whose `dataset_settings` member is a `jfjoch_broker` `dataset_settings` body as it stands. * `rugnux` and `jfjoch_viewer` read PILATUS miniCBF sweeps natively, without conversion. * Masters written by other facilities open, including Eiger 1.x and third-party NXmx variants. * `rugnux` measures the beam centre on every run, and indexes with it when the file's value indexes nothing. * A detector swung out on a 2theta arm is placed where the file says it stands, and the calibration can hold the tilt fixed. * `rugnux` writes the unmerged MTZ by default, and a P1 merge beside it, so a wrong space group can be re-merged without reprocessing. * Significant improvements to symmetry handling in `rugnux`: the lattice, the point group, the setting and the systematic absences. * The `rugnux` report gives the resolution the CC1/2 fit reached, beside the range the reflections were written to. * The `rugnux` report gives the twinning statistics measured before the space group was decided, beside the ones measured after. * The `rugnux` report gives the strong-direction diffraction limit, and warns when CC1/2 is not monotone with resolution. * `rugnux` ranks screw axes on the evidence their absences carry, rather than on how many control reflections a candidate happens to have. * Twinning is no longer reported when the L-test contradicts it. * The `rugnux` report gives the detector tilt, the measured tilt and the direct beam beside the beam centre, and a post-refined beam centre is judged against the run's own measurement rather than the file's. * `--no-refine-tilt` holds the detector tilt at the value in the file, instead of zeroing it, when the calibration starts from the spots. * The `jfjoch_viewer` grid scan view draws the cells in the proportion of the scan steps, so the map has the shape of the scanned area. Reviewed-on: #76 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
5.3 KiB
Installing rugnux
:local:
:depth: 2
rugnux is a single self-contained executable. It needs no CUDA toolkit, no Qt, and no
Jungfraujoch service running anywhere; on a machine with an NVIDIA GPU it needs the NVIDIA
driver, and without one it still runs on the CPU.
From the package repositories (RHEL / Rocky / Ubuntu)
On a distribution covered by the package repositories, rugnux is a package of
its own:
sudo dnf install rugnux # RHEL / Rocky 8 and 9
sudo apt install rugnux # Ubuntu 22.04 / 24.04
It installs /usr/bin/rugnux and depends on nothing from the acquisition side — no broker, no
detector libraries, no Qt — so it can go on a machine that only processes data.
Upgrading from rc.163 or earlier.
/usr/bin/rugnuxused to belong to thejfjoch-viewerpackage. Therugnuxpackage declares that the file has moved, so installing it upgrades an oldjfjoch-viewerin the same transaction instead of failing on the duplicate path. If yourjfjoch-vieweris pinned to an old version, unpin it or remove it first.
From the release archive
For a machine no package manager covers — or for Windows and Arm, which have no repository — take the archive for your architecture from the Gitea release page:
| Archive | For |
|---|---|
rugnux-<version>-linux-x86_64-cuda12.tgz |
64-bit Intel/AMD Linux. Built on RHEL 8, so it runs on any newer Linux |
rugnux-<version>-linux-aarch64-cuda13.tgz |
64-bit Arm Linux — NVIDIA GH200 and DGX Spark. Built on Ubuntu 24.04, so it needs glibc 2.39 or newer. Cross-compiled and not yet exercised on Arm hardware |
rugnux-<version>-win64-cuda13.zip |
64-bit Windows |
The archive has no top-level directory — it unpacks straight into bin/ and share/. Always
give tar a destination of its own, or it will scatter those into whatever directory you are in:
mkdir -p /opt/rugnux-1.0.0
tar xzf rugnux-1.0.0-linux-x86_64-cuda12.tgz -C /opt/rugnux-1.0.0
/opt/rugnux-1.0.0/bin/rugnux # prints the usage
What you get is:
bin/rugnux the program
share/doc/jfjoch_rugnux/LICENSE GPLv3
share/doc/jfjoch_rugnux/THIRD_PARTY_NOTICES.md
share/doc/jfjoch_rugnux/licenses/ verbatim licence texts of the bundled dependencies
Nothing is written outside that directory, nothing needs root, and several versions can sit side by
side. To remove it, delete the directory. Put bin/ on your PATH if you want to type rugnux
rather than the full path.
Mixing the two. If a
rugnuxpackage is also installed,/usr/bin/rugnuxwill normally win onPATH. Put the archive'sbin/first, or call it by its full path, to be sure which one you are running —rugnuxprints its version on every run.
GPU support
The released archives are CUDA builds. They need only an NVIDIA driver on the host — 525.60.13
or newer for the CUDA 12 archive, 580.65.06 or newer for the CUDA 13 ones — and no CUDA toolkit,
because everything CUDA is linked statically. With no GPU or no driver, rugnux reports zero CUDA
devices and falls back to the CPU path, which works but is far slower and offers only the fftw
indexer. A V100 needs the CUDA 12 archive; which generations each build covers is in
Release contents ▸ GPU generations and the NVIDIA driver.
Building from source
rugnux alone, without the server stack or Qt:
cmake -S . -B build -DJFJOCH_RUGNUX_ONLY=ON -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-march=x86-64-v3" -DCMAKE_C_FLAGS="-march=x86-64-v3"
cmake --build build -j$(nproc) --target rugnux
The binary lands in build/rugnux/rugnux. Two dependencies must come from the system — zlib and
Eigen ≥ 3.4 (zlib-devel and eigen3-devel, or their Debian equivalents); everything else is
downloaded during the first configure, which therefore needs network access. cmake --build build --target package produces the same .tgz the release ships. The -march flag is not set by the
build system on purpose, so a plain build is slower than the released one on the CPU-bound stages —
see the note in CMakeLists.txt.
Hardware
As with the rest of Jungfraujoch, serious performance requires an NVIDIA GPU. The CUDA build
provides the GPU fast-feedback indexer (ffbidx) and the GPU FFT indexer (fft); without CUDA
only the CPU fftw indexer is available. With a GPU present most of the per-image pipeline runs on
the device — bitshuffle+LZ4 decompression, image preprocessing, azimuthal integration, spot finding,
prediction and Bragg integration — as does rotation scaling and merging, with CPU implementations as
the fallback where there is no GPU. The thread count (-N) governs the CPU side of all of it.
The released CUDA builds need only an NVIDIA driver on the host, no CUDA toolkit: 525.60.13 or
newer for the CUDA 12 artefacts (RHEL 8 packages, the x86_64 rugnux archive) and 580.65.06 or
newer for the CUDA 13 ones (RHEL 9, Ubuntu, the aarch64 and Windows rugnux archives). Which GPU
generations each artefact supports — a V100 in particular works only with the CUDA 12 build — is in
Release contents ▸ GPU generations and the NVIDIA driver.