File indexing completed on 2026-07-26 08:22:13
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "traccc/options/track_finding.hpp"
0010
0011 #include "traccc/examples/utils/printable.hpp"
0012 #include "traccc/utils/particle.hpp"
0013
0014
0015 #include <format>
0016 #include <sstream>
0017
0018 namespace traccc::opts {
0019
0020
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 }