v1.0.0-rc.173 (#83)
Build Packages / Create release (push) Successful in 24s
Build Packages / build:viewer:macos-arm64:nocuda (push) Successful in 3m29s
Build Packages / build:rugnux:macos-arm64:nocuda (push) Successful in 2m43s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 8m27s
Build Packages / build:rugnux:linux-x86_64:cuda (push) Successful in 9m53s
Build Packages / build:viewer:linux-x86_64:nocuda (push) Successful in 9m58s
Build Packages / build:viewer:linux-x86_64:cuda (push) Successful in 11m22s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 13m39s
Build Packages / build:viewer:windows-x86_64:nocuda (push) Successful in 18m37s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 16m32s
Build Packages / build:viewer:windows-x86_64:cuda (push) Successful in 24m11s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 25m30s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 19m3s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 20m23s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 19m41s
Build Packages / Generate python client (push) Successful in 50s
Build Packages / Build documentation (push) Successful in 1m16s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 21m0s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 18m38s
Build Packages / build:rugnux:windows-x86_64:cuda (push) Successful in 14m33s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 17m55s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 20m50s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 18m38s
Build Packages / Unit tests (push) Successful in 1h46m14s

* jfjoch_broker: Optional per-dataset authentication - statistics, images and plots can require a bearer token, which jfjoch_viewer supports.
* jfjoch_viewer: Dark mode and a theme-matched colour scheme, a magnifier panel, and simpler contrast and background controls.
* Rugnux: Multiple performance improvements on GPU and CPU (CPU-only processing up to 40% faster, faster image decoding on ARM), with unchanged results.
* Rugnux: `--model` rigid-body refinement runs on the GPU, and the model-validation check is faster and more reliable.
* Rugnux: Improved scaling and merging - error model, outlier rejection, absorption correction and French-Wilson amplitudes now agree more closely with XDS and ctruncate.
* Rugnux: Improved integration - radial background on powder and ice rings, crowded rotation data keep their reflections, and CPU-only builds integrate large unit cells as GPU builds do.
* Rugnux: More robust detector geometry - measured beam centre, X-ray bandwidth and goniometer rate, and geometry refinement accepted only on significant evidence.
* Rugnux: Merged files are written in the standard setting, or in the setting of a reference MTZ, structure-factor mmCIF or model, with its free-R flags.
* Rugnux: Richer report - ice and powder rings, further lattices, superstructure candidates and mosaicity, with warnings worded as prompts to check.
* Rugnux: Clear error messages when a data set needs more GPU or host memory than is available.

Reviewed-on: #83
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
This commit was merged in pull request #83.
This commit is contained in:
2026-09-29 15:57:32 +02:00
committed by leonarski_f
parent 6dfe065365
commit 84228bf8be
452 changed files with 23762 additions and 3779 deletions
+15 -7
View File
@@ -4,6 +4,8 @@
#include "HDF5ImageSource.h"
#include "../common/JFJochException.h"
#include <algorithm>
#ifdef _WIN32
#include <windows.h>
#else
@@ -97,22 +99,26 @@ HDF5ImageSource::GetDataset(const HDF5ImageLocator::Location &loc) const {
HDF5DataType datatype(*entry.dataset);
HDF5Dcpl dcpl(*entry.dataset);
if (dataspace.GetNumOfDimensions() != 3)
const auto rank = dataspace.GetNumOfDimensions();
if (rank != 3 && rank != 4)
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
loc.dataset + " dataset must be 3D");
loc.dataset + " dataset must be 3D or 4D");
entry.multichannel = (rank == 4);
if (datatype.IsFloat())
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"Float datasets not supported at this time");
auto dim = dataspace.GetDimensions();
entry.height = dim[1];
entry.width = dim[2];
entry.height = dim[rank - 2];
entry.width = dim[rank - 1];
entry.mode = CalcImageMode(datatype.GetElemSize(), datatype.IsFloat(), datatype.IsSigned());
// One chunk per image: [1, h, w], or [1, 1, h, w] for a multichannel dataset
auto chunk_size = dcpl.GetChunking();
entry.direct_chunk = (chunk_size.size() == 3) && (chunk_size[0] == 1)
&& (chunk_size[1] == dim[1]) && (chunk_size[2] == dim[2]);
entry.direct_chunk = (chunk_size.size() == rank)
&& std::all_of(chunk_size.begin(), chunk_size.end() - 2, [](hsize_t c) { return c == 1; })
&& (chunk_size[rank - 2] == entry.height) && (chunk_size[rank - 1] == entry.width);
if (entry.direct_chunk)
entry.algorithm = dcpl.GetCompression();
@@ -155,7 +161,9 @@ HDF5ImageSource::PrepareDirectRead(const HDF5ImageLocator::Location &loc) const
if (!ds.raw)
return {};
const hsize_t coord[3] = {static_cast<hsize_t>(loc.local_index), 0, 0};
const hsize_t coord_3d[3] = {loc.local_index, 0, 0};
const hsize_t coord_4d[4] = {loc.local_index, loc.channel, 0, 0};
const hsize_t *coord = ds.multichannel ? coord_4d : coord_3d;
unsigned filter_mask = 0;
haddr_t address = HADDR_UNDEF;
hsize_t size = 0;