jfjoch_viewer: Add Image B-factor

This commit is contained in:
2026-05-18 12:54:24 +02:00
parent ac907e8aef
commit 4e2043ec4b
10 changed files with 66 additions and 16 deletions
+1
View File
@@ -885,6 +885,7 @@ PlotType ConvertPlotType(const std::optional<std::string>& input) {
if (input == "integrated_reflections") return PlotType::IntegratedReflections;
if (input == "image_scale_factor") return PlotType::ImageScaleFactor;
if (input == "image_scale_cc") return PlotType::ImageScaleCC;
if (input == "image_scale_b") return PlotType::ImageScaleBFactor;
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"Plot type not recognized");
+1
View File
@@ -118,6 +118,7 @@ components:
- integrated_reflections
- image_scale_factor
- image_scale_cc
- image_scale_b
roi:
in: query
name: roi
+1 -1
View File
@@ -16,7 +16,7 @@ enum class PlotType {
ROISum, ROIMean, ROIMaxCount, ROIPixels, ROIWeightedX, ROIWeightedY, PacketsReceived, MaxValue,
ResolutionEstimate, ProfileRadius, Mosaicity, BFactor, PixelSum, StrongPixels,
RefinementBeamX, RefinementBeamY, ImageProcessingTime, IntegratedReflections,
ImageScaleFactor, ImageScaleCC
ImageScaleFactor, ImageScaleCC, ImageScaleBFactor
};
enum class PlotAzintUnit {
+1
View File
@@ -291,6 +291,7 @@ void JFJochHDF5Reader::ReadFile(const std::string &filename) {
dataset->b_factor = master_file->ReadOptVector<float>("/entry/MX/bFactor");
dataset->image_scale_factor = master_file->ReadOptVector<float>("/entry/MX/imageScaleFactor");
dataset->image_scale_cc = master_file->ReadOptVector<float>("/entry/MX/imageScaleCC");
dataset->image_scale_b = master_file->ReadOptVector<float>("/entry/MX/imageScaleBFactor");
dataset->integrated_reflections = master_file->ReadOptVector<float>("/entry/MX/integratedReflections");
}
if (master_file->Exists("/entry/image"))
+1
View File
@@ -185,6 +185,7 @@ std::shared_ptr<JFJochReaderDataset> JFJochHttpReader::UpdateDataset_i() {
dataset->integrated_reflections = GetPlot_i("integrated_reflections");
dataset->image_scale_factor = GetPlot_i("image_scale_factor");
dataset->image_scale_cc = GetPlot_i("image_scale_cc");
dataset->image_scale_b = GetPlot_i("image_scale_b");
if (msg->start_message->goniometer)
dataset->experiment.Goniometer(msg->start_message->goniometer);
+1
View File
@@ -43,6 +43,7 @@ struct JFJochReaderDataset {
std::vector<float> integrated_reflections;
std::vector<float> image_scale_factor;
std::vector<float> image_scale_cc;
std::vector<float> image_scale_b;
std::vector<int64_t> max_value;
+8
View File
@@ -108,6 +108,7 @@ void JFJochReceiverPlots::Setup(const DiffractionExperiment &experiment, const A
integrated_reflections.Clear(r);
image_scale_factor.Clear(r);
image_scale_cc.Clear(r);
image_scale_b.Clear(r);
refinement_time.Clear(r);
spot_finding_time.Clear(r);
@@ -173,6 +174,7 @@ void JFJochReceiverPlots::Add(const DataMessage &msg, const AzimuthalIntegration
indexing_solution.AddElement(msg.number, msg.indexing_result);
image_scale_factor.AddElement(msg.number, msg.image_scale_factor);
image_scale_cc.AddElement(msg.number, msg.image_scale_cc);
image_scale_b.AddElement(msg.number, msg.image_scale_b_factor);
{
std::unique_lock ul(m);
@@ -328,6 +330,9 @@ MultiLinePlot JFJochReceiverPlots::GetPlots(const PlotRequest &request) {
case PlotType::ImageScaleCC:
ret = image_scale_cc.GetMeanPlot(nbins, start, incr, request.fill_value);
break;
case PlotType::ImageScaleBFactor:
ret = image_scale_b.GetMeanPlot(nbins, start, incr, request.fill_value);
break;
case PlotType::ImageScaleFactor:
ret = image_scale_factor.GetMeanPlot(nbins, start, incr, request.fill_value);
break;
@@ -552,6 +557,9 @@ void JFJochReceiverPlots::GetPlotRaw(std::vector<float> &v, PlotType type, const
case PlotType::ImageScaleFactor:
v = image_scale_factor.ExportArray();
break;
case PlotType::ImageScaleBFactor:
v = image_scale_b.ExportArray();
break;
case PlotType::ROISum:
case PlotType::ROIMaxCount:
case PlotType::ROIPixels:
+1
View File
@@ -69,6 +69,7 @@ class JFJochReceiverPlots {
StatusVector integrated_reflections;
StatusVector image_scale_factor;
StatusVector image_scale_cc;
StatusVector image_scale_b;
// StatusVector objects are fully thread-safe (protected by internal mutex)
// It is OK to have concurrent access to StatusVector
+49 -14
View File
@@ -7,6 +7,11 @@
#include <QHeaderView>
#include <QCloseEvent>
namespace {
constexpr int ScaleSortRole = Qt::UserRole + 1;
constexpr double ScaleNotAvailableSortValue = -1.0e100;
}
JFJochViewerImageListWindow::JFJochViewerImageListWindow(QWidget *parent) : JFJochHelperWindow(parent) {
QWidget *centralWidget = new QWidget(this);
@@ -21,6 +26,7 @@ JFJochViewerImageListWindow::JFJochViewerImageListWindow(QWidget *parent) : JFJo
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(tableModel);
proxyModel->setSortRole(ScaleSortRole);
tableView->setModel(proxyModel);
tableView->sortByColumn(0, Qt::AscendingOrder);
@@ -45,15 +51,16 @@ JFJochViewerImageListWindow::JFJochViewerImageListWindow(QWidget *parent) : JFJo
void JFJochViewerImageListWindow::setupTableModel()
{
tableModel->setColumnCount(8);
tableModel->setColumnCount(9);
tableModel->setHeaderData(0, Qt::Horizontal, "#");
tableModel->setHeaderData(1, Qt::Horizontal, "Background");
tableModel->setHeaderData(2, Qt::Horizontal, "Indexing");
tableModel->setHeaderData(1, Qt::Horizontal, "Bkg");
tableModel->setHeaderData(2, Qt::Horizontal, "Index");
tableModel->setHeaderData(3, Qt::Horizontal, "Spots");
tableModel->setHeaderData(4, Qt::Horizontal, "Res. estimate");
tableModel->setHeaderData(5, Qt::Horizontal, "Max");
tableModel->setHeaderData(4, Qt::Horizontal, "Res. [A]");
tableModel->setHeaderData(5, Qt::Horizontal, "Max val");
tableModel->setHeaderData(6, Qt::Horizontal, "Scale factor");
tableModel->setHeaderData(7, Qt::Horizontal, "Scale CC [%]");
tableModel->setHeaderData(7, Qt::Horizontal, "Scale CC");
tableModel->setHeaderData(8, Qt::Horizontal, "Scale B [A^2]");
}
void JFJochViewerImageListWindow::addDataRow(int imageNumber, double backgroundEstimate,
@@ -62,15 +69,18 @@ void JFJochViewerImageListWindow::addDataRow(int imageNumber, double backgroundE
double resolutionEstimate,
int64_t max_value,
double image_scale_factor,
double image_scale_cc_percent) {
double image_scale_cc_percent,
double image_scale_b) {
QList<QStandardItem*> rowItems;
QStandardItem *imageItem = new QStandardItem();
imageItem->setData(imageNumber, Qt::DisplayRole);
imageItem->setData(imageNumber, ScaleSortRole);
rowItems.append(imageItem);
QStandardItem *bgItem = new QStandardItem();
bgItem->setData(backgroundEstimate, Qt::DisplayRole);
bgItem->setData(backgroundEstimate, ScaleSortRole);
rowItems.append(bgItem);
QStandardItem *indexingItem = new QStandardItem(indexingResult);
@@ -78,30 +88,50 @@ void JFJochViewerImageListWindow::addDataRow(int imageNumber, double backgroundE
QStandardItem *spotItem = new QStandardItem();
spotItem->setData(spotCount, Qt::DisplayRole);
spotItem->setData(spotCount, ScaleSortRole);
rowItems.append(spotItem);
QStandardItem *resolutionItem = new QStandardItem();
resolutionItem->setData(resolutionEstimate, Qt::DisplayRole);
resolutionItem->setData(QString::number(resolutionEstimate, 'f', 2), Qt::DisplayRole);
resolutionItem->setData(resolutionEstimate, ScaleSortRole);
rowItems.append(resolutionItem);
QStandardItem *maxValueItem = new QStandardItem();
maxValueItem->setData(static_cast<int32_t>(max_value), Qt::DisplayRole);
maxValueItem->setData(static_cast<int32_t>(max_value), ScaleSortRole);
rowItems.append(maxValueItem);
QStandardItem *scaleFactorItem = new QStandardItem();
if (std::isfinite(image_scale_factor))
if (std::isfinite(image_scale_factor)) {
scaleFactorItem->setData(image_scale_factor, Qt::DisplayRole);
else
scaleFactorItem->setData(image_scale_factor, ScaleSortRole);
} else {
scaleFactorItem->setData("N/A", Qt::DisplayRole);
scaleFactorItem->setData(ScaleNotAvailableSortValue, ScaleSortRole);
}
rowItems.append(scaleFactorItem);
QStandardItem *scaleCCItem = new QStandardItem();
if (std::isfinite(image_scale_cc_percent))
scaleCCItem->setData(image_scale_cc_percent, Qt::DisplayRole);
else
if (std::isfinite(image_scale_cc_percent)) {
scaleCCItem->setData(QString::number(image_scale_cc_percent, 'f', 1) + "%", Qt::DisplayRole);
scaleCCItem->setData(image_scale_cc_percent, ScaleSortRole);
} else {
scaleCCItem->setData("N/A", Qt::DisplayRole);
scaleCCItem->setData(ScaleNotAvailableSortValue, ScaleSortRole);
}
rowItems.append(scaleCCItem);
QStandardItem *scaleBItem = new QStandardItem();
if (std::isfinite(image_scale_b)) {
scaleBItem->setData(QString::number(image_scale_b, 'f', 2), Qt::DisplayRole);
scaleBItem->setData(image_scale_b, ScaleSortRole);
} else {
scaleBItem->setData("N/A", Qt::DisplayRole);
scaleBItem->setData(ScaleNotAvailableSortValue, ScaleSortRole);
}
rowItems.append(scaleBItem);
tableModel->appendRow(rowItems);
}
@@ -148,6 +178,10 @@ void JFJochViewerImageListWindow::datasetLoaded(std::shared_ptr<const JFJochRead
if (dataset->image_scale_cc.size() > i)
image_scale_cc_percent = dataset->image_scale_cc[i] * 100.0;
double image_scale_b = NAN;
if (dataset->image_scale_b.size() > i)
image_scale_b = dataset->image_scale_b[i];
addDataRow(i + 1,
bkg_estimate,
indexing_result,
@@ -155,7 +189,8 @@ void JFJochViewerImageListWindow::datasetLoaded(std::shared_ptr<const JFJochRead
res_estimation,
max_value,
image_scale_factor,
image_scale_cc_percent);
image_scale_cc_percent,
image_scale_b);
}
}
+2 -1
View File
@@ -25,7 +25,8 @@ class JFJochViewerImageListWindow : public JFJochHelperWindow {
const QString &indexingResult, int spotCount,
double resolutionEstimate, int64_t max_value,
double image_scale_factor,
double image_scale_cc_percent);
double image_scale_cc_percent,
double image_scale_b);
void clearAllData();
public: