From 60da4bb2f844d87ec8b59b36dc9dc8a031a90940 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Thu, 27 Nov 2025 14:21:36 +0100 Subject: [PATCH] jfjoch_viewer: Grid scan 2D image has also 1/d^2 for resolution estimation plot --- viewer/JFJochViewerDatasetInfo.cpp | 10 +++--- viewer/charts/JFJochChartView.cpp | 4 +-- viewer/image_viewer/JFJochGridScanImage.cpp | 37 +++++++++++++++++---- viewer/image_viewer/JFJochGridScanImage.h | 3 +- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/viewer/JFJochViewerDatasetInfo.cpp b/viewer/JFJochViewerDatasetInfo.cpp index 1aec8ef3..58ab741a 100644 --- a/viewer/JFJochViewerDatasetInfo.cpp +++ b/viewer/JFJochViewerDatasetInfo.cpp @@ -107,6 +107,7 @@ void JFJochViewerDatasetInfo::UpdatePlot() { if (image) image_number = image->ImageData().number; + bool one_over_d2 = false; std::vector data; if (val == 0) data = dataset->bkg_estimate; @@ -122,15 +123,16 @@ void JFJochViewerDatasetInfo::UpdatePlot() { data = dataset->indexing_result; else if (val == 6) data = dataset->profile_radius; - else if (val == 7) + else if (val == 7) { data = dataset->resolution_estimate; - else if (val == 8) + one_over_d2 = true; + } else if (val == 8) data = dataset->b_factor; - chart_view->loadValues(data, image_number, val == 7); + chart_view->loadValues(data, image_number, one_over_d2); if (dataset->experiment.GetGridScan()) { stack->setCurrentWidget(grid_scan_image); - grid_scan_image->loadData(data, dataset->experiment.GetGridScan().value()); + grid_scan_image->loadData(data, dataset->experiment.GetGridScan().value(), one_over_d2); grid_button->setEnabled(true); grid_button->setChecked(true); } else { diff --git a/viewer/charts/JFJochChartView.cpp b/viewer/charts/JFJochChartView.cpp index 3d4ffe3b..ac68c4f9 100644 --- a/viewer/charts/JFJochChartView.cpp +++ b/viewer/charts/JFJochChartView.cpp @@ -242,14 +242,14 @@ void JFJochChartView::mouseMoveEvent(QMouseEvent *event) { if (m_yOneOverD) { if (std::isfinite(yv) && yv > 0.0) { const double d = 1.0 / std::sqrt(yv); - text = QString("image = %1, d = %2 Å") + text = QString("image = %1 d = %2 Å") .arg(idx) .arg(d, 0, 'f', 2); } else { text = QString("image = %1, no resolution estimate").arg(idx); } } else { - text = QString("image = %1, value = %2") + text = QString("image = %1 value = %2") .arg(idx) .arg(yv, 0, 'g', 6); } diff --git a/viewer/image_viewer/JFJochGridScanImage.cpp b/viewer/image_viewer/JFJochGridScanImage.cpp index fc2090d1..10e9b97c 100644 --- a/viewer/image_viewer/JFJochGridScanImage.cpp +++ b/viewer/image_viewer/JFJochGridScanImage.cpp @@ -14,7 +14,7 @@ void JFJochGridScanImage::clear() { CalcROI(); } -void JFJochGridScanImage::loadData(const std::vector &data, const GridScanSettings &settings) { +void JFJochGridScanImage::loadData(const std::vector &data, const GridScanSettings &settings, bool in_one_over_d2) { if (data.empty()) { clear(); return; @@ -30,6 +30,13 @@ void JFJochGridScanImage::loadData(const std::vector &data, const GridSca image_index = settings.Rearrange(indices, -1); + one_over_d2 = in_one_over_d2; + if (one_over_d2) { + for (int i = 0; i < image_fp.size(); i++) + if (!std::isnan(image_fp[i])) + image_fp[i] = 1.0f / (image_fp[i] * image_fp[i]); + } + float minv = std::numeric_limits::infinity(); float maxv = -std::numeric_limits::infinity(); for (float v : image_fp) { @@ -75,12 +82,28 @@ void JFJochGridScanImage::mouseHover(QMouseEvent *event) { if (event->modifiers() & Qt::ShiftModifier) emit imageSelected(image_id); - emit writeStatusBar(QString("Image %1 y %2 y %3 value %4") - .arg(image_id) - .arg(x) - .arg(y) - .arg(QString::number(image_fp[idx], 'f', 3)), - 6000); + if (one_over_d2) { + if (std::isnan(image_fp[idx])) + emit writeStatusBar(QString("Image %1 x %2 y %3 no resolution estimation") + .arg(image_id) + .arg(x) + .arg(y), + 6000); + else + emit writeStatusBar(QString("Image %1 x %2 y %3 d = %4 Å") + .arg(image_id) + .arg(x) + .arg(y) + .arg(QString::number(1 / std::sqrt(image_fp[idx]), 'f', 2)), + 6000); + } else { + emit writeStatusBar(QString("Image %1 x %2 y %3 value %4") + .arg(image_id) + .arg(x) + .arg(y) + .arg(QString::number(image_fp[idx], 'f', 3)), + 6000); + } } } diff --git a/viewer/image_viewer/JFJochGridScanImage.h b/viewer/image_viewer/JFJochGridScanImage.h index 27b8e4f5..fd71c4d0 100644 --- a/viewer/image_viewer/JFJochGridScanImage.h +++ b/viewer/image_viewer/JFJochGridScanImage.h @@ -16,6 +16,7 @@ class JFJochGridScanImage : public JFJochImage { std::vector image_index; int64_t current_image_W = -1; int64_t current_image_H = -1; + bool one_over_d2 = false; void mouseHover(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; @@ -27,7 +28,7 @@ signals: public: JFJochGridScanImage(QWidget *parent = nullptr); public slots: - void loadData(const std::vector &data, const GridScanSettings &settings); + void loadData(const std::vector &data, const GridScanSettings &settings, bool one_over_d2); void setImage(int64_t val); void clear(); };