Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-29 08:24: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/Surfaces/CylinderSurface.hpp"
0012 #include "Acts/Surfaces/DiscSurface.hpp"
0013 #include "Acts/Surfaces/RadialBounds.hpp"
0014 #include "Acts/Utilities/MultiAxisSpec.hpp"
0015 #include "ActsPlugins/DD4hep/DD4hepMaterialHelpers.hpp"
0016 
0017 #include <numbers>
0018 
0019 using namespace Acts;
0020 using namespace ActsPlugins;
0021 
0022 BOOST_AUTO_TEST_CASE(DD4hepProtoMaterialDefersRanges) {
0023   dd4hep::rec::VariantParameters params;
0024   // Construct variants in place to avoid Boost variant assignment warnings
0025   // with optimized GCC builds.
0026   params.variantParameters.emplace("material_binPhi", 8);
0027   params.variantParameters.emplace("material_binZ", 3);
0028   params.variantParameters.emplace("material_binR", 4);
0029 
0030   const auto cylinderMaterial = createProtoMaterial(
0031       params, "material", {{"binPhi", closed}, {"binZ", open}});
0032   const auto discMaterial = createProtoMaterial(
0033       params, "material", {{"binPhi", closed}, {"binR", open}});
0034   for (const auto& material : {cylinderMaterial, discMaterial}) {
0035     BOOST_CHECK(material->binning().isDeferred());
0036     for (const auto& axis : material->binning().axisSpecs()) {
0037       BOOST_CHECK(!axis.asEquidistant().min);
0038       BOOST_CHECK(!axis.asEquidistant().max);
0039     }
0040   }
0041   BOOST_CHECK(cylinderMaterial->binning().axisSpec(0).direction() ==
0042               AxisDirection::AxisRPhi);
0043   BOOST_CHECK(discMaterial->binning().axisSpec(0).direction() ==
0044               AxisDirection::AxisPhi);
0045 
0046   const auto cylinder =
0047       Surface::makeShared<CylinderSurface>(Transform3::Identity(), 30., 100.);
0048   const auto cylinderAxes =
0049       resolveMultiAxis(cylinderMaterial->binning(), *cylinder);
0050   BOOST_CHECK_EQUAL(cylinderAxes->getAxis(0).getNBins(), 8);
0051   BOOST_CHECK_CLOSE(cylinderAxes->getAxis(0).getMax(), 30. * std::numbers::pi,
0052                     1e-10);
0053   BOOST_CHECK_EQUAL(cylinderAxes->getAxis(1).getNBins(), 3);
0054   BOOST_CHECK_EQUAL(cylinderAxes->getAxis(1).getMin(), -100.);
0055   BOOST_CHECK_EQUAL(cylinderAxes->getAxis(1).getMax(), 100.);
0056 
0057   const auto disc = Surface::makeShared<DiscSurface>(
0058       Transform3::Identity(), std::make_shared<RadialBounds>(10., 50.));
0059   const auto discAxes = resolveMultiAxis(discMaterial->binning(), *disc);
0060   BOOST_CHECK_EQUAL(discAxes->getAxis(0).getNBins(), 4);
0061   BOOST_CHECK_EQUAL(discAxes->getAxis(0).getMin(), 10.);
0062   BOOST_CHECK_EQUAL(discAxes->getAxis(0).getMax(), 50.);
0063   BOOST_CHECK_EQUAL(discAxes->getAxis(1).getNBins(), 8);
0064 
0065   params.get<int>("material_binZ") = 0;
0066   const auto homogeneousZ = createProtoMaterial(
0067       params, "material", {{"binPhi", closed}, {"binZ", open}});
0068   BOOST_CHECK_EQUAL(homogeneousZ->binning().axisSpec(1).asEquidistant().nBins,
0069                     1);
0070 }