File indexing completed on 2026-07-26 08:22:17
0001
0002
0003
0004
0005
0006
0007
0008
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
0028 #include <vecmem/memory/host_memory_resource.hpp>
0029
0030
0031 #include <boost/filesystem.hpp>
0032
0033 using namespace traccc;
0034
0035
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
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
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
0063
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
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
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
0089
0090
0091
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
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
0113 typename writer_type::config smearer_writer_cfg{meas_smearer};
0114
0115
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 }