Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /** TRACCC library, part of the ACTS project (R&D line)
0002  *
0003  * (c) 2023-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/bfield/construct_const_bfield.hpp"
0010 #include "traccc/bfield/magnetic_field_types.hpp"
0011 #include "traccc/definitions/primitives.hpp"
0012 #include "traccc/edm/track_parameters.hpp"
0013 #include "traccc/geometry/detector.hpp"
0014 #include "traccc/io/detector.hpp"
0015 #include "traccc/io/utils.hpp"
0016 #include "traccc/options/detector.hpp"
0017 #include "traccc/options/generation.hpp"
0018 #include "traccc/options/output_data.hpp"
0019 #include "traccc/options/program_options.hpp"
0020 #include "traccc/options/track_propagation.hpp"
0021 #include "traccc/simulation/event_generators.hpp"
0022 #include "traccc/simulation/measurement_smearer.hpp"
0023 #include "traccc/simulation/simulator.hpp"
0024 #include "traccc/simulation/smearing_writer.hpp"
0025 #include "traccc/utils/propagation.hpp"
0026 
0027 // VecMem include(s).
0028 #include <vecmem/memory/host_memory_resource.hpp>
0029 
0030 // Boost include(s).
0031 #include <boost/filesystem.hpp>
0032 
0033 using namespace traccc;
0034 
0035 // The main routine
0036 //
0037 int main(int argc, char* argv[]) {
0038   std::unique_ptr<const traccc::Logger> logger = traccc::getDefaultLogger(
0039       "TracccExampleSimulate", traccc::Logging::Level::INFO);
0040 
0041   // Program options.
0042   traccc::opts::detector det_opts;
0043   traccc::opts::generation generation_opts;
0044   traccc::opts::output_data output_opts;
0045   traccc::opts::track_propagation propagation_opts;
0046   traccc::opts::program_options program_opts{
0047       "Detector Simulation",
0048       {det_opts, generation_opts, output_opts, propagation_opts},
0049       argc,
0050       argv,
0051       logger->cloneWithSuffix("Options")};
0052 
0053   /// Type declarations
0054   using host_detector_type = traccc::default_detector::host;
0055   using uniform_gen_t =
0056       detray::detail::random_numbers<scalar,
0057                                      std::uniform_real_distribution<scalar>>;
0058   using generator_type =
0059       detray::random_track_generator<traccc::free_track_parameters<>,
0060                                      uniform_gen_t>;
0061 
0062   // B field value and its type
0063   // @TODO: Set B field as argument
0064   using b_field_t =
0065       covfie::field<traccc::const_bfield_backend_t<traccc::scalar>>;
0066   const traccc::vector3 B{0, 0, 2 * traccc::unit<traccc::scalar>::T};
0067   const b_field_t field =
0068       traccc::construct_const_bfield(B)
0069           .as_field<traccc::const_bfield_backend_t<traccc::scalar>>();
0070 
0071   // Read the detector
0072   detray::io::detector_reader_config reader_cfg{};
0073   reader_cfg.add_file(traccc::io::get_absolute_path(det_opts.detector_file));
0074   if (!det_opts.material_file.empty()) {
0075     reader_cfg.add_file(traccc::io::get_absolute_path(det_opts.material_file));
0076   }
0077   if (!det_opts.grid_file.empty()) {
0078     reader_cfg.add_file(traccc::io::get_absolute_path(det_opts.grid_file));
0079   }
0080 
0081   // Memory resource used by the EDM.
0082   vecmem::host_memory_resource host_mr;
0083 
0084   auto [host_det, names] =
0085       detray::io::read_detector<host_detector_type>(host_mr, reader_cfg);
0086 
0087   /***************************
0088    * Generate simulation data
0089    ***************************/
0090 
0091   // Origin of particles
0092   generator_type::configuration gen_cfg{};
0093   gen_cfg.n_tracks(generation_opts.gen_nparticles);
0094   gen_cfg.origin(traccc::point3{generation_opts.vertex[0],
0095                                 generation_opts.vertex[1],
0096                                 generation_opts.vertex[2]});
0097   gen_cfg.origin_stddev(traccc::point3{generation_opts.vertex_stddev[0],
0098                                        generation_opts.vertex_stddev[1],
0099                                        generation_opts.vertex_stddev[2]});
0100   gen_cfg.phi_range(generation_opts.phi_range);
0101   gen_cfg.theta_range(generation_opts.theta_range);
0102   gen_cfg.mom_range(generation_opts.mom_range);
0103   generator_type generator(gen_cfg);
0104 
0105   // Smearing value for measurements
0106   traccc::measurement_smearer<traccc::default_algebra> meas_smearer(
0107       50 * traccc::unit<scalar>::um, 50 * traccc::unit<scalar>::um);
0108 
0109   using writer_type = traccc::smearing_writer<
0110       traccc::measurement_smearer<traccc::default_algebra>>;
0111 
0112   // Writer config
0113   typename writer_type::config smearer_writer_cfg{meas_smearer};
0114 
0115   // Run simulator
0116   const std::string full_path = io::data_directory() + output_opts.directory;
0117 
0118   boost::filesystem::create_directories(full_path);
0119 
0120   auto sim = traccc::simulator<host_detector_type, b_field_t, generator_type,
0121                                writer_type>(
0122       generation_opts.ptc_type, generation_opts.events, host_det, field,
0123       std::move(generator), std::move(smearer_writer_cfg), full_path);
0124 
0125   sim.get_config().propagation = propagation_opts;
0126 
0127   sim.run();
0128 
0129   return 1;
0130 }