Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-26 08:22:27

0001 /** TRACCC library, part of the ACTS project (R&D line)
0002  *
0003  * (c) 2024 CERN for the benefit of the ACTS project
0004  *
0005  * Mozilla Public License Version 2.0
0006  */
0007 
0008 // Project include(s).
0009 #include "traccc/clusterization/measurement_creation_algorithm.hpp"
0010 #include "traccc/clusterization/sparse_ccl_algorithm.hpp"
0011 #include "traccc/io/data_format.hpp"
0012 #include "traccc/io/detector.hpp"
0013 #include "traccc/io/read_cells.hpp"
0014 #include "traccc/io/read_detector_description.hpp"
0015 #include "traccc/io/read_digitization_config.hpp"
0016 #include "traccc/io/utils.hpp"
0017 #include "traccc/utils/event_data.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 TEST(event_data, acts_odd) {
0026   /// Type declarations
0027   using host_detector_type = traccc::default_detector::host;
0028 
0029   vecmem::host_memory_resource resource;
0030 
0031   const std::string path = "odd/geant4_1muon_100GeV";
0032   const std::string det_file = "geometries/odd/odd-detray_geometry_detray.json";
0033 
0034   // Read detector file
0035   detray::io::detector_reader_config reader_cfg{};
0036   reader_cfg.add_file(traccc::io::data_directory() + det_file);
0037 
0038   auto [host_det, names] =
0039       detray::io::read_detector<host_detector_type>(resource, reader_cfg);
0040 
0041   traccc::host_detector polymorphic_detector;
0042   polymorphic_detector.set<traccc::default_detector>(std::move(host_det));
0043 
0044   {
0045     // without cell
0046     traccc::event_data evt_data(path, 0u, resource, true, &polymorphic_detector,
0047                                 traccc::data_format::csv, false);
0048     EXPECT_EQ(evt_data.m_particle_map.size(), 4515u);
0049     EXPECT_EQ(evt_data.m_meas_to_ptc_map.size(), 58u);
0050     EXPECT_EQ(evt_data.m_meas_to_param_map.size(), 58u);
0051   }
0052   {
0053     // with cell
0054     traccc::event_data evt_data(path, 0u, resource, true, &polymorphic_detector,
0055                                 traccc::data_format::csv, true);
0056     EXPECT_EQ(evt_data.m_particle_map.size(), 4515u);
0057     EXPECT_EQ(evt_data.m_meas_to_ptc_map.size(), 58u);
0058     EXPECT_EQ(evt_data.m_meas_to_param_map.size(), 58u);
0059   }
0060 }
0061 
0062 TEST(event_data, mock_data) {
0063   /***
0064    * Mock data test
0065    *
0066    * Mock data consists of three particles each of which has one hit
0067    *
0068    * first particle: one hit, three cells
0069    * second particle: one hit, four cells
0070    * thrid particle: one hit, three cells
0071    *
0072    * [ ] [1] [ ] [ ] [ ] [ ] [ ] [ ]
0073    * [1][1,2][2] [ ] [ ] [ ] [ ] [ ]
0074    * [ ] [2] [2] [ ] [ ] [ ] [ ] [ ]
0075    * [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
0076    * [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
0077    * [ ] [ ] [ ] [ ] [ ] [3] [3] [3]
0078    * [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
0079    * [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
0080    *
0081    * Current traccc's CCA algorithm will make two clusters
0082    *
0083    * first cluster is a set of cells generated by 1st and 2nd particles
0084    * second cluster is a set of cells generated by 3rd particle
0085    *
0086    */
0087 
0088   /// Type declarations
0089   using host_detector_type = traccc::default_detector::host;
0090 
0091   vecmem::host_memory_resource resource;
0092 
0093   const std::string path = TRACCC_TEST_IO_MOCK_DATA_DIR;
0094 
0095   // Dummy detector and digitization file
0096   const std::string det_file = "geometries/odd/odd-detray_geometry_detray.json";
0097   const std::string digi_file = "geometries/odd/odd-digi-geometric-config.json";
0098   const std::string cond_file = "geometries/odd/odd-digi-geometric-config.json";
0099 
0100   // Read detector file
0101   detray::io::detector_reader_config reader_cfg{};
0102   reader_cfg.add_file(traccc::io::data_directory() + det_file);
0103 
0104   auto [host_det, names] =
0105       detray::io::read_detector<host_detector_type>(resource, reader_cfg);
0106 
0107   traccc::host_detector polymorphic_detector;
0108   polymorphic_detector.set<traccc::default_detector>(std::move(host_det));
0109 
0110   traccc::event_data evt_data(path, 0u, resource, true, &polymorphic_detector,
0111                               traccc::data_format::csv, true);
0112 
0113   // There are three measurements
0114   EXPECT_EQ(evt_data.m_meas_to_ptc_map.size(), 3u);
0115   EXPECT_EQ(evt_data.m_meas_to_param_map.size(), 3u);
0116   // There are three particles
0117   EXPECT_EQ(evt_data.m_particle_map.size(), 3u);
0118   EXPECT_EQ(evt_data.m_ptc_to_meas_map.size(), 3u);
0119 
0120   for (auto const& [meas, ptcs] : evt_data.m_meas_to_ptc_map) {
0121     EXPECT_EQ(ptcs.size(), 1);
0122 
0123     for (auto const& [ptc, count] : ptcs) {
0124       if (ptc.particle_id == 4503599644147712) {
0125         // number of cells from 1st particle
0126         EXPECT_EQ(count, 3);
0127       } else if (ptc.particle_id == 4503599660924928) {
0128         // number of cells from 2nd particle
0129         EXPECT_EQ(count, 4);
0130       } else if (ptc.particle_id == 4503599744811008) {
0131         // number of cells from 3rd particle
0132         EXPECT_EQ(count, 3);
0133       }
0134     }
0135   }
0136 
0137   /// Test with CCA
0138 
0139   // Construct the detector description object.
0140   traccc::detector_design_description::host det_descr{resource};
0141   traccc::detector_conditions_description::host det_cond{resource};
0142   traccc::io::read_detector_description(det_descr, det_cond, det_file,
0143                                         digi_file, cond_file,
0144                                         traccc::data_format::json);
0145 
0146   traccc::detector_design_description::data det_descr_data{
0147       vecmem::get_data(det_descr)};
0148   traccc::detector_conditions_description::data det_cond_data{
0149       vecmem::get_data(det_cond)};
0150   // Algorithms
0151   traccc::host::sparse_ccl_algorithm cc(resource);
0152   traccc::host::measurement_creation_algorithm mc(resource);
0153 
0154   // Read cells
0155   traccc::edm::silicon_cell_collection::host cells{resource};
0156   traccc::io::read_cells(cells, 0u, path, traccc::getDummyLogger().clone(),
0157                          &det_cond, traccc::data_format::csv);
0158   const auto cells_view = vecmem::get_data(cells);
0159 
0160   auto clusters = cc(cells_view, det_cond_data);
0161   auto measurements =
0162       mc(cells_view, vecmem::get_data(clusters), det_descr_data, det_cond_data);
0163 
0164   evt_data.fill_cca_result(cells, clusters, measurements, det_cond);
0165 
0166   EXPECT_EQ(evt_data.m_found_meas_to_ptc_map.size(), 2u);
0167   EXPECT_EQ(evt_data.m_found_meas_to_param_map.size(), 2u);
0168 
0169   bool has_first_cluster = false;
0170   bool has_second_cluster = false;
0171 
0172   bool has_first_particle = false;
0173   bool has_second_particle = false;
0174   bool has_third_particle = false;
0175 
0176   for (auto const& [meas, ptcs] : evt_data.m_found_meas_to_ptc_map) {
0177     // first measurement (or cluster) is contributed by 1st and 2nd
0178     // particles
0179     if (ptcs.size() == 2) {
0180       for (auto const& [ptc, count] : ptcs) {
0181         if (ptc.particle_id == 4503599644147712) {
0182           // number of cells from 1st particle
0183           EXPECT_EQ(count, 3);
0184           has_first_particle = true;
0185         } else if (ptc.particle_id == 4503599660924928) {
0186           // number of cells from 2nd particle
0187           EXPECT_EQ(count, 4);
0188           has_second_particle = true;
0189         }
0190       }
0191 
0192       has_first_cluster = true;
0193     }
0194 
0195     // second measurement (or cluster) is contributed by 3rd particle
0196     else if (ptcs.size() == 1) {
0197       for (auto const& [ptc, count] : ptcs) {
0198         if (ptc.particle_id == 4503599744811008) {
0199           // number of cells from 3rd particle
0200           EXPECT_EQ(count, 3);
0201           has_third_particle = true;
0202         }
0203       }
0204 
0205       has_second_cluster = true;
0206     }
0207   }
0208 
0209   EXPECT_EQ(has_first_cluster, true);
0210   EXPECT_EQ(has_second_cluster, true);
0211   EXPECT_EQ(has_first_particle, true);
0212   EXPECT_EQ(has_second_particle, true);
0213   EXPECT_EQ(has_third_particle, true);
0214 
0215   bool has_first_param = false;
0216   bool has_second_param = false;
0217 
0218   for (auto const& [meas, param] : evt_data.m_found_meas_to_param_map) {
0219     if (meas.identifier() == 0u) {
0220       has_first_param = true;
0221     } else if (meas.identifier() == 1u) {
0222       has_second_param = true;
0223     }
0224   }
0225 
0226   EXPECT_EQ(has_first_param, true);
0227   EXPECT_EQ(has_second_param, true);
0228 }