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