Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-26 08:22:13

0001 /** TRACCC library, part of the ACTS project (R&D line)
0002  *
0003  * (c) 2023-2025 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/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 // System include(s).
0017 #include <sstream>
0018 
0019 namespace traccc::opts {
0020 
0021 /// Convenience namespace shorthand
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   // The eta and theta range can not be specified at the same time
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 }  // namespace traccc::opts