Commit Graph
1299 Commits
Author SHA1 Message Date
leonarski_f 9defbffa67 Revert "CI: reuse jfjoch_hdf5_test via artifact in dials-test"
This reverts commit 94125bd6cb.
2026-06-22 17:49:38 +02:00
leonarski_fandClaude Opus 4.8 961836837f viewer: salmon group boxes; dataset-info x-axis spans the whole dataset
- Fusion fills QGroupBox interiors with a flat light colour, so the settings window
  lost its salmon look. A tiny app stylesheet (QGroupBox { background: transparent })
  makes them show the salmon window background again; entry widgets stay white via
  the palette.
- The dataset-info chart now fixes the x-axis to the whole dataset [0, n) (the
  largest run = the original file), so a subset run is drawn at its real image
  positions instead of being stretched to fill the plot. Subsets with binning bin
  by ordinal and place each point at its mapped image number (correct for the
  common contiguous sub-range).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 16:56:18 +02:00
leonarski_fandClaude Opus 4.8 94125bd6cb CI: reuse jfjoch_hdf5_test via artifact in dials-test
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 14m21s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 15m1s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 15m26s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 15m19s
Build Packages / build:rpm (rocky8) (push) Successful in 15m21s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m41s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 16m14s
Build Packages / Build jfjoch_hdf5_test (push) Successful in 9m13s
Build Packages / Generate python client (push) Successful in 26s
Build Packages / XDS test (neggia plugin) (push) Successful in 9m15s
Build Packages / Create release (push) Skipped
Build Packages / DIALS test (push) Failing after 6s
Build Packages / Build documentation (push) Successful in 54s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 10m31s
Build Packages / XDS test (durin plugin) (push) Successful in 10m41s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m51s
Build Packages / build:rpm (rocky9) (push) Successful in 13m1s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m28s
Build Packages / Unit tests (push) Successful in 59m54s
Build jfjoch_hdf5_test once in a new build-hdf5-test job and hand the binary
to dials-test as an artifact, instead of recompiling it from scratch in every
rocky9 processing job. Uses the christopherhx gitea-{upload,download}-artifact
fork (mirrored under gitea.psi.ch/actions) to avoid the stock v4 action's
GHESNotSupportedError. Probe scope: dials-test only; xds-* still self-build
until the round-trip is confirmed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 16:08:48 +02:00
leonarski_fandClaude Opus 4.8 c86beeb393 rotation indexer: fix sub-range crash, explicit angle, settings + guards
Running rotation indexing on a sub-range (e.g. images 60-120) segfaulted: the
first pass passed the *global* image number to RotationIndexer::ProcessImage,
which indexes v_ (sized to the run's image count) -> out-of-bounds write.

- ProcessImage now takes an explicit mid-exposure angle (optional; falls back to
  the goniometer at the image index), so the indexer no longer assumes its slot
  index equals the goniometer image index. IndexAndRefine supplies it via
  RotationAngle(), matching the angle used for prediction. Added a bounds guard in
  ProcessImage so a bad index can never corrupt memory.
- JFJochProcess feeds the rotation indexer the local ordinal (not the global
  index), and shifts the goniometer (start += start_image*incr, incr *= stride,
  per-image wedge preserved) so local index i maps to the angle of original image
  start+i*stride - fixing rotation angles for the whole sub-range pipeline
  (prediction, refinement, output), not just the indexer.
- Expose "Rotation images" (number used for the first pass) in the job dialog,
  enabled when rotation indexing is on. (Count > available is already clamped by
  select_equally_spaced_image_ordinals.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:59:21 +02:00
leonarski_fandClaude Opus 4.8 67ad43a2b2 viewer: palette theming, Original as a run row, stable plot colours
Styling (now via the application palette in main(), not a stylesheet, so it
applies to every widget incl. dialogs):
- Entry fields and item views (line edits, spin boxes, combos, tables) are white
  when enabled and salmon (the GUI default) when disabled - so it's clear where
  you can type. Panels stay salmon (Window role).
- Teal (#2a9d8f) accent via the Highlight role: selections and progress-bar chunks.

Runs list / plots:
- The original file is listed as a first "Original" run (Mode "HDF5"); double-click
  any run row to show it (replaces the "Show original" button). The currently shown
  run is bold (driven by snapshotsChanged).
- Fix the colour "swap" when switching runs: the primary line is matched by the
  active-dataset pointer (not active_id_), so a run keeps its colour even while a
  datasetLoaded/runsChanged pair is mid-flight.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:34:06 +02:00
leonarski_f 95fe2ce781 CI: Sign RPMs on upload 2026-06-22 15:22:21 +02:00
leonarski_fandClaude Opus 4.8 03a09c43bc viewer: white-when-active inputs, teal accent, Status column visible
Styling:
- Entry widgets (line edits, spin boxes, combos, item views) are salmon (the GUI
  default) when inactive and turn white while focused/active.
- A teal accent (#2a9d8f) for selections and the QProgressBar chunk, against the
  salmon background.
- Move the jobs-table Status column (the progress bar) to column 2 so it stays
  visible in the narrow dock instead of scrolling off the right edge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:10:36 +02:00
leonarski_fandClaude Opus 4.8 0f3009069f viewer: processing dialog takes start + end image, not a count
Replace the ambiguous "Images" count with explicit "Start image" and "End image"
spinboxes (end 0 = to the last image). buildConfig sets config.start_image /
end_image; the table shows the range ("start-end" / "all") and the progress bar
expects end-start images.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:01:25 +02:00
leonarski_fandClaude Opus 4.8 b9f8c2b675 reader/viewer: snapshot image->original map; subset runs register and overlay
Foundation for a dataset (snapshot or, later, the main file) being a subset of the
truly collected images:
- JFJochReaderDataset gains source_image_number (image index -> original image
  number; empty = identity).
- HDF5MetadataSource reads /entry/detector/number into that map and an inverse
  (original -> local) map; FillPerImage / ReadSpots translate the requested global
  image to this source's local index via ToLocalIndex (return nothing if the image
  is not covered), so partial snapshots are correct and never read out of bounds.
- RegisterSnapshot now accepts a snapshot with fewer images than the dataset
  (only rejects more), so sub-range / strided reprocessing runs register.
- The dataset-info plot draws each run at its original image numbers (x map from
  source_image_number), so a subset run lands at the right place on the shared
  axis. The live run's map is filled from msg.original_number.

This makes the foundation ready for strided / filtered selections (e.g. reprocess
only images with >N spots) without restricting to a min-max sub-range.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:59:23 +02:00
leonarski_fandClaude Opus 4.8 7ba097df1c viewer: looser minimum heights so the bottom docks resize freely
Lower the dataset-info chart and jobs-table minimum heights (200 -> 80, table 60)
so the bottom dock area can be dragged smaller; the comfortable default size is
still set via resizeDocks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 12:24:47 +02:00
leonarski_fandClaude Opus 4.8 a412f96f3a viewer: give the current-image plot marker a fixed colour
The current-image marker (a scatter series) was picking an arbitrary theme colour
(green), which read as a stray series. Pin it to black so it's an unambiguous
"current image" dot, distinct from the run line colours. Its legend entry is
already hidden.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 12:13:39 +02:00
leonarski_fandClaude Opus 4.8 2af822436e viewer: remove/clear runs, stable per-run colours, processing rate + ETA
- "Remove result" toolbar action drops a reprocessing run: reader RemoveSnapshot
  (Original is protected; if the removed run was active the view falls back to
  Original), worker RemoveRun, and the table row is removed.
- Opening a new file clears the jobs table (worker fileOpened -> clearJobs) to
  match the reader, which already resets snapshots on ReadFile.
- Plot fixes: each run keeps a stable colour by its position (Original = blue),
  so colours no longer swap when the active run changes; the current-image marker
  is hidden from the legend (was the stray "[Image #N]" entry).
- The status bar shows processing rate (Hz) and estimated remaining time while a
  job runs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 12:00:15 +02:00
leonarski_fandClaude Opus 4.8 aceff23ce2 viewer: overlay one plot line per processing run (with editable names)
The dataset-info plot now overlays every run as a separate named line instead of
replacing the plot when a snapshot is activated:

- Reader gains AllSnapshotDatasets() (every snapshot's dataset, Original first).
- The worker owns the run collection: a stable snapshot id plus an editable
  display label (RunData), emitted as runsChanged(runs, active_id) on file open,
  snapshot register, activate and rename. RenameRun(id, label) updates the legend
  label without touching the reader key (decoupled id vs label).
- The chart view draws the active run as the primary series (markers, hover,
  binning, axes) and the other runs as overlay lines sharing its axes, with a
  legend shown when overlaying (appendSeries factored out for both).
- The dataset-info widget holds the run list + the live run, extracts the selected
  metric from each (ExtractMetric), and unions the available metrics across runs.
- The live run is its own "Live" overlay (lightweight per-tick refresh, no combo
  rebuild); it is cleared on finish so the persisted snapshot takes over.
- The processing jobs table gets a "Started" column and an editable Name column;
  editing a name renames that run's legend label.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 11:28:47 +02:00
leonarski_fandClaude Opus 4.8 b735aec1c4 viewer: show effective indexing algorithm; disable GPU options without CUDA
- The Indexing tab now shows what the selected algorithm resolves to on this
  machine/dataset ("Effective on this system: ..."), mirroring
  DiffractionExperiment::GetIndexingAlgorithm() so Auto is no longer ambiguous
  (GPU present? unit cell known?). Cell-known state is forwarded from the loaded
  dataset via JFJochSettingsWindow::datasetLoaded.
- FFBIDX and FFT (GPU) radio options are disabled on builds without CUDA, where
  only the FFTW CPU indexer exists.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 11:09:21 +02:00
leonarski_fandClaude Opus 4.8 42219d8c5b viewer: fix bottom-dock height, window size, and snapshot-switch lag
Regressions from docking the processing panel + live plots:
- Default window size is now screen-aware (fits a laptop) instead of a fixed
  1200x1200.
- Give the bottom dock area a guaranteed height (resizeDocks vertical) and a
  minimum height on the dataset-info chart, so the plot and its axis labels stay
  visible next to the processing panel.
- Activating a metadata snapshot (Show original / View results) no longer re-runs
  full analysis: it re-reads the image against the snapshot's stored results with
  reanalysis suppressed, instead of re-indexing on every switch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 09:58:51 +02:00
leonarski_fandClaude Opus 4.8 9c417d322f viewer: dock the processing panel next to the plots; HTTP-mode notice
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m56s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m27s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m48s
Build Packages / build:rpm (rocky8) (push) Successful in 14m42s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 15m10s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m24s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m43s
Build Packages / XDS test (durin plugin) (push) Successful in 8m31s
Build Packages / Generate python client (push) Successful in 31s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 9m21s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (neggia plugin) (push) Successful in 9m7s
Build Packages / Build documentation (push) Successful in 1m6s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m52s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m32s
Build Packages / build:rpm (rocky9) (push) Successful in 13m28s
Build Packages / DIALS test (push) Successful in 13m11s
Build Packages / Unit tests (push) Successful in 1h0m24s
- Convert JFJochProcessingJobsWindow from a standalone helper window into a
  dockable QWidget panel (toolbar + stacked table/message), placed in the bottom
  dock area and split horizontally to sit in the bottom-right corner next to the
  dataset-info plots. Its show/hide toggle moves to the Window menu via the new
  JFJochViewerMenu::AddDockEntry.
- When connected to a live HTTP stream the panel shows "Dataset re-processing is
  currently available only in File mode" and disables the toolbar, driven by the
  worker's httpConnectionChanged signal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 08:35:56 +02:00
leonarski_fandClaude Opus 4.8 940b7e34d4 viewer: indexing algorithm/refinement radio groups, rotation fix, live job plots
Processing settings:
- Split the spot/index settings widget into two tabs (Spot finding | Indexing)
  via TakeSpotFindingPage()/TakeIndexingPage().
- Indexing tab now exposes the indexing algorithm (Auto/FFBIDX/FFT/FFTW/None) and
  geometry refinement (None/Orientation/Beam center/Pixel refine) as radio groups
  with short explanations.
- Fix: UpdateSpotFindingSettings dropped algorithm + geometry-refinement when
  copying into indexing_settings (the geom checkbox was a no-op); both now flow
  into jobs via curr_experiment.

Processing jobs window:
- Rotation indexing from the job dialog now also sets RotationIndexing(true) on
  the experiment's IndexingSettings; otherwise IndexAndRefine builds no rotation
  indexer and the two-pass pre-pass throws.
- Status cell shows a QProgressBar with "<done> / <expected>".
- Live results: JFJochProcessController::OnImageProcessed accumulates per-image
  results into a JFJochReaderDataset and emits it throttled (~4 Hz) as liveDataset,
  forwarded to the dataset-info plots so they update while a job runs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 08:30:49 +02:00
leonarski_f 95223fc281 CI: Tests needs LFS to get rotation dataset
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 14m30s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 15m3s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 15m26s
Build Packages / build:rpm (rocky8) (push) Successful in 15m22s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 15m37s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m52s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 16m13s
Build Packages / XDS test (durin plugin) (push) Successful in 7m16s
Build Packages / Generate python client (push) Successful in 30s
Build Packages / Build documentation (push) Successful in 59s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m37s
Build Packages / XDS test (neggia plugin) (push) Successful in 8m32s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m58s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m11s
Build Packages / build:rpm (rocky9) (push) Successful in 13m8s
Build Packages / DIALS test (push) Successful in 12m54s
Build Packages / Unit tests (push) Successful in 1h0m22s
2026-06-22 07:17:31 +02:00
leonarski_fandClaude Opus 4.8 74f36710e4 viewer: converge processing settings into one tabbed window + Bragg/scaling
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 11m43s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 12m24s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 12m33s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 12m34s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 12m58s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m38s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m33s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 13m22s
Build Packages / build:rpm (rocky8) (push) Successful in 13m41s
Build Packages / Generate python client (push) Successful in 14s
Build Packages / build:rpm (rocky9) (push) Successful in 14m14s
Build Packages / Create release (push) Skipped
Build Packages / DIALS test (push) Successful in 13m55s
Build Packages / Build documentation (push) Successful in 45s
Build Packages / XDS test (durin plugin) (push) Successful in 6m54s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m50s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m31s
Build Packages / Unit tests (push) Failing after 1h0m10s
One "Processing settings" window with tabs: Spot finding & indexing | Azimuthal | Bragg
integration | Scaling, replacing the two separate settings windows. The spot/index and azimuthal
tabs reuse the existing windows' widgets unchanged (their content is lifted into tabs via
takeCentralWidget), so all their logic/signals keep working; Bragg integration and scaling are new
editable panels (previously not adjustable in the GUI).

JFJochImageReadingWorker gains UpdateBraggIntegrationSettings / UpdateScalingSettings; both persist
as worker state and are re-imported into curr_experiment on file load / dataset update (like the
indexing/azint settings), so they apply to interactive analysis (Bragg) and flow into processing
jobs via GetReprocessingInputs (Bragg + scaling). Scaling only affects the job post-pass, so it is
just stored, not reanalyzed.

Verified: jfjoch_viewer builds and runs (offscreen) with the converged window.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 17:09:20 +02:00
leonarski_fandClaude Opus 4.8 c916cf8b2d tests: drop the serial [large] test (serial dataset not shipped)
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m34s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m36s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 9m37s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m39s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 10m56s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m21s
Build Packages / build:rpm (rocky8) (push) Successful in 11m15s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m57s
Build Packages / build:rpm (rocky9) (push) Successful in 11m26s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 9m42s
Build Packages / Generate python client (push) Successful in 23s
Build Packages / Build documentation (push) Successful in 53s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (durin plugin) (push) Successful in 7m15s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m26s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m28s
Build Packages / DIALS test (push) Successful in 10m59s
Build Packages / Unit tests (push) Successful in 1h13m11s
Only the ~1800-image rotation dataset is kept in LFS; a separate ~5000-image serial set is too
large to ship, and the serial path can be exercised by running the rotation series in serial
mode if needed. Removes JFJochProcess_LysoSerial and the serial entry from the start-up listener
and README. The rotation [large] test now runs against the committed data and passes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 16:46:56 +02:00
leonarski_fandClaude Opus 4.8 ed8fb5d37c tests: add lyso rotation dataset (1800 images) via git-LFS
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 11m28s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m7s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 11m43s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 12m7s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 12m50s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m21s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m5s
Build Packages / build:rpm (rocky8) (push) Successful in 12m41s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m31s
Build Packages / Generate python client (push) Successful in 14s
Build Packages / build:rpm (rocky9) (push) Successful in 13m14s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 45s
Build Packages / XDS test (durin plugin) (push) Successful in 9m55s
Build Packages / DIALS test (push) Successful in 13m39s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m37s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m58s
Build Packages / Unit tests (push) Failing after 1h21m19s
Real reference dataset for the [large] JFJochProcess_LysoRotation test, stored with git-LFS
(tests/data/*.h5). lyso_rotation_master.h5 is the 1800-image lysozyme rotation series
(its data files keep the names the master links to). The test indexes it at 100% with cell
~78.2/78.2/37.8; it SKIPs when the data is not pulled.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 16:05:25 +02:00
leonarski_fandClaude Opus 4.8 5bfa70c4a6 viewer: Processing jobs window - run jfjoch_process in-GUI + result snapshots
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m40s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 13m50s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m48s
Build Packages / build:rpm (rocky8) (push) Successful in 14m55s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 15m0s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m11s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m27s
Build Packages / XDS test (durin plugin) (push) Successful in 9m9s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 9m18s
Build Packages / XDS test (neggia plugin) (push) Successful in 8m56s
Build Packages / Create release (push) Skipped
Build Packages / Generate python client (push) Successful in 29s
Build Packages / Build documentation (push) Successful in 1m8s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m6s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m50s
Build Packages / build:rpm (rocky9) (push) Successful in 13m23s
Build Packages / DIALS test (push) Successful in 13m13s
Build Packages / Unit tests (push) Successful in 1h28m58s
Makes the viewer a processing frontend, not just an image viewer:

- JFJochProcessingJobsWindow (menu "Processing"): a table of processing jobs on the open
  dataset. "New job" configures mode (full/azint), image count, threads, output, and (full)
  rotation indexing + scale/merge, using the viewer's current processing settings. A job can
  be Run locally (off the GUI thread via JFJochProcessController, with live status/progress and
  Cancel) or its jfjoch_process command line copied for a cluster.
- A finished local run is registered as a reader metadata snapshot and becomes the active
  dataset (bottom plots + per-image overlays follow it); "View results" / "Show original" switch
  between runs - so several settings attempts on one dataset can be compared.
- JFJochImageReadingWorker gains GetReprocessingInputs() (one locked read of file + experiment +
  mask + spot-finding settings, so jobs share the interactive settings) and
  RegisterProcessingSnapshot/SetActiveSnapshot slots + snapshotsChanged signal over the reader's
  snapshot API. Files only (not live HTTP).

First-cut / open ends: one job at a time; output lands in the working dir (FileWriter rejects
absolute prefixes); Bragg/scaling settings still use defaults until the converged settings
window lands. Viewer builds and runs (offscreen) cleanly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 14:38:17 +02:00
leonarski_fandClaude Opus 4.8 800ffecd20 process/viewer: command-line generator + JFJochProcessController (GUI engine)
Foundation for making processing a first-class GUI activity:

- process/JFJochProcessCommandLine: reconstruct the equivalent jfjoch_process / jfjoch_azint
  command line from a ProcessConfig + DiffractionExperiment + input path, for handing a job
  off to a cluster. Unit-tested (full + azint).
- viewer/JFJochProcessController: runs one JFJochProcess job off the GUI thread (its own private
  reader; HDF5 access is globally serialized so it is safe next to the interactive reader) and
  reports back via queued Qt signals (started/phaseChanged/progress/finished/failed). Cancel()
  forwards to JFJochProcess::Cancel(). Progress is throttled to ~200 updates per run.

The visible processing UI (jobs window + snapshot switcher + converged settings) builds on this.

Verified: tests/jfjoch_test [process]; jfjoch_viewer links and builds against JFJochProcess.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 14:26:48 +02:00
leonarski_fandClaude Opus 4.8 39599bc090 tests: git-LFS large-dataset harness + jfjoch_process include cleanup
- .gitattributes tracks tests/data/*.h5 via git-LFS for big reference datasets.
- tests/TestData.h resolves tests/data files and reports absent / unfetched-LFS-pointer
  so tests can SKIP() instead of failing; tests/data/README.md documents fetching + the
  expected lyso_rotation/lyso_serial datasets.
- JFJochProcessLargeTest: a Catch start-up listener that prints dataset availability, plus
  [large] full-analysis runs (rotation indexing + serial) that SKIP when data is absent.
  Verified against the real 1800-image lyso rotation set (100% indexing, cell 78.2/78.2/37.8)
  and skips cleanly without it.
- jfjoch_process.cpp: drop the ~15 now-unused workflow includes left after the JFJochProcess
  extraction.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 14:16:34 +02:00
leonarski_fandClaude Opus 4.8 4697f10555 process: extract reprocessing workflow into shared JFJochProcess library
The full processing workflow no longer lives in the CLIs. New process/JFJochProcess
encapsulates it for jfjoch_process, jfjoch_azint and (later) the viewer:

- ProcessMode {AzimuthalIntegration, FullAnalysis}; ProcessConfig carries run control
  (range, threads, output prefix, spot finding, rotation + scaling options, reference
  data) while the DiffractionExperiment carries all algorithm settings.
- Run() executes setup -> optional two-pass rotation pre-pass -> parallel per-image loop
  (std::thread) -> optional scaling/merging post-pass -> NXmxIntegrated _process.h5 that
  links back to the original images. ProcessResult returns stats + merge text.
- Cancel() / std::atomic<bool> (receiver style), checked between images; the CLIs install
  a SIGINT handler that calls it (fixes the previous Ctrl+C gap), the viewer will use the
  same hook. JFJochProcessObserver streams progress / per-image results for a live GUI.

jfjoch_process.cpp and jfjoch_azint.cpp are now thin: argument parsing + experiment
configuration, then JFJochProcess::Run + stats printing. Behaviour and usage messages
are unchanged.

Adds JFJochProcessTest (azimuthal integration round-trip, no-output run, pre-cancel) over
a small generated dataset.

Verified: tests/jfjoch_test [HDF5] (83 cases / 1854 assertions); jfjoch_azint and
jfjoch_process run end-to-end on lyso_test (azint 20 images; full analysis recovers the
lysozyme cell at 25% indexing).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:36:18 +02:00
leonarski_fandClaude Opus 4.8 9434878c92 reader: split metadata reading into HDF5MetadataSource + snapshot map
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m46s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m27s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 15m5s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 15m1s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m7s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m6s
Build Packages / build:rpm (rocky8) (push) Successful in 13m25s
Build Packages / XDS test (neggia plugin) (push) Successful in 9m46s
Build Packages / XDS test (durin plugin) (push) Successful in 10m14s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (rocky9) (push) Successful in 13m1s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m33s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 10m45s
Build Packages / Build documentation (push) Successful in 47s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m17s
Build Packages / DIALS test (push) Successful in 13m39s
Build Packages / Unit tests (push) Failing after 58m55s
Complete the image/metadata decoupling. JFJochHDF5Reader is now a thin JFJochReader
facade composing one shared HDF5ImageSource (raw pixels) with a name->HDF5MetadataSource
map and an active selection ("snapshots").

- HDF5MetadataSource owns one master file: dataset-level parse (Open, ex-ReadFile),
  per-image metadata (FillPerImage, ex-LoadImage_i), ReadSpots/ReadReflections/
  ReadCalibration, and the master-first helpers. It locates per-image metadata either via
  the shared image source (original file: metadata co-located with pixels) or in its own
  master at the global index (integrated _process.h5 snapshot) - so switching snapshots
  never reloads pixels.
- Facade adds RegisterSnapshot/SetActiveSnapshot/SnapshotNames/ActiveSnapshot; ReadFile
  registers the original as "Original". All existing JFJochReader callers are unchanged.
- The global hdf5_mutex is taken once in the facade; the sources assume it is held.

Adds JFJochReader_Snapshots test (original _master.h5 + a reprocessing _process.h5 over
the same images: pixels stay from the original, metadata follows the active snapshot).

Verified: tests/jfjoch_test [HDF5] (80 cases / 1810 assertions), plus jfjoch_process/
azint/extract_hkl/scale and jfjoch_viewer all build against the refactored reader.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:15:09 +02:00
leonarski_fandClaude Opus 4.8 23d27f30c4 reader: split raw-image reading into HDF5ImageLocator + HDF5ImageSource
Decouple the raw-pixel side of JFJochHDF5Reader from the rest as the first
step toward swappable per-dataset metadata snapshots.

- HDF5ImageLocator: single owner of the legacy/VDS/contiguous layout resolution
  plus a persistent open-file cache, replacing the four duplicated resolvers
  (GetImageLocation, ReadSpots, ReadReflections) and their per-call file caches.
  Also hosts the source-mapping logic (former GetHDF5DataSource body).
- HDF5ImageSource: raw-pixel reading (locator + LoadImageDataset); the part whose
  links to files stay fixed while the metadata master may change.
- JFJochHDF5Reader keeps a thin GetImageLocation/GetRawImage/GetHDF5DataSource that
  delegate to image_source_; the six layout members are gone, parsed into a local
  Layout handed to the source at the end of ReadFile. Cache cleared on Close().

Verified: tests/jfjoch_test [HDF5] (79 cases / 1775 assertions), and
jfjoch_process/azint/extract_hkl/scale relink unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:15:09 +02:00
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