mirror of
https://github.com/slsdetectorgroup/aare.git
synced 2026-05-10 04:22:04 +02:00
Dev/multiple rois in aare (#263)
Reading multiple ROI's for aare - read_frame, read_n etc throws for multiple ROIs - new functions read_ROIs, read_n_ROIs - read_roi_into (used for python bindings - to not copy) all these functions use get_frame or get_frame_into where one passes the roi_index ## Refactoring: - each roi keeps track of its subfiles that one has to open e.g. subfiles can be opened several times - refactored class DetectorGeometry - keep track of the updated module geometries in new class ROIGeometry. - ModuleGeometry updates based on ROI ## ROIGeometry: - stores number of modules overlapping with ROI and its indices - size of ROI Note: only tested size of the resulting frames not the actual values --------- Co-authored-by: Erik Fröjdh <erik.frojdh@psi.ch> Co-authored-by: Erik Fröjdh <erik.frojdh@gmail.com>
This commit is contained in:
+221
-91
@@ -7,17 +7,20 @@
|
||||
#include <filesystem>
|
||||
|
||||
#include "aare/DetectorGeometry.hpp"
|
||||
#include "aare/ROIGeometry.hpp"
|
||||
#include "test_config.hpp"
|
||||
|
||||
TEST_CASE("Simple ROIs on one module") {
|
||||
// DetectorGeometry update_geometry_with_roi(DetectorGeometry geo, aare::ROI
|
||||
// roi)
|
||||
TEST_CASE("Simple ROIs on one module", "[DetectorGeometry]") {
|
||||
aare::DetectorGeometry geo(aare::xy{1, 1}, 1024, 512);
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).origin_x == 0);
|
||||
REQUIRE(geo.get_module_geometries(0).origin_y == 0);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 1024);
|
||||
REQUIRE(geo.get_module_geometries(0).height == 512);
|
||||
REQUIRE(geo.modules_x() == 1);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.pixels_x() == 1024);
|
||||
REQUIRE(geo.pixels_y() == 512);
|
||||
|
||||
SECTION("ROI is the whole module") {
|
||||
aare::ROI roi;
|
||||
@@ -25,14 +28,18 @@ TEST_CASE("Simple ROIs on one module") {
|
||||
roi.xmax = 1024;
|
||||
roi.ymin = 0;
|
||||
roi.ymax = 512;
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 1024);
|
||||
REQUIRE(geo.pixels_y() == 512);
|
||||
REQUIRE(geo.modules_x() == 1);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.get_module_geometries(0).height == 512);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 1024);
|
||||
aare::ROIGeometry roi_geometry(roi, geo);
|
||||
|
||||
REQUIRE(roi_geometry.pixels_x() == 1024);
|
||||
REQUIRE(roi_geometry.pixels_y() == 512);
|
||||
REQUIRE(roi_geometry.num_modules_in_roi() == 1);
|
||||
auto module_geometry =
|
||||
geo.get_module_geometries(roi_geometry.module_indices_in_roi(0));
|
||||
REQUIRE(module_geometry.height == 512);
|
||||
REQUIRE(module_geometry.width == 1024);
|
||||
REQUIRE(module_geometry.origin_x == 0);
|
||||
REQUIRE(module_geometry.origin_y == 0);
|
||||
}
|
||||
SECTION("ROI is the top left corner of the module") {
|
||||
aare::ROI roi;
|
||||
@@ -40,51 +47,22 @@ TEST_CASE("Simple ROIs on one module") {
|
||||
roi.xmax = 200;
|
||||
roi.ymin = 150;
|
||||
roi.ymax = 200;
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 100);
|
||||
REQUIRE(geo.pixels_y() == 50);
|
||||
REQUIRE(geo.modules_x() == 1);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.get_module_geometries(0).height == 50);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 100);
|
||||
}
|
||||
aare::ROIGeometry roi_geometry(roi, geo);
|
||||
|
||||
SECTION("ROI is a small square") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 1000;
|
||||
roi.xmax = 1010;
|
||||
roi.ymin = 500;
|
||||
roi.ymax = 510;
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 10);
|
||||
REQUIRE(geo.pixels_y() == 10);
|
||||
REQUIRE(geo.modules_x() == 1);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.get_module_geometries(0).height == 10);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 10);
|
||||
}
|
||||
SECTION("ROI is a few columns") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 750;
|
||||
roi.xmax = 800;
|
||||
roi.ymin = 0;
|
||||
roi.ymax = 512;
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 50);
|
||||
REQUIRE(geo.pixels_y() == 512);
|
||||
REQUIRE(geo.modules_x() == 1);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.get_module_geometries(0).height == 512);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 50);
|
||||
REQUIRE(roi_geometry.pixels_x() == 100);
|
||||
REQUIRE(roi_geometry.pixels_y() == 50);
|
||||
REQUIRE(roi_geometry.num_modules_in_roi() == 1);
|
||||
auto module_geometry =
|
||||
geo.get_module_geometries(roi_geometry.module_indices_in_roi(0));
|
||||
REQUIRE(module_geometry.height == 50);
|
||||
REQUIRE(module_geometry.width == 100);
|
||||
REQUIRE(module_geometry.origin_x == 0);
|
||||
REQUIRE(module_geometry.origin_y == 0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Two modules side by side") {
|
||||
// DetectorGeometry update_geometry_with_roi(DetectorGeometry geo, aare::ROI
|
||||
// roi)
|
||||
TEST_CASE("Two modules side by side", "[DetectorGeometry]") {
|
||||
aare::DetectorGeometry geo(aare::xy{1, 2}, 1024, 512);
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).origin_x == 0);
|
||||
@@ -93,6 +71,10 @@ TEST_CASE("Two modules side by side") {
|
||||
REQUIRE(geo.get_module_geometries(0).height == 512);
|
||||
REQUIRE(geo.get_module_geometries(1).origin_x == 1024);
|
||||
REQUIRE(geo.get_module_geometries(1).origin_y == 0);
|
||||
REQUIRE(geo.modules_x() == 2);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.pixels_x() == 2048);
|
||||
REQUIRE(geo.pixels_y() == 512);
|
||||
|
||||
SECTION("ROI is the whole image") {
|
||||
aare::ROI roi;
|
||||
@@ -100,12 +82,24 @@ TEST_CASE("Two modules side by side") {
|
||||
roi.xmax = 2048;
|
||||
roi.ymin = 0;
|
||||
roi.ymax = 512;
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 2048);
|
||||
REQUIRE(geo.pixels_y() == 512);
|
||||
REQUIRE(geo.modules_x() == 2);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
aare::ROIGeometry roi_geometry(roi, geo);
|
||||
|
||||
REQUIRE(roi_geometry.pixels_x() == 2048);
|
||||
REQUIRE(roi_geometry.pixels_y() == 512);
|
||||
REQUIRE(roi_geometry.num_modules_in_roi() == 2);
|
||||
|
||||
auto module_geometry_0 = geo.get_module_geometries(0);
|
||||
auto module_geometry_1 = geo.get_module_geometries(1);
|
||||
|
||||
REQUIRE(module_geometry_0.height == 512);
|
||||
REQUIRE(module_geometry_0.width == 1024);
|
||||
REQUIRE(module_geometry_1.height == 512);
|
||||
REQUIRE(module_geometry_1.width == 1024);
|
||||
REQUIRE(module_geometry_0.origin_x == 0);
|
||||
REQUIRE(module_geometry_1.origin_x == 1024);
|
||||
REQUIRE(module_geometry_0.origin_y == 0);
|
||||
REQUIRE(module_geometry_1.origin_y == 0);
|
||||
}
|
||||
SECTION("rectangle on both modules") {
|
||||
aare::ROI roi;
|
||||
@@ -113,28 +107,30 @@ TEST_CASE("Two modules side by side") {
|
||||
roi.xmax = 1300;
|
||||
roi.ymin = 200;
|
||||
roi.ymax = 499;
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 500);
|
||||
REQUIRE(geo.pixels_y() == 299);
|
||||
REQUIRE(geo.modules_x() == 2);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.get_module_geometries(0).height == 299);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 224);
|
||||
REQUIRE(geo.get_module_geometries(1).height == 299);
|
||||
REQUIRE(geo.get_module_geometries(1).width == 276);
|
||||
aare::ROIGeometry roi_geometry(roi, geo);
|
||||
|
||||
REQUIRE(roi_geometry.pixels_x() == 500);
|
||||
REQUIRE(roi_geometry.pixels_y() == 299);
|
||||
REQUIRE(roi_geometry.num_modules_in_roi() == 2);
|
||||
|
||||
auto module_geometry_0 = geo.get_module_geometries(0);
|
||||
auto module_geometry_1 = geo.get_module_geometries(1);
|
||||
|
||||
REQUIRE(module_geometry_0.height == 299);
|
||||
REQUIRE(module_geometry_0.width == 224);
|
||||
REQUIRE(module_geometry_1.height == 299);
|
||||
REQUIRE(module_geometry_1.width == 276);
|
||||
REQUIRE(module_geometry_0.origin_x == 0);
|
||||
REQUIRE(module_geometry_1.origin_x == 224);
|
||||
REQUIRE(module_geometry_0.origin_y == 0);
|
||||
REQUIRE(module_geometry_1.origin_y == 0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Three modules side by side") {
|
||||
// DetectorGeometry update_geometry_with_roi(DetectorGeometry geo, aare::ROI
|
||||
// roi)
|
||||
TEST_CASE("Three modules side by side", "[DetectorGeometry]") {
|
||||
|
||||
aare::DetectorGeometry geo(aare::xy{1, 3}, 1024, 512);
|
||||
aare::ROI roi;
|
||||
roi.xmin = 700;
|
||||
roi.xmax = 2500;
|
||||
roi.ymin = 0;
|
||||
roi.ymax = 123;
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).origin_x == 0);
|
||||
REQUIRE(geo.get_module_geometries(0).origin_y == 0);
|
||||
@@ -142,24 +138,78 @@ TEST_CASE("Three modules side by side") {
|
||||
REQUIRE(geo.get_module_geometries(0).height == 512);
|
||||
REQUIRE(geo.get_module_geometries(1).origin_x == 1024);
|
||||
REQUIRE(geo.get_module_geometries(2).origin_x == 2048);
|
||||
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 1800);
|
||||
REQUIRE(geo.pixels_y() == 123);
|
||||
REQUIRE(geo.modules_x() == 3);
|
||||
REQUIRE(geo.modules_y() == 1);
|
||||
REQUIRE(geo.get_module_geometries(0).height == 123);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 324);
|
||||
REQUIRE(geo.get_module_geometries(1).height == 123);
|
||||
REQUIRE(geo.get_module_geometries(1).width == 1024);
|
||||
REQUIRE(geo.get_module_geometries(2).height == 123);
|
||||
REQUIRE(geo.get_module_geometries(2).width == 452);
|
||||
REQUIRE(geo.pixels_x() == 3072);
|
||||
REQUIRE(geo.pixels_y() == 512);
|
||||
|
||||
SECTION("ROI overlapping all three modules") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 500;
|
||||
roi.xmax = 2500;
|
||||
roi.ymin = 0;
|
||||
roi.ymax = 123;
|
||||
|
||||
aare::ROIGeometry roi_geometry(roi, geo);
|
||||
REQUIRE(roi_geometry.pixels_x() == 2000);
|
||||
REQUIRE(roi_geometry.pixels_y() == 123);
|
||||
REQUIRE(roi_geometry.num_modules_in_roi() == 3);
|
||||
|
||||
auto module_geometry_0 = geo.get_module_geometries(0);
|
||||
auto module_geometry_1 = geo.get_module_geometries(1);
|
||||
auto module_geometry_2 = geo.get_module_geometries(2);
|
||||
|
||||
REQUIRE(module_geometry_0.height == 123);
|
||||
REQUIRE(module_geometry_0.width == 524);
|
||||
REQUIRE(module_geometry_0.origin_x == 0);
|
||||
REQUIRE(module_geometry_0.origin_y == 0);
|
||||
|
||||
REQUIRE(module_geometry_1.height == 123);
|
||||
REQUIRE(module_geometry_1.width == 1024);
|
||||
REQUIRE(module_geometry_1.origin_x == 524);
|
||||
REQUIRE(module_geometry_1.origin_y == 0);
|
||||
|
||||
REQUIRE(module_geometry_2.height == 123);
|
||||
REQUIRE(module_geometry_2.width == 452);
|
||||
REQUIRE(module_geometry_2.origin_x == 1548);
|
||||
REQUIRE(module_geometry_2.origin_y == 0);
|
||||
}
|
||||
|
||||
SECTION("ROI overlapping last two modules") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 1050;
|
||||
roi.xmax = 2500;
|
||||
roi.ymin = 0;
|
||||
roi.ymax = 123;
|
||||
|
||||
aare::ROIGeometry roi_geometry(roi, geo);
|
||||
|
||||
REQUIRE(roi_geometry.pixels_x() == 1450);
|
||||
REQUIRE(roi_geometry.pixels_y() == 123);
|
||||
REQUIRE(roi_geometry.num_modules_in_roi() == 2);
|
||||
|
||||
auto module_geometry_0 = geo.get_module_geometries(0);
|
||||
auto module_geometry_1 = geo.get_module_geometries(1);
|
||||
auto module_geometry_2 = geo.get_module_geometries(2);
|
||||
|
||||
REQUIRE(module_geometry_0.height == 512);
|
||||
REQUIRE(module_geometry_0.width == 1024);
|
||||
REQUIRE(module_geometry_0.origin_x == 0);
|
||||
REQUIRE(module_geometry_0.origin_y == 0);
|
||||
|
||||
REQUIRE(module_geometry_1.height == 123);
|
||||
REQUIRE(module_geometry_1.width == 998);
|
||||
REQUIRE(module_geometry_1.origin_x == 0);
|
||||
REQUIRE(module_geometry_1.origin_y == 0);
|
||||
|
||||
REQUIRE(module_geometry_2.height == 123);
|
||||
REQUIRE(module_geometry_2.width == 452);
|
||||
REQUIRE(module_geometry_2.origin_x == 998);
|
||||
REQUIRE(module_geometry_2.origin_y == 0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Four modules as a square") {
|
||||
// DetectorGeometry update_geometry_with_roi(DetectorGeometry geo, aare::ROI
|
||||
// roi)
|
||||
TEST_CASE("Four modules as a square", "[DetectorGeometry]") {
|
||||
aare::DetectorGeometry geo(aare::xy{2, 2}, 1024, 512, aare::xy{1, 2});
|
||||
aare::ROI roi;
|
||||
roi.xmin = 500;
|
||||
@@ -177,19 +227,99 @@ TEST_CASE("Four modules as a square") {
|
||||
REQUIRE(geo.get_module_geometries(2).origin_y == 512);
|
||||
REQUIRE(geo.get_module_geometries(3).origin_x == 1024);
|
||||
REQUIRE(geo.get_module_geometries(3).origin_y == 512);
|
||||
|
||||
geo.update_geometry_with_roi(roi);
|
||||
|
||||
REQUIRE(geo.pixels_x() == 1500);
|
||||
REQUIRE(geo.pixels_y() == 100);
|
||||
REQUIRE(geo.modules_x() == 2);
|
||||
REQUIRE(geo.modules_y() == 2);
|
||||
REQUIRE(geo.pixels_x() == 2048);
|
||||
REQUIRE(geo.pixels_y() == 1024);
|
||||
|
||||
aare::ROIGeometry roi_geometry(roi, geo);
|
||||
|
||||
REQUIRE(roi_geometry.pixels_x() == 1500);
|
||||
REQUIRE(roi_geometry.pixels_y() == 100);
|
||||
REQUIRE(roi_geometry.num_modules_in_roi() == 4);
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).height == 12);
|
||||
REQUIRE(geo.get_module_geometries(0).width == 524);
|
||||
REQUIRE(geo.get_module_geometries(0).origin_x == 0);
|
||||
REQUIRE(geo.get_module_geometries(0).origin_y == 0);
|
||||
|
||||
REQUIRE(geo.get_module_geometries(1).height == 12);
|
||||
REQUIRE(geo.get_module_geometries(1).width == 976);
|
||||
REQUIRE(geo.get_module_geometries(1).origin_x == 524);
|
||||
REQUIRE(geo.get_module_geometries(1).origin_y == 0);
|
||||
|
||||
REQUIRE(geo.get_module_geometries(2).height == 88);
|
||||
REQUIRE(geo.get_module_geometries(2).width == 524);
|
||||
REQUIRE(geo.get_module_geometries(2).origin_x == 0);
|
||||
REQUIRE(geo.get_module_geometries(2).origin_y == 12);
|
||||
|
||||
REQUIRE(geo.get_module_geometries(3).height == 88);
|
||||
REQUIRE(geo.get_module_geometries(3).width == 976);
|
||||
REQUIRE(geo.get_module_geometries(3).origin_x == 524);
|
||||
REQUIRE(geo.get_module_geometries(3).origin_y == 12);
|
||||
}
|
||||
|
||||
TEST_CASE("check if module in ROI", "[DetectorGeometry]") {
|
||||
aare::DetectorGeometry geo(aare::xy{2, 2}, 1024, 512, aare::xy{1, 2});
|
||||
|
||||
SECTION("all modules in ROI") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 500;
|
||||
roi.xmax = 2000;
|
||||
roi.ymin = 500;
|
||||
roi.ymax = 600;
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(1).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(2).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(3).module_in_roi(roi) == true);
|
||||
}
|
||||
SECTION("some modules on border of ROI") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 1024;
|
||||
roi.xmax = 2000;
|
||||
roi.ymin = 500;
|
||||
roi.ymax = 600;
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).module_in_roi(roi) == false);
|
||||
REQUIRE(geo.get_module_geometries(1).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(2).module_in_roi(roi) == false);
|
||||
REQUIRE(geo.get_module_geometries(3).module_in_roi(roi) == true);
|
||||
}
|
||||
SECTION("one module on border of ROI") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 1025;
|
||||
roi.xmax = 2000;
|
||||
roi.ymin = 513;
|
||||
roi.ymax = 600;
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).module_in_roi(roi) == false);
|
||||
REQUIRE(geo.get_module_geometries(1).module_in_roi(roi) == false);
|
||||
REQUIRE(geo.get_module_geometries(2).module_in_roi(roi) == false);
|
||||
REQUIRE(geo.get_module_geometries(3).module_in_roi(roi) == true);
|
||||
}
|
||||
SECTION("some modules to the left of ROI") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 500;
|
||||
roi.xmax = 1024;
|
||||
roi.ymin = 500;
|
||||
roi.ymax = 600;
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(1).module_in_roi(roi) == false);
|
||||
REQUIRE(geo.get_module_geometries(2).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(3).module_in_roi(roi) == false);
|
||||
}
|
||||
SECTION("all modules in ROI") {
|
||||
aare::ROI roi;
|
||||
roi.xmin = 500;
|
||||
roi.xmax = 2000;
|
||||
roi.ymin = 10;
|
||||
roi.ymax = 513;
|
||||
|
||||
REQUIRE(geo.get_module_geometries(0).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(1).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(2).module_in_roi(roi) == true);
|
||||
REQUIRE(geo.get_module_geometries(3).module_in_roi(roi) == true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user