Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-11-01 07:55:09

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 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 https://mozilla.org/MPL/2.0/.
0008 
0009 #include <boost/test/tools/output_test_stream.hpp>
0010 #include <boost/test/unit_test.hpp>
0011 
0012 #include "Acts/Definitions/Algebra.hpp"
0013 #include "Acts/Surfaces/BoundaryTolerance.hpp"
0014 #include "Acts/Surfaces/DiscTrapezoidBounds.hpp"
0015 #include "Acts/Surfaces/SurfaceBounds.hpp"
0016 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0017 
0018 #include <algorithm>
0019 #include <array>
0020 #include <stdexcept>
0021 #include <vector>
0022 
0023 using namespace Acts;
0024 
0025 namespace ActsTests {
0026 
0027 BOOST_AUTO_TEST_SUITE(SurfacesSuite)
0028 
0029 const double minHalfX = 1.;
0030 const double maxHalfX = 5.;
0031 const double rMin = 2.;
0032 const double rMax = 6.;
0033 const double averagePhi = 0.;
0034 const double stereo = 0.1;
0035 
0036 /// Unit tests for DiscTrapezoidBounds constructors
0037 BOOST_AUTO_TEST_CASE(DiscTrapezoidBoundsConstruction) {
0038   /// Test construction with dimensions and default stereo
0039   BOOST_CHECK_EQUAL(
0040       DiscTrapezoidBounds(minHalfX, maxHalfX, rMin, rMax, averagePhi).type(),
0041       SurfaceBounds::eDiscTrapezoid);
0042 
0043   /// Test construction with all dimensions
0044   BOOST_CHECK_EQUAL(
0045       DiscTrapezoidBounds(minHalfX, maxHalfX, rMin, rMax, averagePhi, stereo)
0046           .type(),
0047       SurfaceBounds::eDiscTrapezoid);
0048 
0049   /// Copy constructor
0050   DiscTrapezoidBounds original(minHalfX, maxHalfX, rMin, rMax, averagePhi);
0051   DiscTrapezoidBounds copied(original);
0052   BOOST_CHECK_EQUAL(copied.type(), SurfaceBounds::eDiscTrapezoid);
0053 }
0054 
0055 // Streaning and recreation test
0056 BOOST_AUTO_TEST_CASE(DiscTrapezoidBoundsRecreation) {
0057   DiscTrapezoidBounds original(minHalfX, maxHalfX, rMin, rMax, averagePhi,
0058                                stereo);
0059   auto valvector = original.values();
0060   std::array<double, DiscTrapezoidBounds::eSize> values{};
0061   std::copy_n(valvector.begin(), DiscTrapezoidBounds::eSize, values.begin());
0062   DiscTrapezoidBounds recreated(values);
0063   BOOST_CHECK_EQUAL(recreated, original);
0064 }
0065 
0066 // Unit tests for AnnulusBounds exception throwing
0067 BOOST_AUTO_TEST_CASE(DiscTrapezoidBoundsExceptions) {
0068   // Exception for opening neg min half x < 0
0069   BOOST_CHECK_THROW(
0070       DiscTrapezoidBounds(-minHalfX, maxHalfX, rMin, rMax, averagePhi, stereo),
0071       std::logic_error);
0072 
0073   // Exception for opening neg max half x < 0
0074   BOOST_CHECK_THROW(
0075       DiscTrapezoidBounds(minHalfX, -maxHalfX, rMin, rMax, averagePhi, stereo),
0076       std::logic_error);
0077 
0078   // Exception for opening neg min and max half x < 0
0079   BOOST_CHECK_THROW(
0080       DiscTrapezoidBounds(-minHalfX, -maxHalfX, rMin, rMax, averagePhi, stereo),
0081       std::logic_error);
0082 
0083   // Exception for opening neg r min
0084   BOOST_CHECK_THROW(
0085       DiscTrapezoidBounds(minHalfX, maxHalfX, -rMin, rMax, averagePhi, stereo),
0086       std::logic_error);
0087 
0088   // Exception for opening neg r max
0089   BOOST_CHECK_THROW(
0090       DiscTrapezoidBounds(minHalfX, maxHalfX, rMin, -rMax, averagePhi, stereo),
0091       std::logic_error);
0092 
0093   // Exception for opening neg r min and r max
0094   BOOST_CHECK_THROW(
0095       DiscTrapezoidBounds(minHalfX, maxHalfX, -rMin, -rMax, averagePhi, stereo),
0096       std::logic_error);
0097 
0098   // Exception for out of bound average phi
0099   BOOST_CHECK_THROW(
0100       DiscTrapezoidBounds(minHalfX, maxHalfX, rMin, rMax, 4., stereo),
0101       std::logic_error);
0102 }
0103 
0104 /// Unit tests for DiscTrapezoidBounds properties
0105 BOOST_AUTO_TEST_CASE(DiscTrapezoidBoundsProperties) {
0106   /// Test clone
0107   DiscTrapezoidBounds DiscTrapezoidBoundsObject(minHalfX, maxHalfX, rMin, rMax,
0108                                                 averagePhi);
0109 
0110   /// Test type() (redundant; already used in constructor confirmation)
0111   BOOST_CHECK_EQUAL(DiscTrapezoidBoundsObject.type(),
0112                     SurfaceBounds::eDiscTrapezoid);
0113 
0114   /// Test distanceToBoundary
0115   Vector2 origin(0., 0.);
0116   Vector2 outside(30., 0.);
0117   Vector2 inSurface(2.5, 0.);
0118 
0119   /// Test dump
0120   boost::test_tools::output_test_stream dumpOutput;
0121   DiscTrapezoidBoundsObject.toStream(dumpOutput);
0122   BOOST_CHECK(dumpOutput.is_equal(
0123       "Acts::DiscTrapezoidBounds: (innerRadius, outerRadius, halfLengthXminR, "
0124       "halfLengthXmaxR, halfLengthY, halfPhiSector, averagePhi, rCenter, "
0125       "stereo) = "
0126       "(2.0000000, 6.0000000, 1.0000000, 5.0000000, 0.7922870, 0.9851108, "
0127       "0.0000000, 2.5243378, 0.0000000)"));
0128 
0129   /// Test inside
0130   BOOST_CHECK(
0131       DiscTrapezoidBoundsObject.inside(inSurface, BoundaryTolerance::None()));
0132   BOOST_CHECK(
0133       !DiscTrapezoidBoundsObject.inside(outside, BoundaryTolerance::None()));
0134 
0135   /// Test rMin
0136   CHECK_CLOSE_REL(DiscTrapezoidBoundsObject.rMin(), rMin, 1e-6);
0137 
0138   /// Test rMax
0139   CHECK_CLOSE_REL(DiscTrapezoidBoundsObject.rMax(), rMax, 1e-6);
0140 
0141   /// Test averagePhi
0142   CHECK_SMALL(DiscTrapezoidBoundsObject.get(DiscTrapezoidBounds::eAveragePhi),
0143               1e-9);
0144 
0145   /// Test rCenter (redundant; not configurable)
0146   CHECK_CLOSE_REL(DiscTrapezoidBoundsObject.rCenter(), 2.524337798, 1e-6);
0147 
0148   /// Test halfPhiSector (redundant; not configurable)
0149   CHECK_SMALL(DiscTrapezoidBoundsObject.stereo(), 1e-6);
0150 
0151   /// Test minHalfLengthX
0152   CHECK_CLOSE_REL(
0153       DiscTrapezoidBoundsObject.get(DiscTrapezoidBounds::eHalfLengthXminR),
0154       minHalfX, 1e-6);
0155 
0156   /// Test maxHalfLengthX
0157   CHECK_CLOSE_REL(
0158       DiscTrapezoidBoundsObject.get(DiscTrapezoidBounds::eHalfLengthXmaxR),
0159       maxHalfX, 1e-6);
0160 
0161   /// Test halfLengthY
0162   CHECK_CLOSE_REL(DiscTrapezoidBoundsObject.halfLengthY(), 0.792286991, 1e-6);
0163 }
0164 /// Unit test for testing DiscTrapezoidBounds assignment
0165 BOOST_AUTO_TEST_CASE(DiscTrapezoidBoundsAssignment) {
0166   DiscTrapezoidBounds DiscTrapezoidBoundsObject(minHalfX, maxHalfX, rMin, rMax,
0167                                                 averagePhi, stereo);
0168 
0169   /// Test operator ==
0170   // not implemented in this class
0171 
0172   /// Test assignment
0173   DiscTrapezoidBounds assignedDiscTrapezoidBoundsObject(2.1, 6.6, 3.4, 4.2, 0.3,
0174                                                         0.);
0175   assignedDiscTrapezoidBoundsObject = DiscTrapezoidBoundsObject;
0176   BOOST_CHECK_EQUAL(assignedDiscTrapezoidBoundsObject,
0177                     DiscTrapezoidBoundsObject);
0178 }
0179 
0180 BOOST_AUTO_TEST_SUITE_END()
0181 
0182 }  // namespace ActsTests