From fae445c8aea97713cfc0ab53e180986d932bd6fc Mon Sep 17 00:00:00 2001 From: leonarski_f Date: Sun, 23 Aug 2026 12:07:13 +0200 Subject: [PATCH] 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) Claude-Session: https://claude.ai/code/session_01VfYvJT5Nb71suJCowRBn5z --- docs/CHANGELOG.md | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 81cdf0c6..473aa963 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -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.