This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use. * **rugnux: significantly better quality of results, and faster.** A large rework of integration, scaling, merging, geometry refinement and space-group determination, together with measurements the program previously made no attempt at - the direct beam before indexing, the beam stop, the goniometer rotation scale, and the stretches of a sweep the crystal did not deliver. A rotation dataset typically gains observations at better <I/sigma> and R_meas, and every `mx` and `scale` run writes a `<prefix>_report.txt` results report modelled on XDS's `CORRECT.LP`. Many defaults moved with it: spot detection is self-calibrating, beam-stop detection and rotation geometry post-refinement are on, resolution limits default to as far as the detector reaches, and ice-ring handling engages only where the crystal is measured to have ice. * **jfjoch_viewer:** the beam-stop shadow, the detector calibration and the beam-centre measurement are reachable from "Analyze dataset"; the settings panel reports how the sample moved and how polarized the beam was; image rendering and interaction are faster. * **Performance:** bitshuffle+LZ4 images are decoded on the GPU rather than on the host, with the bitshuffle inverse fused into preprocessing so the decompressed frame is never held in device memory. * **Broker, writer, packaging and build:** image-slot lifetime and locking fixes, per-image datasets sized by the images actually written, the Debian/Ubuntu broker package renamed to `jfjoch`, and `image_analysis` compiling under MSVC again. **Breaking change to the rugnux command line:** * `--azint-only` and `--scale` are **removed**, replaced by `--mode azint` and `--mode scale`; the full pipeline is `--mode mx` and remains the default. A script passing the old flags now fails with the list of valid modes rather than silently running the wrong one. * `-t`/`--stride` is **refused on rotation data**: skipping frames cuts every reflection's rocking curve, so the combined fulls and their partiality would be measured over frames the sweep never recorded. Select a contiguous range with `-s`/`-e` instead. `--mode azint` and `--force-still` still take a stride. **Breaking changes to OpenAPI** - regenerate the client (`jfjoch-client` 1.0.0-rc.161, `frontend/src/client`) or read the affected fields as optional: * `image_scale_b` is removed from the `plot_type` enum, so a client requesting that plot now gets an error rather than a curve. * `azim_int_settings.high_q_recipA`, `spot_finding_settings.high_resolution_limit` and `spot_finding_settings.low_resolution_limit` are no longer `required`. All three mean "no limit at that end" when unset and are omitted from the response instead of carrying a placeholder value, which raises in a client generated from an rc.160-or-earlier spec. A value of 0 is still accepted and means the same thing. **Breaking changes to the stored formats** - a consumer reading these fields must treat them as optional: * The per-image image-scale B factor is no longer computed, so `/entry/MX/imageScaleBFactor` is absent from newly written HDF5 files and the corresponding key is absent from the CBOR DataMessage and END blocks. Files written by rc.160 and earlier still contain it and still open; nothing in the pipeline reads it any more. * `_reflns.jfjoch_diffrn_ISa` now carries the whole-range `1/sqrt(a*b)` that XDS's ISa denotes, and the error-model `a` and `b` are reported in XDS's convention; the strong-reflection asymptote moves to `_reflns.jfjoch_diffrn_ISa_asymptotic`. **A file written by an earlier version carries the asymptote under the plain `ISa` name.** Reviewed-on: #71 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
7.1 KiB
Release contents
This page describes what a Jungfraujoch release ships and what each artefact needs on the target machine — which CPU instruction set the binaries were compiled for, which CUDA toolkit they were built against, and which runtime libraries are bundled rather than expected from the host.
The artefacts in the table below are built and published by the continuous-integration pipeline
(.gitea/workflows/build_and_test.yml) when a tag is pushed. For how to install and configure the
result see Deployment; for the package-repository URLs see
Linux package repositories.
Artefacts
| Artefact | Distributed via | Contains |
|---|---|---|
.rpm / .deb packages |
package repositories | The full server stack: jfjoch (broker, frontend, FPGA and detector tools), jfjoch-writer, jfjoch-viewer (incl. the XDS plugin), jfjoch-driver-dkms |
jfjoch_viewer-<version>-linux-cuda<major>.tgz, ...-linux-cpu.tgz |
Gitea release page | Portable Linux viewer package: jfjoch_viewer, rugnux, jfjoch_extract_hkl, jfjoch_recompress and the license notices |
jfjoch-viewer-<version>-win64-cuda<major>.exe, ...-win64-cpu.exe |
Gitea release page | Windows installer with the same four programs, plus the Qt runtime |
jfjoch-writer .rpm / .deb |
Gitea release page | The writer alone, for a file-writing machine without the rest of the stack |
libjfjoch_xds_plugin.so.<version> |
Gitea release page | XDS HDF5 read plugin (built on RHEL 8); see Integration with MX software |
jfjoch-client |
PyPI and the Gitea PyPI index | Generated Python OpenAPI client |
| Documentation | Read the Docs and the gitea-pages branch |
This documentation set |
The FPGA firmware (.mcs) images are attached to the release as well. The firmware is stable and is
carried from version to version, and is rebuilt with Vivado (see FPGA smartNIC) when it
needs to change — so a card keeps its image across a software upgrade unless the release notes say
otherwise.
CPU instruction set
The architecture flags live in the CI configuration rather than in CMakeLists.txt, so a site
building from source picks its own (x86-64-v4 on an AVX-512 cluster, -march=native, or the plain
baseline the compiler defaults to). The released binaries are compiled to a fixed floor:
| Release | Flags | Minimum CPU |
|---|---|---|
Linux (all packages, and the portable .tgz) |
-march=x86-64-v3 -flto=auto |
AVX2 + FMA + BMI2 — Intel Haswell (2013) / AMD Zen (2017) and newer |
| Windows installer | /arch:AVX |
AVX — Intel Sandy Bridge (2011) / AMD Bulldozer and newer |
The Windows floor is lower because MSVC has no spelling for the x86-64-v2 level; /arch:AVX is
the nearest one and implies SSE4.1/4.2, which is what actually matters — without it Eigen has no
vectorised round and falls back to a libm call per element. Link-time optimisation is applied on
Linux only.
A binary will fault with an illegal instruction on a CPU below its floor. If you must run on older hardware, build from source without the flags.
Operating-system floor
The .rpm / .deb packages are built per distribution (RHEL/Rocky 8 and 9, Ubuntu 22.04 and 24.04)
and are tied to it. The portable viewer .tgz is built on RHEL 8, the oldest supported
distribution, so its glibc floor is low enough to run on any newer Linux — that is what it is for,
and why it replaces the per-distro packaging of the viewer on the release page. The Windows
installer is built and verified on Windows 11.
CUDA and non-CUDA builds
Every binary artefact is released in two variants, cuda<major> and cpu. The CUDA variant adds
the GPU fast-feedback indexer (ffbidx), the GPU FFT indexer and GPU image processing; the CPU-only
variant runs the same pipeline on the CPU with the FFTW indexer, at much lower throughput.
The CUDA toolkit used is the one on the corresponding build machine: CUDA 12 for the RHEL 8 packages, CUDA 13 for RHEL 9, Ubuntu and Windows. The major version is part of the artefact and repository name, so a download is self-identifying. Building from source needs CUDA 12.8 or newer.
A CUDA build does not require a CUDA machine. Of the CUDA components only cuFFT is linked dynamically — the CUDA runtime and the fast-feedback indexer are linked statically — and cuFFT itself has no link-time dependency on the NVIDIA driver library. Jungfraujoch asks how many CUDA devices are present at start-up and treats "none" (including "no driver installed") as zero GPUs, falling back to the CPU path. So a CUDA build starts and runs correctly on a machine with no NVIDIA GPU at all, provided the cuFFT runtime can be loaded:
- Portable
.tgzand Windows installer — cuFFT is part of the distribution, shipped next to the executable (on Linux found through an$ORIGINrpath). Nothing else is needed: no CUDA toolkit, and on a GPU machine only the NVIDIA driver. .rpm/.deb— cuFFT comes from the distribution's own CUDA packages, so that one dependency is managed centrally with the rest of CUDA. Install the cuFFT package alongside, or use thenocudarepositories on a machine where CUDA is not wanted.
The cuFFT runtime is large (the Windows DLL is ~256 MB), so the CUDA artefacts are correspondingly bigger than the CPU ones — the other reason for shipping both.
On a machine with an NVIDIA GPU, take the CUDA variant: only that one uses the GPU.
Windows installer
The Windows artefact covers jfjoch_viewer and the portable analysis CLIs only; the rest of
Jungfraujoch (broker, receiver, FPGA host, detector control) is Linux-only.
The toolchain bounds of the released installer are:
- Visual Studio 2026 with the C++ (MSVC) toolset. MSVC is not optional — CUDA on Windows builds through it — and it is what the release is compiled with.
- CUDA Toolkit 13.3 for the
cuda13variant. - Qt 6.11 for MSVC (
msvc2022_64), including Qt Charts. - Ninja as the generator; zlib and Eigen 3.4 supplied from a build prefix.
The installer is generated with NSIS and bundles the Qt runtime (via windeployqt) and, on the
CUDA variant, the cuFFT DLL — so the end user installs neither Qt nor a CUDA toolkit. The two
variants share an install directory and Start Menu group and replace each other (CUDA is a strict
superset); they are told apart by the installer filename and the Add/Remove Programs entry:
| Build | Installer file | Add/Remove Programs |
|---|---|---|
| CUDA (default) | jfjoch-viewer-<version>-win64-cuda<major>.exe |
Jungfraujoch (CUDA) |
| CPU-only | jfjoch-viewer-<version>-win64-cpu.exe |
Jungfraujoch (CPU) |
To build the viewer yourself on Windows, see jfjoch_viewer ▸ Building from source on Windows.
Licenses
Every package variant carries the project license, the third-party manifest and the verbatim
license texts of the bundled dependencies under share/doc/jfjoch. See
Third-party software notices.