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 // Project include(s)
0010 #include "detray/core/detector.hpp"
0011 
0012 #include "detray/definitions/indexing.hpp"
0013 #include "detray/material/predefined_materials.hpp"
0014 
0015 // Detray test include(s)
0016 #include "detray/test/framework/types.hpp"
0017 #include "detray/test/utils/prefill_detector.hpp"
0018 
0019 // Vecmem include(s)
0020 #include <vecmem/memory/host_memory_resource.hpp>
0021 
0022 // GTest include(s)
0023 #include <gtest/gtest.h>
0024 
0025 /// This tests the functionality of a detector as a data store manager
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   // Helper lambda for checking the contents of an "empty" detector object.
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     /*EXPECT_TRUE(
0065         d.accelerator_store().template empty<finder_id::e_irr_disc_grid>());
0066     EXPECT_TRUE(d.accelerator_store()
0067                     .template empty<finder_id::e_irr_cylinder2_grid>());*/
0068     EXPECT_TRUE(
0069         d.accelerator_store().template empty<finder_id::e_surface_default>());
0070   };
0071 
0072   // Check the empty detector object.
0073   check_empty_detector(d1);
0074 
0075   // Add some geometrical data
0076   prefill_detector(d1, geo_ctx);
0077 
0078   // Helper lambda for checking the contents of a "filled" detector object.
0079   auto check_filled_detector = [](auto& d) {
0080     // TODO: add B-field check
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     /*EXPECT_EQ(
0109         d.accelerator_store().template size<finder_id::e_irr_disc_grid>(),
0110         0u);
0111     EXPECT_EQ(d.accelerator_store()
0112                   .template size<finder_id::e_irr_cylinder2_grid>(),
0113               0u);*/
0114     EXPECT_EQ(
0115         d.accelerator_store().template size<finder_id::e_surface_default>(),
0116         1u);
0117   };
0118 
0119   // Check the filled detector object.
0120   check_filled_detector(d1);
0121 
0122   // Move construct a detector object.
0123   detector_t d2{std::move(d1)};
0124   check_filled_detector(d2);
0125 
0126   // Create a new, empty detector.
0127   detector_t d3{host_mr};
0128   check_empty_detector(d3);
0129 
0130   // Move assign the filled detector to the empty one.
0131   d3 = std::move(d2);
0132   check_filled_detector(d3);
0133 }