File indexing completed on 2026-07-26 08:22:13
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "traccc/options/generation.hpp"
0010
0011 #include "traccc/definitions/common.hpp"
0012 #include "traccc/examples/utils/printable.hpp"
0013 #include "traccc/utils/particle.hpp"
0014 #include "traccc/utils/ranges.hpp"
0015
0016
0017 #include <sstream>
0018
0019 namespace traccc::opts {
0020
0021
0022 namespace po = boost::program_options;
0023
0024 generation::generation() : interface("Particle Generation Options") {
0025 m_desc.add_options()("gen-events", po::value(&events)->default_value(events),
0026 "The number of events to generate");
0027 m_desc.add_options()(
0028 "gen-nparticles",
0029 po::value(&gen_nparticles)->default_value(gen_nparticles),
0030 "The number of particles to generate per event");
0031 m_desc.add_options()(
0032 "gen-vertex-xyz-mm",
0033 po::value(&vertex)->value_name("X:Y:Z")->default_value(vertex),
0034 "Vertex [mm]");
0035 m_desc.add_options()("gen-vertex-xyz-std-mm",
0036 po::value(&vertex_stddev)
0037 ->value_name("X:Y:Z")
0038 ->default_value(vertex_stddev),
0039 "Standard deviation of the vertex [mm]");
0040 m_desc.add_options()(
0041 "gen-mom-gev",
0042 po::value(&mom_range)->value_name("MIN:MAX")->default_value(mom_range),
0043 "Range of momentum [GeV]");
0044 m_desc.add_options()(
0045 "gen-phi-degree",
0046 po::value(&phi_range)->value_name("MIN:MAX")->default_value(phi_range),
0047 "Range of phi [Degree]");
0048 m_desc.add_options()(
0049 "gen-eta",
0050 po::value(&eta_range)->value_name("MIN:MAX")->default_value(eta_range),
0051 "Range of eta");
0052 m_desc.add_options()("gen-theta",
0053 po::value(&theta_range)
0054 ->value_name("MIN:MAX")
0055 ->default_value(theta_range),
0056 "Range of theta in degree");
0057 m_desc.add_options()("particle-type",
0058 po::value(&pdg_number)->default_value(pdg_number),
0059 "PDG number for the particle type");
0060 m_desc.add_options()("no-multiple-scattering",
0061 "Do not inlcude multiple scattering");
0062 m_desc.add_options()("no-energy-loss", "Do not include energy loss");
0063 }
0064
0065 void generation::read(const po::variables_map &vm) {
0066 vertex *= traccc::unit<float>::mm;
0067 vertex_stddev *= traccc::unit<float>::mm;
0068 mom_range *= traccc::unit<float>::GeV;
0069 phi_range *= traccc::unit<float>::degree;
0070
0071
0072 if (vm.count("gen-eta") && !vm["gen-eta"].defaulted() &&
0073 vm.count("gen-theta") && !vm["gen-theta"].defaulted()) {
0074 throw std::logic_error(
0075 std::string("Conflicting options 'gen-eta' and 'gen-theta'"));
0076 } else if (vm.count("gen-eta") && !vm["gen-eta"].defaulted()) {
0077 theta_range = eta_to_theta_range(eta_range);
0078 } else if (vm.count("gen-theta") && !vm["gen-theta"].defaulted()) {
0079 theta_range *= traccc::unit<float>::degree;
0080 eta_range = theta_to_eta_range(theta_range);
0081 }
0082 if (vm.count("no-multiple-scattering")) {
0083 do_multiple_scattering = false;
0084 }
0085 if (vm.count("no-energy-loss")) {
0086 do_energy_loss = false;
0087 }
0088
0089 ptc_type = detail::particle_from_pdg_number<traccc::scalar>(pdg_number);
0090 }
0091
0092 std::unique_ptr<configuration_printable> generation::as_printable() const {
0093 auto cat = std::make_unique<configuration_category>(m_description);
0094
0095 cat->add_child(std::make_unique<configuration_kv_pair>(
0096 "Number of events", std::to_string(events)));
0097 cat->add_child(std::make_unique<configuration_kv_pair>(
0098 "Number of particles", std::to_string(gen_nparticles)));
0099 std::ostringstream vertex_ss;
0100 vertex_ss << vertex / traccc::unit<float>::mm << " mm";
0101 cat->add_child(
0102 std::make_unique<configuration_kv_pair>("Vertex", vertex_ss.str()));
0103 std::ostringstream vertex_dev_ss;
0104 vertex_dev_ss << vertex_stddev / traccc::unit<float>::mm << " mm";
0105 cat->add_child(std::make_unique<configuration_kv_pair>(
0106 "Vertex standard deviation", vertex_dev_ss.str()));
0107 std::ostringstream mom_range_ss;
0108 mom_range_ss << mom_range / traccc::unit<float>::GeV << " GeV";
0109 cat->add_child(std::make_unique<configuration_kv_pair>("Momentum range",
0110 mom_range_ss.str()));
0111 std::ostringstream phi_range_ss;
0112 phi_range_ss << phi_range / traccc::unit<float>::degree << " deg";
0113 cat->add_child(
0114 std::make_unique<configuration_kv_pair>("Phi range", phi_range_ss.str()));
0115 std::ostringstream eta_range_ss;
0116 eta_range_ss << eta_range;
0117 cat->add_child(
0118 std::make_unique<configuration_kv_pair>("Eta range", eta_range_ss.str()));
0119 std::ostringstream theta_range_ss;
0120 theta_range_ss << theta_range / traccc::unit<float>::degree << " deg";
0121 cat->add_child(std::make_unique<configuration_kv_pair>("Theta range",
0122 theta_range_ss.str()));
0123 cat->add_child(std::make_unique<configuration_kv_pair>(
0124 "PGD number", std::to_string(pdg_number)));
0125 std::ostringstream multiple_scattering_ss;
0126 multiple_scattering_ss << std::boolalpha << do_multiple_scattering;
0127 cat->add_child(std::make_unique<configuration_kv_pair>(
0128 "Include multiple scattering", multiple_scattering_ss.str()));
0129 std::ostringstream energy_loss_ss;
0130 energy_loss_ss << std::boolalpha << do_energy_loss;
0131 cat->add_child(std::make_unique<configuration_kv_pair>("Include energy loss",
0132 energy_loss_ss.str()));
0133
0134 return cat;
0135 }
0136
0137 }