From 5aaff2adaf50864a0bc5f1a85657186ed66a349a Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Tue, 25 Aug 2026 07:10:19 +0200 Subject: [PATCH] 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) Claude-Session: https://claude.ai/code/session_01Y5XisyYxmF8mUEQjzpMRe2 --- docs/CHANGELOG.md | 57 +++++++++++++++++------------------------------ 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 46199d68..0ae576b3 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -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 `_01.mtz`, `_01.cif`, `_01.hkl` and `_01_image.dat`; the refined second pass writes the same files under ``, 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 `_01.mtz`, `_01.cif`, `_01.hkl` and `_01_image.dat`; the refined second pass writes those files under ``, 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`):