From c8d6a19bfa11cac0627baee6d1fd09e1017def10 Mon Sep 17 00:00:00 2001 From: Alice Date: Tue, 11 Aug 2026 14:14:40 +0200 Subject: [PATCH] give ROI higher precedence --- include/aare/utils/utility_functions.hpp | 24 +++++++++++++ src/RawFile.cpp | 46 ++++++++++++------------ 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/include/aare/utils/utility_functions.hpp b/include/aare/utils/utility_functions.hpp index 8b325c7e..7a399247 100644 --- a/include/aare/utils/utility_functions.hpp +++ b/include/aare/utils/utility_functions.hpp @@ -1,4 +1,5 @@ #pragma once +#include "aare/DetectorGeometry.hpp" #include "aare/defs.hpp" #include #include @@ -89,4 +90,27 @@ std::vector merge_consecutive_rois(std::vector &rois) { return merge_along_y(merge_along_x(rois)); // generic case: two passes } } + +/** + * @brief Check if the ROI covers the entire detector geometry + * @param roi Region of interest + * @param geometry Detector geometry + * @return true if the ROI covers the entire detector geometry, false otherwise + */ +inline bool complete_ROI(const ROI &roi, const DetectorGeometry &geometry) { + return roi.xmin == 0 && + roi.xmax == static_cast(geometry.pixels_x()) && + roi.ymin == 0 && + roi.ymax == static_cast(geometry.pixels_y()); +} + +inline bool complete_ROI(const std::vector &rois, + const DetectorGeometry &geometry) { + if (rois.empty() or rois.size() > 1) { + return false; + } else { + return complete_ROI(rois[0], geometry); + } +} + } // namespace aare \ No newline at end of file diff --git a/src/RawFile.cpp b/src/RawFile.cpp index 74dbd2c0..72c95a46 100644 --- a/src/RawFile.cpp +++ b/src/RawFile.cpp @@ -144,11 +144,6 @@ get_rois_from_disabled_udp_ports(std::vector &disabled_ports, enabled_ports.end()); }); - std::for_each(enabled_ports.begin(), enabled_ports.end(), - [](size_t &port) { - LOG(logDEBUG) << "Enabled UDP port: " << port; - }); - rois.reserve(enabled_ports.size()); for (const auto enabled_port : enabled_ports) { @@ -184,10 +179,29 @@ RawFile::RawFile(const std::filesystem::path &fname, const std::string &mode) m_mode = mode; if (mode == "r") { - // TODO: should we support both ROI and disabled udp port - which - // one should have precedence? - if (m_master.disabled_udp_ports().has_value() && - m_master.disabled_udp_ports().value().size() > 0) { + + if (m_master.rois().has_value() && + !complete_ROI(m_master.rois().value(), m_geometry)) { + LOG(logDEBUG) + << "ROIs defined in master file. Creating subfiles for " + "each ROI."; + m_ROI_geometries.reserve(m_master.rois()->size()); + + m_subfiles.resize(m_master.rois()->size()); + // iterate over all ROIS + size_t roi_index = 0; + const auto rois = m_master.rois().value(); + for (const auto &roi : rois) { + m_ROI_geometries.push_back(ROIGeometry(roi, m_geometry)); + // open subfiles + open_subfiles(roi_index); + ++roi_index; + } + } else if (m_master.disabled_udp_ports().has_value() && + m_master.disabled_udp_ports().value().size() > 0) { + + LOG(logDEBUG) << "Disabled UDP ports defined in master file. " + "Creating ROIs from disabled UDP ports."; auto disabled_ports = m_master.disabled_udp_ports().value(); @@ -227,20 +241,6 @@ RawFile::RawFile(const std::filesystem::path &fname, const std::string &mode) min_subfiles_per_roi.end()); LOG(logDEBUG) << "Frames in file: " << m_frames_in_file; - - } else if (m_master.rois().has_value()) { - m_ROI_geometries.reserve(m_master.rois()->size()); - - m_subfiles.resize(m_master.rois()->size()); - // iterate over all ROIS - size_t roi_index = 0; - const auto rois = m_master.rois().value(); - for (const auto &roi : rois) { - m_ROI_geometries.push_back(ROIGeometry(roi, m_geometry)); - // open subfiles - open_subfiles(roi_index); - ++roi_index; - } } else { // no ROI use full detector m_subfiles.resize(1);