Files
Jungfraujoch/viewer/windows/JFJochProcessingJobsWindow.h
leonarski_f d6389e12da
Build Packages / Unit tests (push) Successful in 1h31m39s
Build Packages / build:windows:nocuda (push) Successful in 15m10s
Build Packages / build:windows:cuda (push) Successful in 17m30s
Build Packages / build:viewer-tgz:cpu (push) Successful in 8m26s
Build Packages / build:viewer-tgz:cuda (push) Successful in 9m40s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 13m35s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 14m2s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 13m31s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m29s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 13m34s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m22s
Build Packages / build:rpm (rocky8) (push) Successful in 12m8s
Build Packages / build:rpm (rocky9) (push) Successful in 13m6s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m41s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m11s
Build Packages / DIALS test (push) Successful in 15m1s
Build Packages / XDS test (durin plugin) (push) Successful in 8m53s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m49s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m46s
Build Packages / Generate python client (push) Successful in 31s
Build Packages / Build documentation (push) Successful in 58s
Build Packages / Create release (push) Skipped
v1.0.0-rc.156 (#66)
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_process: Major rotation (rot3d) data processing overhaul - robust profile-fit integration, Cauchy-loss scaling with optional absorption surface, de-novo indexing and space-group/centering determination fixes, and merging statistics + ISa in the mmCIF output.
* jfjoch_process: Add EXPERIMENTAL ice-ring detection (--detect-ice-rings) that excludes ice reflections from scaling.
* Compression: Add BSHUF_ZSTD_RLE_HUFF, make compression size-aware (drop frames that don't fit rather than aborting), and add the jfjoch_recompress tool.
* jfjoch_viewer: Report "Multiple lattices detected" and grey out "Analyze dataset" on a live connection.
* jfjoch_broker: Write smargon chi/phi goniometer positions to NXmx; read sensor thickness/material from HDF5 metadata.
* CI: Build Windows (CUDA and non-CUDA) installers.Reviewed-on: #66

Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
2026-07-03 19:18:56 +02:00

101 lines
4.5 KiB
C++

// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#include <QElapsedTimer>
#include <QString>
#include <QWidget>
#include <vector>
#include "../JFJochProcessController.h"
#include "../JFJochImageReadingWorker.h" // ReprocessingInputs
class QTableWidget;
class QProgressBar;
class QStackedWidget;
class QToolBar;
class QToolButton;
// Makes processing a first-class GUI activity: a dockable panel with a table of processing jobs run
// on the current dataset. A job can be run locally (off the GUI thread, via JFJochProcessController)
// or its jfjoch_process command line copied for a cluster. A finished local run is registered as a
// reader snapshot so its results become a selectable view of the dataset. Re-processing reads a
// stored HDF5 file, so the panel shows an explanatory message while connected to a live HTTP stream.
class JFJochProcessingJobsWindow : public QWidget {
Q_OBJECT
public:
explicit JFJochProcessingJobsWindow(JFJochImageReadingWorker *worker, QWidget *parent = nullptr);
signals:
void registerSnapshot(QString id, QString label, QString master_path);
void activateSnapshot(QString id);
void renameRun(QString id, QString label);
void removeRun(QString id);
void writeStatusBar(QString message, int timeout_ms = 0);
// Live per-image results while a job runs, for the dataset-info plots (nullptr clears it).
void liveDataset(std::shared_ptr<const JFJochReaderDataset> dataset);
void jobStarted(); // a reprocessing job was launched — reveal the (hidden-by-default) panel
public slots:
void onHttpConnectionChanged(bool connected, QString addr);
void clearJobs(); // reset the table on a new file (re-adds the Original row)
void setActiveRun(QString active_id); // bold the row of the run currently shown in the plots
void newJob(bool azint = false); // the panel's "Analyze dataset" action; azint = AzInt page
private slots:
void cancelJob();
void removeResult();
void viewResults();
void onPhase(QString phase);
void onProgress(quint64 done, quint64 total);
void onFinished(ProcessResult result);
void onFailed(QString error);
private:
struct JobInfo {
QString id; // stable reader-snapshot key
QString label; // editable display name (legend / table)
QString snapshot_path; // empty unless saved
bool has_result = false;
// Merge statistics captured when a scaling/merging job finished (drive the analysis window).
bool has_merge_stats = false;
MergeStatistics merge_stats;
double isa = 0.0;
bool merge_has_reference = false;
TwinningAnalysisResult twinning; // twinning test of the merged intensities
QToolButton *graph_btn = nullptr; // per-row "show statistics" button (enabled once stats exist)
};
struct JobSpec {
ProcessMode mode = ProcessMode::FullAnalysis;
int start_image = 0;
int end_image = 0; // 0 == to the end
int threads = 4;
bool save = true;
QString prefix;
bool rotation = false;
int rotation_images = 30; // images used to find the rotation lattice (first pass)
bool scaling = false;
};
// Returns 0 = cancel, 1 = run locally, 2 = copy command line; fills spec from the dialog.
int askJob(const ReprocessingInputs &inputs, JobSpec &spec, bool azint);
ProcessConfig buildConfig(const JobSpec &spec, const ReprocessingInputs &inputs) const;
void setStatus(int row, const QString &text);
void addOriginalRow(); // the file's own data as the first, always-present run
void addRowActions(int row, const QString &id); // per-row graph (stats) + trash (remove) buttons
void showStats(const QString &id); // open the merge-statistics window for a run
void removeRunById(const QString &id); // remove a run from the table + reader
JFJochImageReadingWorker *worker_;
JFJochProcessController *controller_;
QToolBar *toolbar_;
QStackedWidget *stack_; // page 0: jobs table, page 1: HTTP-mode message
QTableWidget *table_;
QProgressBar *running_bar_ = nullptr; // lives in the running row's Status cell
QElapsedTimer job_timer_; // running job wall-clock, for rate + ETA
int running_row_ = -1;
int job_counter_ = 0;
std::vector<JobInfo> jobs_;
};