Files
Jungfraujoch/viewer/JFJochViewerImageStatistics.cpp
2025-09-08 20:28:59 +02:00

164 lines
5.3 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "JFJochViewerImageStatistics.h"
#include <QFormLayout>
JFJochViewerImageStatistics::JFJochViewerImageStatistics(QWidget *parent) : QWidget(parent) {
QFormLayout* layout = new QFormLayout(this);
dataset_name = new QLabel(this);
layout->addRow(new QLabel("Dataset:"), dataset_name);
detector_name = new QLabel(this);
layout->addRow(new QLabel("Detector:"), detector_name);
sample_temperature_K = new QLabel(this);
layout->addRow(new QLabel("Sample temperature:"), sample_temperature_K);
error_pixels = new QLabel(this);
layout->addRow(new QLabel("Error pixels:"), error_pixels);
sat_pixels = new QLabel(this);
layout->addRow(new QLabel("Sat. pixels:"), sat_pixels);
valid_values = new QLabel(this);
layout->addRow(new QLabel("Valid values:"), valid_values);
spots = new QLabel(this);
layout->addRow(new QLabel("Spots:"), spots);
bkg_estimate = new QLabel(this);
layout->addRow(new QLabel("Background:"), bkg_estimate);
indexed = new QLabel(this);
layout->addRow(new QLabel("Indexing:"), indexed);
profile_radius = new QLabel(this);
layout->addRow(new QLabel("Profile radius:"), profile_radius);
b_factor = new QLabel(this);
layout->addRow(new QLabel("B-factor:"), b_factor);
roi_sum = new QLabel(this);
layout->addRow(new QLabel("ROI sum:"), roi_sum);
roi_mean = new QLabel(this);
layout->addRow(new QLabel("ROI mean:"), roi_mean);
roi_stddev = new QLabel(this);
layout->addRow(new QLabel("ROI st. dev.:"), roi_stddev);
roi_max = new QLabel(this);
layout->addRow(new QLabel("ROI max:"), roi_max);
}
void JFJochViewerImageStatistics::loadImage(std::shared_ptr<const JFJochReaderImage> image) {
if (!image) {
dataset_name->setText("");
detector_name->setText("");
error_pixels->setText("");
sat_pixels->setText("");
valid_values->setText("");
spots->setText("");
bkg_estimate->setText("");
indexed->setText("");
roi_sum->setText("");
roi_mean->setText("");
roi_stddev->setText("");
roi_max->setText("");
sample_temperature_K->setText("");
b_factor->setText("");
profile_radius->setText("");
return;
}
QString text;
auto &exp = image->Dataset().experiment;
text = QString("<b>%1</b>").arg(QString::fromStdString(exp.GetFilePrefix()));
dataset_name->setText(text);
text = QString("<b>%1</b>").arg(QString::fromStdString(exp.GetDetectorDescription()));
detector_name->setText(text);
text = QString("<b>%1</b>").arg(image->ErrorPixels().size());
error_pixels->setText(text);
text = QString("<b>%1</b>").arg(image->SaturatedPixels().size());
sat_pixels->setText(text);
text = QString("<b>%1</b>").arg(image->ImageData().spots.size());
spots->setText(text);
text = QString("<b>%1</b> - <b>%2</b>")
.arg(image->ValidPixels().begin()->first)
.arg(image->ValidPixels().rbegin()->first);
valid_values->setText(text);
if (!image->Dataset().bkg_estimate.empty()) {
text = QString("<b>%1</b>").arg(image->ImageData().bkg_estimate.value_or(0));
bkg_estimate->setText(text);
} else {
bkg_estimate->setText("N/A");
}
auto temp = exp.GetSampleTemeperature_K();
if (temp.has_value()) {
text = QString("<b>%1</b> K").arg(QString::number(temp.value(),'f',2));
sample_temperature_K->setText(text);
} else
sample_temperature_K->setText("N/A");
auto mos = image->ImageData().profile_radius;
if (mos) {
text = QString("<b>%1</b> Å<sup>-1</sup>").arg(QString::number(mos.value(), 'f', 6));
profile_radius->setText(text);
} else {
profile_radius->setText("N/A");
}
auto b = image->ImageData().b_factor;
if (b) {
text = QString("<b>%1</b> Å<sup>2</sup>").arg(QString::number(b.value(), 'f', 2));
b_factor->setText(text);
} else {
b_factor->setText("N/A");
}
if (!image->Dataset().indexing_result.empty()) {
if (image->ImageData().indexing_result.value_or(false))
text = QString("<span style=\"color: purple;\"><b>Lattice found</b></span>");
else
text = QString("<span style=\"color: red;\"><b>No lattice</b></span>");
indexed->setText(text);
} else {
indexed->setText("N/A");
}
auto roi = image->GetROI();
if (roi && roi->pixels > 0) {
text = QString("<b>%1</b>").arg(roi->sum);
roi_sum->setText(text);
auto roi_npixel = static_cast<double>(roi->pixels);
double roi_mean_val = static_cast<double>(roi->sum) / roi_npixel;
text = QString("<b>%1</b>").arg(QString::number(roi_mean_val, 'f', 3));
roi_mean->setText(text);
double variance = static_cast<double>(roi->sum_square) / roi_npixel - roi_mean_val * roi_mean_val;
text = QString("<b>%1</b>").arg(QString::number(sqrt(variance), 'f', 3));
roi_stddev->setText(text);
text = QString("<b>%1</b>").arg(roi->max_count);
roi_max->setText(text);
} else {
roi_sum->setText("N/A");
roi_mean->setText("N/A");
roi_stddev->setText("N/A");
roi_max->setText("N/A");
}
}