Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /** TRACCC library, part of the ACTS project (R&D line)
0002  *
0003  * (c) 2022-2025 CERN for the benefit of the ACTS project
0004  *
0005  * Mozilla Public License Version 2.0
0006  */
0007 
0008 // Local include(s).
0009 #include "traccc/options/track_seeding.hpp"
0010 
0011 #include "traccc/examples/utils/printable.hpp"
0012 
0013 // System include(s).
0014 #include <format>
0015 
0016 namespace traccc::opts {
0017 
0018 /// Convenience namespace shorthand
0019 namespace po = boost::program_options;
0020 
0021 track_seeding::track_seeding() : interface("Track Seeding Options") {
0022   m_desc.add_options()(
0023       "seedfinder-z-range",
0024       po::value(&m_z_range)->value_name("MIN:MAX")->default_value(m_z_range),
0025       "Spacepoint Z range [mm]");
0026   m_desc.add_options()(
0027       "seedfinder-r-range",
0028       po::value(&m_r_range)->value_name("MIN:MAX")->default_value(m_r_range),
0029       "Spacepoint R range [mm]");
0030   m_desc.add_options()("seedfinder-vertex-range",
0031                        po::value(&m_vertex_range)
0032                            ->value_name("MIN:MAX")
0033                            ->default_value(m_vertex_range),
0034                        "Vertex Z range [mm]");
0035 
0036   m_desc.add_options()(
0037       "seedfinder-minPt",
0038       po::value(&m_seedfinder.minPt)
0039           ->default_value(m_seedfinder.minPt / unit<float>::GeV),
0040       "Minimum track momentum [GeV]");
0041 
0042   m_desc.add_options()("seedfinder-cotThetaMax",
0043                        po::value(&m_seedfinder.cotThetaMax)
0044                            ->default_value(m_seedfinder.cotThetaMax),
0045                        "Maximum cotangent of theta angle [unitless]");
0046   m_desc.add_options()(
0047       "seedfinder-deltaR-range",
0048       po::value(&m_delta_r_range)->default_value(m_delta_r_range),
0049       "Radial distance between measurements [mm]");
0050 
0051   m_desc.add_options()(
0052       "seedfinder-impactMax",
0053       po::value(&m_seedfinder.impactMax)
0054           ->default_value(m_seedfinder.impactMax / unit<float>::mm),
0055       "Maximum impact parameter [mm]");
0056 
0057   m_desc.add_options()(
0058       "seedfinder-deltaZMax",
0059       po::value(&m_seedfinder.deltaZMax)
0060           ->default_value(m_seedfinder.deltaZMax / unit<float>::mm),
0061       "Maximum Z distance between measurements [mm]");
0062 
0063   m_desc.add_options()("seedfinder-sigmaScattering",
0064                        po::value(&m_seedfinder.sigmaScattering)
0065                            ->default_value(m_seedfinder.sigmaScattering),
0066                        "Scattering angle sigma [unitless]");
0067   m_desc.add_options()(
0068       "seedfinder-maxPtScattering",
0069       po::value(&m_seedfinder.maxPtScattering)
0070           ->default_value(m_seedfinder.maxPtScattering / unit<float>::GeV),
0071       "Upper pT limit for scattering [GeV]");
0072 
0073   m_desc.add_options()("seedfinder-maxSeedsPerSpM",
0074                        po::value(&m_seedfinder.maxSeedsPerSpM)
0075                            ->default_value(m_seedfinder.maxSeedsPerSpM),
0076                        "Maximum number of seeds per middle space point");
0077   m_desc.add_options()(
0078       "seedfinder-bFieldInZ",
0079       po::value(&m_seedfinder.bFieldInZ)
0080           ->default_value(m_seedfinder.bFieldInZ / unit<float>::T),
0081       "B-field in Z direction [T]");
0082   m_desc.add_options()(
0083       "seedfinder-deltaInvHelixDiameter",
0084       po::value(&m_seedfilter.deltaInvHelixDiameter)
0085           ->default_value(m_seedfilter.deltaInvHelixDiameter * unit<float>::mm),
0086       "Inverted radius delta for compatible seeds [mm^-1]");
0087   m_desc.add_options()("seedfinder-impactWeightFactor",
0088                        po::value(&m_seedfilter.impactWeightFactor)
0089                            ->default_value(m_seedfilter.impactWeightFactor),
0090                        "Weight factor for impact parameter [unitless]");
0091   m_desc.add_options()("seedfinder-compatSeedWeight",
0092                        po::value(&m_seedfilter.compatSeedWeight)
0093                            ->default_value(m_seedfilter.compatSeedWeight),
0094                        "Weight per compatible seed [unitless]");
0095   m_desc.add_options()("seedfinder-compatSeedLimit",
0096                        po::value(&m_seedfilter.compatSeedLimit)
0097                            ->default_value(m_seedfilter.compatSeedLimit),
0098                        "Maximum weighted compatible seeds [cardinal]");
0099 }
0100 
0101 track_seeding::operator seedfinder_config() const {
0102   return m_seedfinder;
0103 }
0104 
0105 track_seeding::operator seedfilter_config() const {
0106   return m_seedfilter;
0107 }
0108 
0109 track_seeding::operator spacepoint_grid_config() const {
0110   return {m_seedfinder};
0111 }
0112 
0113 track_seeding::operator vector3() const {
0114   return {0.f, 0.f, m_seedfinder.bFieldInZ};
0115 }
0116 
0117 void track_seeding::read(const po::variables_map&) {
0118   m_seedfinder.zMin = m_z_range[0] * unit<float>::mm;
0119   m_seedfinder.zMax = m_z_range[1] * unit<float>::mm;
0120   m_seedfinder.rMin = m_r_range[0] * unit<float>::mm;
0121   m_seedfinder.rMax = m_r_range[1] * unit<float>::mm;
0122   m_seedfinder.collisionRegionMin = m_vertex_range[0] * unit<float>::mm;
0123   m_seedfinder.collisionRegionMax = m_vertex_range[1] * unit<float>::mm;
0124   m_seedfinder.deltaRMin = m_delta_r_range[0] * unit<float>::mm;
0125   m_seedfinder.deltaRMax = m_delta_r_range[1] * unit<float>::mm;
0126 
0127   m_seedfinder.minPt *= unit<float>::GeV;
0128   m_seedfinder.impactMax *= unit<float>::mm;
0129   m_seedfinder.maxPtScattering *= unit<float>::GeV;
0130   m_seedfinder.bFieldInZ *= unit<float>::T;
0131 
0132   m_seedfilter.deltaInvHelixDiameter /= unit<float>::mm;
0133 
0134   m_seedfinder.setup();
0135 }
0136 
0137 std::unique_ptr<configuration_printable> track_seeding::as_printable() const {
0138   auto cat = std::make_unique<configuration_category>(m_description);
0139 
0140   cat->add_child(std::make_unique<configuration_kv_pair>(
0141       "Spacepoint Z range",
0142       std::format("[{:.1f} - {:.1f}] mm", m_seedfinder.zMin / unit<float>::mm,
0143                   m_seedfinder.zMax / unit<float>::mm)));
0144   cat->add_child(std::make_unique<configuration_kv_pair>(
0145       "Spacepoint R range",
0146       std::format("[{:.2f} - {:.2f}] mm", m_seedfinder.rMin / unit<float>::mm,
0147                   m_seedfinder.rMax / unit<float>::mm)));
0148   cat->add_child(std::make_unique<configuration_kv_pair>(
0149       "Vertex Z range",
0150       std::format("[{:.2f} - {:.2f}] mm",
0151                   m_seedfinder.collisionRegionMin / unit<float>::mm,
0152                   m_seedfinder.collisionRegionMax / unit<float>::mm)));
0153 
0154   cat->add_child(std::make_unique<configuration_kv_pair>(
0155       "Minimum track momentum",
0156       std::format("{:.2f} GeV", m_seedfinder.minPt / unit<float>::GeV)));
0157 
0158   float theta = std::atan(1.f / m_seedfinder.cotThetaMax);
0159   float eta = -std::log(std::tan(theta / 2.f));
0160 
0161   cat->add_child(std::make_unique<configuration_kv_pair>(
0162       "Maximum cotangent of theta angle",
0163       std::format("{:.4f} (eta = {:.2f})", m_seedfinder.cotThetaMax, eta)));
0164   cat->add_child(std::make_unique<configuration_kv_pair>(
0165       "Radial distance between measurements",
0166       std::format("[{:.2f} - {:.2f}] mm",
0167                   m_seedfinder.deltaRMin / unit<float>::mm,
0168                   m_seedfinder.deltaRMax / unit<float>::mm)));
0169   cat->add_child(std::make_unique<configuration_kv_pair>(
0170       "Maximum impact parameter",
0171       std::format("{:.2f} mm", m_seedfinder.impactMax / unit<float>::mm)));
0172   cat->add_child(std::make_unique<configuration_kv_pair>(
0173       "Scattering angle sigma",
0174       std::format("{:.2f}", m_seedfinder.sigmaScattering)));
0175   cat->add_child(std::make_unique<configuration_kv_pair>(
0176       "Upper pT limit for scattering",
0177       std::format("{:.2f} GeV",
0178                   m_seedfinder.maxPtScattering / unit<float>::GeV)));
0179   cat->add_child(std::make_unique<configuration_kv_pair>(
0180       "Maximum seeds per middle space point",
0181       std::to_string(m_seedfinder.maxSeedsPerSpM)));
0182   cat->add_child(std::make_unique<configuration_kv_pair>(
0183       "B-field in Z direction",
0184       std::format("{:.2f} T", m_seedfinder.bFieldInZ / unit<float>::T)));
0185   cat->add_child(std::make_unique<configuration_kv_pair>(
0186       "Inverted radius delta for compatible seeds",
0187       std::format("{:.5f} mm^-1",
0188                   m_seedfilter.deltaInvHelixDiameter * unit<float>::mm)));
0189   cat->add_child(std::make_unique<configuration_kv_pair>(
0190       "Weight factor for impact parameter",
0191       std::format("{:.2f}", m_seedfilter.impactWeightFactor)));
0192   cat->add_child(std::make_unique<configuration_kv_pair>(
0193       "Weight per compatible seed",
0194       std::format("{:.2f}", m_seedfilter.compatSeedWeight)));
0195   cat->add_child(std::make_unique<configuration_kv_pair>(
0196       "Maximum weighted compatible seed",
0197       std::format("{:d}", m_seedfilter.compatSeedLimit)));
0198 
0199   return cat;
0200 }
0201 }  // namespace traccc::opts