Commit Graph
1272 Commits
Author SHA1 Message Date
leonarski_fandClaude Opus 4.8 ec8a45dc09 windows: bundle cuFFT in installer and tag the CUDA/CPU variant
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m54s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m29s
Build Packages / build:rpm (rocky8) (push) Successful in 14m21s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m34s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m36s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 14m50s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m10s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m44s
Build Packages / XDS test (durin plugin) (push) Successful in 8m29s
Build Packages / Generate python client (push) Successful in 31s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m46s
Build Packages / Build documentation (push) Successful in 56s
Build Packages / build:rpm (rocky9) (push) Successful in 12m39s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m23s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m5s
Build Packages / DIALS test (push) Successful in 12m59s
Build Packages / Unit tests (push) Successful in 59m10s
cuFFT is the only CUDA component linked dynamically (cudart and the
fast-feedback indexer are static), so the prior Windows installer would
fail to launch the GPU path on a host without a CUDA toolkit. Ship
cufft64_*.dll next to the viewer (CUDA 13 keeps it in bin/x64, earlier
toolkits in bin); the DLL is self-contained, so the installed app needs
only an NVIDIA driver.

Tag the variant where it matters and nowhere else: the installer
filename (-cuda<major> / -cpu) and the Add/Remove Programs entry
("Jungfraujoch (CUDA)" / "(CPU)") advertise it, while the install folder
and Start Menu group stay plain "Jungfraujoch" -- the CUDA build is a
strict superset, so the two variants share a location and replace each
other.

Docs: SOFTWARE.md + JFJOCH_VIEWER.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 09:17:52 +02:00
leonarski_fandClaude Opus 4.8 0c1babd0ca CMake: provide Eigen externally again; fix cpack NSIS icon escape
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 14m24s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m39s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m54s
Build Packages / build:rpm (rocky8) (push) Successful in 14m47s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m57s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m27s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m38s
Build Packages / XDS test (durin plugin) (push) Successful in 8m7s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m44s
Build Packages / Generate python client (push) Successful in 26s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m22s
Build Packages / Build documentation (push) Successful in 1m0s
Build Packages / build:rpm (rocky9) (push) Successful in 12m15s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m52s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m25s
Build Packages / DIALS test (push) Successful in 12m49s
Build Packages / Unit tests (push) Successful in 58m37s
Revert Eigen from the FetchContent OVERRIDE_FIND_PACKAGE vendoring (cd394c52,
d4d2d0d8) back to an external find_package(Eigen3) dependency, like zlib. The
OVERRIDE_FIND_PACKAGE mechanism makes the Visual-Studio-bundled CMake (4.x
"-msvc") intermittently segfault during configure -- ~1/3 of fresh configures,
and 100% with Ceres CUDA enabled. The fault is in CMake's own FetchContent
variable-stack cleanup, reached when Ceres' find_package(Eigen3) resolves the
override through a nested FetchContent_MakeAvailable. Stock Kitware CMake runs
the identical scripts fine, so it is a bug in the VS-bundled cmake binary;
providing Eigen externally avoids that path entirely and is stable with Ceres
CUDA both on and off (verified 0 crashes; full CUDA build + NSIS installer
succeed under the VS-bundled cmake).

Also fix CPACK_NSIS_INSTALLED_ICON_NAME: the backslash value was written
verbatim into CPackConfig.cmake, where "\j" is an invalid escape that cmake 4.x
(CMP0010 strict) rejects when cpack re-parses it, so cpack failed under the
VS-bundled cmake (older/Kitware cpack only warned). Use a forward slash.

- image_analysis: keep Ceres USE_CUDA OFF (Jungfraujoch does not use Ceres' GPU
  solvers) but drop the now-obsolete "required to avoid the Windows cmake crash"
  rationale from the comment.
- docs: Eigen is a required external dependency again (SOFTWARE.md); the Windows
  viewer build provides zlib + Eigen externally (JFJOCH_VIEWER.md).
- THIRD_PARTY_NOTICES: move Eigen from the fetched-and-linked table to the
  external runtime-libraries table.

Docker images still need Eigen re-added (5.0.1, source build) -- to follow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 22:33:12 +02:00
leonarski_fandClaude Opus 4.8 1ea5897fca windows: vendor wingetopt and scope server-only targets out of viewer-only builds
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m59s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m9s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m24s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 14m44s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m46s
Build Packages / build:rpm (rocky8) (push) Successful in 14m48s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m27s
Build Packages / XDS test (neggia plugin) (push) Successful in 9m22s
Build Packages / XDS test (durin plugin) (push) Successful in 10m23s
Build Packages / Generate python client (push) Successful in 24s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (JFJoch plugin) (push) Successful in 10m33s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m40s
Build Packages / Build documentation (push) Successful in 47s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m23s
Build Packages / build:rpm (rocky9) (push) Successful in 13m0s
Build Packages / DIALS test (push) Successful in 13m57s
Build Packages / Unit tests (push) Successful in 59m20s
MSVC/Windows build fixes:

- Force JFJOCH_VIEWER_ONLY ON for Windows and macOS; the broker/receiver/FPGA/
  writer server stack is Linux-only, so those platforms build the viewer subset.
- Vendor an OpenBSD/NetBSD getopt/getopt_long shim (tools/wingetopt/, BSD/ISC)
  as a WIN32-only static lib -- the MSVC CRT has no <getopt.h> -- and link it
  into the four portable CLI tools on Windows.
- jfjoch_extract_hkl.cpp: include <getopt.h> explicitly (it relied on glibc's
  transitive <unistd.h>).
