diff --git a/common/GoniometerAxis.cpp b/common/GoniometerAxis.cpp index 5cad2728..09467618 100644 --- a/common/GoniometerAxis.cpp +++ b/common/GoniometerAxis.cpp @@ -55,8 +55,8 @@ Coord GoniometerAxis::GetPosition(int64_t image_number) const { return helical_step.value_or(Coord()) * static_cast(image_number); } -float GoniometerAxis::GetAngle_deg(int64_t image_number) const { - return start + increment * static_cast(image_number); +float GoniometerAxis::GetAngle_deg(float image_number) const { + return start + increment * image_number; } std::vector GoniometerAxis::GetAxisVector() const { diff --git a/common/GoniometerAxis.h b/common/GoniometerAxis.h index c7f46d9c..9d19abeb 100644 --- a/common/GoniometerAxis.h +++ b/common/GoniometerAxis.h @@ -30,7 +30,7 @@ public: [[nodiscard]] float GetIncrement_deg() const; [[nodiscard]] std::optional GetScreeningWedge() const; [[nodiscard]] float GetWedge_deg() const; - [[nodiscard]] float GetAngle_deg(int64_t image_number) const; + [[nodiscard]] float GetAngle_deg(float image_number) const; [[nodiscard]] Coord GetAxis() const; [[nodiscard]] std::optional GetHelicalStep() const; diff --git a/viewer/JFJochViewerDatasetInfo.cpp b/viewer/JFJochViewerDatasetInfo.cpp index 58ab741a..8d0e78ec 100644 --- a/viewer/JFJochViewerDatasetInfo.cpp +++ b/viewer/JFJochViewerDatasetInfo.cpp @@ -129,7 +129,7 @@ void JFJochViewerDatasetInfo::UpdatePlot() { } else if (val == 8) data = dataset->b_factor; - chart_view->loadValues(data, image_number, one_over_d2); + chart_view->loadValues(data, image_number, one_over_d2, dataset->experiment.GetGoniometer()); if (dataset->experiment.GetGridScan()) { stack->setCurrentWidget(grid_scan_image); grid_scan_image->loadData(data, dataset->experiment.GetGridScan().value(), one_over_d2); diff --git a/viewer/charts/JFJochChartView.cpp b/viewer/charts/JFJochChartView.cpp index ac68c4f9..d80e14f5 100644 --- a/viewer/charts/JFJochChartView.cpp +++ b/viewer/charts/JFJochChartView.cpp @@ -72,7 +72,10 @@ void JFJochChartView::updateChart() { if (!std::isfinite(values[i])) continue; const double disp = values[i]; if (!std::isfinite(disp)) continue; - series->append(i, disp); + if (goniometer_axis) + series->append(goniometer_axis->GetAngle_deg(i), disp); + else + series->append(i, disp); if (disp < dispMin) dispMin = disp; if (disp > dispMax) dispMax = disp; } @@ -91,7 +94,11 @@ void JFJochChartView::updateChart() { const double mean = tmp / static_cast(count); const double disp = mean; if (std::isfinite(disp)) { - series->append((i + 0.5) * binning, disp); + if (goniometer_axis) { + series->append(goniometer_axis->GetAngle_deg((i + 0.5) * binning), disp); + } else { + series->append((i + 0.5) * binning, disp); + } if (disp < dispMin) dispMin = disp; if (disp > dispMax) dispMax = disp; } @@ -99,12 +106,21 @@ void JFJochChartView::updateChart() { } } - if (curr_image < values.size() && curr_image >= 0 && std::isfinite(values[curr_image])) - currentSeries->append(curr_image, values[curr_image]); + if (curr_image < values.size() && curr_image >= 0 && std::isfinite(values[curr_image])) { + if (goniometer_axis) + currentSeries->append(goniometer_axis->GetAngle_deg(curr_image), values[curr_image]); + else + currentSeries->append(curr_image, values[curr_image]); + } chart()->addSeries(series); chart()->addSeries(currentSeries); chart()->createDefaultAxes(); + if (goniometer_axis) { + chart()->axisX(series)->setTitleText("Rotation angle (deg.)"); + } else { + chart()->axisX(series)->setTitleText("Image number"); + } // Set Y-axis behavior according to options QValueAxis *axisY = qobject_cast(chart()->axisY(series)); diff --git a/viewer/charts/JFJochChartView.h b/viewer/charts/JFJochChartView.h index 85dfd108..d9511e55 100644 --- a/viewer/charts/JFJochChartView.h +++ b/viewer/charts/JFJochChartView.h @@ -10,6 +10,7 @@ #include #include #include +#include "../../common/GoniometerAxis.h" class JFJochChartView : public QChartView { Q_OBJECT @@ -27,6 +28,8 @@ class JFJochChartView : public QChartView { bool m_minYZeroEnabled = true; bool m_yOneOverD = false; + + std::optional goniometer_axis; void updateChart(); signals: @@ -52,13 +55,15 @@ public slots: public: template - void loadValues(const std::vector &input, int64_t image, bool one_over_d2) { + void loadValues(const std::vector &input, int64_t image, bool one_over_d2, const std::optional &goniometer = {}) { m_yOneOverD = one_over_d2; values.resize(input.size()); + + goniometer_axis = goniometer; + for (int i = 0; i < input.size(); i++) { if (one_over_d2) { - float d = static_cast(input[i]); if (!std::isfinite(d)) values[i] = 0.0f;