From ce60cf96a1f604a4a54c2cdbd862d62f39fb81a5 Mon Sep 17 00:00:00 2001 From: Alice Date: Fri, 7 Aug 2026 00:03:22 +0200 Subject: [PATCH] replaced geometry calculations with members in DetectorGeometry --- include/aare/DetectorGeometry.hpp | 3 + src/DetectorGeometry.cpp | 7 +- src/RawFile.cpp | 226 +++++++++++++++++------------- 3 files changed, 140 insertions(+), 96 deletions(-) diff --git a/include/aare/DetectorGeometry.hpp b/include/aare/DetectorGeometry.hpp index 8aa6078..34ab5f7 100644 --- a/include/aare/DetectorGeometry.hpp +++ b/include/aare/DetectorGeometry.hpp @@ -114,6 +114,8 @@ class DetectorGeometry { size_t modules_x() const; size_t modules_y() const; + xy udp_interfaces_per_module() const; + const std::vector &get_module_geometries() const; const ModuleGeometry &get_module_geometries(const size_t index) const; @@ -125,6 +127,7 @@ class DetectorGeometry { size_t m_modules_y{}; size_t m_pixels_x{}; size_t m_pixels_y{}; + xy m_udp_interfaces_per_module{}; static constexpr ModuleConfig cfg{0, 0}; // TODO: maybe remove - should be a member in ROIGeometry - in particular diff --git a/src/DetectorGeometry.cpp b/src/DetectorGeometry.cpp index ee3525f..c0ceef9 100644 --- a/src/DetectorGeometry.cpp +++ b/src/DetectorGeometry.cpp @@ -11,7 +11,8 @@ DetectorGeometry::DetectorGeometry(const xy &geometry, const ssize_t module_pixels_x, const ssize_t module_pixels_y, const xy udp_interfaces_per_module, - const bool quad) { + const bool quad) + : m_udp_interfaces_per_module(udp_interfaces_per_module) { size_t num_modules = geometry.col * geometry.row; module_geometries.reserve(num_modules); @@ -43,6 +44,10 @@ DetectorGeometry::DetectorGeometry(const xy &geometry, m_pixels_y += static_cast((geometry.row - 1) * cfg.module_gap_row); } +xy DetectorGeometry::udp_interfaces_per_module() const { + return m_udp_interfaces_per_module; +} + size_t DetectorGeometry::n_modules() const { return m_modules_x * m_modules_y; } size_t DetectorGeometry::pixels_x() const { return m_pixels_x; } diff --git a/src/RawFile.cpp b/src/RawFile.cpp index 785c935..b3ad4e3 100644 --- a/src/RawFile.cpp +++ b/src/RawFile.cpp @@ -27,11 +27,10 @@ namespace aare { * @param modules_y number of modules in y direction * @return vector of ROIs corresponding to the disabled UDP ports */ -std::vector get_rois_from_disabled_udp_ports( - std::vector &disabled_ports, - std::vector &udp_port_types, const ssize_t pixels_per_module_x, - const ssize_t pixels_per_module_y, const ssize_t modules_x, - const ssize_t modules_y) { +std::vector +get_rois_from_disabled_udp_ports(std::vector &disabled_ports, + std::vector &udp_port_types, + const DetectorGeometry &geometry) { const size_t num_udp_port_types = udp_port_types.size(); @@ -45,73 +44,98 @@ std::vector get_rois_from_disabled_udp_ports( std::vector rois; - constexpr size_t udp_ports_per_module = 2; + const ssize_t udp_ports_per_module = + geometry.udp_interfaces_per_module().col * + geometry.udp_interfaces_per_module().row; bool port_disabled_for_all_modules = - disabled_ports.size() == modules_x * modules_y / udp_ports_per_module; + disabled_ports.size() == + geometry.modules_x() * geometry.modules_y() / udp_ports_per_module; if (all_ports_equal && port_disabled_for_all_modules) { if (udp_port_types[first_port] == "left") { - size_t num_rois = modules_x / udp_ports_per_module; + const size_t num_rois = geometry.modules_x() / udp_ports_per_module; rois.resize(num_rois); - std::generate(rois.begin(), rois.end(), - [n = 0, pixels_per_module_x, pixels_per_module_y, - modules_y]() mutable { - ssize_t idx = n++; - return ROI{idx * 2 * pixels_per_module_x + - pixels_per_module_x, - idx * 2 * pixels_per_module_x + - 2 * pixels_per_module_x, - 0, modules_y * pixels_per_module_y}; - }); + + const ssize_t pixels_per_module_x = + geometry.pixels_x() / geometry.modules_x(); + + std::generate( + rois.begin(), rois.end(), + [n = 0, &geometry, pixels_per_module_x, + udp_ports_per_module]() mutable { + ssize_t idx = n++; + return ROI{ + idx * udp_ports_per_module * pixels_per_module_x + + pixels_per_module_x, + idx * udp_ports_per_module * pixels_per_module_x + + 2 * pixels_per_module_x, + 0, static_cast(geometry.pixels_y())}; + }); } if (udp_port_types[first_port] == "right") { - size_t num_rois = modules_x / udp_ports_per_module; + const size_t num_rois = geometry.modules_x() / udp_ports_per_module; rois.resize(num_rois); - std::generate(rois.begin(), rois.end(), - [n = 0, pixels_per_module_x, pixels_per_module_y, - modules_y]() mutable { - ssize_t idx = n++; - return ROI{idx * 2 * pixels_per_module_x, - idx * 2 * pixels_per_module_x + - pixels_per_module_x, - 0, modules_y * pixels_per_module_y}; - }); + + const ssize_t pixels_per_module_x = + geometry.pixels_x() / geometry.modules_x(); + + std::generate( + rois.begin(), rois.end(), + [n = 0, geometry, pixels_per_module_x, + udp_ports_per_module]() mutable { + ssize_t idx = n++; + return ROI{idx * udp_ports_per_module * pixels_per_module_x, + idx * udp_ports_per_module * + pixels_per_module_x + + pixels_per_module_x, + 0, static_cast(geometry.pixels_y())}; + }); } if (udp_port_types[first_port] == "top") { - size_t num_rois = modules_y / udp_ports_per_module; + size_t num_rois = geometry.modules_y() / udp_ports_per_module; rois.resize(num_rois); // assumes euclidean coordinate system with origin at bottom // left corner of the detector - std::generate(rois.begin(), rois.end(), - [n = 0, pixels_per_module_x, pixels_per_module_y, - modules_x]() mutable { - ssize_t idx = n++; - return ROI{0, modules_x * pixels_per_module_x, - idx * 2 * pixels_per_module_y, - idx * 2 * pixels_per_module_y + - pixels_per_module_y}; - }); + const ssize_t pixels_per_module_y = + geometry.pixels_y() / geometry.modules_y(); + std::generate( + rois.begin(), rois.end(), + [n = 0, &geometry, pixels_per_module_y, + udp_ports_per_module]() mutable { + ssize_t idx = n++; + return ROI{0, static_cast(geometry.pixels_x()), + idx * udp_ports_per_module * pixels_per_module_y, + idx * udp_ports_per_module * + pixels_per_module_y + + pixels_per_module_y}; + }); } if (udp_port_types[first_port] == "bottom") { - size_t num_rois = modules_y / udp_ports_per_module; + size_t num_rois = geometry.modules_y() / udp_ports_per_module; rois.resize(num_rois); - std::generate(rois.begin(), rois.end(), - [n = 0, pixels_per_module_x, pixels_per_module_y, - modules_x]() mutable { - ssize_t idx = n++; - return ROI{0, modules_x * pixels_per_module_x, - idx * 2 * pixels_per_module_y + - pixels_per_module_y, - idx * 2 * pixels_per_module_y + - 2 * pixels_per_module_y}; - }); + const ssize_t pixels_per_module_y = + geometry.pixels_y() / geometry.modules_y(); + std::generate( + rois.begin(), rois.end(), + [n = 0, &geometry, pixels_per_module_y, + udp_ports_per_module]() mutable { + ssize_t idx = n++; + return ROI{ + 0, static_cast(geometry.pixels_x()), + idx * udp_ports_per_module * pixels_per_module_y + + pixels_per_module_y, + idx * udp_ports_per_module * pixels_per_module_y + + 2 * pixels_per_module_y}; + }); } } else { // iterate over all ports and create ROIs for each disabled port rois.reserve(disabled_ports.size()); - for (auto disabled_port : disabled_ports) { + for (size_t idx = 0; idx < disabled_ports.size(); ++idx) { + + size_t disabled_port = disabled_ports[idx]; std::string disabled_port_type = udp_port_types[disabled_port % num_udp_port_types]; // modulo needed as @@ -123,58 +147,72 @@ std::vector get_rois_from_disabled_udp_ports( // in // slsDetectorDefs - ROI roi{}; - if (disabled_port_type == "bottom") { // assumes euclidean coordinate system with origin at bottom // left corner - ssize_t module_idx = disabled_port / udp_ports_per_module; - ssize_t modules_in_y = modules_y / udp_ports_per_module; - ssize_t module_row_pos = module_idx % modules_in_y; - ssize_t module_col_pos = module_idx / modules_in_y; - roi = ROI{module_col_pos * pixels_per_module_x, - (module_col_pos + 1) * pixels_per_module_x, - module_row_pos * 2 * pixels_per_module_y + - pixels_per_module_y, - module_row_pos * 2 * pixels_per_module_y + - 2 * pixels_per_module_y}; + ssize_t module_idx = disabled_port + 1; // top port + if (idx == disabled_ports.size() - 1 || + !(static_cast(disabled_ports[idx + 1]) == + module_idx)) { + // top port is not disabled + auto module_geometry = + geometry.get_module_geometries(module_idx); + + rois.push_back( + ROI{module_geometry.origin_x, + module_geometry.origin_x + module_geometry.width, + module_geometry.origin_y, + module_geometry.origin_y + module_geometry.height}); + } + } else if (disabled_port_type == "top") { - ssize_t module_idx = disabled_port / udp_ports_per_module; - ssize_t modules_in_y = modules_y / udp_ports_per_module; - ssize_t module_row_pos = module_idx % modules_in_y; - ssize_t module_col_pos = module_idx / modules_in_y; - roi = ROI{module_col_pos * pixels_per_module_x, - (module_col_pos + 1) * pixels_per_module_x, - module_row_pos * 2 * pixels_per_module_y, - module_row_pos * 2 * pixels_per_module_y + - pixels_per_module_y}; + ssize_t module_idx = disabled_port - 1; // bottom port + if (idx == 0 || !(static_cast( + disabled_ports[idx - 1]) == module_idx)) { + // bottom port is not disabled + auto module_geometry = + geometry.get_module_geometries(module_idx); + + rois.push_back( + ROI{module_geometry.origin_x, + module_geometry.origin_x + module_geometry.width, + module_geometry.origin_y, + module_geometry.origin_y + module_geometry.height}); + } + } else if (disabled_port_type == "left") { - ssize_t half_module_idx = disabled_port / udp_ports_per_module; - ssize_t module_row_pos = half_module_idx % modules_y; - ssize_t module_col_pos = half_module_idx / modules_y; - roi = ROI{module_col_pos * 2 * pixels_per_module_x + - pixels_per_module_x, - module_col_pos * 2 * pixels_per_module_x + - 2 * pixels_per_module_x, - module_row_pos * pixels_per_module_y, - module_row_pos * pixels_per_module_y + - pixels_per_module_y}; + ssize_t module_idx = disabled_port + 1; // right port + if (idx == disabled_ports.size() - 1 || + !(static_cast(disabled_ports[idx + 1]) == + module_idx)) { + // right port is not disabled + auto module_geometry = + geometry.get_module_geometries(module_idx); + + rois.push_back( + ROI{module_geometry.origin_x, + module_geometry.origin_x + module_geometry.width, + module_geometry.origin_y, + module_geometry.origin_y + module_geometry.height}); + } } else if (disabled_port_type == "right") { - ssize_t half_module_idx = disabled_port / udp_ports_per_module; - ssize_t module_row_pos = half_module_idx % modules_y; - ssize_t module_col_pos = half_module_idx / modules_y; - roi = ROI{module_col_pos * 2 * pixels_per_module_x, - module_col_pos * 2 * pixels_per_module_x + - pixels_per_module_x, - module_row_pos * pixels_per_module_y, - module_row_pos * pixels_per_module_y + - pixels_per_module_y}; + ssize_t module_idx = disabled_port - 1; // left port + if (idx == 0 || !(static_cast( + disabled_ports[idx - 1]) == module_idx)) { + // left port is not disabled + auto module_geometry = + geometry.get_module_geometries(module_idx); + + rois.push_back( + ROI{module_geometry.origin_x, + module_geometry.origin_x + module_geometry.width, + module_geometry.origin_y, + module_geometry.origin_y + module_geometry.height}); + } } else { throw std::runtime_error( LOCATION + "Unknown UDP port type: " + disabled_port_type); } - - rois.push_back(roi); } if (udp_port_types == std::vector{"left", "right"}) { rois = merge_consecutive_rois(rois); @@ -210,9 +248,7 @@ RawFile::RawFile(const std::filesystem::path &fname, const std::string &mode) auto udp_port_types = m_master.udp_port_types().value(); std::vector rois = get_rois_from_disabled_udp_ports( - disabled_ports, udp_port_types, m_master.pixels_x(), - m_master.pixels_y(), m_geometry.modules_x(), - m_geometry.modules_y()); + disabled_ports, udp_port_types, m_geometry); m_subfiles.resize(rois.size());