98 if (detId == detectors::DetID::ITS) {
101 trackParams.assign(3, defaults);
102 trackParams[1].TrackletMinPt = 0.2f;
103 trackParams[2].TrackletMinPt = 0.1f;
104 trackParams[0].MinPt[0] = 1.f / 12.f;
105 trackParams[1].MinPt[0] = 1.f / 12.f;
107 trackParams[2].MinPt[0] = 1.f / 12.f;
108 trackParams[2].MinPt[1] = 1.f / 5.f;
109 trackParams[2].MinPt[2] = 1.f;
110 trackParams[2].MinPt[3] = 1.f / 6.f;
111 trackParams[2].StartLayerMask = (1u << 6) | (1u << 3);
113 trackParams.assign(1, defaults);
116 LOGP(fatal,
"ITS common-CA tracking mode '{}' is not supported yet; use 'sync' or 'async'",
toString(
mode));
121 }
else if (detId == detectors::DetID::MFT) {
139 LOGP(fatal,
"CA tracking mode is unset; set --tracking-mode or MFTCATrackerParam.trackingMode");
142 trackParams.assign(3, defaults);
144 trackParams[1].TrackletMinPt = 0.15f;
145 trackParams[2].TrackletMinPt = 0.08f;
147 trackParams[0].MinPt[0] = 1.f / 12.f;
148 trackParams[1].MinPt[0] = 1.f / 12.f;
151 trackParams[2].MinPt[0] = 1.f / 12.f;
152 trackParams[2].MinPt[1] = 1.f / 8.f;
153 trackParams[2].MinPt[2] = 1.f / 5.f;
154 trackParams[2].MinPt[3] = 1.f / 3.f;
155 trackParams[2].MinPt[4] = 1.f / 2.f;
156 trackParams[2].MinPt[5] = 1.f / 1.f;
158 trackParams.assign(1, defaults);
161 trackParams.assign(1, defaults);
165 trackParams[0].PVres = 1.e5f;
166 trackParams[0].MaxChi2ClusterAttachment = 60.f;
167 trackParams[0].MaxChi2NDF = 40.f;
169 LOGP(fatal,
"Unsupported CA tracking mode {}",
toString(
mode));
172 LOGP(fatal,
"Unsupported detector id {} in getTrackingPlan",
static_cast<int>(detId));
175 const auto applyOverrides = [&]<
typename Config>(
const Config& tc) {
177 if (std::any_of(std::begin(tc.minTrackLgtIter), std::end(tc.minTrackLgtIter), [](
int value) { return value > 0; })) {
178 throw std::invalid_argument(tc.getName() +
".minTrackLgtIter overrides are implemented only for async mode");
180 if (std::any_of(std::begin(tc.minPtIterLgt), std::end(tc.minPtIterLgt), [](
float value) { return value > 0.f; })) {
181 throw std::invalid_argument(tc.getName() +
".minPtIterLgt overrides are implemented only for async mode");
186 for (
int ip = 0; ip < static_cast<int>(trackParams.size()); ip++) {
187 auto&
param = trackParams[ip];
189 if (tc.minTrackLgtIter[ip] > 0) {
190 param.MinTrackLength = tc.minTrackLgtIter[ip];
192 for (
int ilg = tc.MaxTrackLength; ilg >= tc.MinTrackLength; ilg--) {
193 const int lslot0 = tc.MaxTrackLength - ilg;
194 const int lslot = lslot0 + ip * (tc.MaxTrackLength - tc.MinTrackLength + 1);
195 if (tc.minPtIterLgt[lslot] > 0.f) {
196 param.MinPt[lslot0] = tc.minPtIterLgt[lslot];
203 if (tc.nIterations != -1 && (tc.nIterations <= 0 ||
static_cast<size_t>(tc.nIterations) > trackParams.size())) {
204 throw std::invalid_argument(std::format(
"{}.nIterations={} is invalid for {}: use -1 or 1..{}",
205 tc.getName(), tc.nIterations,
toString(
mode), trackParams.size()));
207 if (tc.nIterations > 0) {
208 trackParams.resize(tc.nIterations);
210 constexpr uint32_t allowedStartLayers = (uint32_t{1} << Config::NLayers) - 1;
212 if (tc.startLayerMask[iteration] & ~allowedStartLayers) {
213 throw std::invalid_argument(std::format(
"{}.startLayerMask[{}]={} contains bits outside the {} detector layers",
214 tc.getName(), iteration, tc.startLayerMask[iteration], tc.NLayers));
218 plan.
execution = {tc.maxMemory, tc.dropTFUponFailure};
219 resolveSystematicErrors(plan.
detector, tc);
220 for (
int i{0};
i < tc.NLayers; ++
i) {
226 for (
auto&
param : trackParams) {
227 param.PassFlags.reset();
229 if (!trackParams.empty()) {
234 const float bFactorTracklets = bFactor < 0.01f ? 1.f : bFactor;
236 for (
auto& p : trackParams) {
237 p.TrackletMinPt *= bFactorTracklets;
238 for (
int ilg = tc.MaxTrackLength; ilg >= tc.MinTrackLength; ilg--) {
239 const int lslot = tc.MaxTrackLength - ilg;
240 if (lslot <
static_cast<int>(p.MinPt.size())) {
241 p.MinPt[lslot] *= bFactor;
245 p.UseDiamond = tc.useDiamond;
246 p.RepeatRefitOut = tc.repeatRefitOut;
247 p.ShiftRefToCluster = tc.shiftRefToCluster;
248 p.CreateArtefactLabels = tc.createArtefactLabels;
249 p.AllowSharingFirstCluster = tc.allowSharingFirstCluster;
250 p.SharedClusterMaxDeltaPhi = tc.sharedClusterMaxDeltaPhi;
251 p.SharedClusterMaxDeltaEta = tc.sharedClusterMaxDeltaEta;
252 p.SharedClusterOppositeSign = tc.sharedClusterOppositeSign;
254 const auto iter = &p - trackParams.data();
256 p.MaxHoles = tc.maxHolesIter[iter];
259 if (tc.startLayerMask[iter] != 0) {
260 p.StartLayerMask = tc.startLayerMask[iter];
263 p.MaxChi2ClusterAttachment = tc.maxChi2ClusterAttachment > 0 ? tc.maxChi2ClusterAttachment : p.MaxChi2ClusterAttachment;
264 p.MaxChi2NDF = tc.maxChi2NDF > 0 ? tc.maxChi2NDF : p.MaxChi2NDF;
265 p.PVres = tc.pvRes > 0 ? tc.pvRes : p.PVres;
266 p.NSigmaCut *= tc.nSigmaCut > 0 ? tc.nSigmaCut : 1.f;
267 p.TrackletMinPt *= tc.minPt > 0 ? tc.minPt : 1.f;
268 for (
int iD{0}; iD < 3; ++iD) {
269 p.Diamond[iD] = tc.diamondPos[iD];
273 if (detId == detectors::DetID::ITS) {
277 LOGP(info,
"MFT CA {}: {} passes, material model nominal, index=PhiR phiBins={} radiusBins={} (radians, cm)",
279 for (
size_t iteration = 0; iteration < trackParams.size(); ++iteration) {
280 const auto& p = trackParams[iteration];
281 LOGP(info,
"MFT CA pass {}: minTrackLength={} trackletMinPt={} maxChi2ClusterAttachment={} maxChi2NDF={} startLayerMask={}",
282 iteration, p.MinTrackLength, p.TrackletMinPt, p.MaxChi2ClusterAttachment, p.MaxChi2NDF, p.StartLayerMask.value());