Changelog: lead rc.162 with what it means for users

The block had grown into a list of field-level edits, several carrying rationale and measurements
that belong in the commits. What a user needs from this release is one thing - files written by
Jungfraujoch now import correctly in DIALS, XDS and pyFAI - so say that first and keep the rest to
one line each. Also adds the security page, which shipped with no entry, and drops a test-only entry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfYvJT5Nb71suJCowRBn5z
This commit is contained in:
2026-08-23 12:07:13 +02:00
co-authored by Claude Opus 5
parent eb0cb42355
commit fae445c8ae
+22 -24
View File
@@ -3,32 +3,30 @@
### 1.0.0-rc.162
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.
* 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.
* Documentation: the supported GPU generations and the minimum NVIDIA driver version of every released artefact.
* HDF5 and image stream: `bit_depth_readout` now reports the bit depth of the stored image, not the detector's electronic readout depth.
**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.
* 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.
* rugnux: `_process.h5` now describes the pixel format of the images it links to, instead of the container rugnux processes in.
* HDF5: the detector tilt (`rot1`/`rot2`/`rot3`) is now exported correctly in the NXmx transformation chain; a tilted geometry was previously written so that other programs placed the detector wrongly (tens of mm at a few degrees of tilt). Untilted geometries are unaffected.
* Tests: a tilted detector is now cross-checked against pyFAI and DIALS, in the unit tests and against a written file in CI.
* rugnux: the detector geometry is also logged in XDS's convention (`ORGX`/`ORGY`, detector axis vectors, rotation axis), so it can be compared directly with an XDS refinement.
* HDF5: a data file missing next to a VDS master now reads as the error-pixel marker instead of zero counts, so those frames are masked rather than silently integrated as blank.
* HDF5: a still or grid scan recorded with a Smargon head position is no longer read back as a single image.
* HDF5 and image stream: `saturation_value` no longer loses a count each time a file is read and written again; a reprocessed `_process.h5` kept shrinking its own trusted range.
* HDF5: `error_value` now reports the marker an unsigned image actually stores (`UINTx_MAX`); it was written as `-1`, which no unsigned pixel can hold.
* HDF5: `bit_depth_readout` is written for unsigned images only. On a signed image it made DIALS read saturated pixels as a valid count of -2.
* The writer refuses a stream whose start message declares a different pixel format than its images carry, instead of writing a master that does not describe its own data.
* HDF5: `module_offset` is written as a float with a proper unit vector, and every transformation offset declares `offset_units`, so a reader does not fall back to the axis's own units - degrees on a rotation - when interpreting a length.
* The image stream can carry the sample transformation chain (`transformations`, in the END message) in mounting order, so a goniometer axis, the Smargon chi/phi and a grid stage are described together and unambiguously. It is optional - a producer that does not send it gets the same chain built by the writer - so no metadata version change is needed. The rotation width and end angles are derived by the writer rather than sent.
* Smargon chi/phi are written for a still as well, and are read back from HDF5; before, they were dropped unless the run also had a rotation axis or a grid scan, and nothing read them.
* The image stream and HDF5 now record `mirror_y`, whether the assembled image is mirrored in Y relative to the detector's raw readout, and it is read back.
* rugnux: an image integrated in pyFAI through the `.poni` file written by `--mode calibration` now comes out with the correct azimuth; it was 180 degrees out. Radial integration is unchanged.
* rugnux: the `.poni` file declares pyFAI's `orientation`, so the image origin is stated rather than assumed. Needs pyFAI 2024.01 or newer.
* A grid scan and a goniometer axis are no longer alternatives - both can be set, and the grid scan is no longer silently dropped when an axis is present.
* HDF5: a grid-scan file now records the (stationary) spindle, so it can be opened by programs that require a rotation axis; DIALS refused the previous files outright. The grid stage is written as a base stage, so a grid position does not turn with the spindle.
* The rotation axis is read back from HDF5 under whatever name it carries; only `omega` was recognised before, so a sweep recorded as e.g. `phi` re-opened as stills with nothing to say so.
* A goniometer axis that does not turn is now kept rather than discarded, and is distinguished from a rotation sweep - it records where the head was for a still or a grid scan.
* `images_per_file` is now 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.
* 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.
* `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.
* 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.
* 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`):
* `dataset_settings.images_per_file` is no longer `default: 1000` and no longer accepts `0`; it is optional, and its minimum is 1. A client sending `0` (previously "one file for the whole run") is now rejected - omit the field instead, which for a rotation sweep gives the same single file.