Changelog: collapse the rc.162 entries onto what a user does with them

The section had grown to 45 bullets, several of them the same functional
change reported once per commit - four separate "faster" lines for one rotation
run, the -S lattice fix split across three, the NXmx offset attributes split
from the transformation chain they are attributes of.

Group them by what changed for a user rather than by what was committed, and
drop the incidental notes that belong in a commit message. 25 entries, each one
line, in the order the release paragraph introduces them: the files other
programs read, then rugnux, then speed, then the build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y5XisyYxmF8mUEQjzpMRe2
This commit is contained in:
2026-08-25 07:10:19 +02:00
co-authored by Claude Opus 5
parent ebf2064c26
commit 5aaff2adaf
+20 -37
View File
@@ -6,46 +6,29 @@ This is an UNSTABLE release. It includes many experimental features, as well as
**Files written by Jungfraujoch now import correctly in DIALS, XDS and pyFAI.** A tilted detector, a grid scan, a still recorded at a goniometer position, and saturated or unreadable pixels were each described in a way that a third-party program acted on wrongly. If you process Jungfraujoch data outside Jungfraujoch, prefer this release to any earlier one.
* HDF5: the detector tilt (`rot1`/`rot2`/`rot3`) is exported correctly in the NXmx transformation chain; untilted geometries are unaffected.
* HDF5: a grid scan, or a still recorded at a goniometer position, is no longer read back as a single image, and now records the stationary spindle so programs that require a rotation axis can open it.
* HDF5: saturated pixels are no longer handed to DIALS as an ordinary count.
* HDF5: `saturation_value` no longer loses a count each time a file is read and written again.
* HDF5: `error_value` reports the marker an unsigned image actually stores.
* HDF5: a data file missing next to a VDS master reads as the error-pixel marker instead of zero counts, so those frames are masked rather than integrated as blank.
* HDF5: `bit_depth_readout` reports the bit depth of the stored image, and is written for unsigned images only.
* HDF5: NXmx `underload_value`, the lowest valid pixel value, is now written.
* HDF5: `module_offset` is written as a float with a unit vector, and every transformation offset declares `offset_units`.
* HDF5: the rotation axis is read back under whatever name it carries, and a Smargon head position is told apart from the spindle.
* HDF5 and image stream: `mirror_y` records whether the assembled image is mirrored in Y relative to the detector's raw readout.
* rugnux: an image integrated in pyFAI through the `.poni` file written by `--mode calibration` now comes out with the correct azimuth. Radial integration is unchanged.
* rugnux: the `.poni` file declares pyFAI's `orientation`, which needs pyFAI 2024.01 or newer.
* The build resolves a single Eigen for the whole project, and refuses to configure if Ceres picks up a different one; a build that mixed two Eigen versions was undefined behaviour and crashed at -O2.
* rugnux: per-image geometry refinement and integration are faster, with identical output.
* rugnux: scaling and merging are faster, with identical output.
* The per-image resolution estimate now predicts the resolution the merged data reach, rather than reporting the highest-resolution spot found; rugnux reports the run's value as `SPOT_RESOLUTION_ESTIMATE` in its report.
* rugnux: fixing the space group with `-S` no longer prevents the lattice from being found; the group is applied to scaling and merging rather than to the indexing search.
* rugnux: a lattice indexed in a different setting from the space group fixed with `-S` is reindexed into that group's own setting before merging, instead of merging with the group's centring rule applied in the wrong frame.
* rugnux: a run now stops, naming the cell the crystal indexed as, when the space group fixed with `-S` has a lattice the crystal does not have, rather than merging and reporting statistics that cannot describe it.
* rugnux: the detector geometry is also logged in XDS's convention (`ORGX`/`ORGY`, detector axis vectors, rotation axis), so it can be compared with an XDS refinement.
* rugnux: `_process.h5` describes the pixel format of the images it links to.
* A DECTRIS detector sending signed images is no longer declared unsigned in the image stream and in HDF5.
* A grid scan and a goniometer axis are no longer alternatives - both can be set.
* The image stream can carry the sample transformation chain (`transformations`, in the END message) in mounting order; a producer that does not send it gets the same chain built by the writer.
* The writer refuses a stream whose start message declares a different pixel format than its images carry.
* HDF5: a grid scan, or a still recorded at a goniometer position, is no longer read back as a single image, and records its stationary spindle so a program that requires a rotation axis can open it.
* HDF5: the sample transformation chain is written in mounting order, with a Smargon head position told apart from the spindle, one entry per image, `module_offset` as a float unit vector, and `offset_units` on every offset.
* HDF5: saturated, underloaded and unreadable pixels are described so a downstream program masks them - `saturation_value`, `underload_value`, `error_value` and `bit_depth_readout` are written correctly, and a data file missing next to a VDS master reads as the error marker rather than as zero counts.
* HDF5: the rotation axis is read back under whatever name it carries, and `mirror_y` records whether the assembled image is mirrored in Y relative to the detector's raw readout.
* A grid scan and a goniometer axis can both be set; they are no longer alternatives.
* `images_per_file` is chosen from the acquisition when it is not given: a rotation sweep of at most 20000 images goes into a single data file, a grid scan splits on whole fast-axis rows, and stills and serial keep 1000.
* rugnux: observations outside the scaling resolution range are dropped as they are ingested, rather than scaled, combined and error-modelled first; merged results are unchanged.
* rugnux: two runs of the same command on the same images now produce the same merged intensities - the GPU prediction, profile-learning and profile-fit steps no longer depend on the order their blocks happen to run in. The azimuthal profile written alongside them is not yet reproducible in the same way.
* The writer refuses a stream whose start message declares a different pixel format than its images carry, and a DECTRIS detector sending signed images is no longer declared unsigned.
* The image stream can carry the sample transformation chain (`transformations`, in the END message); a producer that does not send it gets the same chain built by the writer.
* rugnux: fixing the space group with `-S` no longer prevents the lattice from being found - a lattice indexed in a different setting is reindexed into that group's own setting, and a run whose crystal does not have that group's lattice stops and names the cell it indexed as, rather than reporting statistics that cannot describe it.
* rugnux: the per-image resolution estimate now predicts the resolution the merged data reach rather than the highest-resolution spot found, and is reported as `SPOT_RESOLUTION_ESTIMATE`.
* rugnux: two runs of the same command on the same images produce the same merged intensities; the azimuthal profile written alongside them is not yet reproducible in the same way.
* rugnux: the offline lattice refinement is bounded by iterations rather than by a wall clock, so a loaded machine can no longer refine to a different lattice; a live acquisition keeps its real-time bound.
* rugnux: a rotation run is substantially faster.
* rugnux: geometry refinement and scaling/merging are substantially faster; the refined geometry, the space group chosen and the merged statistics are unchanged.
* rugnux: a rotation run no longer writes the geometry pre-pass files `<prefix>_01.mtz`, `_01.cif`, `_01.hkl` and `_01_image.dat`; the refined second pass writes the same files under `<prefix>`, and that is the result to use.
* rugnux: with `-N` left at its default the per-image loop now uses at most eight workers per GPU, rather than one per hardware thread; an explicit `-N` is obeyed as given.
* rugnux: the detector-frame modulation correction is fitted on a grid spanning the detector rather than on the reflections that happen to be present, so whether it is applied no longer depends on how far integration reached.
* rugnux: the first-pass rotation indexing finds its spots on every worker rather than one, which is worth most on large detectors. The lattice it picks is unchanged.
* rugnux: beam-stop detection is substantially faster - the pre-scan reads and accumulates its frames on several threads, the mask is built in one pass over the image rather than by repeated searches, and a worker's accumulator is allocated only if it is used. The shadow it finds is unchanged.
* rugnux: the `_process.h5` file is written on a thread of its own, so processing no longer waits on it.
* Faster spot finding and indexing, on the broker and in rugnux: the ring reduction reads four pixels at a time and the FFT indexer gives each direction its own block. The spots found and the lattices indexed are unchanged.
* GPU memory is no longer allocated for buffers nothing reads, and a worker builds only the engines it uses. A run reserves substantially less device memory.
* rugnux: the detector-frame modulation correction is fitted on a grid spanning the detector, so whether it is applied no longer depends on how far integration reached.
* rugnux: the geometry pre-pass no longer writes `<prefix>_01.mtz`, `_01.cif`, `_01.hkl` and `_01_image.dat`; the refined second pass writes those files under `<prefix>`, and that is the result to use.
* rugnux: `_process.h5` describes the pixel format of the images it links to, and is written on a thread of its own.
* rugnux: the detector geometry is also logged in XDS's convention (`ORGX`/`ORGY`, detector axis vectors, rotation axis), so it can be compared with an XDS refinement.
* rugnux: an image integrated in pyFAI through the `.poni` file written by `--mode calibration` comes out with the correct azimuth, and the file declares pyFAI's `orientation`, which needs pyFAI 2024.01 or newer. Radial integration is unchanged.
* rugnux: a rotation run is substantially faster throughout - beam-stop detection, first-pass indexing, geometry refinement, integration, scaling and merging - and observations outside the scaling resolution range are dropped as they are ingested. The refined geometry, the space group chosen and the merged statistics are unchanged.
* Faster spot finding and indexing, on the broker as well as in rugnux; the spots found and the lattices indexed are unchanged.
* A run reserves substantially less GPU memory: nothing is allocated for buffers that are never read, and a worker builds only the engines it uses.
* rugnux: with `-N` left at its default the per-image loop of `--mode mx` uses at most 16 workers per GPU, rather than one per hardware thread; an explicit `-N` is obeyed as given.
* CUDA 12 builds now contain device code for Volta, so the RHEL 8 packages and the portable Linux `.tgz` run on a V100; the CUDA 13 artefacts (RHEL 9, Ubuntu, Windows) remain Turing and newer.
* The build resolves a single Eigen for the whole project, and refuses to configure if Ceres picks up a different one; a build that mixed two Eigen versions was undefined behaviour and crashed at -O2.
* Documentation: a security page, and the supported GPU generations and minimum NVIDIA driver version of every released artefact.
**Breaking change to OpenAPI** - regenerate the client (`jfjoch-client` 1.0.0-rc.162, `frontend/src/client`):