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_wire_chamber.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 wire chamber
0049    *****************************/
0050 
0051   // Detector type
0052   using detector_type = traccc::wire_chamber::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   const b_field_t field =
0059       traccc::construct_const_bfield(B)
0060           .as_field<traccc::const_bfield_backend_t<scalar>>();
0061 
0062   // Set Configuration
0063   detray::wire_chamber_config<scalar> wire_chamber_cfg{};
0064   wire_chamber_cfg.n_layers(20u);
0065 
0066   // Create the toy geometry
0067   const auto [det, name_map] =
0068       detray::build_wire_chamber<detector_type::algebra_type>(host_mr,
0069                                                               wire_chamber_cfg);
0070 
0071   /***************************
0072    * Generate simulation data
0073    ***************************/
0074 
0075   // Origin of particles
0076   using generator_type =
0077       detray::random_track_generator<traccc::free_track_parameters<>,
0078                                      uniform_gen_t>;
0079   generator_type::configuration gen_cfg{};
0080   gen_cfg.n_tracks(generation_opts.gen_nparticles);
0081   gen_cfg.origin(traccc::point3{generation_opts.vertex[0],
0082                                 generation_opts.vertex[1],
0083                                 generation_opts.vertex[2]});
0084   gen_cfg.origin_stddev(traccc::point3{generation_opts.vertex_stddev[0],
0085                                        generation_opts.vertex_stddev[1],
0086                                        generation_opts.vertex_stddev[2]});
0087   gen_cfg.phi_range(generation_opts.phi_range);
0088   gen_cfg.theta_range(generation_opts.theta_range);
0089   gen_cfg.mom_range(generation_opts.mom_range);
0090   gen_cfg.charge(generation_opts.ptc_type.charge());
0091   generator_type generator(gen_cfg);
0092 
0093   // Smearing value for measurements
0094   traccc::measurement_smearer<traccc::default_algebra> meas_smearer(
0095       50 * traccc::unit<scalar>::um, 50 * traccc::unit<scalar>::um);
0096 
0097   // Type declarations
0098   using writer_type = traccc::smearing_writer<
0099       traccc::measurement_smearer<traccc::default_algebra>>;
0100 
0101   // Writer config
0102   typename writer_type::config smearer_writer_cfg{meas_smearer};
0103 
0104   // Run simulator
0105   const std::string full_path = io::data_directory() + output_opts.directory;
0106 
0107   boost::filesystem::create_directories(full_path);
0108 
0109   auto sim =
0110       traccc::simulator<detector_type, b_field_t, generator_type, writer_type>(
0111           generation_opts.ptc_type, generation_opts.events, det, field,
0112           std::move(generator), std::move(smearer_writer_cfg), full_path);
0113   sim.get_config().propagation = propagation_opts;
0114 
0115   sim.run();
0116 
0117   // Create detector file
0118   auto writer_cfg = detray::io::detector_writer_config{}
0119                         .format(detray::io::format::json)
0120                         .replace_files(true);
0121   detray::io::write_detector(det, name_map, writer_cfg);
0122 
0123   return 1;
0124 }
0125 
0126 // The main routine
0127 //
0128 int main(int argc, char* argv[]) {
0129   std::unique_ptr<const traccc::Logger> logger = traccc::getDefaultLogger(
0130       "TracccExampleSimulateWireChamber", traccc::Logging::Level::INFO);
0131 
0132   // Program options.
0133   traccc::opts::generation generation_opts;
0134   traccc::opts::output_data output_opts;
0135   traccc::opts::track_propagation propagation_opts;
0136   traccc::opts::program_options program_opts{
0137       "Wire-Chamber Simulation",
0138       {generation_opts, output_opts, propagation_opts},
0139       argc,
0140       argv,
0141       logger->cloneWithSuffix("Options")};
0142 
0143   // Run the application.
0144   return simulate(generation_opts, output_opts, propagation_opts);
0145 }