- jfjoch_process.cpp: guard <unistd.h> with #ifndef _WIN32.
- Guard JFJochStreamWriter and jfjoch_writer with IF(NOT JFJOCH_VIEWER_ONLY):
  the former pulls in JFJochImagePuller, the latter uses a fork()/waitpid()
  multi-process design; neither belongs to the portable viewer subset.
- Record wingetopt in THIRD_PARTY_NOTICES.md and licenses/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 18:50:20 +02:00
leonarski_fandClaude Opus 4.8 e5034d0a2c licenses: add third-party notices, attribution texts, and viewer license window
Acknowledge all bundled third-party software and satisfy attribution/notice
requirements, while keeping it maintainable:

- THIRD_PARTY_NOTICES.md: human-readable manifest (component, copyright, SPDX
  license, link) for fetched, vendored, and runtime/SDK dependencies.
- licenses/: verbatim license texts; COLLECT.sh regenerates them from the
  build trees and system SDK locations.
- Bundle the verbatim Qt LGPL-3.0 text and the CUDA Toolkit 12.8 EULA.
- frontend: self-contained npm attribution generator (`npm run licenses` ->
  dist/THIRD_PARTY_LICENSES.txt), wired into the frontend build target.
- Install LICENSE + notices + licenses/ into share/doc/jfjoch for every
  packaged component.
- viewer: Help > "Third-party Licenses" window (QTextBrowser) showing a
  generated, self-contained HTML built from licenses/.
- docs/SOFTWARE.md: drop the stale hand-kept dependency lists; point at the
  manifest.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 18:35:50 +02:00
leonarski_fandClaude Opus 4.8 e035f7c303 viewer: drop unused CMAKE_AUTORCC
The viewer's only .qrc is compiled explicitly via QT_ADD_RESOURCES into
APP_RESOURCES; no .qrc is added directly as a target source, so AUTORCC never
acted on anything. Remove the dead flag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:22:48 +02:00
leonarski_fandClaude Opus 4.8 f9396e01e7 viewer: Windows NSIS / macOS installer polish + bundle analysis CLIs
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m43s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m16s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m30s
Build Packages / build:rpm (rocky8) (push) Successful in 14m26s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 14m42s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m41s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m18s
Build Packages / XDS test (durin plugin) (push) Successful in 7m42s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m43s
Build Packages / Generate python client (push) Successful in 30s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (neggia plugin) (push) Successful in 8m8s
Build Packages / Build documentation (push) Successful in 1m5s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m52s
Build Packages / build:rpm (rocky9) (push) Successful in 12m31s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m4s
Build Packages / DIALS test (push) Successful in 12m27s
Build Packages / Unit tests (push) Successful in 59m47s
NSIS installer was missing several things on Windows:
- License: show the repo GPLv3 LICENSE as the click-through license page
  (CPACK_RESOURCE_FILE_LICENSE).
- Start Menu: no shortcut was created -- add CPACK_PACKAGE_EXECUTABLES for
  jfjoch_viewer, and embed an app icon so the shortcut is not generic. The
  icon is a new multi-size jfjoch.ico (256 PNG + 48/32/16) compiled into the
  .exe via resources/jfjoch.rc; macOS gets the matching jfjoch.icns copied
  into the .app bundle (MACOSX_BUNDLE_ICON_FILE). Both derived from
  resources/jfjoch.png, padded square with transparent bands.
- Naming: install folder, Start Menu group and Add/Remove Programs entry are
  now "Jungfraujoch" instead of "jfjoch <version>".

Also ship the offline analysis CLIs (jfjoch_process/scale/azint/extract_hkl)
in viewer-only / Windows packages: JFJochReceiverPlots now lives in
JFJochCommon, so their stale JFJochReceiver link is dropped, leaving only the
portable libs (reader/image_analysis/writer/common). tools/CMakeLists.txt is
split so those four build everywhere while the hardware tools stay gated
behind NOT JFJOCH_VIEWER_ONLY, and the viewer-only branch now adds tools/.
They install into the "viewer" CPack component.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 16:40:46 +02:00
leonarski_f e6c6536e3a JFJochReceiverPlots: Move to common/, so it can be linked without bringing JFJochReceiver HW dependencies 2026-06-20 16:26:11 +02:00
leonarski_fandClaude Opus 4.8 5247acc07e CMake: package the viewer component in JFJOCH_VIEWER_ONLY builds
A viewer-only build builds jfjoch_viewer but the CPack block hard-coded
CPACK_COMPONENTS_ALL to "jfjoch writer" and only appended "viewer" when
JFJOCH_VIEWER_BUILD was set -- which a pure viewer-only build does not set.
cpack then tried to package the empty jfjoch/writer components and failed,
requiring a manual -D CPACK_COMPONENTS_ALL=viewer.

Branch the component list on build mode: viewer-only packages just "viewer";
other modes keep "jfjoch writer" plus driver-dkms/viewer when their flags are
set. Also drops the redundant re-set of the default list.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 16:13:24 +02:00
leonarski_fandClaude Opus 4.8 5064b5ba47 image_analysis: force Ceres to build without CUDA
USE_CUDA is a Ceres cache STRING (default "default" = auto-detect), not an
option(), so a plain SET was shadowed by the cache default and CUDA got
enabled on MSVC. Force it OFF in the cache instead.

