// Copyright (2019-2022) Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-or-later #include #include "../common/DetectorGeometry.h" TEST_CASE("DetectorGeometry_Regular", "[DetectorGeometry]") { DetectorGeometry geometry(18, 3, 8, 36, false); const JFJochProtoBuf::DetectorGeometry pbuf = geometry; REQUIRE(pbuf.module_geometry_size() == 18); REQUIRE(pbuf.width_pxl() == 3 * 1030 + 2 * 8); REQUIRE(pbuf.height_pxl() == 6 * 514 + 5 * 36); REQUIRE(pbuf.module_geometry(0).pixel0() == 0); REQUIRE(pbuf.module_geometry(2).pixel0() == 2 * 1030 + 2 * 8); REQUIRE(pbuf.module_geometry(15).pixel0() == pbuf.width_pxl() * (514 * 5 + 36 * 5)); REQUIRE(pbuf.module_geometry(15).fast_direction_step() == 1); REQUIRE(pbuf.module_geometry(15).slow_direction_step() == pbuf.width_pxl()); } TEST_CASE("DetectorGeometry_RegularMirror", "[DetectorGeometry]") { DetectorGeometry geometry(18, 3, 8, 36, true); const JFJochProtoBuf::DetectorGeometry pbuf = geometry; REQUIRE(pbuf.module_geometry_size() == 18); REQUIRE(pbuf.width_pxl() == 3 * 1030 + 2 * 8); REQUIRE(pbuf.height_pxl() == 6 * 514 + 5 * 36); REQUIRE(pbuf.module_geometry(0).pixel0() == pbuf.width_pxl() * (pbuf.height_pxl() - 1)); REQUIRE(pbuf.module_geometry(2).pixel0() == pbuf.width_pxl() * (pbuf.height_pxl() - 1) + 2 * 1030 + 2 * 8); CHECK(pbuf.module_geometry(15).pixel0() == pbuf.width_pxl() * 513); CHECK(pbuf.module_geometry(17).pixel0() == pbuf.width_pxl() * (513) + 2 * 1030 + 2 * 8); REQUIRE(pbuf.module_geometry(15).fast_direction_step() == 1); REQUIRE(pbuf.module_geometry(15).slow_direction_step() == -pbuf.width_pxl()); } TEST_CASE("DetectorModuleGeometry_SameAxis", "[DetectorGeometry]") { std::unique_ptr geometry; REQUIRE_THROWS(geometry = std::make_unique(0,0, DetectorModuleGeometry::Direction::Xpos, DetectorModuleGeometry::Direction::Xpos)); REQUIRE_THROWS(geometry = std::make_unique(0,0, DetectorModuleGeometry::Direction::Ypos, DetectorModuleGeometry::Direction::Ypos)); REQUIRE_THROWS(geometry = std::make_unique(2000,2000, DetectorModuleGeometry::Direction::Yneg, DetectorModuleGeometry::Direction::Ypos)); REQUIRE_THROWS(geometry = std::make_unique(2000,2000, DetectorModuleGeometry::Direction::Xpos, DetectorModuleGeometry::Direction::Xneg)); REQUIRE_NOTHROW(geometry = std::make_unique(2000,2000, DetectorModuleGeometry::Direction::Xneg, DetectorModuleGeometry::Direction::Ypos)); REQUIRE_NOTHROW(geometry = std::make_unique(0,0, DetectorModuleGeometry::Direction::Ypos, DetectorModuleGeometry::Direction::Xpos)); } TEST_CASE("DetectorModuleGeometry_NoSpace", "[DetectorGeometry]") { std::unique_ptr geometry; REQUIRE_THROWS(geometry = std::make_unique(1022,0, DetectorModuleGeometry::Direction::Xneg, DetectorModuleGeometry::Direction::Ypos)); REQUIRE_THROWS(geometry = std::make_unique(1022,512, DetectorModuleGeometry::Direction::Xpos, DetectorModuleGeometry::Direction::Yneg)); REQUIRE_THROWS(geometry = std::make_unique(1029,513, DetectorModuleGeometry::Direction::Yneg, DetectorModuleGeometry::Direction::Xneg)); REQUIRE_NOTHROW(geometry = std::make_unique(1029,513, DetectorModuleGeometry::Direction::Xneg, DetectorModuleGeometry::Direction::Yneg)); REQUIRE_NOTHROW(geometry = std::make_unique(513,1029, DetectorModuleGeometry::Direction::Yneg, DetectorModuleGeometry::Direction::Xneg)); } TEST_CASE("DetectorModuleGeometry_GetMaxX_GetMaxY", "[DetectorGeometry]") { std::unique_ptr geometry; REQUIRE_NOTHROW(geometry = std::make_unique(0,0, DetectorModuleGeometry::Direction::Xpos, DetectorModuleGeometry::Direction::Ypos)); REQUIRE(geometry->GetMaxX() == 1029); REQUIRE(geometry->GetMaxY() == 513); REQUIRE_NOTHROW(geometry = std::make_unique(2029,1513, DetectorModuleGeometry::Direction::Xneg, DetectorModuleGeometry::Direction::Yneg)); REQUIRE(geometry->GetMaxX() == 2029); REQUIRE(geometry->GetMaxY() == 1513); REQUIRE_NOTHROW(geometry = std::make_unique(2029,1513, DetectorModuleGeometry::Direction::Yneg, DetectorModuleGeometry::Direction::Xneg)); REQUIRE(geometry->GetMaxX() == 2029); REQUIRE(geometry->GetMaxY() == 1513); REQUIRE_NOTHROW(geometry = std::make_unique(2029,1513, DetectorModuleGeometry::Direction::Yneg, DetectorModuleGeometry::Direction::Xpos)); REQUIRE(geometry->GetMaxX() == 2029 + 513); REQUIRE(geometry->GetMaxY() == 1513); REQUIRE_NOTHROW(geometry = std::make_unique(2029,1513, DetectorModuleGeometry::Direction::Ypos, DetectorModuleGeometry::Direction::Xneg)); REQUIRE(geometry->GetMaxX() == 2029); REQUIRE(geometry->GetMaxY() == 1513 + 1029); } TEST_CASE("DetectorGeometry_Custom", "[DetectorGeometry]") { std::vector module_geom; REQUIRE_NOTHROW(module_geom.emplace_back(2999, 2999, DetectorModuleGeometry::Direction::Xneg, DetectorModuleGeometry::Direction::Yneg)); REQUIRE_NOTHROW(module_geom.emplace_back(0, 0, DetectorModuleGeometry::Direction::Ypos, DetectorModuleGeometry::Direction::Xpos)); REQUIRE_NOTHROW(module_geom.emplace_back(5000, 0, DetectorModuleGeometry::Direction::Ypos, DetectorModuleGeometry::Direction::Xpos)); DetectorGeometry geometry(module_geom); REQUIRE(geometry.GetModulesNum() == 3); JFJochProtoBuf::DetectorGeometry pbuf_geom = geometry; CHECK(pbuf_geom.height_pxl() == 2999+1); CHECK(pbuf_geom.width_pxl() == 5513+1); CHECK(pbuf_geom.module_geometry(0).pixel0() == 2999 * pbuf_geom.width_pxl() + 2999); CHECK(pbuf_geom.module_geometry(1).pixel0() == 0); CHECK(pbuf_geom.module_geometry(2).pixel0() == 5000); CHECK(pbuf_geom.module_geometry(0).fast_direction_step() == -1); CHECK(pbuf_geom.module_geometry(1).fast_direction_step() == pbuf_geom.width_pxl()); CHECK(pbuf_geom.module_geometry(2).fast_direction_step() == pbuf_geom.width_pxl()); CHECK(pbuf_geom.module_geometry(0).slow_direction_step() == -pbuf_geom.width_pxl()); CHECK(pbuf_geom.module_geometry(1).slow_direction_step() == 1); CHECK(pbuf_geom.module_geometry(2).slow_direction_step() == 1); }