File indexing completed on 2026-05-27 07:24:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/core/detector.hpp"
0011
0012 #include "detray/definitions/indexing.hpp"
0013 #include "detray/material/predefined_materials.hpp"
0014
0015
0016 #include "detray/test/framework/types.hpp"
0017 #include "detray/test/utils/prefill_detector.hpp"
0018
0019
0020 #include <vecmem/memory/host_memory_resource.hpp>
0021
0022
0023 #include <gtest/gtest.h>
0024
0025
0026 GTEST_TEST(detray_core, detector) {
0027 using namespace detray;
0028
0029 using metadata_t = test::default_metadata;
0030 using detector_t = detector<metadata_t>;
0031 using mask_id = typename detector_t::masks::id;
0032 using material_id = typename detector_t::material::id;
0033 using finder_id = typename detector_t::accel::id;
0034
0035 vecmem::host_memory_resource host_mr;
0036 detector_t d1(host_mr);
0037 auto geo_ctx = typename detector_t::geometry_context{};
0038
0039
0040 auto check_empty_detector = [](auto& d) {
0041 EXPECT_TRUE(d.volumes().empty());
0042 EXPECT_TRUE(d.portals().empty());
0043 EXPECT_TRUE(d.transform_store().empty());
0044 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_rectangle2D>());
0045 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_trapezoid2D>());
0046 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_annulus2D>());
0047 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_cylinder2D>());
0048 EXPECT_TRUE(
0049 d.mask_store().template empty<mask_id::e_concentric_cylinder2D>());
0050 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_ring2D>());
0051 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_ring2D>());
0052 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_straw_tube>());
0053 EXPECT_TRUE(d.mask_store().template empty<mask_id::e_drift_cell>());
0054 EXPECT_TRUE(
0055 d.material_store().template empty<material_id::e_material_slab>());
0056 EXPECT_TRUE(
0057 d.material_store().template empty<material_id::e_material_rod>());
0058 EXPECT_TRUE(d.accelerator_store()
0059 .template empty<finder_id::e_surface_brute_force>());
0060 EXPECT_TRUE(d.accelerator_store()
0061 .template empty<finder_id::e_surface_ring2D_grid>());
0062 EXPECT_TRUE(d.accelerator_store()
0063 .template empty<finder_id::e_surface_cylinder2D_grid>());
0064
0065
0066
0067
0068 EXPECT_TRUE(
0069 d.accelerator_store().template empty<finder_id::e_surface_default>());
0070 };
0071
0072
0073 check_empty_detector(d1);
0074
0075
0076 prefill_detector(d1, geo_ctx);
0077
0078
0079 auto check_filled_detector = [](auto& d) {
0080
0081 EXPECT_EQ(d.volumes().size(), 1u);
0082 EXPECT_EQ(d.portals().size(), 3u);
0083 EXPECT_EQ(d.transform_store().size(), 4u);
0084 EXPECT_EQ(d.mask_store().template size<mask_id::e_rectangle2D>(), 1u);
0085 EXPECT_EQ(d.mask_store().template size<mask_id::e_rectangle2D>(), 1u);
0086 EXPECT_EQ(d.mask_store().template size<mask_id::e_trapezoid2D>(), 1u);
0087 EXPECT_EQ(d.mask_store().template size<mask_id::e_annulus2D>(), 1u);
0088 EXPECT_EQ(d.mask_store().template size<mask_id::e_cylinder2D>(), 0u);
0089 EXPECT_EQ(d.mask_store().template size<mask_id::e_concentric_cylinder2D>(),
0090 0u);
0091 EXPECT_EQ(d.mask_store().template size<mask_id::e_ring2D>(), 0u);
0092 EXPECT_EQ(d.mask_store().template size<mask_id::e_ring2D>(), 0u);
0093 EXPECT_EQ(d.mask_store().template size<mask_id::e_straw_tube>(), 0u);
0094 EXPECT_EQ(d.mask_store().template size<mask_id::e_drift_cell>(), 0u);
0095 EXPECT_EQ(d.material_store().template size<material_id::e_material_slab>(),
0096 2u);
0097 EXPECT_EQ(d.material_store().template size<material_id::e_material_rod>(),
0098 1u);
0099 EXPECT_EQ(
0100 d.accelerator_store().template size<finder_id::e_surface_brute_force>(),
0101 1u);
0102 EXPECT_EQ(
0103 d.accelerator_store().template size<finder_id::e_surface_ring2D_grid>(),
0104 0u);
0105 EXPECT_EQ(d.accelerator_store()
0106 .template size<finder_id::e_surface_cylinder2D_grid>(),
0107 0u);
0108
0109
0110
0111
0112
0113
0114 EXPECT_EQ(
0115 d.accelerator_store().template size<finder_id::e_surface_default>(),
0116 1u);
0117 };
0118
0119
0120 check_filled_detector(d1);
0121
0122
0123 detector_t d2{std::move(d1)};
0124 check_filled_detector(d2);
0125
0126
0127 detector_t d3{host_mr};
0128 check_empty_detector(d3);
0129
0130
0131 d3 = std::move(d2);
0132 check_filled_detector(d3);
0133 }