Also drop two dead settings: MINIGLOG (Ceres uses abseil logging now, no
longer referenced) and EIGENSPARSE ON (already Ceres' default).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 16:08:38 +02:00
leonarski_f a89a4c5beb jfjoch_viewer: Show detected GPUs in the about box 2026-06-20 16:08:13 +02:00
leonarski_fandClaude Opus 4.8 9c9f818ea6 CMake: support DGX Spark (Blackwell GB10 sm_121 + aarch64 FFTW NEON)
- CUDA: append sm_121 (Blackwell GB10 / DGX Spark) to CMAKE_CUDA_ARCHITECTURES
  when nvcc >= 12.9 knows it. The static list tops out at sm_120 and embeds no
  PTX, so without this a build would fail to launch on Spark ("no kernel image
  available"); guarded so CUDA 12.8 (which predates sm_121) is unaffected.
- FFTW: enable NEON codelets on aarch64 (Grace), mirroring the x86 SSE2/AVX/AVX2
  branch, so single-precision FFT is SIMD-accelerated instead of scalar on ARM.

Both are inert on x86 / CUDA 12.8; verified configure still succeeds there.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 15:42:00 +02:00
leonarski_fandClaude Opus 4.8 8cd46751f9 docker: drop fftw too -- the project builds FFTW itself
FFTW is fetched and built by the jungfraujoch CMake (single-precision, from the
release tarball), so the system fftw packages (fftw-static/fftw-devel on Rocky,
libfftw3-dev on Ubuntu) were unused. Remove them from all four images.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 15:32:05 +02:00
leonarski_fandClaude Opus 4.8 da5fff71a9 docker: unify static Qt 6.9.1 on all 4 Linux images, drop dead prebuilds
The jungfraujoch CMake now builds HDF5 + libtiff (FetchContent) and
libjpeg-turbo + Eigen (ExternalProject / OVERRIDE_FIND_PACKAGE) itself, so the
per-image pre-builds and system -dev packages for those were dead weight (the
app rebuilt its own copies regardless). Consolidate dependency management into
the one CMakeLists at the cost of longer build time (build env has network).

- Qt: pin static 6.9.1 everywhere. ubuntu2204 was on 6.10.0 and ubuntu2404 used
  the OS Qt (~6.4, dynamic) -- the latter is now a static 6.9.1 build like the
  others, so every image ships a self-contained, identical-Qt viewer.
- Remove the HDF5/libtiff/libjpeg-turbo/Eigen source builds + their system -dev
  packages + the stale /opt/* CMAKE_PREFIX_PATH/PKG_CONFIG_PATH entries.
- nasm: now needed by the project's libjpeg-turbo ExternalProject; added to
  ubuntu2404 (the others already had it).
- Standardize the Qt configure flags across all four (xcb, xcb_xlib=OFF,
  no Wayland -- the qtwayland module was never built, so wayland_client=ON on
  ubuntu2204 was a no-op).

Untested here (no Docker on this host) -- needs a build in each image; the
ubuntu2404 static-Qt dep list in particular should be sanity-checked.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 15:28:29 +02:00
leonarski_fandClaude Opus 4.8 31630c20a1 viewer: macOS .app / Windows GUI packaging + Qt deploy + CPack generators
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m52s
Build Packages / build:rpm (rocky8) (push) Successful in 14m24s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 15m16s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 15m12s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 15m20s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m25s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m48s
Build Packages / XDS test (neggia plugin) (push) Successful in 8m36s
Build Packages / Generate python client (push) Successful in 27s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 9m39s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (durin plugin) (push) Successful in 9m59s
Build Packages / Build documentation (push) Successful in 54s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m44s
Build Packages / build:rpm (rocky9) (push) Successful in 13m38s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m23s
Build Packages / DIALS test (push) Successful in 12m58s
Build Packages / Unit tests (push) Successful in 59m33s
Add the platform packaging the viewer was missing so it can ship as a .dmg
(macOS) or installer (Windows):

- viewer: set MACOSX_BUNDLE (a .app bundle on macOS) and WIN32_EXECUTABLE
  (GUI subsystem, no console window) -- both ignored where they don't apply;
  install with BUNDLE/RUNTIME destinations.
- viewer: qt_generate_deploy_app_script + install(SCRIPT) to bundle the Qt
  runtime at install time (windeployqt on Windows, macdeployqt on macOS).
  Gated on Qt >= 6.5, which is where the OUTPUT_SCRIPT signature and the Linux
  deploy path landed; with a static Qt (our Linux builds) it is a no-op.
- CPack: select DragNDrop (.dmg) on macOS and NSIS on Windows, ahead of the
  Linux-only /etc/* probes; DEB/RPM path unchanged.

Verified: configures + generates cleanly on Linux with the viewer enabled
(Qt 6.4.2 -> deploy step correctly skipped).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 15:05:40 +02:00
leonarski_fandClaude Opus 4.8 d4d2d0d8ad CMake: fix CI -- export vendored Eigen so Ceres' install(EXPORT) resolves
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m49s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 14m22s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m32s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m37s
Build Packages / build:rpm (rocky8) (push) Successful in 14m30s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m38s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m11s
Build Packages / XDS test (durin plugin) (push) Successful in 7m49s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m5s
Build Packages / Generate python client (push) Successful in 27s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 1m5s
Build Packages / XDS test (neggia plugin) (push) Successful in 9m8s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m52s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m12s
Build Packages / build:rpm (rocky9) (push) Successful in 12m34s
Build Packages / DIALS test (push) Successful in 12m37s
Build Packages / Unit tests (push) Successful in 58m0s
A clean configure failed at generation:
  install(EXPORT "CeresExport" ...) includes target "ceres" which requires
  target "eigen" that is not in any export set.

Ceres' install(EXPORT CeresExport) is unconditional, and its ceres target
transitively links the eigen target. As a FetchContent subproject Eigen leaves
EIGEN_BUILD_CMAKE_PACKAGE OFF (it defaults to PROJECT_IS_TOP_LEVEL), so its
install(EXPORT Eigen3Targets) never runs and eigen ends up in no installed
export set. Force EIGEN_BUILD_CMAKE_PACKAGE ON so eigen is exported and Ceres'
export validates. Install/export-only change; the build is unaffected.

Verified with a clean configure (fresh CMakeCache): configure + generate now
succeed where they previously errored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 13:38:46 +02:00
leonarski_fandClaude Opus 4.8 cd394c5249 CMake: vendor Eigen (5.0.1) and libjpeg-turbo so the build is self-contained
Build Packages / Unit tests (push) Failing after 2m41s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Failing after 2m34s
Build Packages / build:rpm (rocky8) (push) Failing after 2m29s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Failing after 2m38s
Build Packages / build:rpm (rocky8_sls9) (push) Failing after 2m34s
Build Packages / build:rpm (rocky8_nocuda) (push) Failing after 2m43s
Build Packages / build:rpm (rocky9_nocuda) (push) Failing after 2m49s
Build Packages / build:rpm (rocky9_sls9) (push) Failing after 2m56s
Build Packages / Generate python client (push) Successful in 21s
Build Packages / Build documentation (push) Successful in 1m9s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (ubuntu2404) (push) Failing after 2m15s
Build Packages / build:rpm (ubuntu2204) (push) Failing after 2m17s
Build Packages / XDS test (JFJoch plugin) (push) Failing after 2m24s
Build Packages / build:rpm (rocky9) (push) Failing after 2m34s
Build Packages / XDS test (neggia plugin) (push) Failing after 2m23s
Build Packages / DIALS test (push) Failing after 2m29s
Build Packages / XDS test (durin plugin) (push) Failing after 2m41s
Two deps the Linux build picked up from the system were absent on Windows.
Bundle both, unconditionally (matching how libtiff/FFTW are vendored), so the
tree builds without system Eigen/JPEG:

- Eigen 5.0.1 via FetchContent with OVERRIDE_FIND_PACKAGE, so every
  find_package(Eigen3) -- ours, Ceres', and ffbidx' -- resolves to this copy and
  the requested 3.4 version is satisfied by the newer major. ffbidx's bundled
  eigen submodule is disabled (GIT_SUBMODULES "" on fast-indexer) so it no longer
  creates a duplicate Eigen3::Eigen target. Verified on a CUDA build: Ceres 2.3.0,
  the analysis libs, and ffbidx's CUDA code all compile against 5.0.1.

- libjpeg-turbo 3.0.4 via ExternalProject (upstream discourages add_subdirectory);
  built+installed static and imported as JPEG::JPEG, replacing find_package(JPEG)
  in preview/. SIMD is lazy: WITH_SIMD=ON + REQUIRE_SIMD=OFF means NASM-accelerated
  when nasm is present, otherwise a warning and a scalar build (no hard failure).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 07:55:56 +02:00
leonarski_f 4737eff1a9 jfjoch_process: Missing include <set> 2026-06-20 07:44:50 +02:00
leonarski_f 7eb927e82f CMake: Ensure static ZLIB (must be before FIND_PACKAGE) 2026-06-20 07:40:56 +02:00
leonarski_fandClaude Opus 4.8 1ae2e6869d CLAUDE.md: record Windows viewer goal of MSVC + CUDA, and unbundled deps
The recurring goal is a Windows jfjoch_viewer built with MSVC *and* CUDA ON
(GPU processing is wanted, not a CPU-only fallback); the non-CUDA path is the
macOS fallback. Also note the three deps a self-contained Windows build still
needs but FetchContent does not auto-provide: ZLIB (bundle zlib-ng as
ZLIB::ZLIB), libjpeg-turbo (ExternalProject), and Eigen (header-only, also
needed by Ceres) -- each guarded so the Linux build is unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 07:38:06 +02:00
leonarski_fandClaude Opus 4.8 025c6394b6 reader: fix Windows path handling in JFJochHDF5Reader
Two spots used POSIX-only path logic that breaks on Windows:

- dataset_name() located the basename with rfind('/'), which misses
  backslash separators, so a C:\...\foo_master.h5 file prefix kept the
  whole directory. Use std::filesystem::path::filename() instead.
- Legacy-format data-file resolution joined paths with
  fmt::format("{}/{}", ...), producing mixed \/ separators and prepending
  the master directory even to absolute link targets. Reuse the existing
  ResolveRelativeToMaster() helper, which joins via std::filesystem and
  leaves absolute targets untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 07:23:07 +02:00
leonarski_fandClaude Opus 4.8 4a39f2cfcf Fix FFTW build-tree header wiring and two MSVC warnings
FFTW exposes fftw3.h only via $<INSTALL_INTERFACE:include>, so consuming
fftw3f from the build tree (FetchContent) leaves FFTIndexerCPU.h unable to
find the header. A system-installed fftw3.h masks this on Linux, so it only
bit on Windows; add the source-tree api/ dir to fftw3f's interface includes.

Also two viewer-reachable warnings:
- time_utc.h (C4477): %03ld was fed a chrono milliseconds::rep (64-bit), not
  a long; cast the 0-999 value to int and use %03d.
- HDF5Objects.h (C4700): value-initialize the scalar read buffer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 07:15:47 +02:00
leonarski_fandClaude Opus 4.8 b888c53509 CMake: stop libtiff/httplib pulling in webp, sharpyuv, brotli
libtiff's webp and lerc codec options default ON whenever their library is
found on the build host, dragging in libwebp + libsharpyuv (webp) and libLerc.
We only need DEFLATE (zlib) + the internal LZW codec, so turn both OFF.

httplib likewise auto-enables Brotli content-encoding when system Brotli is
present; gzip/zlib is enough for the broker, so disable it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 07:10:04 +02:00
leonarski_f a872b68d6f ADUHistogram: Fix missing exception header
Build Packages / build:rpm (rocky9_nocuda) (push) Failing after 3m50s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Failing after 11m18s
Build Packages / build:rpm (rocky8_nocuda) (push) Failing after 12m7s
Build Packages / build:rpm (rocky9_sls9) (push) Failing after 12m57s
Build Packages / build:rpm (rocky8_sls9) (push) Failing after 13m4s
Build Packages / build:rpm (rocky8) (push) Failing after 13m6s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Failing after 13m24s
Build Packages / build:rpm (rocky9) (push) Failing after 11m13s
Build Packages / Generate python client (push) Successful in 27s
Build Packages / Build documentation (push) Successful in 57s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (neggia plugin) (push) Successful in 8m35s
Build Packages / XDS test (durin plugin) (push) Successful in 8m54s
Build Packages / build:rpm (ubuntu2204) (push) Failing after 10m48s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m56s
Build Packages / build:rpm (ubuntu2404) (push) Failing after 10m12s
Build Packages / DIALS test (push) Successful in 11m57s
Build Packages / Unit tests (push) Successful in 56m50s
2026-06-20 06:14:15 +02:00
leonarski_fandClaude Opus 4.8 bcd588b400 CMake: build StreamWriter only into JFJochStreamWriter
Build Packages / Unit tests (push) Failing after 4m18s
Build Packages / build:rpm (rocky8_nocuda) (push) Failing after 5m29s
Build Packages / build:rpm (rocky9_nocuda) (push) Failing after 5m54s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Failing after 4m2s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Failing after 4m44s
Build Packages / build:rpm (rocky8) (push) Failing after 5m39s
Build Packages / build:rpm (rocky9) (push) Failing after 5m35s
Build Packages / build:rpm (rocky9_sls9) (push) Failing after 6m13s
Build Packages / build:rpm (rocky8_sls9) (push) Failing after 6m22s
Build Packages / build:rpm (ubuntu2204) (push) Failing after 5m44s
Build Packages / Generate python client (push) Successful in 15s
Build Packages / build:rpm (ubuntu2404) (push) Failing after 5m3s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 50s
Build Packages / DIALS test (push) Failing after 3m24s
Build Packages / XDS test (neggia plugin) (push) Failing after 3m15s
Build Packages / XDS test (JFJoch plugin) (push) Failing after 3m20s
Build Packages / XDS test (durin plugin) (push) Failing after 3m50s
StreamWriter.cpp was compiled into both JFJochWriter and JFJochStreamWriter,
so JFJochWriter still transitively pulled in image_puller headers via
StreamWriter.h. Compile it only into JFJochStreamWriter (which already
links JFJochImagePuller); targets needing the streaming writer (jfjoch_writer,
jfjoch_test) link that lib, while JFJochWriter consumers (viewer, tools,
ImagePusher) no longer drag in the puller. Also drop a stray duplicate
HDF5DataFile source listing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 23:15:49 +02:00
leonarski_fandClaude Opus 4.8 ebc28744e2 viewer: fix MSVC compatibility in viewer-reachable code
Address portability issues found building jfjoch_viewer with MSVC:

- common/{ADUHistogram,AzimuthalIntegrationProfile}.h and
  image_analysis/spot_finding/StrongPixelSet.h only need DeviceOutput,
  so include fpga/pcie_driver/jfjoch_fpga.h (plain-C, self-contained)
  directly instead of acquisition_device/AcquisitionDevice.h, which
  dragged <unistd.h> into the viewer tree.
- common/time_utc.h: guard gmtime_r/timegm/localtime_r with the MSVC
  equivalents (gmtime_s/_mkgmtime/localtime_s) under _WIN32; drop the
  duplicated includes and add the headers used directly.
- gemmi_gph/gemmi/utf.hpp: vendor the upstream gemmi header; fileutil.hpp
  includes it on Windows for UTF8_to_wchar but it was never vendored.
- writer/HDF5Objects.cpp: ExtractFilename returns path.filename().string()
  (std::filesystem::path has no implicit conversion to std::string on
  Windows, where it is wchar_t-based).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 23:15:27 +02:00
leonarski_f 07ce8b785a CMake: Remove image_puller dependency from the jfjoch_viewer 2026-06-19 23:03:07 +02:00
leonarski_f c9803ccbfd Separate JFJochWriter and JFJochStreamWriter 2026-06-19 22:56:11 +02:00
leonarski_fandClaude Opus 4.8 5a6485da3a cmake: use upstream libtiff (gitlab) at v4.7.1
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 11m1s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 11m2s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m29s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m34s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 12m0s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m35s
Build Packages / build:rpm (rocky8) (push) Successful in 12m19s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m10s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m35s
Build Packages / Generate python client (push) Successful in 18s
Build Packages / build:rpm (rocky9) (push) Successful in 12m46s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 45s
Build Packages / XDS test (durin plugin) (push) Successful in 9m28s
Build Packages / DIALS test (push) Successful in 14m43s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m54s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m36s
Build Packages / Unit tests (push) Successful in 1h0m51s
Switch the libtiff FetchContent from the personal GitHub mirror to the
upstream gitlab repo and bump v4.6.0 -> v4.7.1 -- cleaner provenance; the
mirror was only ever a network-reachability workaround.

Verified on Linux: fetches, builds static (libtiff.a/libtiffxx.a), and
jfjoch_viewer links cleanly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 22:47:36 +02:00
leonarski_fandClaude Opus 4.8 53645434be cmake: enable FFTW SSE2/AVX/AVX2 codelets (x86, runtime-dispatched)
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 14m9s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m53s
Build Packages / build:rpm (rocky8) (push) Successful in 14m56s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 15m3s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m10s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 15m12s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m38s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m15s
Build Packages / Generate python client (push) Successful in 30s
Build Packages / XDS test (durin plugin) (push) Successful in 9m16s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (neggia plugin) (push) Successful in 8m48s
Build Packages / Build documentation (push) Successful in 1m10s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m15s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m29s
Build Packages / build:rpm (rocky9) (push) Successful in 13m11s
Build Packages / DIALS test (push) Successful in 13m21s
Build Packages / Unit tests (push) Successful in 1h16m18s
FFTW selects SIMD codelets at runtime via cpuid, so enabling AVX2 does not
require an AVX2 CPU -- it just speeds up the CPU FFT fallback indexer on
capable hardware and falls back to SSE2/scalar otherwise. Arch-guarded to
x86_64/AMD64 (ARM would need ENABLE_NEON). AVX-512 left off on purpose:
it's x86-64-v4 (not our v3 target), the FFT gain over AVX2 is marginal,
older Intel downclocks on it, and it's the riskiest to build under MSVC.

Verified on Linux: SSE2/AVX/AVX2 codelets compile, libfftw3f.a stays a
single static archive, jfjoch_viewer relinks cleanly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 22:37:09 +02:00
leonarski_fandClaude Opus 4.8 0220c6376d cmake: fetch libtiff and FFTW instead of relying on system libs
Both are leaf deps (JFJochPreview / JFJochIndexing) that only our own code
looks for, so building them ourselves removes the system-package lottery and
gives a reproducible, statically-linked build on every platform.

- libtiff: FetchContent, library only (jbig/zstd/lzma/jpeg/old-jpeg/tools/
  tests off). The C++ binding (TIFF::CXX / libtiffxx) is packaged
  inconsistently across distros -- missing on Rocky 9 -- and absent on
  Windows, so find_package(TIFF COMPONENTS CXX) was unreliable; that call is
  removed and JFJochPreview links the tiff/tiffxx targets directly. GitHub
  mirror because upstream (gitlab) is unreachable from some restricted hosts.
- FFTW: FetchContent single precision (ENABLE_FLOAT) from the release tarball
  -- the git repo ships no pre-generated codelets (needs OCaml genfft). It's
  now always available, so the CPU FFT indexer is always built and
  JFJOCH_USE_FFTW always defined; the "FFTW disabled" path is gone. Static
  (libfftw3f.a) via the global BUILD_SHARED_LIBS OFF.

Verified on Linux: jfjoch_viewer builds and links libfftw3f.a + libtiff*.a,
all static.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 22:16:05 +02:00
leonarski_f fcbe19103d Update to most recent bitshuffle version 2026-06-19 22:10:06 +02:00
leonarski_fandClaude Opus 4.8 0585fab9bf cmake: don't fetch sls/catch2 in a viewer-only build
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 8m20s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m43s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m34s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 11m3s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 9m57s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 10m27s
Build Packages / build:rpm (rocky8) (push) Successful in 10m17s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 9m17s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 10m22s
Build Packages / build:rpm (rocky9) (push) Successful in 11m10s
Build Packages / Generate python client (push) Successful in 19s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 51s
Build Packages / XDS test (durin plugin) (push) Successful in 7m16s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m38s
Build Packages / DIALS test (push) Successful in 12m31s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m5s
Build Packages / Unit tests (push) Successful in 54m23s
Under JFJOCH_VIEWER_ONLY, only the viewer's transitive deps are built, so
sls_detector_package (detector_control/receiver) and catch2 (tests) are
never used -- and sls does not configure under MSVC, which is the whole
point of the viewer-only mode. Skip fetching just those two; zstd, hdf5,
spdlog, libzmq and httplib are still required (JFJochReader links httplib).

Verified: cmake -DJFJOCH_VIEWER_ONLY=ON configures with sls/catch2 absent
and `make jfjoch_viewer` still links.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 21:02:28 +02:00
leonarski_fandClaude Opus 4.8 3c6439530d cmake: raise policy floor to 3.5 for FetchContent deps (CMake 4.x)
CMake >= 4.0 (4.3.1 ships bundled with Visual Studio 2026) makes any
cmake_minimum_required(VERSION < 3.5) a fatal error. The fetched libzmq
still declares VERSION 3.0.2, which aborts configuration before our own
CMakeLists gets a say. Set CMAKE_POLICY_VERSION_MINIMUM=3.5 before the
FetchContent_MakeAvailable calls so those subprojects configure; the
variable is simply unused (harmless) on CMake < 3.30.

Verified against CMake 4.3.1: the real libzmq source fails without it and
configures with it, and an in-file SET() propagates into the
add_subdirectory child exactly as a -D cache entry does.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 21:02:28 +02:00
leonarski_fandClaude Opus 4.8 f21c22d453 cmake: add JFJOCH_VIEWER_ONLY to build the viewer standalone
New option (default OFF) that compiles only jfjoch_viewer and the
libraries it transitively links -- common, image_analysis, writer,
reader, preview, image_puller, frame_serialize, gemmi_gph, compression,
jungfrau, and the OpenAPI model (JFJochAPI) -- skipping the Linux-only
online stack (broker service, receiver, fpga, acquisition_device,
detector_control, image_pusher, xds-plugin, tests, tools) and the
frontend. This is the standalone build path for the cross-platform
viewer.

JFJochAPI is the only piece the viewer needs from broker/, so the broker
service library and executable are gated behind NOT JFJOCH_VIEWER_ONLY.
The full build and JFJOCH_VIEWER_BUILD (viewer on top of the full build)
are unchanged -- that path is the verbatim ELSE() branch.

Verified on Linux: cmake -DJFJOCH_VIEWER_ONLY=ON configures and
`make jfjoch_viewer` links cleanly with the online stack absent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 21:02:28 +02:00
leonarski_fandClaude Opus 4.8 74c2c808de cmake: drop GCC-only hardcoded flags, bump CUDA to C++20
Make the build less hostile to MSVC (needed for the viewer port) and
align the CUDA standard with C++.

- Remove the CMAKE_C/CXX_FLAGS_RELEASE overrides: -O3/-DNDEBUG only
  duplicate CMake's own GCC/Clang Release defaults, and the SET()
  clobbered the MSVC defaults. The lone meaningful flag,
  -Wno-deprecated-enum-enum-conversion, merely silenced warnings from
  the vendored Xilinx ap_private.h in the FPGA path; with no -Werror
  it is just log noise, so drop it.
- CMAKE_CUDA_STANDARD 17 -> 20 (+ STANDARD_REQUIRED); CUDA >= 12.8
  already supports C++20.
- Drop the file-scoped -Ofast on JFPedestalCalc.cpp /
  JFConversionFloatingPoint.cpp: it is GCC-only and reaches the MSVC
  viewer via JFJochCommon -> JFCalibration. Those files now build at
  plain -O3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 21:02:28 +02:00
leonarski_f 1e53db8f64 Docker: Update 2606 to support python3.12/3.13
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 12m15s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 12m45s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m18s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 13m12s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 12m56s
Build Packages / XDS test (durin plugin) (push) Successful in 7m24s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m52s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 13m7s
Build Packages / build:rpm (rocky8) (push) Successful in 12m55s
Build Packages / Generate python client (push) Successful in 17s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m29s
Build Packages / build:rpm (rocky9) (push) Successful in 13m40s
Build Packages / Build documentation (push) Successful in 1m7s
Build Packages / DIALS test (push) Successful in 14m7s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m23s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m25s
Build Packages / Unit tests (push) Failing after 1h8m4s
2026-06-19 20:56:13 +02:00
leonarski_fandClaude Opus 4.8 3ce7666738 make_doc.sh: prefer the newest available python3.x
Build Packages / Unit tests (push) Successful in 51m32s
Build Packages / DIALS test (push) Successful in 9m31s
Build Packages / XDS test (durin plugin) (push) Successful in 5m48s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m3s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m31s
Build Packages / Generate python client (push) Successful in 26s
Build Packages / Build documentation (push) Successful in 54s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m15s
Build Packages / build:rpm (rocky8) (push) Successful in 14m9s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m22s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m41s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 14m48s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m47s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m3s
Build Packages / build:rpm (rocky9) (push) Successful in 15m4s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 13m8s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m36s
The bare python3 is often too old for the Sphinx build. Auto-select the
newest python3.13/3.12/3.11/3 found on PATH, still allowing $PYTHON to
override.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 16:37:32 +02:00
leonarski_f 4e9505e6bb make_doc.sh: Use python3
Build Packages / build:rpm (rocky8_nocuda) (push) Failing after 2m58s
Build Packages / build:rpm (rocky9_nocuda) (push) Failing after 2m56s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Failing after 2m31s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Failing after 3m0s
Build Packages / build:rpm (rocky8) (push) Failing after 3m6s
Build Packages / build:rpm (rocky9_sls9) (push) Failing after 3m23s
Build Packages / build:rpm (rocky8_sls9) (push) Failing after 3m31s
Build Packages / build:rpm (ubuntu2204) (push) Failing after 2m46s
Build Packages / build:rpm (rocky9) (push) Failing after 2m54s
Build Packages / Generate python client (push) Successful in 11s
Build Packages / Build documentation (push) Failing after 9s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (ubuntu2404) (push) Failing after 3m18s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m47s
Build Packages / XDS test (durin plugin) (push) Successful in 6m54s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m58s
Build Packages / DIALS test (push) Successful in 9m47s
Build Packages / Unit tests (push) Successful in 53m21s
2026-06-19 16:06:49 +02:00
leonarski_fandClaude Opus 4.8 a34a033c99 frontend: auto-fill the missing phi bound for a sector
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Failing after 3m39s
Build Packages / build:rpm (rocky8_nocuda) (push) Failing after 3m47s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Failing after 3m41s
Build Packages / build:rpm (rocky8_sls9) (push) Failing after 3m45s
Build Packages / build:rpm (rocky9_nocuda) (push) Failing after 4m0s
Build Packages / build:rpm (rocky8) (push) Failing after 3m53s
Build Packages / build:rpm (rocky9_sls9) (push) Failing after 3m55s
Build Packages / build:rpm (ubuntu2204) (push) Failing after 2m41s
Build Packages / Generate python client (push) Successful in 32s
Build Packages / Build documentation (push) Failing after 27s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (rocky9) (push) Failing after 4m37s
Build Packages / build:rpm (ubuntu2404) (push) Failing after 4m49s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m42s
Build Packages / XDS test (durin plugin) (push) Successful in 6m17s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m4s
Build Packages / DIALS test (push) Successful in 10m37s
Build Packages / Unit tests (push) Successful in 56m38s
When only one azimuthal phi bound is entered, fill the other so the
sector is well-defined and the server accepts it: a missing phi_min
becomes 0 and a missing phi_max becomes 360. Leaving both empty still
means a full ring.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 16:05:15 +02:00
leonarski_fandClaude Opus 4.8 e9e5ec79cd frontend: phi_min/phi_max columns in the azimuthal ROI table
Surface the optional azimuthal phi-sector bounds (phi_min_deg/phi_max_deg)
as editable columns, so a sector can be set from the web UI, not only the
viewer. Also fix the Q_max row's d header, which read d_max but is d_min.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 16:01:13 +02:00
leonarski_fandClaude Opus 4.8 e60b42ea83 viewer: white, compact, right-aligned ROI numeric fields
The ROI bound editors now have a white background, a capped width and
right-aligned text, which reads better for numeric entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 16:01:13 +02:00
leonarski_fandClaude Opus 4.8 abc1d1c079 viewer: add/subtract the selected ROI to/from the user mask
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Failing after 3m45s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Failing after 3m44s
Build Packages / build:rpm (rocky8_nocuda) (push) Failing after 3m50s
Build Packages / build:rpm (rocky8_sls9) (push) Failing after 3m45s
Build Packages / build:rpm (rocky8) (push) Failing after 3m46s
Build Packages / build:rpm (rocky9_nocuda) (push) Failing after 4m0s
Build Packages / build:rpm (rocky9_sls9) (push) Failing after 3m56s
Build Packages / build:rpm (ubuntu2204) (push) Failing after 3m5s
Build Packages / build:rpm (ubuntu2404) (push) Failing after 3m7s
Build Packages / build:rpm (rocky9) (push) Failing after 3m12s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Failing after 21s
Build Packages / Generate python client (push) Successful in 31s
Build Packages / XDS test (durin plugin) (push) Successful in 5m53s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m12s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m54s
Build Packages / DIALS test (push) Successful in 8m46s
Build Packages / Unit tests (push) Successful in 48m22s
Restore the ROI-to-mask action on the new list: "Add to mask" and
"Subtract from mask" buttons rasterise the selected ROI into the user
mask (set or clear), through the same UpdateUserMask_i path. The ROI is
evaluated with per-pixel resolution and phi from the geometry, so box,
circle and azimuthal (sector) ROIs all map correctly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:08:59 +02:00
leonarski_fandClaude Opus 4.8 81b48febcf viewer: remove the dead scratch-ROI widgets and worker methods
With the scratch ROI panel gone, delete the now-orphaned
JFJochViewerImageROIStatistics(_Box/_Circle) widgets and the worker's
unused scratch-ROI plumbing (SetROIBox/SetROICircle, the ROIElement
member, AddROIToUserMask/SubtractROIFromUserMask). ROI-to-mask, if wanted
later, should act on the selected list ROI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:58:33 +02:00
leonarski_fandClaude Opus 4.8 52aca9a4a9 docs: ROIs/azimuthal apply to both FPGA and DECTRIS workflows
Clarify in FPGA_DATA_ANALYSIS.md that the ROI and azimuthal definitions
are also evaluated on CPU via the shared image_analysis library, so they
apply to the DECTRIS SIMPLON (EIGER) path that has no FPGA, not only the
FPGA-accelerated JUNGFRAU/PSI path. Document the three NXmx writer formats
(Legacy/VDS/Integrated) and the two acquisition workflows in CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:55:01 +02:00
leonarski_f d4c96d48fc make_doc.sh: Use default python 2026-06-19 14:52:40 +02:00
leonarski_fandClaude Opus 4.8 fef9c2f4c3 viewer: load user mask from TIFF (replace or add)
Two Mask-menu entries read a 16-bit TIFF (via ReadTIFFFromString16) and
apply it as the user mask: "replace" overwrites the current mask, "add"
unions the TIFF into it. The TIFF must match the detector dimensions; any
non-zero pixel masks. Both go through UpdateUserMask_i like the other
mask edits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:52:21 +02:00
leonarski_fandClaude Opus 4.8 b2c60dfbd0 viewer: download/upload ROIs to the broker
Add Download and "Upload to server" buttons to the ROI panel. The HTTP
reader gains GetROIDefinitions (GET /config/roi) and UploadROIDefinitions
(PUT /config/roi), converting between ROIDefinition and the generated
Roi_definitions model (including the optional azimuthal phi sector), the
same shapes OpenAPIConvert uses on the server. Download applies the
fetched ROIs through SetROIDefinition; upload pushes the current ones.
Both are no-ops unless the viewer is connected to a broker.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:47:10 +02:00
leonarski_fandClaude Opus 4.8 142cb88aa8 viewer: shift/ctrl-drag creates list ROIs; remove the old scratch panel
The interactive shift-drag (box) / shift+ctrl-drag (circle) now creates a
new persistent ROI in the list instead of feeding the old single-ROI
scratch panel. The base emits a roiScratchDrawn hook on release; the
diffraction image turns the drawn shape into a named ROI committed via
SetROIDefinition.

The old JFJochViewerImageROIStatistics scratch panel and all its wiring
(box/circle configuration, single-ROI result, add/subtract user mask) are
removed from the side panel and window; the ROI list is now the single
source.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:31:23 +02:00
leonarski_fandClaude Opus 4.8 1d015145a4 viewer: numeric editing of the selected ROI's bounds
The ROI panel now shows editable numeric fields for the selected ROI,
labelled by type: box min/max X/Y, circle centre/radius, or azimuthal
Q-range and phi sector. Editing a field rebuilds that ROI and commits it
through the same SetROIDefinition path, so all three types can be created
(via +) and dialled in by typing, not only by dragging.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:24:57 +02:00
leonarski_fandClaude Opus 4.8 d413af0e92 viewer: azimuthal ROI handles, and keep panning inside the ROI
Azimuthal ROIs now show discrete grab handles on the selected ROI: the
inner/outer arc (resize Q/d) and, for a sector, the two phi edges
(rotate). Editing is by clicking a handle, with a generous tolerance,
which fixes the previously near-impossible phi-edge grab. Clicking the
(large) interior of an azimuthal ROI now only selects it and lets the
view pan, instead of capturing the gesture.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:21:23 +02:00