Files
Jungfraujoch/viewer/JFJochProcessController.h
leonarski_f 75e401f0e5
Build Packages / Unit tests (push) Successful in 1h31m59s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 8m43s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m5s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 9m27s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m56s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 9m24s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 10m27s
Build Packages / build:rpm (rocky8) (push) Successful in 9m20s
Build Packages / build:rpm (rocky9) (push) Successful in 10m50s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m54s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 8m38s
Build Packages / DIALS test (push) Successful in 12m13s
Build Packages / XDS test (durin plugin) (push) Successful in 7m8s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m8s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m50s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / Build documentation (push) Successful in 50s
Build Packages / Create release (push) Skipped
v1.0.0-rc.153 (#63)
This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use.

* jfjoch_broker: Add EXPERIMENTAL pixelrefine mode for image processing
* jfjoch_broker: Allow to load user mask from 8-bit and 16-bit TIFF files
* jfjoch_broker: Add ROI calculation in non-FPGA workflow
* jfjoch_broker: Fixes to TCP image pusher
* jfjoch_broker: Remove NUMA bindings
* jfjoch_broker: Improvements to indexing
* jfjoch_broker: For PSI EIGER, trimming energies are taken from the detector configuration (now compulsory) instead of hardcoded values
* jfjoch_writer: Save ROI definitions and the per-pixel ROI bitmap in the master file; azimuthal ROIs support phi (angular) sectors
* jfjoch_viewer: Major redesign with dockable panels and saved layouts, plus on-canvas creation/move/resize of box, circle and azimuthal ROIs
* jfjoch_viewer: Run jfjoch_process reprocessing jobs from inside the GUI and overlay per-run results

Reviewed-on: #63
2026-06-23 20:29:49 +02:00

71 lines
2.7 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 "../process/JFJochProcess.h"
#include "../common/DiffractionExperiment.h"
#include "../common/PixelMask.h"
#include "../reader/JFJochReaderDataset.h"
Q_DECLARE_METATYPE(ProcessResult)
// Runs one JFJochProcess 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 JFJochProcess::Cancel() (atomic) and works from any
// thread / at any point of the run.
class JFJochProcessController : public QObject, private JFJochProcessObserver {
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:
// JFJochProcessObserver - 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<JFJochProcess *> 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_;
};