Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-24 08:20:22

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