Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:11:20

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2019 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008 
0009 #include <boost/test/unit_test.hpp>
0010 
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Definitions/Direction.hpp"
0013 #include "Acts/Geometry/CutoutCylinderVolumeBounds.hpp"
0014 #include "Acts/Geometry/GeometryContext.hpp"
0015 #include "Acts/Surfaces/Surface.hpp"
0016 #include "Acts/Tests/CommonHelpers/FloatComparisons.hpp"
0017 #include "Acts/Utilities/BinningType.hpp"
0018 #include "Acts/Utilities/BoundingBox.hpp"
0019 
0020 #include <algorithm>
0021 #include <array>
0022 #include <iostream>
0023 #include <memory>
0024 #include <stdexcept>
0025 #include <utility>
0026 #include <vector>
0027 
0028 namespace Acts {
0029 namespace Test {
0030 
0031 BOOST_AUTO_TEST_SUITE(Geometry)
0032 
0033 BOOST_AUTO_TEST_CASE(CutoutCylinderVolumeBoundsConstruction) {
0034   CutoutCylinderVolumeBounds ccvb(5, 10, 15, 30, 25);
0035   ccvb.toStream(std::cout);
0036 
0037   // Test copy construction
0038   CutoutCylinderVolumeBounds copied(ccvb);
0039   BOOST_CHECK_EQUAL(ccvb, copied);
0040 
0041   // Test assigned
0042   CutoutCylinderVolumeBounds assigned = ccvb;
0043   BOOST_CHECK_EQUAL(ccvb, assigned);
0044 }
0045 
0046 BOOST_AUTO_TEST_CASE(CutoutCylinderVolumeBoundsRecreation) {
0047   CutoutCylinderVolumeBounds original(5, 10, 15, 30, 25);
0048   std::array<double, CutoutCylinderVolumeBounds::eSize> values{};
0049   std::vector<double> valvector = original.values();
0050   std::copy_n(valvector.begin(), CutoutCylinderVolumeBounds::eSize,
0051               values.begin());
0052   CutoutCylinderVolumeBounds recreated(values);
0053   BOOST_CHECK_EQUAL(original, recreated);
0054 }
0055 
0056 BOOST_AUTO_TEST_CASE(CutoutCylinderVolumeBoundsExceptions) {
0057   double rmin{5}, rmed{10}, rmax{15}, hz{30}, hzc{25};
0058 
0059   // Test negative rmin
0060   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(-rmin, rmed, rmax, hz, hzc),
0061                     std::logic_error);
0062 
0063   // Test negative rmed
0064   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(rmin, -rmed, rmax, hz, hzc),
0065                     std::logic_error);
0066 
0067   // Test negative rmax
0068   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(rmin, rmed, -rmax, hz, hzc),
0069                     std::logic_error);
0070 
0071   // Test swapped rmin / rmed
0072   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(rmed, rmin, rmax, hz, hzc),
0073                     std::logic_error);
0074 
0075   // Test swapped rmin / rmax
0076   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(rmax, rmed, rmin, hz, hzc),
0077                     std::logic_error);
0078 
0079   // Test swapped rmed / rmax
0080   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(rmin, rmax, rmed, hz, hzc),
0081                     std::logic_error);
0082 
0083   // Test negative hz
0084   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(rmin, rmed, rmax, -hz, hzc),
0085                     std::logic_error);
0086 
0087   // Test negative hzc
0088   BOOST_CHECK_THROW(CutoutCylinderVolumeBounds(rmin, rmed, rmax, hz, -hzc),
0089                     std::logic_error);
0090 }
0091 
0092 BOOST_AUTO_TEST_CASE(CutoutCylinderVolumeBoundsAccess) {
0093   double rmin{5}, rmed{10}, rmax{15}, hz{30}, hzc{25};
0094   CutoutCylinderVolumeBounds ccvb(rmin, rmed, rmax, hz, hzc);
0095 
0096   BOOST_CHECK_EQUAL(ccvb.get(CutoutCylinderVolumeBounds::eMinR), rmin);
0097   BOOST_CHECK_EQUAL(ccvb.get(CutoutCylinderVolumeBounds::eMedR), rmed);
0098   BOOST_CHECK_EQUAL(ccvb.get(CutoutCylinderVolumeBounds::eMaxR), rmax);
0099   BOOST_CHECK_EQUAL(ccvb.get(CutoutCylinderVolumeBounds::eHalfLengthZ), hz);
0100   BOOST_CHECK_EQUAL(ccvb.get(CutoutCylinderVolumeBounds::eHalfLengthZcutout),
0101                     hzc);
0102 }
0103 
0104 BOOST_AUTO_TEST_CASE(CutoutCylinderVolumeBoundsInside) {
0105   CutoutCylinderVolumeBounds ccvb(5, 10, 15, 30, 25);
0106 
0107   BOOST_CHECK(!ccvb.inside({0, 0, 0}));
0108   BOOST_CHECK(!ccvb.inside({0, 3, 0}));
0109   BOOST_CHECK(!ccvb.inside({3, 0, 0}));
0110   BOOST_CHECK(!ccvb.inside({0, 7, 0}));
0111   BOOST_CHECK(!ccvb.inside({7, 0, 0}));
0112   BOOST_CHECK(ccvb.inside({0, 13, 0}));
0113   BOOST_CHECK(ccvb.inside({13, 0, 0}));
0114   BOOST_CHECK(!ccvb.inside({0, 17, 0}));
0115   BOOST_CHECK(!ccvb.inside({17, 0, 0}));
0116 
0117   // outside in z
0118   BOOST_CHECK(!ccvb.inside({0, 0, 35}));
0119   BOOST_CHECK(!ccvb.inside({0, 0, -35}));
0120   BOOST_CHECK(!ccvb.inside({0, 3, 35}));
0121   BOOST_CHECK(!ccvb.inside({0, 3, -35}));
0122   BOOST_CHECK(!ccvb.inside({3, 0, 35}));
0123   BOOST_CHECK(!ccvb.inside({3, 0, -35}));
0124   BOOST_CHECK(!ccvb.inside({0, 10, 35}));
0125   BOOST_CHECK(!ccvb.inside({0, 10, -35}));
0126   BOOST_CHECK(!ccvb.inside({10, 0, 35}));
0127   BOOST_CHECK(!ccvb.inside({10, 0, -35}));
0128   BOOST_CHECK(!ccvb.inside({0, 20, 35}));
0129   BOOST_CHECK(!ccvb.inside({0, 20, -35}));
0130   BOOST_CHECK(!ccvb.inside({20, 0, 35}));
0131   BOOST_CHECK(!ccvb.inside({20, 0, -35}));
0132 
0133   // in the choke point in z
0134   BOOST_CHECK(!ccvb.inside({0, 0, 27}));
0135   BOOST_CHECK(!ccvb.inside({0, 0, -27}));
0136   BOOST_CHECK(!ccvb.inside({0, 3, 27}));
0137   BOOST_CHECK(!ccvb.inside({0, 3, -27}));
0138   BOOST_CHECK(!ccvb.inside({3, 0, 27}));
0139   BOOST_CHECK(!ccvb.inside({3, 0, -27}));
0140   BOOST_CHECK(ccvb.inside({0, 7, 27}));
0141   BOOST_CHECK(ccvb.inside({0, 7, -27}));
0142   BOOST_CHECK(ccvb.inside({7, 0, 27}));
0143   BOOST_CHECK(ccvb.inside({7, 0, -27}));
0144   BOOST_CHECK(ccvb.inside({0, 13, 27}));
0145   BOOST_CHECK(ccvb.inside({0, 13, -27}));
0146   BOOST_CHECK(ccvb.inside({13, 0, 27}));
0147   BOOST_CHECK(ccvb.inside({13, 0, -27}));
0148   BOOST_CHECK(!ccvb.inside({0, 17, 27}));
0149   BOOST_CHECK(!ccvb.inside({0, 17, -27}));
0150   BOOST_CHECK(!ccvb.inside({17, 0, 27}));
0151   BOOST_CHECK(!ccvb.inside({17, 0, -27}));
0152 
0153   // right inside the choke point in z
0154   BOOST_CHECK(!ccvb.inside({0, 0, 23}));
0155   BOOST_CHECK(!ccvb.inside({0, 0, -23}));
0156   BOOST_CHECK(!ccvb.inside({0, 3, 23}));
0157   BOOST_CHECK(!ccvb.inside({0, 3, -23}));
0158   BOOST_CHECK(!ccvb.inside({3, 0, 23}));
0159   BOOST_CHECK(!ccvb.inside({3, 0, -23}));
0160   BOOST_CHECK(!ccvb.inside({0, 7, 23}));
0161   BOOST_CHECK(!ccvb.inside({0, 7, -23}));
0162   BOOST_CHECK(!ccvb.inside({7, 0, 23}));
0163   BOOST_CHECK(!ccvb.inside({7, 0, -23}));
0164   BOOST_CHECK(ccvb.inside({0, 13, 23}));
0165   BOOST_CHECK(ccvb.inside({0, 13, -23}));
0166   BOOST_CHECK(ccvb.inside({13, 0, 23}));
0167   BOOST_CHECK(ccvb.inside({13, 0, -23}));
0168   BOOST_CHECK(!ccvb.inside({0, 17, 23}));
0169   BOOST_CHECK(!ccvb.inside({0, 17, -23}));
0170   BOOST_CHECK(!ccvb.inside({17, 0, 23}));
0171   BOOST_CHECK(!ccvb.inside({17, 0, -23}));
0172 }
0173 
0174 BOOST_AUTO_TEST_CASE(CutoutCylinderVolumeBoundsBoundingBox) {
0175   GeometryContext tgContext = GeometryContext();
0176   CutoutCylinderVolumeBounds ccvb(5, 10, 15, 30, 25);
0177   auto box = ccvb.boundingBox();
0178   CHECK_CLOSE_ABS(box.min(), Vector3(-15, -15, -30), 1e-6);
0179   CHECK_CLOSE_ABS(box.max(), Vector3(15, 15, 30), 1e-6);
0180 
0181   auto ccvbSurfaces = ccvb.orientedSurfaces(Transform3::Identity());
0182 }
0183 
0184 BOOST_AUTO_TEST_CASE(CutoutCylinderVolumeOrientedBoundaries) {
0185   GeometryContext tgContext = GeometryContext();
0186 
0187   CutoutCylinderVolumeBounds ccvb(5, 10, 15, 30, 25);
0188 
0189   auto ccvbOrientedSurfaces = ccvb.orientedSurfaces(Transform3::Identity());
0190   BOOST_CHECK_EQUAL(ccvbOrientedSurfaces.size(), 8);
0191 
0192   auto geoCtx = GeometryContext();
0193   Vector3 xaxis(1., 0., 0.);
0194   Vector3 yaxis(0., 1., 0.);
0195   Vector3 zaxis(0., 0., 1.);
0196 
0197   for (auto& os : ccvbOrientedSurfaces) {
0198     auto onSurface = os.surface->binningPosition(geoCtx, binR);
0199     auto locPos =
0200         os.surface->globalToLocal(geoCtx, onSurface, Vector3::Zero()).value();
0201     auto osNormal = os.surface->normal(geoCtx, locPos);
0202     // Check if you step inside the volume with the oriented normal
0203     Vector3 insideCcvb = onSurface + os.direction * osNormal;
0204     Vector3 outsideCCvb = onSurface - os.direction * osNormal;
0205 
0206     BOOST_CHECK(ccvb.inside(insideCcvb));
0207     BOOST_CHECK(!ccvb.inside(outsideCCvb));
0208 
0209     // Test the orientation of the boundary surfaces
0210     auto rot = os.surface->transform(geoCtx).rotation();
0211     BOOST_CHECK(rot.col(0).isApprox(xaxis));
0212     BOOST_CHECK(rot.col(1).isApprox(yaxis));
0213     BOOST_CHECK(rot.col(2).isApprox(zaxis));
0214   }
0215 }
0216 
0217 BOOST_AUTO_TEST_SUITE_END()
0218 }  // namespace Test
0219 }  // namespace Acts