Files
Jungfraujoch/viewer/JFJochImageReadingWorker.cpp
2025-08-17 21:21:20 +02:00

165 lines
5.5 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "JFJochImageReadingWorker.h"
#include <QVector>
#include <QMutexLocker>
JFJochImageReadingWorker::JFJochImageReadingWorker(QObject *parent) : QObject(parent) {}
void JFJochImageReadingWorker::LoadFile(const QString &filename, qint64 image_number, qint64 summation) {
QMutexLocker ul(&m);
try {
std::shared_ptr<const JFJochReaderDataset> dataset;
auto start = std::chrono::high_resolution_clock::now();
if (!http_mode && filename == current_file)
logger.Info("File {} already loaded", filename.toStdString());
else {
if (filename.startsWith("http://")) {
http_mode = true;
http_reader.ReadURL(filename.toStdString());
total_images = http_reader.GetNumberOfImages();
dataset = http_reader.GetDataset();
if (image_number < 0)
emit setToolbarMode(JFJochViewerToolbar::ToolbarMode::Autoload);
else
emit setToolbarMode(JFJochViewerToolbar::ToolbarMode::None);
} else {
http_mode = false;
reader.ReadFile(filename.toStdString());
total_images = reader.GetNumberOfImages();
dataset = reader.GetDataset();
emit setToolbarMode(JFJochViewerToolbar::ToolbarMode::None);
}
current_image.reset();
current_summation = 1;
current_file = filename;
}
emit datasetLoaded(dataset);
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
logger.Info("Loaded file {} in {} ms", filename.toStdString(), duration);
LoadImage_i(image_number, summation);
} catch (std::exception &e) {
logger.Error("Error loading file {} {}", filename.toStdString(), e.what());
}
}
void JFJochImageReadingWorker::CloseFile() {
QMutexLocker ul(&m);
if (http_mode)
http_reader.Close();
else
reader.Close();
current_image_ptr.reset();
current_image.reset();
current_summation = 1;
total_images = 0;
current_file = "";
emit imageLoaded({});
emit datasetLoaded({});
}
void JFJochImageReadingWorker::LoadImage(int64_t image_number, int64_t summation) {
QMutexLocker ul(&m);
if ((image_number == current_image) && (current_summation == summation))
return;
LoadImage_i(image_number, summation);
}
void JFJochImageReadingWorker::LoadImage_i(int64_t image_number, int64_t summation) {
// Assumes m locked!
try {
if (summation <= 0 || image_number + summation > total_images)
return;
std::vector<int32_t> image;
auto start = std::chrono::high_resolution_clock::now();
if (http_mode) {
if (image_number < 0 && summation != 1)
return;
current_image_ptr = http_reader.LoadImage(image_number, summation);
total_images = http_reader.GetNumberOfImages();
emit datasetLoaded(http_reader.GetDataset());
} else {
if (image_number < 0)
return;
current_image_ptr = reader.LoadImage(image_number, summation);
}
if (!current_image_ptr) {
emit imageLoaded({});
return;
}
current_image = current_image_ptr->ImageData().number;
current_summation = summation;
auto end = std::chrono::high_resolution_clock::now();
if (roi)
current_image_ptr->CalcROI(roi.get());
current_image_ptr->BraggIntegrate(bragg_integration_settings);
auto end_analysis = std::chrono::high_resolution_clock::now();
auto duration_1 = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
auto duration_2 = std::chrono::duration_cast<std::chrono::milliseconds>(end_analysis - end).count();
logger.Info("Loaded image {} in {}/{} ms", image_number, duration_1, duration_2);
emit imageNumberChanged(total_images, current_image.value());
emit imageLoaded(current_image_ptr);
} catch (std::exception &e) {
logger.Error("Error loading image {}: {}", image_number, e.what());
}
}
void JFJochImageReadingWorker::SetROIBox(QRect box) {
QMutexLocker ul(&m);
roi = std::make_unique<ROIBox>("roi1", box.left(), box.right(), box.bottom(), box.top());
if (current_image_ptr) {
current_image_ptr->CalcROI(roi.get());
emit imageStatsUpdated(current_image_ptr);
}
}
void JFJochImageReadingWorker::SetROICircle(double x, double y, double radius) {
QMutexLocker ul(&m);
if (radius <= 0)
roi.reset();
else
roi = std::make_unique<ROICircle>("roi1", x, y, radius);
if (current_image_ptr) {
current_image_ptr->CalcROI(roi.get());
emit imageStatsUpdated(current_image_ptr);
}
}
void JFJochImageReadingWorker::UpdateDataset(const DiffractionExperiment &experiment) {
QMutexLocker ul(&m);
if (!current_image)
return;
std::shared_ptr<const JFJochReaderDataset> dataset;
if (http_mode) {
http_reader.UpdateGeomMetadata(experiment);
dataset = http_reader.GetDataset();
} else {
reader.UpdateGeomMetadata(experiment);
dataset = reader.GetDataset();
}
emit datasetLoaded(dataset);
LoadImage_i(current_image.value(), current_summation);
}