// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "ROIMap.h" #include "JFJochException.h" std::vector ROIMap::GetROIMap(const DiffractionGeometry &geom, size_t xpixel, size_t ypixel) const { std::vector map(xpixel * ypixel, 0); std::vector resolution_map(xpixel * ypixel, 0); if (!rois.azimuthal.empty()) { for (int y = 0; y < ypixel; y++) { for (int x = 0; x < xpixel; x++) { resolution_map[y * xpixel + x] = geom.PxlToRes(static_cast(x), static_cast(y)); } } } uint16_t roi_id = 0; for (const auto & box : rois.boxes) { box.MarkROI(map, roi_id, xpixel, ypixel, resolution_map); roi_id++; } for (const auto & circle : rois.circles) { circle.MarkROI(map, roi_id, xpixel, ypixel, resolution_map); roi_id++; } for (const auto &az : rois.azimuthal) { az.MarkROI(map, roi_id, xpixel, ypixel, resolution_map); roi_id++; } return map; } std::map ROIMap::GetROINameMap() const { std::map roi_name_map; uint16_t roi_id = 0; for (auto & box : rois.boxes) { roi_name_map[box.GetName()] = roi_id; roi_id++; } for (auto & circle : rois.circles) { roi_name_map[circle.GetName()] = roi_id; roi_id++; } for (auto & az : rois.azimuthal) { roi_name_map[az.GetName()] = roi_id; roi_id++; } return roi_name_map; } void ROIMap::SetROI(const ROIDefinition &input) { if (rois.boxes.size() + rois.circles.size() + rois.azimuthal.size() > roi_limit) throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, "Limit of box ROIs exceeded"); rois = input; } const ROIDefinition &ROIMap::GetROIDefinition() const { return rois; } bool ROIMap::empty() const { return rois.boxes.empty() && rois.circles.empty() && rois.azimuthal.empty(); } size_t ROIMap::size() const { return rois.boxes.size() + rois.circles.size() + rois.azimuthal.size(); } std::vector ROIMap::ExportMetadata() const { std::vector ret; for (auto &r : rois.boxes) ret.emplace_back(r.ExportMetadata()); for (auto &r : rois.circles) ret.emplace_back(r.ExportMetadata()); for (auto &r : rois.azimuthal) ret.emplace_back(r.ExportMetadata()); return ret; }