File indexing completed on 2026-05-27 07:24:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
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
0021 #include "detray/test/framework/types.hpp"
0022
0023
0024 #include <vecmem/memory/host_memory_resource.hpp>
0025
0026
0027 #include <gtest/gtest.h>
0028
0029
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 }
0047
0048
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
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
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
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
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 }