// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochAzIntImage.h" #include #include "../../common/JFJochException.h" JFJochAzIntImage::JFJochAzIntImage(QWidget *parent) : JFJochImage(parent) { } void JFJochAzIntImage::Clear() { W = 0; H = 0; image_fp.clear(); if (scene()) scene()->clear(); } // data: size = azimuthal_bins * q_bins // Layout: q varies fastest (i % q_bins == q index) void JFJochAzIntImage::SetData(const std::vector &data, const std::vector &in_phi, const std::vector &in_q, int azimuthal_bins) { if (azimuthal_bins <= 0) { Clear(); throw std::runtime_error("azimuthal_bins <= 0"); } int q_bins = data.size() / azimuthal_bins; if (q_bins <= 0 || in_phi.size() != data.size() || in_q.size() != data.size()) { Clear(); throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Mismatch in input size"); } float local_min = range_min, local_max = range_max; if (auto_range) { local_min = std::numeric_limits::infinity(); local_max = -std::numeric_limits::infinity(); for (float v : data) { if (std::isfinite(v)) { if (v < local_min) local_min = v; if (v > local_max) local_max = v; } } if (!std::isfinite(local_min) || !std::isfinite(local_max) || local_max <= local_min) { Clear(); return; } } else { if (!(std::isfinite(local_min) && std::isfinite(local_max) && local_max > local_min)) { Clear(); return; } } phi = in_phi; q = in_q; // Update base class members W = q_bins; H = azimuthal_bins; image_fp = data; // Update foreground/background for color mapping background = local_min; foreground = local_max; // Generate pixmap and redraw using base class functionality GeneratePixmap(); Redraw(); } void JFJochAzIntImage::mouseHover(QMouseEvent* event) { if (!scene() || W == 0 || H == 0) return; QPointF scenePos = mapToScene(event->pos()); int x = static_cast(scenePos.x()); int y = static_cast(scenePos.y()); if (x >= 0 && x < static_cast(W) && y >= 0 && y < static_cast(H)) { size_t idx = y * W + x; QString statusText = QString("Q: %1 Å^-1 phi: %2° value: %3") .arg(QString::number(q[idx], 'f', 3)) .arg(QString::number(phi[idx], 'f', 3)) .arg(QString::number(image_fp[idx], 'f', 3)); emit writeStatusBar(statusText, 0); } }