Build Packages / Unit tests (push) Successful in 1h1m46s
Build Packages / build:windows:nocuda (push) Successful in 10m19s
Build Packages / build:viewer-tgz:cpu (push) Successful in 8m22s
Build Packages / build:viewer-tgz:cuda (push) Successful in 9m18s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 13m23s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 13m47s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 13m25s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m53s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 13m27s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m59s
Build Packages / build:rpm (rocky8) (push) Successful in 10m50s
Build Packages / build:rpm (rocky9) (push) Successful in 12m26s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 13m3s
Build Packages / XDS test (durin plugin) (push) Successful in 7m58s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m26s
Build Packages / DIALS test (push) Successful in 13m35s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m22s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m47s
Build Packages / Generate python client (push) Successful in 30s
Build Packages / Build documentation (push) Successful in 1m5s
Build Packages / Create release (push) Skipped
Build Packages / build:windows:cuda (push) Successful in 11m55s
Split the naming: rugnux = data-processing subsystem, Jungfraujoch = streaming/acquisition. Executables jfjoch_process -> rugnux (source tools/rugnux_cli.cpp) and jfjoch_scale -> rugnux_scale; the processing library process/ -> rugnux/ with class/target JFJochProcess -> Rugnux (JFJochProcessObserver -> RugnuxObserver, JFJochProcessCommandLine -> RugnuxCommandLine). Doc JFJOCH_PROCESS.md -> RUGNUX.md, reconciled with the live usage message (drop dead -P/--partiality, -w/--wedge; --process-as-stills -> --force-still; add the real rot3d scaling knobs). New docs/NAMING.md explains both names, with pronunciation and a note on Romansh. rugnux now scales and merges rotation data automatically (implicit -M); stills still require an explicit -M. jfjoch_viewer and its classes keep their names (rename deferred); only their references to the renamed library are updated. The _process.h5 output suffix and ProcessConfig/Mode/Result are kept. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
71 lines
2.6 KiB
C++
71 lines
2.6 KiB
C++
// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#pragma once
|
|
|
|
#include <QObject>
|
|
#include <QString>
|
|
|
|
#include <atomic>
|
|
#include <chrono>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <thread>
|
|
|
|
#include "../rugnux/Rugnux.h"
|
|
#include "../common/DiffractionExperiment.h"
|
|
#include "../common/PixelMask.h"
|
|
#include "../reader/JFJochReaderDataset.h"
|
|
|
|
Q_DECLARE_METATYPE(ProcessResult)
|
|
|
|
// Runs one Rugnux job off the GUI thread and reports back via queued Qt signals. The job
|
|
// opens its own private JFJochHDF5Reader on the file (HDF5 access is globally serialized, so this
|
|
// is safe alongside the interactive reader), so the viewer becomes a processing frontend without
|
|
// blocking the UI. Cancel() is forwarded to Rugnux::Cancel() (atomic) and works from any
|
|
// thread / at any point of the run.
|
|
class JFJochProcessController : public QObject, private RugnuxObserver {
|
|
Q_OBJECT
|
|
public:
|
|
explicit JFJochProcessController(QObject *parent = nullptr);
|
|
~JFJochProcessController() override;
|
|
|
|
bool running() const { return running_; }
|
|
|
|
public slots:
|
|
// Start a job over `file_path` with the given (fully configured) experiment + mask + config.
|
|
// Ignored if a job is already running.
|
|
void start(const QString &file_path, DiffractionExperiment experiment,
|
|
PixelMask pixel_mask, ProcessConfig config);
|
|
void cancel();
|
|
|
|
signals:
|
|
void started();
|
|
void phaseChanged(QString phase);
|
|
void progress(quint64 done, quint64 total);
|
|
void finished(ProcessResult result);
|
|
void failed(QString error);
|
|
// Per-image results accumulated so far, for live dataset-info plots while a job runs (throttled).
|
|
void liveDataset(std::shared_ptr<const JFJochReaderDataset> dataset);
|
|
|
|
private:
|
|
// RugnuxObserver - called from worker threads, forwarded as queued signals.
|
|
void OnPhase(const std::string &phase) override;
|
|
void OnProgress(uint64_t done, uint64_t total) override;
|
|
void OnImageProcessed(const DataMessage &msg) override;
|
|
|
|
void run_(QString file_path, DiffractionExperiment experiment, PixelMask pixel_mask, ProcessConfig config);
|
|
void joinWorker_();
|
|
|
|
std::thread worker_;
|
|
std::atomic<Rugnux *> active_{nullptr};
|
|
std::atomic<bool> running_{false};
|
|
std::atomic<bool> cancel_pending_{false};
|
|
|
|
// Live per-image results, accumulated by OnImageProcessed (worker threads) and emitted as
|
|
// immutable copies. live_mutex_ guards both the dataset and the throttle timestamp.
|
|
std::mutex live_mutex_;
|
|
std::shared_ptr<JFJochReaderDataset> live_dataset_;
|
|
std::chrono::steady_clock::time_point last_live_emit_;
|
|
};
|