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/generation.hpp"
0017 #include "traccc/options/output_data.hpp"
0018 #include "traccc/options/program_options.hpp"
0019 #include "traccc/options/track_propagation.hpp"
0020 #include "traccc/simulation/event_generators.hpp"
0021 #include "traccc/simulation/measurement_smearer.hpp"
0022 #include "traccc/simulation/simulator.hpp"
0023 #include "traccc/simulation/smearing_writer.hpp"
0024 
0025 // detray include(s).
0026 #include <detray/test/common/build_toy_detector.hpp>
0027 
0028 // VecMem include(s).
0029 #include <vecmem/memory/host_memory_resource.hpp>
0030 
0031 // Boost include(s).
0032 #include <boost/filesystem.hpp>
0033 
0034 using namespace traccc;
0035 
0036 int simulate(const traccc::opts::generation& generation_opts,
0037              const traccc::opts::output_data& output_opts,
0038              const traccc::opts::track_propagation& propagation_opts) {
0039   // Use deterministic random number generator for testing
0040   using uniform_gen_t =
0041       detray::detail::random_numbers<scalar,
0042                                      std::uniform_real_distribution<scalar>>;
0043 
0044   // Memory resource
0045   vecmem::host_memory_resource host_mr;
0046 
0047   /*****************************
0048    * Build a toy geometry
0049    *****************************/
0050 
0051   // Detector type
0052   using detector_type = traccc::toy_detector::host;
0053 
0054   // B field value and its type
0055   // @TODO: Set B field as argument
0056   using b_field_t = covfie::field<traccc::const_bfield_backend_t<scalar>>;
0057   const vector3 B{0, 0, 2 * traccc::unit<scalar>::T};
0058   b_field_t field = traccc::construct_const_bfield(B)
0059                         .as_field<traccc::const_bfield_backend_t<scalar>>();
0060 
0061   // Create the toy geometry
0062   detray::toy_det_config<scalar> toy_cfg{};
0063   toy_cfg.n_brl_layers(4u).n_edc_layers(7u);
0064   // @TODO: Increase the material budget again
0065   toy_cfg.module_mat_thickness(0.11f * traccc::unit<scalar>::mm);
0066   const auto [det, name_map] =
0067       detray::build_toy_detector<traccc::default_algebra>(host_mr, toy_cfg);
0068 
0069   /***************************
0070    * Generate simulation data
0071    ***************************/
0072 
0073   // Origin of particles
0074   using generator_type =
0075       detray::random_track_generator<traccc::free_track_parameters<>,
0076                                      uniform_gen_t>;
0077   generator_type::configuration gen_cfg{};
0078   gen_cfg.n_tracks(generation_opts.gen_nparticles);
0079   gen_cfg.origin(traccc::point3{generation_opts.vertex[0],
0080                                 generation_opts.vertex[1],
0081                                 generation_opts.vertex[2]});
0082   gen_cfg.origin_stddev(traccc::point3{generation_opts.vertex_stddev[0],
0083                                        generation_opts.vertex_stddev[1],
0084                                        generation_opts.vertex_stddev[2]});
0085   gen_cfg.phi_range(generation_opts.phi_range);
0086   gen_cfg.theta_range(generation_opts.theta_range);
0087   gen_cfg.mom_range(generation_opts.mom_range);
0088   generator_type generator(gen_cfg);
0089 
0090   // Smearing value for measurements
0091   traccc::measurement_smearer<traccc::default_algebra> meas_smearer(
0092       50 * traccc::unit<scalar>::um, 50 * traccc::unit<scalar>::um);
0093 
0094   // Type declarations
0095   using writer_type = traccc::smearing_writer<
0096       traccc::measurement_smearer<traccc::default_algebra>>;
0097 
0098   // Writer config
0099   typename writer_type::config smearer_writer_cfg{meas_smearer};
0100 
0101   // Run simulator
0102   const std::string full_path = io::data_directory() + output_opts.directory;
0103 
0104   boost::filesystem::create_directories(full_path);
0105 
0106   auto sim =
0107       traccc::simulator<detector_type, b_field_t, generator_type, writer_type>(
0108           generation_opts.ptc_type, generation_opts.events, det, field,
0109           std::move(generator), std::move(smearer_writer_cfg), full_path);
0110   sim.get_config().propagation = propagation_opts;
0111 
0112   sim.run();
0113 
0114   // Create detector file
0115   auto writer_cfg = detray::io::detector_writer_config{}
0116                         .format(detray::io::format::json)
0117                         .replace_files(true);
0118   detray::io::write_detector(det, name_map, writer_cfg);
0119 
0120   return 1;
0121 }
0122 
0123 // The main routine
0124 //
0125 int main(int argc, char* argv[]) {
0126   std::unique_ptr<const traccc::Logger> logger = traccc::getDefaultLogger(
0127       "TracccExampleSimulateToyDetector", traccc::Logging::Level::INFO);
0128 
0129   // Program options.
0130   traccc::opts::generation generation_opts;
0131   traccc::opts::output_data output_opts;
0132   traccc::opts::track_propagation propagation_opts;
0133   traccc::opts::program_options program_opts{
0134       "Toy-Detector Simulation",
0135       {generation_opts, output_opts, propagation_opts},
0136       argc,
0137       argv,
0138       logger->cloneWithSuffix("Options")};
0139 
0140   // Run the application.
0141   return simulate(generation_opts, output_opts, propagation_opts);
0142 }