jfjoch_viewer: ROI panel (work in progress)

This commit is contained in:
2025-11-05 12:54:01 +01:00
parent 78d4f21d4b
commit a0840f860d
7 changed files with 58 additions and 48 deletions
-41
View File
@@ -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<uint32_t> 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);
+4
View File
@@ -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<ROIBox>("roi1", box.left(), box.right(), box.bottom(), box.top());
if (current_image_ptr) {
+21 -6
View File
@@ -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<const JFJochReaderImage> image) {
if (!image) {
roi_pos->setText("None");
roi_label->setText("");
} else {
auto roi = image->GetROI();
@@ -34,10 +42,17 @@ void JFJochViewerImageROIStatistics::loadImage(std::shared_ptr<const JFJochReade
.arg(QString::number(variance, 'f', 3))
.arg(roi->max_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);
}
+14
View File
@@ -6,17 +6,31 @@
#define JFJOCH_JFJOCHVIEWERIMAGEROISTATISTICS_H
#include <QLabel>
#include <QRadioButton>
#include <QButtonGroup>
#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<const JFJochReaderImage> 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
};
+9 -1
View File
@@ -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);
}
+4
View File
@@ -9,6 +9,7 @@
#include <QLineEdit>
#include <QCheckBox>
#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<const JFJochReaderImage> image);
void SetROIBox(QRect box);
void SetROICircle(double x, double y, double radius);
private slots:
void editingFinished();
void enableResRings(bool input);
+6
View File
@@ -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);