12#include "detray/definitions/algebra.hpp"
13#include "detray/utils/logging.hpp"
16#include "detray/options/options_handling.hpp"
17#include "detray/test/common/event_generator/random_track_generator_config.hpp"
18#include "detray/test/common/event_generator/uniform_track_generator_config.hpp"
21#include "detray/options/boost_program_options.hpp"
27namespace detray::options {
32template <concepts::scalar scalar_t>
33void add_uniform_track_gen_options(
34 boost::program_options::options_description &desc,
35 const uniform_track_generator_config<scalar_t> &cfg) {
38 boost::program_options::value<std::size_t>()->default_value(
40 "No. phi steps for particle gun")(
42 boost::program_options::value<std::size_t>()->default_value(
44 "No. eta steps for particle gun")(
46 boost::program_options::value<std::size_t>()->default_value(cfg.seed()),
47 "Seed for the random number generator")(
49 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
50 "Min, Max range of eta values for particle gun")(
51 "randomize_charge",
"Randomly flip charge sign per track")(
53 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
54 "Coordinates for particle gun origin position [mm]")(
56 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
57 "Total momentum [range] of the test particles [GeV]")(
59 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
60 "Transverse momentum [range] of the test particles [GeV]");
64template <concepts::scalar scalar_t>
65void configure_uniform_track_gen_options(
66 const boost::program_options::variables_map &vm,
67 uniform_track_generator_config<scalar_t> &cfg) {
68 cfg.phi_steps(vm[
"phi_steps"].as<std::size_t>());
69 cfg.eta_steps(vm[
"eta_steps"].as<std::size_t>());
70 cfg.seed(vm[
"random_seed"].as<std::size_t>());
71 cfg.randomize_charge(vm.count(
"randomize_charge"));
73 if (vm.count(
"eta_range") != 0u) {
74 const auto eta_range = vm[
"eta_range"].as<std::vector<scalar_t>>();
75 if (eta_range.size() == 2u) {
76 cfg.eta_range(eta_range[0], eta_range[1]);
78 throw std::invalid_argument(
"Eta range needs two arguments");
81 if (vm.count(
"origin") != 0u) {
82 const auto origin = vm[
"origin"].as<std::vector<scalar_t>>();
83 if (origin.size() == 3u) {
87 throw std::invalid_argument(
"Particle gun origin needs three arguments");
90 if (vm.count(
"pT_range") != 0u && vm.count(
"p_range") != 0u) {
91 throw std::invalid_argument(
92 "Transverse and total momentum cannot be specified at the same "
95 if (vm.count(
"pT_range") != 0u) {
96 const auto pt_range = vm[
"pT_range"].as<std::vector<scalar_t>>();
99 if (pt_range.empty()) {
100 cfg.p_T(
static_cast<scalar_t
>(cfg.m_p_mag));
101 }
else if (pt_range.size() <= 2u) {
102 if (pt_range.size() == 2u) {
104 "Momentum range not possible with uniform "
105 "track generator: Using first value.");
109 throw std::invalid_argument(
110 "Wrong number of arguments for pT range: Need one argument or "
114 auto p_range = std::vector<scalar_t>{};
115 if (vm.count(
"pT_range") != 0u) {
116 p_range = vm[
"p_range"].as<std::vector<scalar_t>>();
120 if (p_range.empty()) {
121 cfg.p_tot(
static_cast<scalar_t
>(cfg.m_p_mag));
122 }
else if (p_range.size() <= 2u) {
123 if (p_range.size() == 2u) {
125 "Momentum range not possible with uniform "
126 "track generator: Using first value.");
131 "Wrong number of arguments for p_tot range: Need one argument "
133 DETRAY_FATAL_HOST(err_str);
134 throw std::invalid_argument(err_str);
140template <concepts::scalar scalar_t>
141void add_rnd_track_gen_options(
142 boost::program_options::options_description &desc,
143 const random_track_generator_config<scalar_t> &cfg) {
146 boost::program_options::value<std::size_t>()->default_value(
148 "No. of tracks for particle gun")(
150 boost::program_options::value<std::size_t>()->default_value(cfg.seed()),
151 "Seed for the random number generator")(
153 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
154 "Min, Max range of theta values for particle gun. Interval in [0, pi)")(
156 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
157 "Min, Max range of eta values for particle gun")(
158 "randomize_charge",
"Randomly flip charge sign per track")(
160 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
161 "Coordinates for particle gun origin position [mm]")(
163 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
164 "Total momentum [range] of the test particles [GeV]")(
166 boost::program_options::value<std::vector<scalar_t>>()->multitoken(),
167 "Transverse momentum [range] of the test particles [GeV]");
171template <concepts::scalar scalar_t>
172void configure_rnd_track_gen_options(
173 const boost::program_options::variables_map &vm,
174 random_track_generator_config<scalar_t> &cfg) {
175 cfg.n_tracks(vm[
"n_tracks"].as<std::size_t>());
176 cfg.seed(vm[
"random_seed"].as<std::size_t>());
177 cfg.randomize_charge(vm.count(
"randomize_charge"));
179 if (vm.count(
"eta_range") != 0u && vm.count(
"theta_range") != 0u) {
180 throw std::invalid_argument(
181 "Eta range and theta range cannot be specified at the same time");
182 }
else if (vm.count(
"eta_range") != 0u) {
183 const auto eta_range = vm[
"eta_range"].as<std::vector<scalar_t>>();
184 if (eta_range.size() == 2u) {
185 scalar_t min_theta{2.f * std::atan(std::exp(-eta_range[0]))};
186 scalar_t max_theta{2.f * std::atan(std::exp(-eta_range[1]))};
189 if (min_theta > max_theta) {
190 scalar_t tmp{min_theta};
191 min_theta = max_theta;
195 cfg.theta_range(min_theta, max_theta);
197 throw std::invalid_argument(
"Eta range needs two arguments");
199 }
else if (vm.count(
"theta_range") != 0u) {
200 const auto theta_range = vm[
"theta_range"].as<std::vector<scalar_t>>();
201 if (theta_range.size() == 2u) {
202 cfg.theta_range(theta_range[0], theta_range[1]);
204 throw std::invalid_argument(
"Theta range needs two arguments");
207 if (vm.count(
"origin") != 0u) {
208 const auto origin = vm[
"origin"].as<std::vector<scalar_t>>();
209 if (origin.size() == 3u) {
213 throw std::invalid_argument(
214 "Particle gun origin needs three coordinates");
217 if (vm.count(
"pT_range") != 0u && vm.count(
"p_range") != 0u) {
218 throw std::invalid_argument(
219 "Transverse and total momentum cannot be specified at the same "
222 if (vm.count(
"pT_range") != 0u) {
223 const auto pt_range = vm[
"pT_range"].as<std::vector<scalar_t>>();
226 if (pt_range.empty()) {
227 cfg.p_T(cfg.mom_range()[0]);
228 }
else if (pt_range.size() == 1u) {
230 }
else if (pt_range.size() == 2u) {
234 throw std::invalid_argument(
235 "Wrong number of arguments for pT range: Need one argument or "
239 auto p_range = std::vector<scalar_t>();
240 if (vm.count(
"pT_range") != 0u) {
241 p_range = vm[
"p_range"].as<std::vector<scalar_t>>();
245 if (p_range.empty()) {
246 cfg.p_tot(cfg.mom_range()[0]);
247 }
else if (p_range.size() == 1u) {
249 }
else if (p_range.size() == 2u) {
253 throw std::invalid_argument(
254 "Wrong number of arguments for p_tot range: Need one argument "
265void add_options<uniform_track_generator_config<float>>(
266 boost::program_options::options_description &desc,
267 const uniform_track_generator_config<float> &cfg) {
268 detail::add_uniform_track_gen_options(desc, cfg);
272void add_options<uniform_track_generator_config<double>>(
273 boost::program_options::options_description &desc,
274 const uniform_track_generator_config<double> &cfg) {
275 detail::add_uniform_track_gen_options(desc, cfg);
282void configure_options<uniform_track_generator_config<float>>(
283 const boost::program_options::variables_map &vm,
284 uniform_track_generator_config<float> &cfg) {
285 detail::configure_uniform_track_gen_options(vm, cfg);
289void configure_options<uniform_track_generator_config<double>>(
290 const boost::program_options::variables_map &vm,
291 uniform_track_generator_config<double> &cfg) {
292 detail::configure_uniform_track_gen_options(vm, cfg);
299void add_options<random_track_generator_config<float>>(
300 boost::program_options::options_description &desc,
301 const random_track_generator_config<float> &cfg) {
302 detail::add_rnd_track_gen_options(desc, cfg);
306void add_options<random_track_generator_config<double>>(
307 boost::program_options::options_description &desc,
308 const random_track_generator_config<double> &cfg) {
309 detail::add_rnd_track_gen_options(desc, cfg);
316void configure_options<random_track_generator_config<float>>(
317 const boost::program_options::variables_map &vm,
318 random_track_generator_config<float> &cfg) {
319 detail::configure_rnd_track_gen_options(vm, cfg);
323void configure_options<random_track_generator_config<double>>(
324 const boost::program_options::variables_map &vm,
325 random_track_generator_config<double> &cfg) {
326 detail::configure_rnd_track_gen_options(vm, cfg);
static constexpr scalar_t mm
Native length unit, the millimetre.
Definition units.hpp:27
static constexpr scalar_t GeV
Native energy unit, the gigaelectronvolt.
Definition units.hpp:81