File indexing completed on 2026-07-26 08:22:22
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010
0011 #include "traccc/simulation/smearing_writer.hpp"
0012 #include "traccc/utils/logging.hpp"
0013 #include "traccc/utils/particle.hpp"
0014 #include "traccc/utils/propagation.hpp"
0015
0016
0017 #include <detray/test/utils/random_scatterer.hpp>
0018
0019
0020 #include <limits>
0021 #include <memory>
0022
0023 namespace traccc {
0024
0025 template <typename detector_t, typename bfield_t, typename track_generator_t,
0026 typename writer_t>
0027 struct simulator {
0028 using algebra_type = typename detector_t::algebra_type;
0029 using scalar_type = typename detector_t::scalar_type;
0030 using bfield_type = bfield_t;
0031
0032 struct config {
0033 detray::propagation::config propagation;
0034
0035
0036 traccc::pdg_particle<scalar_type> ptc_type{traccc::muon<scalar_type>()};
0037
0038
0039 bool do_energy_loss = true;
0040 bool do_multiple_scattering = true;
0041 bool m_is_min_pT = false;
0042 scalar_type m_min_p = 10.f * traccc::unit<scalar_type>::MeV;
0043
0044
0045 inline void min_p(const scalar_type p) {
0046 m_is_min_pT = false;
0047 m_min_p = p;
0048 }
0049
0050
0051 inline void min_pT(const scalar_type p) {
0052 m_is_min_pT = true;
0053 m_min_p = p;
0054 }
0055 };
0056
0057 using actor_chain_type = detray::actor_chain<
0058 detray::actor::parameter_updater<
0059 algebra_type, detray::actor::random_scatterer<algebra_type>,
0060 writer_t>,
0061 detray::actor::momentum_aborter<scalar_type>>;
0062
0063 using navigator_type = detray::caching_navigator<detector_t>;
0064 using stepper_type = detray::rk_stepper<
0065 typename bfield_type::view_t, algebra_type,
0066 detray::constrained_step<detray::dscalar<algebra_type>>>;
0067 using propagator_type =
0068 detray::propagator<stepper_type, navigator_type, actor_chain_type>;
0069
0070 simulator(const detray::pdg_particle<scalar>& ptc, std::size_t events,
0071 const detector_t& det, const bfield_type& field,
0072 track_generator_t&& track_gen,
0073 typename writer_t::config&& writer_cfg,
0074 const std::string directory = "")
0075 : m_events(events),
0076 m_directory(directory),
0077 m_detector(det),
0078 m_field(field),
0079 m_track_generator(
0080 std::make_unique<track_generator_t>(std::move(track_gen))),
0081 m_writer_cfg(writer_cfg) {
0082 m_cfg.ptc_type = ptc;
0083 m_track_generator->config().charge(ptc.charge());
0084
0085
0086 m_cfg.propagation.stepping.do_covariance_transport = false;
0087 m_cfg.propagation.stepping.use_eloss_gradient = false;
0088 m_cfg.propagation.stepping.use_field_gradient = false;
0089 m_cfg.propagation.navigation.estimate_scattering_noise = false;
0090
0091 m_updater_state =
0092 detray::actor::parameter_updater_state<algebra_type>{m_cfg.propagation};
0093 }
0094
0095 config& get_config() { return m_cfg; }
0096
0097 void run() {
0098 TRACCC_VERBOSE_HOST("Running fast simulation...");
0099
0100
0101 if (m_cfg.m_is_min_pT) {
0102 m_aborter_state.min_pT(m_cfg.m_min_p);
0103 m_aborter_state.min_p(0.f);
0104 } else {
0105 m_aborter_state.min_p(m_cfg.m_min_p);
0106 m_aborter_state.min_pT(0.f);
0107 }
0108 m_scatterer.do_energy_loss = m_cfg.do_energy_loss;
0109 m_scatterer.do_multiple_scattering = m_cfg.do_multiple_scattering;
0110
0111 for (std::size_t event_id = 0u; event_id < m_events; event_id++) {
0112 typename writer_t::state writer_state(event_id, std::move(m_writer_cfg),
0113 m_directory);
0114
0115
0116 m_scatterer.set_seed(event_id);
0117 writer_state.set_seed(event_id);
0118
0119 auto actor_states = detray::tie(m_updater_state, m_scatterer,
0120 m_aborter_state, writer_state);
0121
0122 for (auto track : *m_track_generator.get()) {
0123 m_updater_state.init(track);
0124
0125 writer_state.write_particle(
0126 track, detail::correct_particle_hypothesis(m_cfg.ptc_type, track));
0127
0128 typename propagator_type::state propagation(track, m_field, m_detector);
0129 propagation.set_particle(
0130 detail::correct_particle_hypothesis(m_cfg.ptc_type, track));
0131
0132 propagator_type p(m_cfg.propagation);
0133
0134
0135 propagation.stepping()
0136 .template set_constraint<detray::step::constraint::e_accuracy>(
0137 m_cfg.propagation.stepping.step_constraint);
0138
0139 p.propagate(propagation, actor_states);
0140
0141
0142 writer_state.particle_id++;
0143 }
0144 }
0145 }
0146
0147 private:
0148 config m_cfg;
0149 std::size_t m_events{0u};
0150 std::string m_directory = "";
0151 const detector_t& m_detector;
0152 const typename bfield_type::view_t m_field;
0153 std::unique_ptr<track_generator_t> m_track_generator;
0154 typename writer_t::config m_writer_cfg;
0155
0156
0157 typename detray::actor::momentum_aborter<scalar_type>::state
0158 m_aborter_state{};
0159 typename detray::actor::parameter_updater<algebra_type>::state
0160 m_updater_state{};
0161 typename detray::actor::random_scatterer<algebra_type>::state m_scatterer{};
0162 };
0163
0164 }