Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-27 07:24:20

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 // Detray include(s)
0010 #include "detray/builders/homogeneous_material_builder.hpp"
0011 
0012 #include "detray/builders/cuboid_portal_generator.hpp"
0013 #include "detray/builders/homogeneous_material_factory.hpp"
0014 #include "detray/builders/surface_factory.hpp"
0015 #include "detray/builders/volume_builder.hpp"
0016 #include "detray/core/detector.hpp"
0017 #include "detray/definitions/indexing.hpp"
0018 #include "detray/geometry/shapes/rectangle2D.hpp"
0019 
0020 // Detray test include(s)
0021 #include "detray/test/framework/types.hpp"
0022 
0023 // Vecmem include(s)
0024 #include <vecmem/memory/host_memory_resource.hpp>
0025 
0026 // GTest include(s)
0027 #include <gtest/gtest.h>
0028 
0029 // System include(s)
0030 #include <limits>
0031 #include <memory>
0032 #include <vector>
0033 
0034 using namespace detray;
0035 
0036 namespace {
0037 
0038 using scalar = test::scalar;
0039 using point3 = test::point3;
0040 
0041 using metadata_t = test::default_metadata;
0042 using detector_t = detector<metadata_t>;
0043 
0044 constexpr scalar tol{std::numeric_limits<scalar>::epsilon()};
0045 
0046 }  // anonymous namespace
0047 
0048 /// Unittest: Test the construction of a collection of materials
0049 TEST(detray_builders, homogeneous_material_factory) {
0050   using transform3 = typename detector_t::transform3_type;
0051   using material_id = typename detector_t::material::id;
0052 
0053   // Build rectangle surfaces with material slabs
0054   using rectangle_factory = surface_factory<detector_t, rectangle2D>;
0055   auto mat_factory = std::make_unique<homogeneous_material_factory<detector_t>>(
0056       std::make_unique<rectangle_factory>());
0057 
0058   vecmem::host_memory_resource host_mr;
0059   detector_t d(host_mr);
0060 
0061   EXPECT_TRUE(
0062       d.material_store().template empty<material_id::e_material_slab>());
0063   EXPECT_TRUE(d.material_store().template empty<material_id::e_material_rod>());
0064 
0065   EXPECT_EQ(mat_factory->size(), 0u);
0066   EXPECT_TRUE(mat_factory->materials().empty());
0067   EXPECT_TRUE(mat_factory->thickness().empty());
0068 
0069   // Add material for a few rectangle surfaces
0070   mat_factory->push_back({surface_id::e_sensitive,
0071                           transform3(point3{0.f, 0.f, -1.f}), 1u,
0072                           std::vector<scalar>{10.f, 8.f}});
0073   mat_factory->add_material(material_id::e_material_slab,
0074                             {1.f * unit<scalar>::mm, silicon<scalar>()});
0075   mat_factory->push_back({surface_id::e_sensitive,
0076                           transform3(point3{0.f, 0.f, 1.f}), 1u,
0077                           std::vector<scalar>{20.f, 16.f}});
0078   mat_factory->add_material(material_id::e_material_slab,
0079                             {10.f * unit<scalar>::mm, tungsten<scalar>()});
0080   // Pass the parameters for 'gold'
0081   mat_factory->push_back({surface_id::e_sensitive,
0082                           transform3(point3{0.f, 0.f, 1.f}), 1u,
0083                           std::vector<scalar>{20.f, 16.f}});
0084   mat_factory->add_material(
0085       material_id::e_material_rod,
0086       {0.1f * unit<scalar>::mm,
0087        std::vector<scalar>{
0088            3.344f * unit<scalar>::mm, 101.6f * unit<scalar>::mm, 196.97f, 79,
0089            19.32f * unit<scalar>::g / (1.f * unit<scalar>::cm3)},
0090        material_state::e_solid});
0091 
0092   EXPECT_EQ(mat_factory->size(), 3u);
0093 
0094   // Test the material data
0095   EXPECT_NEAR(mat_factory->thickness()[0], 1.f * unit<scalar>::mm, tol);
0096   EXPECT_NEAR(mat_factory->thickness()[1], 10.f * unit<scalar>::mm, tol);
0097   EXPECT_NEAR(mat_factory->thickness()[2], 0.1f * unit<scalar>::mm, tol);
0098   EXPECT_EQ(mat_factory->materials()[0], silicon<scalar>());
0099   EXPECT_EQ(mat_factory->materials()[1], tungsten<scalar>());
0100   EXPECT_EQ(mat_factory->materials()[2], gold<scalar>());
0101 }