From c0c7cb37e1b81f53450e6446e18a037ffec49c84 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 10 Aug 2026 19:19:19 +0200 Subject: [PATCH] BugFix:iterate_over_enabled_ports --- src/RawFile.cpp | 102 ++++++++++--------------------------------- src/RawFile.test.cpp | 17 ++++++++ 2 files changed, 41 insertions(+), 78 deletions(-) diff --git a/src/RawFile.cpp b/src/RawFile.cpp index b3ad4e3..74dbd2c 100644 --- a/src/RawFile.cpp +++ b/src/RawFile.cpp @@ -132,88 +132,34 @@ get_rois_from_disabled_udp_ports(std::vector &disabled_ports, } } else { // iterate over all ports and create ROIs for each disabled port - rois.reserve(disabled_ports.size()); - for (size_t idx = 0; idx < disabled_ports.size(); ++idx) { + LOG(logDEBUG) << "Creating ROIs from disabled UDP ports"; + // get the enabled ones: + std::vector enabled_ports(geometry.n_modules()); + std::iota(enabled_ports.begin(), enabled_ports.end(), 0); + std::for_each(disabled_ports.begin(), disabled_ports.end(), + [&enabled_ports](size_t &port) { + enabled_ports.erase(std::remove(enabled_ports.begin(), + enabled_ports.end(), + port), + enabled_ports.end()); + }); - size_t disabled_port = disabled_ports[idx]; - std::string disabled_port_type = - udp_port_types[disabled_port % - num_udp_port_types]; // modulo needed as - // indexing is - // relative to half - // module // - // TODO: string_to? - // - anyway defined - // in - // slsDetectorDefs + std::for_each(enabled_ports.begin(), enabled_ports.end(), + [](size_t &port) { + LOG(logDEBUG) << "Enabled UDP port: " << port; + }); - if (disabled_port_type == "bottom") { - // assumes euclidean coordinate system with origin at bottom - // left corner - 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.reserve(enabled_ports.size()); + for (const auto enabled_port : enabled_ports) { - 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 - 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 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 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); - } + auto module_geometry = geometry.get_module_geometries(enabled_port); + 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}); } + if (udp_port_types == std::vector{"left", "right"}) { rois = merge_consecutive_rois(rois); } else if (udp_port_types == diff --git a/src/RawFile.test.cpp b/src/RawFile.test.cpp index 0272514..e2d2731 100644 --- a/src/RawFile.test.cpp +++ b/src/RawFile.test.cpp @@ -598,4 +598,21 @@ TEST_CASE("Read Eiger frame with disabled UDP ports", REQUIRE(frame.cols() == 512); REQUIRE(frame.rows() == 256); } + SECTION("only one port disabled") { + auto fpath = test_data_path() / "raw/eiger" / + "one_udp_port_disabled_master_0.json"; + + REQUIRE(std::filesystem::exists(fpath)); + RawFile f(fpath); + REQUIRE(f.master().disabled_udp_ports().value() == + std::vector{0}); + REQUIRE(f.master().udp_port_types().value() == + std::vector{"left", "right"}); + auto frame = f.read_rois(); + REQUIRE(frame.size() == 2); + REQUIRE(frame[0].cols() == 512); + REQUIRE(frame[0].rows() == 256); + REQUIRE(frame[1].cols() == 1024); + REQUIRE(frame[1].rows() == 256); + } }