File indexing completed on 2025-08-05 08:09:21
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Definitions/Units.hpp"
0013 #include "Acts/Seeding/SeedConfirmationRangeConfig.hpp"
0014 #include "Acts/Utilities/Delegate.hpp"
0015
0016 #include <limits>
0017 #include <memory>
0018 #include <vector>
0019
0020 namespace Acts {
0021
0022
0023 template <typename T>
0024 class SeedFilter;
0025
0026
0027 template <typename SpacePoint>
0028 struct SeedFinderConfig {
0029 std::shared_ptr<Acts::SeedFilter<SpacePoint>> seedFilter;
0030
0031
0032
0033
0034
0035
0036 float phiMin = -M_PI;
0037 float phiMax = M_PI;
0038 float zMin = -2800 * Acts::UnitConstants::mm;
0039 float zMax = 2800 * Acts::UnitConstants::mm;
0040 float rMax = 600 * Acts::UnitConstants::mm;
0041
0042
0043 float rMin = 33 * Acts::UnitConstants::mm;
0044
0045
0046 std::vector<float> zBinEdges;
0047
0048
0049 std::vector<std::size_t> zBinsCustomLooping = {};
0050
0051
0052 float binSizeR = 1. * Acts::UnitConstants::mm;
0053
0054
0055
0056
0057
0058
0059
0060
0061 float rMinMiddle = 60.f * Acts::UnitConstants::mm;
0062 float rMaxMiddle = 120.f * Acts::UnitConstants::mm;
0063
0064
0065 bool useVariableMiddleSPRange = false;
0066
0067 std::vector<std::vector<float>> rRangeMiddleSP;
0068
0069
0070
0071 float deltaRMiddleMinSPRange = 10. * Acts::UnitConstants::mm;
0072 float deltaRMiddleMaxSPRange = 10. * Acts::UnitConstants::mm;
0073
0074
0075
0076 std::pair<float, float> zOutermostLayers{-2700 * Acts::UnitConstants::mm,
0077 2700 * Acts::UnitConstants::mm};
0078
0079
0080
0081
0082
0083
0084 float deltaRMin = 5 * Acts::UnitConstants::mm;
0085
0086
0087
0088 float deltaRMax = 270 * Acts::UnitConstants::mm;
0089
0090 float deltaRMinTopSP = std::numeric_limits<float>::quiet_NaN();
0091
0092 float deltaRMaxTopSP = std::numeric_limits<float>::quiet_NaN();
0093
0094 float deltaRMinBottomSP = std::numeric_limits<float>::quiet_NaN();
0095
0096 float deltaRMaxBottomSP = std::numeric_limits<float>::quiet_NaN();
0097
0098
0099 float deltaZMax =
0100 std::numeric_limits<float>::infinity() * Acts::UnitConstants::mm;
0101
0102
0103
0104 float cotThetaMax = 10.01788;
0105
0106
0107
0108 float collisionRegionMin = -150 * Acts::UnitConstants::mm;
0109 float collisionRegionMax = +150 * Acts::UnitConstants::mm;
0110
0111
0112
0113 bool interactionPointCut = false;
0114
0115
0116
0117
0118
0119
0120
0121
0122 float minPt = 400. * Acts::UnitConstants::MeV;
0123
0124
0125 float sigmaScattering = 5;
0126
0127
0128
0129
0130 float radLengthPerSeed = 0.05;
0131
0132 float maxPtScattering = 10 * Acts::UnitConstants::GeV;
0133
0134 float impactMax = 20. * Acts::UnitConstants::mm;
0135
0136
0137 float helixCutTolerance = 1.;
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147 bool seedConfirmation = false;
0148
0149 SeedConfirmationRangeConfig centralSeedConfirmationRange;
0150
0151 SeedConfirmationRangeConfig forwardSeedConfirmationRange;
0152
0153 unsigned int maxSeedsPerSpM = 5;
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 float zAlign = 0 * Acts::UnitConstants::mm;
0164 float rAlign = 0 * Acts::UnitConstants::mm;
0165
0166
0167 float sigmaError = 5;
0168
0169
0170 float highland = 0;
0171 float maxScatteringAngle2 = 0;
0172
0173
0174 int maxBlockSize = 1024;
0175 int nTrplPerSpBLimit = 100;
0176 int nAvgTrplPerSpBLimit = 2;
0177
0178
0179
0180
0181
0182
0183 bool useDetailedDoubleMeasurementInfo = false;
0184
0185 Delegate<float(const SpacePoint&)> getTopHalfStripLength;
0186
0187 Delegate<float(const SpacePoint&)> getBottomHalfStripLength;
0188
0189 Delegate<Acts::Vector3(const SpacePoint&)> getTopStripDirection;
0190
0191 Delegate<Acts::Vector3(const SpacePoint&)> getBottomStripDirection;
0192
0193 Delegate<Acts::Vector3(const SpacePoint&)> getStripCenterDistance;
0194
0195 Delegate<Acts::Vector3(const SpacePoint&)> getTopStripCenterPosition;
0196
0197
0198
0199 float toleranceParam = 1.1 * Acts::UnitConstants::mm;
0200
0201
0202 Delegate<bool(float , float )> experimentCuts{
0203 DelegateFuncTag<&noopExperimentCuts>{}};
0204
0205 bool isInInternalUnits = false;
0206
0207 SeedFinderConfig toInternalUnits() const {
0208 if (isInInternalUnits) {
0209 throw std::runtime_error(
0210 "Repeated conversion to internal units for SeedFinderConfig");
0211 }
0212
0213
0214 if (!seedFilter) {
0215 throw std::runtime_error(
0216 "Invalid values for the seed filter inside the seed filter config: "
0217 "nullptr");
0218 }
0219 if (!seedFilter->getSeedFilterConfig().isInInternalUnits) {
0220 throw std::runtime_error(
0221 "The internal Seed Filter configuration, contained in the seed "
0222 "finder config, is not in internal units.");
0223 }
0224
0225 using namespace Acts::UnitLiterals;
0226 SeedFinderConfig config = *this;
0227 config.isInInternalUnits = true;
0228 config.minPt /= 1_MeV;
0229 config.deltaRMin /= 1_mm;
0230 config.deltaRMax /= 1_mm;
0231 config.binSizeR /= 1_mm;
0232 config.deltaRMinTopSP /= 1_mm;
0233 config.deltaRMaxTopSP /= 1_mm;
0234 config.deltaRMinBottomSP /= 1_mm;
0235 config.deltaRMaxBottomSP /= 1_mm;
0236 config.deltaRMiddleMinSPRange /= 1_mm;
0237 config.deltaRMiddleMaxSPRange /= 1_mm;
0238 config.impactMax /= 1_mm;
0239 config.maxPtScattering /= 1_MeV;
0240 config.collisionRegionMin /= 1_mm;
0241 config.collisionRegionMax /= 1_mm;
0242 config.zMin /= 1_mm;
0243 config.zMax /= 1_mm;
0244 config.rMax /= 1_mm;
0245 config.rMin /= 1_mm;
0246 config.deltaZMax /= 1_mm;
0247
0248 config.zAlign /= 1_mm;
0249 config.rAlign /= 1_mm;
0250
0251 config.toleranceParam /= 1_mm;
0252
0253 return config;
0254 }
0255 SeedFinderConfig calculateDerivedQuantities() const {
0256 SeedFinderConfig config = *this;
0257
0258
0259 config.highland = 13.6 * std::sqrt(radLengthPerSeed) *
0260 (1 + 0.038 * std::log(radLengthPerSeed));
0261 const float maxScatteringAngle = config.highland / minPt;
0262 config.maxScatteringAngle2 = maxScatteringAngle * maxScatteringAngle;
0263 return config;
0264 }
0265 };
0266
0267 struct SeedFinderOptions {
0268
0269
0270 Acts::Vector2 beamPos{0 * Acts::UnitConstants::mm,
0271 0 * Acts::UnitConstants::mm};
0272
0273 float bFieldInZ = 2.08 * Acts::UnitConstants::T;
0274
0275
0276 float pTPerHelixRadius = std::numeric_limits<float>::quiet_NaN();
0277 float minHelixDiameter2 = std::numeric_limits<float>::quiet_NaN();
0278 float pT2perRadius = std::numeric_limits<float>::quiet_NaN();
0279 float sigmapT2perRadius = std::numeric_limits<float>::quiet_NaN();
0280 float multipleScattering2 = std::numeric_limits<float>::quiet_NaN();
0281
0282 bool isInInternalUnits = false;
0283
0284 SeedFinderOptions toInternalUnits() const {
0285 if (isInInternalUnits) {
0286 throw std::runtime_error(
0287 "Repeated conversion to internal units for SeedFinderOptions");
0288 }
0289 using namespace Acts::UnitLiterals;
0290 SeedFinderOptions options = *this;
0291 options.isInInternalUnits = true;
0292 options.beamPos[0] /= 1_mm;
0293 options.beamPos[1] /= 1_mm;
0294
0295 options.bFieldInZ /= 1000. * 1_T;
0296 return options;
0297 }
0298
0299 template <typename Config>
0300 SeedFinderOptions calculateDerivedQuantities(const Config& config) const {
0301 using namespace Acts::UnitLiterals;
0302
0303 if (!isInInternalUnits) {
0304 throw std::runtime_error(
0305 "Derived quantities in SeedFinderOptions can only be calculated from "
0306 "Acts internal units");
0307 }
0308 SeedFinderOptions options = *this;
0309
0310
0311
0312 options.pTPerHelixRadius = 1_T * 1e6 * options.bFieldInZ;
0313 options.minHelixDiameter2 =
0314 std::pow(config.minPt * 2 / options.pTPerHelixRadius, 2) *
0315 config.helixCutTolerance;
0316 options.pT2perRadius =
0317 std::pow(config.highland / options.pTPerHelixRadius, 2);
0318 options.sigmapT2perRadius =
0319 options.pT2perRadius * std::pow(2 * config.sigmaScattering, 2);
0320 options.multipleScattering2 =
0321 config.maxScatteringAngle2 * std::pow(config.sigmaScattering, 2);
0322 return options;
0323 }
0324 };
0325
0326 }