Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-12 07:53:08

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/unit_test.hpp>
0010 
0011 #include "Acts/Geometry/GeometryIdentifier.hpp"
0012 
0013 namespace Acts::Test {
0014 
0015 BOOST_AUTO_TEST_CASE(GeometryIdentifier_construct_default) {
0016   GeometryIdentifier id;
0017   BOOST_CHECK_EQUAL(id.volume(), 0u);
0018   BOOST_CHECK_EQUAL(id.boundary(), 0u);
0019   BOOST_CHECK_EQUAL(id.layer(), 0u);
0020   BOOST_CHECK_EQUAL(id.approach(), 0u);
0021   BOOST_CHECK_EQUAL(id.sensitive(), 0u);
0022 }
0023 
0024 BOOST_AUTO_TEST_CASE(GeometryIdentifier_construct_encoded) {
0025   // not sure if it is a good idea to test for the encoding since it should be
0026   // an implementation detail. only the resulting functionality is relevant.
0027   GeometryIdentifier id{0xa0b00c00d00affe0u};
0028   BOOST_CHECK_EQUAL(id.volume(), 0xa0u);
0029   BOOST_CHECK_EQUAL(id.boundary(), 0xb0u);
0030   BOOST_CHECK_EQUAL(id.layer(), 0x0c0u);
0031   BOOST_CHECK_EQUAL(id.approach(), 0x0du);
0032   BOOST_CHECK_EQUAL(id.sensitive(), 0x00affu);
0033   BOOST_CHECK_EQUAL(id.extra(), 0xe0u);
0034 }
0035 
0036 BOOST_AUTO_TEST_CASE(GeometryIdentifier_max_values) {
0037   // compute maximum value for each component
0038   constexpr GeometryIdentifier::Value volumeMax = (1u << 8) - 1;
0039   constexpr GeometryIdentifier::Value boundaryMax = (1u << 8) - 1;
0040   constexpr GeometryIdentifier::Value layerMax = (1u << 12) - 1;
0041   constexpr GeometryIdentifier::Value approachMax = (1u << 8) - 1;
0042   constexpr GeometryIdentifier::Value sensitiveMax = (1u << 20) - 1;
0043   constexpr GeometryIdentifier::Value extraMax = (1u << 8) - 1;
0044   // reference values non-zero values everywhere
0045   constexpr GeometryIdentifier ref{0xdeadaffe01234567};
0046   // values above the maximum are truncated
0047   // max+1 has all available bits zeroed
0048   BOOST_CHECK_THROW(
0049       static_cast<void>(GeometryIdentifier(ref).withVolume(volumeMax + 1)),
0050       std::invalid_argument);
0051   BOOST_CHECK_THROW(
0052       static_cast<void>(GeometryIdentifier(ref).withBoundary(boundaryMax + 1)),
0053       std::invalid_argument);
0054   BOOST_CHECK_THROW(
0055       static_cast<void>(GeometryIdentifier(ref).withLayer(layerMax + 1)),
0056       std::invalid_argument);
0057   BOOST_CHECK_THROW(
0058       static_cast<void>(GeometryIdentifier(ref).withApproach(approachMax + 1)),
0059       std::invalid_argument);
0060   BOOST_CHECK_THROW(static_cast<void>(GeometryIdentifier(ref).withSensitive(
0061                         sensitiveMax + 1)),
0062                     std::invalid_argument);
0063   BOOST_CHECK_THROW(
0064       static_cast<void>(GeometryIdentifier(ref).withExtra(extraMax + 1)),
0065       std::invalid_argument);
0066 
0067   BOOST_CHECK_EQUAL(GeometryIdentifier::getMaxVolume(), 255);
0068   BOOST_CHECK_EQUAL(GeometryIdentifier::getMaxBoundary(), 255);
0069   BOOST_CHECK_EQUAL(GeometryIdentifier::getMaxLayer(), 4095);
0070   BOOST_CHECK_EQUAL(GeometryIdentifier::getMaxApproach(), 255);
0071   BOOST_CHECK_EQUAL(GeometryIdentifier::getMaxSensitive(), 1048575);
0072   BOOST_CHECK_EQUAL(GeometryIdentifier::getMaxExtra(), 255);
0073 }
0074 
0075 BOOST_AUTO_TEST_CASE(GeometryIdentifier_order) {
0076   auto vol1 = GeometryIdentifier()
0077                   .withVolume(1u)
0078                   .withLayer(14u)
0079                   .withSensitive(5u)
0080                   .withExtra(42u);
0081   auto vol2 = GeometryIdentifier()
0082                   .withVolume(2u)
0083                   .withLayer(13u)
0084                   .withSensitive(3u)
0085                   .withExtra(43u);
0086 
0087   // order uses volume first even if other components are larger
0088   BOOST_CHECK_LT(vol1, vol2);
0089   BOOST_CHECK_LT(vol1.withBoundary(64u), vol2);
0090   BOOST_CHECK_LT(vol1.withLayer(64u), vol2);
0091   BOOST_CHECK_LT(vol1.withApproach(64u), vol2);
0092   BOOST_CHECK_LT(vol1.withSensitive(64u), vol2);
0093   BOOST_CHECK_LT(vol1.withSensitive(64u), vol2);
0094   BOOST_CHECK_LT(vol2, GeometryIdentifier(vol1).withVolume(3u));
0095   // other components are hierarchical
0096   BOOST_CHECK_LT(vol1.withVolume(1u).withBoundary(2u),
0097                  vol1.withVolume(2u).withBoundary(1u));
0098   BOOST_CHECK_LT(vol1.withBoundary(1u).withLayer(2u),
0099                  vol1.withBoundary(2u).withLayer(1u));
0100   BOOST_CHECK_LT(vol1.withLayer(1u).withApproach(2u),
0101                  vol1.withLayer(2u).withApproach(1u));
0102   BOOST_CHECK_LT(vol1.withApproach(1u).withSensitive(2u),
0103                  vol1.withApproach(2u).withSensitive(1u));
0104   BOOST_CHECK_LT(vol1.withSensitive(1u).withExtra(2u),
0105                  vol1.withSensitive(2u).withExtra(1u));
0106 }
0107 
0108 }  // namespace Acts::Test