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-2026 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/track_finding.hpp"
0010 
0011 #include "traccc/examples/utils/printable.hpp"
0012 #include "traccc/utils/particle.hpp"
0013 
0014 // System include(s).
0015 #include <format>
0016 #include <sstream>
0017 
0018 namespace traccc::opts {
0019 
0020 /// Convenience namespace shorthand
0021 namespace po = boost::program_options;
0022 
0023 track_finding::track_finding() : interface("Track Finding Options") {
0024   m_desc.add_options()("max-num-branches-per-seed",
0025                        po::value(&m_config.max_num_branches_per_seed)
0026                            ->default_value(m_config.max_num_branches_per_seed),
0027                        "Max number of branches per seed");
0028   m_desc.add_options()(
0029       "max-num-branches-per-surface",
0030       po::value(&m_config.max_num_branches_per_surface)
0031           ->default_value(m_config.max_num_branches_per_surface),
0032       "Max number of branches per surface");
0033   m_desc.add_options()(
0034       "max-num-tracks-per-measurement",
0035       po::value(&m_config.max_num_tracks_per_measurement)
0036           ->default_value(m_config.max_num_tracks_per_measurement),
0037       "Max number of tracks per input measurement; zero disables pruning");
0038   m_desc.add_options()(
0039       "min-measurement-voting-fraction",
0040       po::value(&m_config.min_measurement_voting_fraction)
0041           ->default_value(m_config.min_measurement_voting_fraction),
0042       "Min fraction of voting measurements; only used if "
0043       "`max-num-tracks-per-measurement` is non-zero");
0044   m_desc.add_options()("track-candidates-range",
0045                        po::value(&m_track_candidates_range)
0046                            ->value_name("MIN:MAX")
0047                            ->default_value(m_track_candidates_range),
0048                        "Range of track candidates number");
0049   m_desc.add_options()(
0050       "min-step-length-for-next-surface",
0051       po::value(&m_config.min_step_length_for_next_surface)
0052           ->default_value(m_config.min_step_length_for_next_surface),
0053       "Minimum step length that track should make to reach the next surface. "
0054       "This should be set higher than the overstep tolerance not to make it "
0055       "stay on the same surface");
0056   m_desc.add_options()(
0057       "max-step-counts-for-next-surface",
0058       po::value<unsigned int>(&m_config.max_step_counts_for_next_surface)
0059           ->default_value(m_config.max_step_counts_for_next_surface),
0060       "Maximum step counts that track can make to reach the next surface");
0061   m_desc.add_options()(
0062       "chi2-max",
0063       po::value(&m_config.chi2_max)->default_value(m_config.chi2_max),
0064       "Maximum Chi suqare that measurements can be included in the track");
0065   m_desc.add_options()("max-num-skipping-per-cand",
0066                        po::value(&m_config.max_num_skipping_per_cand)
0067                            ->default_value(m_config.max_num_skipping_per_cand),
0068                        "Maximum allowed number of skipped steps per candidate");
0069   m_desc.add_options()(
0070       "max-num-consecutive-skipped",
0071       po::value(&m_config.max_num_consecutive_skipped)
0072           ->default_value(m_config.max_num_consecutive_skipped),
0073       "Maximum allowed number of consecutive skipped steps");
0074   m_desc.add_options()("particle-hypothesis",
0075                        po::value(&m_pdg_number)->default_value(m_pdg_number),
0076                        "PDG number for the particle hypothesis");
0077   m_desc.add_options()(
0078       "finding-min-total-momentum",
0079       po::value(&m_config.min_p)->default_value(m_config.min_p),
0080       "Minimum total track momentum [GeV]");
0081   m_desc.add_options()(
0082       "finding-min-transverse-momentum",
0083       po::value(&m_config.min_pT)->default_value(m_config.min_pT),
0084       "Minimum transverse track momentum [GeV]");
0085   m_desc.add_options()(
0086       "duplicate-removal-minimum-length",
0087       po::value(&m_config.duplicate_removal_minimum_length)
0088           ->default_value(m_config.duplicate_removal_minimum_length),
0089       "Minimum track length for deduplication (0 to disable) [cardinal]");
0090   m_desc.add_options()(
0091       "finding-run-pkf",
0092       po::value(&m_config.run_pkf)->default_value(m_config.run_pkf),
0093       "Whether to run the progressive Kalman filter when branching is turned "
0094       "off");
0095   m_desc.add_options()(
0096       "finding-run-smoother",
0097       po::value(&m_config.run_smoother)->default_value(m_config.run_smoother),
0098       "Configure the smoother [none, MBF, Kalman]");
0099   m_desc.add_options()("initial-links-per-seed",
0100                        po::value(&m_config.initial_links_per_seed)
0101                            ->default_value(m_config.initial_links_per_seed),
0102                        "Initial number of links to allocate memory for "
0103                        "[cardinal] [compute performance only]");
0104 }
0105 
0106 void track_finding::read(const po::variables_map &) {
0107   m_config.min_p *= traccc::unit<float>::GeV;
0108   m_config.min_pT *= traccc::unit<float>::GeV;
0109 }
0110 
0111 track_finding::operator finding_config() const {
0112   finding_config out = m_config;
0113 
0114   out.min_track_candidates_per_track = m_track_candidates_range[0];
0115   out.max_track_candidates_per_track = m_track_candidates_range[1];
0116   out.ptc_hypothesis =
0117       detail::particle_from_pdg_number<traccc::scalar>(m_pdg_number);
0118 
0119   return out;
0120 }
0121 
0122 std::unique_ptr<configuration_printable> track_finding::as_printable() const {
0123   auto cat = std::make_unique<configuration_category>(m_description);
0124 
0125   cat->add_child(std::make_unique<configuration_kv_pair>(
0126       "Max branches per seed",
0127       std::to_string(m_config.max_num_branches_per_seed)));
0128   cat->add_child(std::make_unique<configuration_kv_pair>(
0129       "Max branches at surface",
0130       std::to_string(m_config.max_num_branches_per_surface)));
0131   cat->add_child(std::make_unique<configuration_kv_pair>(
0132       "Max tracks per measurement",
0133       std::to_string(m_config.max_num_tracks_per_measurement)));
0134   cat->add_child(std::make_unique<configuration_kv_pair>(
0135       "Min measurement voting fraction",
0136       std::to_string(m_config.min_measurement_voting_fraction)));
0137   std::ostringstream candidate_ss;
0138   candidate_ss << m_track_candidates_range;
0139   cat->add_child(std::make_unique<configuration_kv_pair>(
0140       "Track candidate range", candidate_ss.str()));
0141   cat->add_child(std::make_unique<configuration_kv_pair>(
0142       "Min step length to next surface",
0143       std::to_string(m_config.min_step_length_for_next_surface) + " mm"));
0144   cat->add_child(std::make_unique<configuration_kv_pair>(
0145       "Max step count to next surface",
0146       std::to_string(m_config.max_step_counts_for_next_surface)));
0147   cat->add_child(std::make_unique<configuration_kv_pair>(
0148       "Max Chi2", std::to_string(m_config.chi2_max)));
0149   cat->add_child(std::make_unique<configuration_kv_pair>(
0150       "Max holes per candidate",
0151       std::to_string(m_config.max_num_skipping_per_cand)));
0152   cat->add_child(std::make_unique<configuration_kv_pair>(
0153       "Min track length for deduplication",
0154       std::to_string(m_config.duplicate_removal_minimum_length)));
0155   cat->add_child(std::make_unique<configuration_kv_pair>(
0156       "PDG number", std::to_string(m_pdg_number)));
0157   cat->add_child(std::make_unique<configuration_kv_pair>(
0158       "Minimum pT",
0159       std::format("{} GeV", m_config.min_pT / traccc::unit<float>::GeV)));
0160   cat->add_child(std::make_unique<configuration_kv_pair>(
0161       "Minimum p",
0162       std::format("{} GeV", m_config.min_p / traccc::unit<float>::GeV)));
0163   cat->add_child(std::make_unique<configuration_kv_pair>(
0164       "Run PKF", m_config.run_pkf ? "true" : "false"));
0165   std::stringstream os{};
0166   os << m_config.run_smoother;
0167   cat->add_child(
0168       std::make_unique<configuration_kv_pair>("Run smoother", os.str()));
0169   cat->add_child(std::make_unique<configuration_kv_pair>(
0170       "Initial links per seed",
0171       std::to_string(m_config.initial_links_per_seed)));
0172 
0173   return cat;
0174 }
0175 }  // namespace traccc::opts