// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "ROIIntegration.h" #include "../../common/DiffractionExperiment.h" #include #include ROIIntegration::ROIIntegration(const DiffractionExperiment &experiment) : roi_map(experiment.ExportROIMap()), width(experiment.GetXPixelsNumConv()), npixel(roi_map.size()), roi_count(experiment.ROI().size()), roi_name(roi_count), roi_sum(roi_count), roi_sum2(roi_count), roi_pixels(roi_count), roi_x_weighted(roi_count), roi_y_weighted(roi_count), roi_max(roi_count), modules(experiment.GetModules()), panel_slots(std::max(modules.size(), 1)), roi_panel_v(roi_count * panel_slots), roi_panel_x(roi_count * panel_slots), roi_panel_y(roi_count * panel_slots) { for (const auto &[name, id] : experiment.ROI().GetROINameMap()) roi_name[id] = name; } void ROIIntegration::PlaceWeighted() { for (uint16_t r = 0; r < roi_count; r++) { if (modules.empty()) { roi_x_weighted[r] = roi_panel_x[r]; roi_y_weighted[r] = roi_panel_y[r]; continue; } // Sum over panels of v * (o + (x - x0) f + (y - y0) s). double x = 0, y = 0; for (size_t p = 0; p < modules.size(); p++) { const auto &m = modules[p]; const size_t k = r * panel_slots + p; const auto v = static_cast(roi_panel_v[k]); const auto u = static_cast(roi_panel_x[k] - m.x0 * roi_panel_v[k]); const auto w = static_cast(roi_panel_y[k] - m.y0 * roi_panel_v[k]); x += m.ox * v + m.fx * u + m.sx * w; y += m.oy * v + m.fy * u + m.sy * w; } roi_x_weighted[r] = std::llround(x); roi_y_weighted[r] = std::llround(y); } } void ROIIntegration::Export(std::map &out) const { for (uint16_t r = 0; r < roi_count; r++) out[roi_name[r]] = ROIMessage{ .sum = roi_sum[r], .sum_square = roi_sum2[r], .max_count = roi_max[r], .pixels = roi_pixels[r], .pixels_masked = 0, .x_weighted = roi_x_weighted[r], .y_weighted = roi_y_weighted[r], }; }