// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochImageReadingWorker.h" #include #include JFJochImageReadingWorker::JFJochImageReadingWorker(QObject *parent) : QObject(parent) {} void JFJochImageReadingWorker::LoadFile(const QString &filename, qint64 image_number, qint64 summation) { QMutexLocker ul(&m); try { std::shared_ptr 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(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 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(end - start).count(); auto duration_2 = std::chrono::duration_cast(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("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("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 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); }