Files
Jungfraujoch/viewer/windows/JFJochViewerMetadataWindow.cpp
2025-06-10 18:14:04 +02:00

157 lines
5.6 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include <QVBoxLayout>
#include <QGroupBox>
#include <QLabel>
#include <QPushButton>
#include <QDialogButtonBox>
#include <QCloseEvent>
#include <QMessageBox>
#include "JFJochViewerMetadataWindow.h"
JFJochViewerMetadataWindow::JFJochViewerMetadataWindow(JFJochReader &in_reader, QWidget *parent)
: reader(in_reader), QMainWindow(parent) {
setWindowTitle("Dataset metadata");
QWidget *centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
auto mainLayout = new QVBoxLayout(centralWidget);
auto detectorGroup = new QGroupBox(tr("Diffraction geometry"), this);
mainLayout->addWidget(detectorGroup);
auto detectorLayout = new QGridLayout(detectorGroup);
detectorLayout->addWidget(new QLabel(tr("Detector Distance:")), 0, 0);
det_distance_mm = new NumberLineEdit(1.0, 10000, 100.0, 2, "mm", this);
detectorLayout->addWidget(det_distance_mm, 0, 1, 1, 2);
detectorLayout->addWidget(new QLabel(tr("Beam center:")), 1, 0);
beam_center_x = new NumberLineEdit(-10000, 10000, 0.0, 2, "pxl", this);
beam_center_y = new NumberLineEdit(-10000, 10000, 0.0, 2, "pxl", this);
detectorLayout->addWidget(beam_center_x, 1, 1);
detectorLayout->addWidget(beam_center_y, 1, 2);
detectorLayout->addWidget(new QLabel(tr("Wavelength:")), 2, 0);
wavelength_A = new NumberLineEdit(0.01, 10.0, 1.0, 2, "Å", this);
detectorLayout->addWidget(wavelength_A, 2, 1, 1, 2);
auto unitCellGroup = new QGroupBox(tr("Unit cell"), this);
mainLayout->addWidget(unitCellGroup);
auto unitCellLayout = new QGridLayout(unitCellGroup);
unit_cell_enabled = new QCheckBox(tr("Enable unit cell"), this);
unit_cell_enabled->setChecked(true); // Default to enabled
unitCellLayout->addWidget(unit_cell_enabled, 0, 0, 1, 3);
connect(unit_cell_enabled, &QCheckBox::toggled, this, &JFJochViewerMetadataWindow::toggleUnitCellFields);
unit_cell_a = new NumberLineEdit(1.0, 10000.0, 39.0, 2, "Å", this);
unit_cell_b = new NumberLineEdit(1.0, 10000.0, 78.0, 2, "Å", this);
unit_cell_c = new NumberLineEdit(1.0, 10000.0, 78.0, 2, "Å", this);
unit_cell_alpha = new NumberLineEdit(15.0, 345.0, 90, 2, "°", this);
unit_cell_beta = new NumberLineEdit(15.0, 345.0, 90, 2, "°", this);
unit_cell_gamma = new NumberLineEdit(15.0, 345.0, 90, 2, "°", this);
unitCellLayout->addWidget(unit_cell_a, 1, 0);
unitCellLayout->addWidget(unit_cell_b, 1, 1);
unitCellLayout->addWidget(unit_cell_c, 1, 2);
unitCellLayout->addWidget(unit_cell_alpha, 2, 0);
unitCellLayout->addWidget(unit_cell_beta, 2, 1);
unitCellLayout->addWidget(unit_cell_gamma, 2, 2);
QFrame *line = new QFrame();
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
mainLayout->addWidget(line);
auto *updateButton = new QPushButton("Update");
connect(updateButton, &QPushButton::clicked, this, &JFJochViewerMetadataWindow::datasetUpdate);
mainLayout->addWidget(updateButton);
}
void JFJochViewerMetadataWindow::open() {
show();
raise();
activateWindow();
}
void JFJochViewerMetadataWindow::datasetUpdate() {
if (dataset) {
try {
DiffractionExperiment tmp = dataset->experiment;
tmp.DetectorDistance_mm(det_distance_mm->value());
tmp.BeamX_pxl(beam_center_x->value());
tmp.BeamY_pxl(beam_center_y->value());
tmp.IncidentEnergy_keV(WVL_1A_IN_KEV / wavelength_A->value());
if (unit_cell_enabled->isChecked()) {
UnitCell uc;
uc.a = unit_cell_a->value();
uc.b = unit_cell_b->value();
uc.c = unit_cell_c->value();
uc.alpha = unit_cell_alpha->value();
uc.beta = unit_cell_beta->value();
uc.gamma = unit_cell_gamma->value();
tmp.SetUnitCell(uc);
} else {
tmp.SetUnitCell({});
}
dataset->experiment = tmp;
emit datasetUpdated();
} catch (const std::exception &e) {
QMessageBox::critical(this, "Error", e.what());
}
}
}
void JFJochViewerMetadataWindow::datasetLoaded() {
dataset = reader.GetStartMessage();
det_distance_mm->setValue(dataset->experiment.GetDetectorDistance_mm());
beam_center_x->setValue(dataset->experiment.GetBeamX_pxl());
beam_center_y->setValue(dataset->experiment.GetBeamY_pxl());
wavelength_A->setValue(dataset->experiment.GetWavelength_A());
auto unit_cell = dataset->experiment.GetUnitCell();
if (unit_cell) {
unit_cell_enabled->setChecked(true);
unit_cell_a->setValue(unit_cell->a);
unit_cell_b->setValue(unit_cell->b);
unit_cell_c->setValue(unit_cell->c);
unit_cell_alpha->setValue(unit_cell->alpha);
unit_cell_beta->setValue(unit_cell->beta);
unit_cell_gamma->setValue(unit_cell->gamma);
toggleUnitCellFields(true);
} else {
unit_cell_enabled->setChecked(false);
toggleUnitCellFields(false);
}
}
void JFJochViewerMetadataWindow::closeEvent(QCloseEvent *event) {
event->accept();
emit closing();
}
void JFJochViewerMetadataWindow::toggleUnitCellFields(bool enabled) {
unit_cell_a->setEnabled(enabled);
unit_cell_b->setEnabled(enabled);
unit_cell_c->setEnabled(enabled);
unit_cell_alpha->setEnabled(enabled);
unit_cell_beta->setEnabled(enabled);
unit_cell_gamma->setEnabled(enabled);
}