From a0840f860d5a9367d302bd9b1eef8992a4640507 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Wed, 5 Nov 2025 12:54:01 +0100 Subject: [PATCH] jfjoch_viewer: ROI panel (work in progress) --- tests/PixelMaskTest.cpp | 41 ----------------------- viewer/JFJochImageReadingWorker.cpp | 4 +++ viewer/JFJochViewerImageROIStatistics.cpp | 27 +++++++++++---- viewer/JFJochViewerImageROIStatistics.h | 14 ++++++++ viewer/JFJochViewerSidePanel.cpp | 10 +++++- viewer/JFJochViewerSidePanel.h | 4 +++ viewer/JFJochViewerWindow.cpp | 6 ++++ 7 files changed, 58 insertions(+), 48 deletions(-) diff --git a/tests/PixelMaskTest.cpp b/tests/PixelMaskTest.cpp index a957b113..4f34c6bf 100644 --- a/tests/PixelMaskTest.cpp +++ b/tests/PixelMaskTest.cpp @@ -176,47 +176,6 @@ TEST_CASE("PixelMask_SCs","[PixelMask]") { CHECK(mask.GetStatistics().error_pixel == 3); } -TEST_CASE("PixelMask_CalculateNexusMask_UserMaskRaw","[PixelMask]") { - DiffractionExperiment experiment(DetJF(4, 1, 8, 36, false)); - experiment.MaskModuleEdges(false).MaskChipEdges(false); - - PixelMask mask(experiment); - - std::vector v(4 * RAW_MODULE_SIZE, 0); - v[2] = 1; - v[4] = 1; - v[5] = 1; - - REQUIRE_NOTHROW(mask.LoadUserMask(experiment, v)); - - auto mask_v = mask.GetMask(experiment); - - REQUIRE(mask_v.size() == experiment.GetPixelsNum() ); - REQUIRE(mask_v[0] == 0); - REQUIRE(mask_v[1] == 0); - REQUIRE(mask_v[2] == (1 << PixelMask::UserMaskedPixelBit)); - REQUIRE(mask_v[3] == 0); - REQUIRE(mask_v[4] == (1 << PixelMask::UserMaskedPixelBit)); - REQUIRE(mask_v[5] == (1 << PixelMask::UserMaskedPixelBit)); - REQUIRE(mask_v[6] == 0); - REQUIRE(mask_v[1030 * 700 + 300] == 0); - REQUIRE(mask_v[(1030+8)*514] == (1 << PixelMask::ModuleGapPixelBit)); - - auto user_mask_v = mask.GetUserMask(experiment); - - REQUIRE(user_mask_v.size() == experiment.GetPixelsNum() ); - REQUIRE(user_mask_v[0] == 0); - REQUIRE(user_mask_v[1] == 0); - REQUIRE(user_mask_v[2] == 1); - REQUIRE(user_mask_v[3] == 0); - REQUIRE(user_mask_v[4] == 1); - REQUIRE(user_mask_v[5] == 1); - REQUIRE(user_mask_v[6] == 0); - REQUIRE(user_mask_v[1030 * 700 + 300] == 0); - - REQUIRE(user_mask_v[(1030+8)*514] == 0); -} - TEST_CASE("PixelMask_CalculateNexusMask_UserMaskConv","[PixelMask]") { DiffractionExperiment experiment(DetJF(4, 1, 8, 36, false)); experiment.MaskModuleEdges(false).MaskChipEdges(false); diff --git a/viewer/JFJochImageReadingWorker.cpp b/viewer/JFJochImageReadingWorker.cpp index 250da652..c0ffb8bc 100644 --- a/viewer/JFJochImageReadingWorker.cpp +++ b/viewer/JFJochImageReadingWorker.cpp @@ -152,6 +152,10 @@ void JFJochImageReadingWorker::LoadImage_i(int64_t image_number, int64_t summati void JFJochImageReadingWorker::SetROIBox(QRect box) { QMutexLocker ul(&m); + + if (box.width() * box.height() == 0) + roi.reset(); + roi = std::make_unique("roi1", box.left(), box.right(), box.bottom(), box.top()); if (current_image_ptr) { diff --git a/viewer/JFJochViewerImageROIStatistics.cpp b/viewer/JFJochViewerImageROIStatistics.cpp index 4415fa11..11bddf81 100644 --- a/viewer/JFJochViewerImageROIStatistics.cpp +++ b/viewer/JFJochViewerImageROIStatistics.cpp @@ -9,16 +9,24 @@ JFJochViewerImageROIStatistics::JFJochViewerImageROIStatistics(QWidget *parent) : QWidget(parent) { QVBoxLayout* layout = new QVBoxLayout(this); - roi_pos = new QLabel("None", this); - roi_label = new QLabel("", this); + box_radio = new QRadioButton("Box", this); + box_radio->setChecked(true); + layout->addWidget(box_radio); - layout->addWidget(roi_pos); + circle_radio = new QRadioButton("Circle", this); + layout->addWidget(circle_radio); + + radio_group = new QButtonGroup(this); + radio_group->addButton(box_radio, 1); + radio_group->addButton(circle_radio, 2); + + layout->addWidget(new QLabel("", this)); + roi_label = new QLabel("", this); layout->addWidget(roi_label); } void JFJochViewerImageROIStatistics::loadImage(std::shared_ptr image) { if (!image) { - roi_pos->setText("None"); roi_label->setText(""); } else { auto roi = image->GetROI(); @@ -34,10 +42,17 @@ void JFJochViewerImageROIStatistics::loadImage(std::shared_ptrmax_count); roi_label->setText(text); - roi_pos->setText(QString::fromStdString(image->GetROIDescription())); } else { roi_label->setText(""); - roi_pos->setText("None"); } } } + +void JFJochViewerImageROIStatistics::SetROIBox(QRect box) { + box_radio->setChecked(true); +} + +void JFJochViewerImageROIStatistics::SetROICircle(double x, double y, double radius) { + circle_radio->setChecked(true); +} + diff --git a/viewer/JFJochViewerImageROIStatistics.h b/viewer/JFJochViewerImageROIStatistics.h index ebaeec4c..5c538843 100644 --- a/viewer/JFJochViewerImageROIStatistics.h +++ b/viewer/JFJochViewerImageROIStatistics.h @@ -6,17 +6,31 @@ #define JFJOCH_JFJOCHVIEWERIMAGEROISTATISTICS_H #include +#include +#include + +#include "JFJochImageReadingWorker.h" #include "../reader/JFJochReaderImage.h" class JFJochViewerImageROIStatistics : public QWidget { Q_OBJECT + QRadioButton *box_radio; + QRadioButton *circle_radio; + QRadioButton *azim_radio; + QButtonGroup *radio_group; + QLabel *roi_pos; QLabel *roi_label; public: JFJochViewerImageROIStatistics(QWidget *parent); public slots: void loadImage(std::shared_ptr image); + void SetROIBox(QRect box); + void SetROICircle(double x, double y, double radius); +signals: + void ROIBoxConfigured(QRect box); // Signal emitted when Box ROI is set + void ROICircleConfigured(double center_x, double center_y, double radius); // Signal emitted when Circle ROI is set }; diff --git a/viewer/JFJochViewerSidePanel.cpp b/viewer/JFJochViewerSidePanel.cpp index 5dfd640b..2c16f619 100644 --- a/viewer/JFJochViewerSidePanel.cpp +++ b/viewer/JFJochViewerSidePanel.cpp @@ -27,7 +27,7 @@ JFJochViewerSidePanel::JFJochViewerSidePanel(QWidget *parent) : QWidget(parent) layout->addWidget(new TitleLabel("ROI", this)); - auto roi = new JFJochViewerImageROIStatistics(this); + roi = new JFJochViewerImageROIStatistics(this); layout->addWidget(roi); connect(this, &JFJochViewerSidePanel::imageLoaded, roi, &JFJochViewerImageROIStatistics::loadImage); @@ -287,3 +287,11 @@ void JFJochViewerSidePanel::saturatedPixelsToggled(bool input) { void JFJochViewerSidePanel::highlightIceRingsToggled(bool input) { emit highlightIceRings(input); } + +void JFJochViewerSidePanel::SetROIBox(QRect box) { + roi->SetROIBox(box); +} + +void JFJochViewerSidePanel::SetROICircle(double x, double y, double radius) { + roi->SetROICircle(x, y, radius); +} diff --git a/viewer/JFJochViewerSidePanel.h b/viewer/JFJochViewerSidePanel.h index ae21092e..518e1698 100644 --- a/viewer/JFJochViewerSidePanel.h +++ b/viewer/JFJochViewerSidePanel.h @@ -9,6 +9,7 @@ #include #include +#include "JFJochViewerImageROIStatistics.h" #include "../reader/JFJochReader.h" #include "widgets/JFJochSimpleChartView.h" #include "JFJochViewerSidePanelChart.h" @@ -24,6 +25,7 @@ class JFJochViewerSidePanel : public QWidget { QCheckBox *resRingsCheckBox; QComboBox* calibrantCombo{nullptr}; // stores current calibrant selection JFJochViewerSidePanelChart *chart = nullptr; + JFJochViewerImageROIStatistics *roi = nullptr; signals: void showSpots(bool input); void autoResRings(); @@ -42,6 +44,8 @@ public: JFJochViewerSidePanel(QWidget *parent); public slots: void loadImage(std::shared_ptr image); + void SetROIBox(QRect box); + void SetROICircle(double x, double y, double radius); private slots: void editingFinished(); void enableResRings(bool input); diff --git a/viewer/JFJochViewerWindow.cpp b/viewer/JFJochViewerWindow.cpp index ce27152b..7cffce77 100644 --- a/viewer/JFJochViewerWindow.cpp +++ b/viewer/JFJochViewerWindow.cpp @@ -170,6 +170,12 @@ JFJochViewerWindow::JFJochViewerWindow(QWidget *parent, bool dbus, const QString connect(viewer, &JFJochViewerImage::roiCircleUpdated, reading_worker, &JFJochImageReadingWorker::SetROICircle); + connect(viewer, &JFJochViewerImage::roiBoxUpdated, + side_panel, &JFJochViewerSidePanel::SetROIBox); + + connect(viewer, &JFJochViewerImage::roiCircleUpdated, + side_panel, &JFJochViewerSidePanel::SetROICircle); + connect(reading_worker, &JFJochImageReadingWorker::datasetLoaded, dataset_info, &JFJochViewerDatasetInfo::datasetLoaded);