File indexing completed on 2026-05-27 07:24:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/builders/material_map_builder.hpp"
0011
0012 #include "detray/builders/cuboid_portal_generator.hpp"
0013 #include "detray/builders/detector_builder.hpp"
0014 #include "detray/builders/material_map_factory.hpp"
0015 #include "detray/builders/surface_factory.hpp"
0016 #include "detray/builders/volume_builder.hpp"
0017 #include "detray/core/detector.hpp"
0018 #include "detray/definitions/indexing.hpp"
0019 #include "detray/utils/ranges.hpp"
0020
0021
0022 #include "detray/test/framework/types.hpp"
0023
0024
0025 #include <vecmem/memory/host_memory_resource.hpp>
0026
0027
0028 #include <gtest/gtest.h>
0029
0030
0031 #include <limits>
0032 #include <memory>
0033 #include <vector>
0034
0035 using namespace detray;
0036
0037 namespace {
0038
0039 using scalar = test::scalar;
0040 using point3 = test::point3;
0041
0042 using metadata_t = test::default_metadata;
0043 using detector_t = detector<metadata_t>;
0044 using mat_id = typename detector_t::material::id;
0045 using bin_index_t = axis::multi_bin<2u>;
0046
0047
0048 template <typename material_factory_t, concepts::scalar scalar_t>
0049 auto add_material_data(const material_factory_t& mat_factory, mat_id id,
0050 std::size_t sf_index, scalar_t t,
0051 material<scalar_t> mat = silicon<scalar_t>()) {
0052 typename material_factory_t::element_type::data_type mat_data{sf_index};
0053 std::vector<bin_index_t> m_bins{};
0054 std::vector<std::size_t> n_bins{5u, 10u};
0055 std::vector<std::vector<scalar_t>> axis_spans = {};
0056
0057
0058 for (auto [i, j] : detray::views::cartesian_product{
0059 detray::views::iota{0u, 5u}, detray::views::iota{0u, 10u}}) {
0060 m_bins.push_back({i, j});
0061 mat_data.append(t, mat);
0062 t += 0.25f * unit<scalar_t>::mm;
0063 }
0064
0065 mat_factory->add_material(id, std::move(mat_data), std::move(n_bins),
0066 std::move(axis_spans), std::move(m_bins));
0067 }
0068
0069 }
0070
0071
0072 TEST(detray_builders, material_map_factory) {
0073 using algebra_t = typename detector_t::algebra_type;
0074 using transform3 = dtransform3D<algebra_t>;
0075
0076
0077 using rectangle_factory = surface_factory<detector_t, rectangle2D>;
0078 auto mat_factory =
0079 std::make_unique<material_map_factory<detector_t, bin_index_t>>(
0080 std::make_unique<rectangle_factory>());
0081
0082 EXPECT_EQ(mat_factory->size(), 0u);
0083 EXPECT_TRUE(mat_factory->materials().empty());
0084 EXPECT_TRUE(mat_factory->thickness().empty());
0085
0086
0087 mat_factory->push_back({surface_id::e_sensitive,
0088 transform3(point3{0.f, 0.f, -1.f}), 1u,
0089 std::vector<scalar>{10.f, 8.f}});
0090
0091 scalar t{1.f * unit<scalar>::mm};
0092 add_material_data(mat_factory, mat_id::e_rectangle2D_map, 0u, t,
0093 silicon<scalar>());
0094
0095 mat_factory->push_back({surface_id::e_sensitive,
0096 transform3(point3{0.f, 0.f, 1.f}), 1u,
0097 std::vector<scalar>{20.f, 16.f}});
0098 t = 2.f * unit<scalar>::mm;
0099 add_material_data(mat_factory, mat_id::e_rectangle2D_map, 1u, t,
0100 tungsten<scalar>());
0101
0102
0103 mat_factory->push_back({surface_id::e_sensitive,
0104 transform3(point3{0.f, 0.f, 1.f}), 1u,
0105 std::vector<scalar>{20.f, 16.f}});
0106 t = 3.f * unit<scalar>::mm;
0107 add_material_data(
0108 mat_factory, mat_id::e_rectangle2D_map, 2u, t,
0109 {3.344f * unit<scalar>::mm, 101.6f * unit<scalar>::mm, 196.97f, 79,
0110 19.32f * unit<scalar>::g / (1.f * unit<scalar>::cm3),
0111 material_state::e_solid});
0112
0113 EXPECT_EQ(mat_factory->size(), 3u);
0114
0115
0116 EXPECT_EQ(mat_factory->links().size(), 3u);
0117 EXPECT_EQ(mat_factory->thickness().at(0).size(), 50u);
0118 EXPECT_EQ(mat_factory->thickness().at(1).size(), 50u);
0119 EXPECT_EQ(mat_factory->thickness().at(2).size(), 50u);
0120 EXPECT_EQ(mat_factory->materials().at(0).front(), silicon<scalar>());
0121 EXPECT_EQ(mat_factory->materials().at(1).front(), tungsten<scalar>());
0122 EXPECT_EQ(mat_factory->materials().at(2).front(), gold<scalar>());
0123 }