ATLAS Offline Software
TrackFindingAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 #include "src/TrackFindingAlg.h"
5 #include "src/TrackFindingData.h"
7 
8 // Athena
9 #include "AsgTools/ToolStore.h"
18 
19 // ACTS
20 #include "Acts/Definitions/Units.hpp"
21 #include "Acts/Geometry/TrackingGeometry.hpp"
22 #include "Acts/Geometry/GeometryIdentifier.hpp"
23 #include "Acts/MagneticField/MagneticFieldProvider.hpp"
24 #include "Acts/Surfaces/Surface.hpp"
25 #include "Acts/TrackFinding/MeasurementSelector.hpp"
26 #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
27 #include "Acts/Surfaces/PerigeeSurface.hpp"
28 #include "Acts/Utilities/TrackHelpers.hpp"
29 
30 // ActsTrk
36 #include "ActsInterop/Logger.h"
37 #include "ActsInterop/TableUtils.h"
39 #include "src/OnTrackCalibrator.h"
40 
41 // STL
42 #include <sstream>
43 #include <functional>
44 #include <tuple>
45 #include <utility>
46 #include <algorithm>
47 
48 namespace ActsTrk
49 {
50  struct TrackFindingAlg::CKF_pimpl : public CKF_config
51  {
52  };
53 
56 
58  ISvcLocator *pSvcLocator)
59  : AthReentrantAlgorithm(name, pSvcLocator)
60  {
61  }
62 
64 
65  // === initialize ==========================================================
66 
68  {
69  ATH_MSG_INFO("Initializing " << name() << " ... ");
70  ATH_MSG_DEBUG("Properties Summary:");
74  ATH_MSG_DEBUG(" " << m_etaBins);
81  ATH_MSG_DEBUG(" " << m_doTwoWay);
82  ATH_MSG_DEBUG(" " << m_phiMin);
83  ATH_MSG_DEBUG(" " << m_phiMax);
84  ATH_MSG_DEBUG(" " << m_etaMin);
85  ATH_MSG_DEBUG(" " << m_etaMax);
86  ATH_MSG_DEBUG(" " << m_absEtaMin);
87  ATH_MSG_DEBUG(" " << m_absEtaMax);
88  ATH_MSG_DEBUG(" " << m_ptMin);
89  ATH_MSG_DEBUG(" " << m_ptMax);
91  ATH_MSG_DEBUG(" " << m_maxHoles);
94  ATH_MSG_DEBUG(" " << m_maxChi2);
98 
99  // Read and Write handles
100  ATH_CHECK(m_seedContainerKeys.initialize());
102  ATH_CHECK(m_detEleCollKeys.initialize());
106 
107  if (m_estimatedTrackParametersKeys.size() != m_seedLabels.size())
108  {
109  ATH_MSG_FATAL("There are " << m_seedLabels.size() << " SeedLabels, but " << m_estimatedTrackParametersKeys.size() << " EstimatedTrackParametersKeys");
110  return StatusCode::FAILURE;
111  }
112 
114  {
115  ATH_MSG_FATAL("There are " << m_estimatedTrackParametersKeys.size() << " EstimatedTrackParametersKeys, but " << m_seedContainerKeys.size() << " SeedContainerKeys");
116  return StatusCode::FAILURE;
117  }
118 
120  {
121  ATH_MSG_FATAL("There are " << m_uncalibratedMeasurementContainerKeys.size() << " UncalibratedMeasurementContainerKeys, but " << m_detEleCollKeys.size() << " DetEleCollKeys");
122  return StatusCode::FAILURE;
123  }
124 
125  ATH_CHECK(m_monTool.retrieve(EnableTool{not m_monTool.empty()}));
126  ATH_CHECK(m_trackingGeometryTool.retrieve());
127  ATH_CHECK(m_extrapolationTool.retrieve());
128  ATH_CHECK(m_ATLASConverterTool.retrieve());
129  ATH_CHECK(m_trackStatePrinter.retrieve(EnableTool{not m_trackStatePrinter.empty()}));
130  ATH_CHECK(m_fitterTool.retrieve());
131  ATH_CHECK(m_pixelCalibTool.retrieve(EnableTool{not m_pixelCalibTool.empty()}));
132  ATH_CHECK(m_stripCalibTool.retrieve(EnableTool{not m_stripCalibTool.empty()}));
133 
134  m_logger = makeActsAthenaLogger(this, "Acts");
135 
136  auto magneticField = std::make_unique<ATLASMagneticFieldWrapper>();
137  auto trackingGeometry = m_trackingGeometryTool->trackingGeometry();
138 
139  Stepper stepper(std::move(magneticField));
140  Navigator::Config cfg{trackingGeometry};
141  cfg.resolvePassive = false;
142  cfg.resolveMaterial = true;
143  cfg.resolveSensitive = true;
144  Navigator navigator(cfg, logger().cloneWithSuffix("Navigator"));
145  Propagator propagator(std::move(stepper), std::move(navigator), logger().cloneWithSuffix("Prop"));
146 
147  // Using the CKF propagator as extrapolator
148  Extrapolator extrapolator = propagator;
149 
150  std::vector<double> etaBins;
151  // m_etaBins (from flags.Tracking.ActiveConfig.etaBins) includes a dummy first and last bin, which we ignore
152  if (m_etaBins.size() > 2) {
153  etaBins.assign(m_etaBins.begin() + 1, m_etaBins.end() - 1);
154  }
155  Acts::MeasurementSelectorCuts measurementSelectorCuts{etaBins};
156 
157  if (!m_chi2CutOff.empty())
158  measurementSelectorCuts.chi2CutOff = m_chi2CutOff;
159  if (!m_numMeasurementsCutOff.empty())
160  measurementSelectorCuts.numMeasurementsCutOff = m_numMeasurementsCutOff;
161 
162  Acts::MeasurementSelector::Config measurementSelectorCfg{{Acts::GeometryIdentifier(), std::move(measurementSelectorCuts)}};
163  Acts::MeasurementSelector measurementSelector(measurementSelectorCfg);
164 
165  std::vector<double> absEtaEdges;
166  absEtaEdges.reserve(etaBins.size() + 2);
167  if (etaBins.empty())
168  {
169  absEtaEdges.push_back(0.0);
170  absEtaEdges.push_back(std::numeric_limits<double>::infinity());
171  }
172  else
173  {
174  absEtaEdges.push_back(m_absEtaMin);
175  absEtaEdges.insert(absEtaEdges.end(), etaBins.begin(), etaBins.end());
176  absEtaEdges.push_back(m_absEtaMax);
177  }
178 
179  auto setCut = [](auto &cfgVal, const auto &cuts, size_t ind) -> void
180  {
181  if (cuts.empty())
182  return;
183  cfgVal = (ind < cuts.size()) ? cuts[ind] : cuts[cuts.size() - 1];
184  };
185 
186  Acts::TrackSelector::EtaBinnedConfig trackSelectorCfg{std::move(absEtaEdges)};
187  if (etaBins.empty())
188  {
189  assert(trackSelectorCfg.cutSets.size() == 1);
190  trackSelectorCfg.cutSets[0].absEtaMin = m_absEtaMin;
191  trackSelectorCfg.cutSets[0].absEtaMax = m_absEtaMax;
192  }
193  size_t cutIndex = 0;
194  for (auto &cfg : trackSelectorCfg.cutSets)
195  {
196  setCut(cfg.phiMin, m_phiMin, cutIndex);
197  setCut(cfg.phiMax, m_phiMax, cutIndex);
198  setCut(cfg.etaMin, m_etaMin, cutIndex);
199  setCut(cfg.etaMax, m_etaMax, cutIndex);
200  setCut(cfg.ptMin, m_ptMin, cutIndex);
201  setCut(cfg.ptMax, m_ptMax, cutIndex);
202  setCut(cfg.minMeasurements, m_minMeasurements, cutIndex);
203  setCut(cfg.maxHoles, m_maxHoles, cutIndex);
204  setCut(cfg.maxOutliers, m_maxOutliers, cutIndex);
205  setCut(cfg.maxSharedHits, m_maxSharedHits, cutIndex);
206  setCut(cfg.maxChi2, m_maxChi2, cutIndex);
207  ++cutIndex;
208  }
209 
210  ATH_MSG_INFO(trackSelectorCfg);
211 
212  if (!m_useDefaultMeasurementSelector.value()) {
213  // initializer measurement selector and connect it to the delegates of the track finder optins
215  }
216  else if (!m_chi2OutlierCutOff.empty()) {
217  ATH_MSG_DEBUG("chi2OutlierCutOff set but not supported when using the default measurement selector.");
218  }
219 
220  m_trackFinder.reset(new CKF_pimpl{CKF_config{std::move(extrapolator), {std::move(propagator), logger().cloneWithSuffix("CKF")}, measurementSelector, {}, {}, {}, trackSelectorCfg}});
221 
222  trackFinder().pOptions.maxSteps = m_maxPropagationStep;
223  trackFinder().pSecondOptions.maxSteps = m_maxPropagationStep;
224  trackFinder().pOptions.direction = Acts::Direction::Forward;
225  trackFinder().pSecondOptions.direction = trackFinder().pOptions.direction.invert();
226 
227  trackFinder().ckfExtensions.updater.connect<&ActsTrk::FitterHelperFunctions::gainMatrixUpdate<RecoTrackStateContainer>>();
228  trackFinder().ckfExtensions.measurementSelector.connect<&Acts::MeasurementSelector::select<RecoTrackStateContainer>>(&trackFinder().measurementSelector);
229  initStatTables();
230 
231  return StatusCode::SUCCESS;
232  }
233 
234  // === finalize ============================================================
235 
237  {
238  printStatTables();
239  return StatusCode::SUCCESS;
240  }
241 
242  // === execute =============================================================
243 
244  StatusCode TrackFindingAlg::execute(const EventContext &ctx) const
245  {
246  ATH_MSG_DEBUG("Executing " << name() << " ... ");
247 
248  auto timer = Monitored::Timer<std::chrono::milliseconds>("TIME_execute");
249  auto mon_nTracks = Monitored::Scalar<int>("nTracks");
250  auto mon = Monitored::Group(m_monTool, timer, mon_nTracks);
251 
252  // ================================================== //
253  // ===================== INPUTS ===================== //
254  // ================================================== //
255 
256  // SEED PARAMETERS
257  std::vector<const ActsTrk::BoundTrackParametersContainer *> estimatedTrackParametersContainers;
258  estimatedTrackParametersContainers.reserve(m_estimatedTrackParametersKeys.size());
259  for (const auto &estimatedTrackParametersKey : m_estimatedTrackParametersKeys)
260  {
261  ATH_MSG_DEBUG("Reading input collection with key " << estimatedTrackParametersKey.key());
262  SG::ReadHandle<ActsTrk::BoundTrackParametersContainer> estimatedTrackParametersHandle = SG::makeHandle(estimatedTrackParametersKey, ctx);
263  ATH_CHECK(estimatedTrackParametersHandle.isValid());
264  estimatedTrackParametersContainers.push_back(estimatedTrackParametersHandle.cptr());
265  ATH_MSG_DEBUG("Retrieved " << estimatedTrackParametersContainers.back()->size() << " input elements from key " << estimatedTrackParametersKey.key());
266  }
267 
268  // SEED TRIPLETS
269  std::vector<const ActsTrk::SeedContainer *> seedContainers;
270  seedContainers.reserve(m_seedContainerKeys.size());
271  std::size_t total_seeds = 0;
272  for (const auto &seedContainerKey : m_seedContainerKeys)
273  {
274  ATH_MSG_DEBUG("Reading input collection with key " << seedContainerKey.key());
275  SG::ReadHandle<ActsTrk::SeedContainer> seedsHandle = SG::makeHandle(seedContainerKey, ctx);
276  ATH_CHECK(seedsHandle.isValid());
277  seedContainers.push_back(seedsHandle.cptr());
278  ATH_MSG_DEBUG("Retrieved " << seedContainers.back()->size() << " input elements from key " << seedContainerKey.key());
279  total_seeds += seedContainers.back()->size();
280  }
281 
282  // MEASUREMENTS
283  std::vector<const xAOD::UncalibratedMeasurementContainer *> uncalibratedMeasurementContainers;
284  uncalibratedMeasurementContainers.reserve(m_uncalibratedMeasurementContainerKeys.size());
285  std::size_t measTotal = 0;
286  for (const auto &uncalibratedMeasurementContainerKey : m_uncalibratedMeasurementContainerKeys)
287  {
288  ATH_MSG_DEBUG("Reading input collection with key " << uncalibratedMeasurementContainerKey.key());
289  SG::ReadHandle<xAOD::UncalibratedMeasurementContainer> uncalibratedMeasurementContainerHandle = SG::makeHandle(uncalibratedMeasurementContainerKey, ctx);
290  ATH_CHECK(uncalibratedMeasurementContainerHandle.isValid());
291  uncalibratedMeasurementContainers.push_back(uncalibratedMeasurementContainerHandle.cptr());
292  ATH_MSG_DEBUG("Retrieved " << uncalibratedMeasurementContainers.back()->size() << " input elements from key " << uncalibratedMeasurementContainerKey.key());
293  measTotal += uncalibratedMeasurementContainers.back()->size();
294  }
295 
296  std::vector<const InDetDD::SiDetectorElementCollection *> detEleColl;
297  detEleColl.reserve(m_detEleCollKeys.size());
298  for (const auto &detEleCollKey : m_detEleCollKeys)
299  {
300  ATH_MSG_DEBUG("Reading input condition data with key " << detEleCollKey.key());
301  SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> detEleCollHandle(detEleCollKey, ctx);
302  ATH_CHECK(detEleCollHandle.isValid());
303  detEleColl.push_back(detEleCollHandle.retrieve());
304  if (detEleColl.back() == nullptr)
305  {
306  ATH_MSG_FATAL(detEleCollKey.fullKey() << " is not available.");
307  return StatusCode::FAILURE;
308  }
309  ATH_MSG_DEBUG("Retrieved " << detEleColl.back()->size() << " input condition elements from key " << detEleCollKey.key());
310  }
311 
312  DuplicateSeedDetector duplicateSeedDetector(total_seeds, m_skipDuplicateSeeds);
313  for (std::size_t icontainer = 0; icontainer < seedContainers.size(); ++icontainer)
314  {
315  if (!seedContainers[icontainer])
316  continue;
317  duplicateSeedDetector.addSeeds(icontainer, *seedContainers[icontainer]);
318  }
319 
320  TrackFindingMeasurements measurements(measTotal);
321 
322  // @TODO make this condition data
323  for (std::size_t icontainer = 0; icontainer < detEleColl.size(); ++icontainer) {
324  xAOD::UncalibMeasType measType =
325  !uncalibratedMeasurementContainers[icontainer]->empty() ? uncalibratedMeasurementContainers[icontainer]->at(0)->type()
327  measurements.addDetectorElements(measType, *detEleColl[icontainer], m_ATLASConverterTool);
328  }
329 
330  // NB. must complete all addDetectorElements() before addMeasurements(), so don't combine these loops!
331  for (std::size_t icontainer = 0; icontainer < uncalibratedMeasurementContainers.size(); ++icontainer) {
332  ATH_MSG_DEBUG("Create " << uncalibratedMeasurementContainers[icontainer]->size() << " source links from measurements in " << m_uncalibratedMeasurementContainerKeys[icontainer].key());
333  measurements.addMeasurements(icontainer, *uncalibratedMeasurementContainers[icontainer], *detEleColl[icontainer], m_ATLASConverterTool);
334  }
335 
336  if (!m_trackStatePrinter.empty()) {
337  m_trackStatePrinter->printMeasurements(ctx, uncalibratedMeasurementContainers, detEleColl, measurements.measurementOffsets());
338  }
339 
340 
341  // ================================================== //
342  // ===================== COMPUTATION ================ //
343  // ================================================== //
344  ActsTrk::MutableTrackContainer tracksContainer;
345  EventStats event_stat;
346  event_stat.resize(m_stat.size());
347 
348  // Perform the track finding for all initial parameters.
349  // Until the CKF can do a backward search, start with the pixel seeds
350  // (will become relevant when we can remove pixel/strip duplicates).
351  // Afterwards, we could start with strips where the occupancy is lower.
352  for (std::size_t icontainer = 0; icontainer < estimatedTrackParametersContainers.size(); ++icontainer)
353  {
354  if (estimatedTrackParametersContainers[icontainer]->empty())
355  continue;
356  ATH_CHECK(findTracks(ctx,
357  measurements,
358  duplicateSeedDetector,
359  *estimatedTrackParametersContainers[icontainer],
360  seedContainers[icontainer],
361  tracksContainer,
362  icontainer,
363  icontainer < m_seedLabels.size() ? m_seedLabels[icontainer].c_str() : m_seedContainerKeys[icontainer].key().c_str(),
364  event_stat));
365  }
366 
367  ATH_MSG_DEBUG(" \\__ Created " << tracksContainer.size() << " tracks");
368 
369  mon_nTracks = tracksContainer.size();
370 
371  copyStats(event_stat);
372 
373  std::unique_ptr<ActsTrk::TrackContainer> constTracksContainer = m_tracksBackendHandlesHelper.moveToConst(std::move(tracksContainer),
374  m_trackingGeometryTool->getGeometryContext(ctx).context(), ctx);
375  // ================================================== //
376  // ===================== OUTPUTS ==================== //
377  // ================================================== //
378  auto trackContainerHandle = SG::makeHandle(m_trackContainerKey, ctx);
379  ATH_MSG_DEBUG(" \\__ Tracks Container `" << m_trackContainerKey.key() << "` created ...");
380 
381  ATH_CHECK(trackContainerHandle.record(std::move(constTracksContainer)));
382  if (!trackContainerHandle.isValid())
383  {
384  ATH_MSG_FATAL("Failed to write TrackContainer with key " << m_trackContainerKey.key());
385  return StatusCode::FAILURE;
386  }
387 
388  return StatusCode::SUCCESS;
389  }
390 
391  // === findTracks ==========================================================
392 
393  StatusCode
394  TrackFindingAlg::findTracks(const EventContext &ctx,
395  const TrackFindingMeasurements &measurements,
396  DuplicateSeedDetector &duplicateSeedDetector,
397  const ActsTrk::BoundTrackParametersContainer &estimatedTrackParameters,
398  const ActsTrk::SeedContainer *seeds,
399  ActsTrk::MutableTrackContainer &tracksContainer,
400  size_t typeIndex,
401  const char *seedType,
402  EventStats &event_stat) const
403  {
404  ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
405 
406  if (seeds && seeds->size() != estimatedTrackParameters.size())
407  {
408  // should be the same, but we can cope if not
409  ATH_MSG_WARNING("Have " << seeds->size() << " " << seedType << " seeds, but " << estimatedTrackParameters.size() << "estimated track parameters");
410  }
411 
412  // Construct a perigee surface as the target surface
413  auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
414 
415  Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
416  Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
417  // CalibrationContext converter not implemented yet.
418  Acts::CalibrationContext calContext = Acts::CalibrationContext();
419 
420  using AtlUncalibSourceLinkAccessor = UncalibSourceLinkAccessor;
421 
422  AtlUncalibSourceLinkAccessor slAccessor(measurements.orderedGeoIds(),
423  measurements.measurementRanges());
424  Acts::SourceLinkAccessorDelegate<UncalibSourceLinkAccessor::Iterator> slAccessorDelegate;
425  slAccessorDelegate.connect<&UncalibSourceLinkAccessor::range>(&slAccessor);
426 
427  // Set the CombinatorialKalmanFilter options
428  using TrackFinderOptions = Acts::CombinatorialKalmanFilterOptions<UncalibSourceLinkAccessor::Iterator, RecoTrackStateContainer>;
429  TrackFinderOptions options(tgContext,
430  mfContext,
431  calContext,
432  slAccessorDelegate,
433  trackFinder().ckfExtensions,
434  trackFinder().pOptions,
435  pSurface.get());
436  if (!m_useDefaultMeasurementSelector.value()) {
437  m_measurementSelector->connect( &options.trackStateCandidateCreator );
438  }
439  std::optional<TrackFinderOptions> secondOptions;
440  if (m_doTwoWay) {
441  secondOptions.emplace(tgContext,
442  mfContext,
443  calContext,
444  slAccessorDelegate,
445  trackFinder().ckfExtensions,
446  trackFinder().pSecondOptions,
447  pSurface.get());
448  secondOptions->targetSurface = pSurface.get();
449  if (!m_useDefaultMeasurementSelector.value()) {
450  m_measurementSelector->connect( &secondOptions->trackStateCandidateCreator);
451  }
452  }
453 
454  // ActsTrk::MutableTrackContainer tracksContainerTemp;
455  Acts::VectorTrackContainer trackBackend;
456  Acts::VectorMultiTrajectory trackStateBackend;
457  RecoTrackContainer tracksContainerTemp(trackBackend, trackStateBackend);
458 
459  // Measurement calibration
460  // N.B. OnTrackCalibrator expects disabled tool handles when no calibration is requested.
461  // Therefore, passing them without checking if they are enabled is safe.
462 
465  measurements.trackingSurfaceHelper(),
468 
469  if (m_useDefaultMeasurementSelector.value()) {
470  // for default measurement selector need connect calibrator
471  options.extensions.calibrator.connect<&OnTrackCalibrator<RecoTrackStateContainer>::calibrate>(&calibrator);
472  if (m_doTwoWay) {
473  secondOptions->extensions.calibrator.connect<&OnTrackCalibrator<RecoTrackStateContainer>::calibrate>(&calibrator);
474  }
475  }
476 
477  const auto &trackSelectorCfg = trackFinder().trackSelector.config();
478  auto getCuts = [&trackSelectorCfg](double eta) -> const Acts::TrackSelector::Config & {
479  return (std::abs(eta) < trackSelectorCfg.absEtaEdges.front()) ? trackSelectorCfg.cutSets.front()
480  : (std::abs(eta) >= trackSelectorCfg.absEtaEdges.back()) ? trackSelectorCfg.cutSets.back()
481  : trackSelectorCfg.getCuts(eta);
482  };
483 
484  std::size_t category_i = 0;
485  const auto measurementContainerOffsets = measurements.measurementContainerOffsets();
486 
487  using BranchStopperResult = Acts::CombinatorialKalmanFilterBranchStopperResult;
488  auto stopBranch = [&](const Acts::CombinatorialKalmanFilterTipState &tipState,
489  RecoTrackStateContainer::TrackStateProxy &trackState) -> BranchStopperResult {
490  if (!m_trackStatePrinter.empty()) {
491  m_trackStatePrinter->printTrackState(tgContext, trackState, measurementContainerOffsets, true);
492  }
493 
494  if (!m_doBranchStopper)
495  return BranchStopperResult::Continue;
496 
497  const auto &parameters = trackState.hasFiltered() ? trackState.filtered() : trackState.predicted();
498  double eta = -std::log(std::tan(0.5 * parameters[Acts::eBoundTheta]));
499  const auto &cutSet = getCuts(eta);
500 
501  if (typeIndex < m_ptMinMeasurements.size() &&
502  !(tipState.nMeasurements < m_ptMinMeasurements[typeIndex])) {
503  double pT = std::sin(parameters[Acts::eBoundTheta]) / parameters[Acts::eBoundQOverP];
504  if (std::abs(pT) < cutSet.ptMin) {
505  ++event_stat[category_i][kNStoppedTracksMinPt];
506  ATH_MSG_DEBUG("CkfBranchStopper: drop branch with q*pT="
507  << pT << " after "
508  << tipState.nMeasurements << " measurements");
509  return BranchStopperResult::StopAndDrop;
510  }
511  }
512 
513  if (typeIndex < m_absEtaMaxMeasurements.size() &&
514  !(tipState.nMeasurements < m_absEtaMaxMeasurements[typeIndex]) &&
515  !(std::abs(eta) < trackSelectorCfg.absEtaEdges.back())) {
516  ++event_stat[category_i][kNStoppedTracksMaxEta];
517  ATH_MSG_DEBUG("CkfBranchStopper: drop branch with eta="
518  << eta << " after "
519  << tipState.nMeasurements << " measurements");
520  return BranchStopperResult::StopAndDrop;
521  }
522 
523  // https://github.com/acts-project/acts/blob/v35.0.0/Core/include/Acts/TrackFinding/MeasurementSelector.ipp#L99
524  // counts any other measurement anywhere on the surface as an outlier, so does not register as a hole.
525  // We really want to count them as holes.
526  if (!(tipState.nHoles > cutSet.maxHoles || tipState.nOutliers > cutSet.maxOutliers))
527  return BranchStopperResult::Continue;
528 
529  bool enoughMeasurements = !(tipState.nMeasurements < cutSet.minMeasurements);
530  if (!enoughMeasurements)
531  ++event_stat[category_i][kNStoppedTracksMaxHoles];
532  ATH_MSG_DEBUG("CkfBranchStopper: stop and "
533  << (enoughMeasurements ? "keep" : "drop")
534  << " branch with nHoles=" << tipState.nHoles
535  << ", nOutliers=" << tipState.nOutliers
536  << ", nMeasurements=" << tipState.nMeasurements);
537  return enoughMeasurements ? BranchStopperResult::StopAndKeep
538  : BranchStopperResult::StopAndDrop;
539  };
540 
541  options.extensions.branchStopper.connect(stopBranch);
542  if (m_doTwoWay)
543  secondOptions->extensions.branchStopper.connect(stopBranch);
544 
545  Acts::PropagatorOptions<Acts::ActionList<Acts::MaterialInteractor>,
546  Acts::AbortList<Acts::EndOfWorldReached>>
547  extrapolationOptions(tgContext, mfContext);
548 
549  Acts::TrackExtrapolationStrategy extrapolationStrategy =
550  Acts::TrackExtrapolationStrategy::firstOrLast;
551 
552  // Perform the track finding for all initial parameters
553  ATH_MSG_DEBUG("Invoke track finding with " << estimatedTrackParameters.size() << ' ' << seedType << " seeds.");
554 
555  std::size_t nPrinted = 0;
556  auto printSeed = [&](std::size_t iseed, const Acts::BoundTrackParameters &seedParameters, bool isKF = false)
557  {
558  if (m_trackStatePrinter.empty() || !seeds)
559  return;
560  if (!nPrinted++)
561  {
562  ATH_MSG_INFO("CKF results for " << estimatedTrackParameters.size() << ' ' << seedType << " seeds:");
563  }
564  m_trackStatePrinter->printSeed(tgContext, *(*seeds)[iseed], seedParameters, measurements.measurementOffset(typeIndex), iseed, isKF);
565  };
566 
567  // Loop over the track finding results for all initial parameters
568  for (std::size_t iseed = 0; iseed < estimatedTrackParameters.size(); ++iseed)
569  {
570  category_i = typeIndex * (m_statEtaBins.size() + 1);
571  tracksContainerTemp.clear();
572 
573  if (!estimatedTrackParameters[iseed])
574  {
575  ATH_MSG_WARNING("No " << seedType << " seed " << iseed);
576  ++event_stat[category_i][kNoTrackParam];
577  continue;
578  }
579 
580  const Acts::BoundTrackParameters *initialParameters = estimatedTrackParameters[iseed];
581  printSeed(iseed, *initialParameters);
582 
583  double eta = -std::log(std::tan(0.5 * initialParameters->theta()));
584  category_i = getStatCategory(typeIndex, eta);
585  ++event_stat[category_i][kNTotalSeeds];
586 
587  if (duplicateSeedDetector.isDuplicate(typeIndex, iseed))
588  {
589  ATH_MSG_DEBUG("skip " << seedType << " seed " << iseed << " - already found");
590  ++event_stat[category_i][kNDuplicateSeeds];
591  continue;
592  }
593 
594  // Get the Acts tracks, given this seed
595  // Result here contains a vector of TrackProxy objects
596  ++event_stat[category_i][kNUsedSeeds];
597 
598  std::unique_ptr<Acts::BoundTrackParameters> seedParameters;
599  if (m_refitSeeds)
600  {
601  // Perform KF before CKF
602  const auto fittedSeedCollection = m_fitterTool->fit(ctx, *(*seeds)[iseed], *initialParameters,
603  tgContext, mfContext, calContext,
604  measurements.trackingSurfaceHelper());
605  if (not fittedSeedCollection)
606  {
607  ATH_MSG_WARNING("KF Fitted Track is nullptr");
608  }
609  else if (fittedSeedCollection->size() != 1)
610  {
611  ATH_MSG_WARNING("KF produced " << fittedSeedCollection->size() << " tracks but should produce 1!");
612  }
613  else
614  {
615  // Check pTmin requirement
616  const auto fittedSeed = fittedSeedCollection->getTrack(0);
617 
618  double etaSeed = -std::log(std::tan(0.5 * fittedSeed.parameters()[Acts::eBoundTheta]));
619  const auto &cutSet = getCuts(etaSeed);
620  if (fittedSeed.transverseMomentum() < cutSet.ptMin)
621  {
622  ATH_MSG_VERBOSE("min pt requirement not satisfied after param refinement: pt min is " << cutSet.ptMin << " but Refined params have pt of " << fittedSeed.transverseMomentum());
623  ++event_stat[category_i][kNRejectedRefinedSeeds];
624  continue;
625  }
626 
627  seedParameters.reset(new Acts::BoundTrackParameters(fittedSeed.referenceSurface().getSharedPtr(),
628  fittedSeed.parameters(),
629  fittedSeed.covariance(),
630  fittedSeed.particleHypothesis()));
631  printSeed(iseed, *seedParameters, true);
632 
633  // Pass the refined params to the CKF
634  initialParameters = seedParameters.get();
635  }
636  }
637 
638  auto result = trackFinder().ckf.findTracks(*initialParameters, options, tracksContainerTemp);
639 
640  // The result for this seed
641  if (not result.ok()) {
642  ATH_MSG_WARNING("Track finding failed for " << seedType << " seed " << iseed << " with error" << result.error());
643  continue;
644  }
645  auto &tracksForSeed = result.value();
646 
647  size_t ntracks = 0;
648 
649  // lambda to collect together all the things we do with a viable track.
650  auto addTrack = [&](const RecoTrackContainerProxy &track) {
651  if (!m_trackStatePrinter.empty()) {
652  m_trackStatePrinter->printTrack(tgContext, tracksContainerTemp, track, measurementContainerOffsets);
653  }
654 
655  // Fill the track infos into the duplicate seed detector
656  if (m_skipDuplicateSeeds) {
657  storeSeedInfo(tracksContainerTemp, track, duplicateSeedDetector);
658  }
659 
660  ++ntracks;
661  ++event_stat[category_i][kNOutputTracks];
662 
663  // copy selected tracks into output tracksContainer
664  if (trackFinder().trackSelector.isValidTrack(track)) {
665  auto destProxy = tracksContainer.getTrack(tracksContainer.addTrack());
666  destProxy.copyFrom(track, true); // make sure we copy track states!
667  ++event_stat[category_i][kNSelectedTracks];
668  } else {
669  ATH_MSG_DEBUG("Track " << ntracks << " from " << seedType << " seed " << iseed << " failed track selection");
670  }
671  };
672 
673  std::size_t nfirst = 0;
674  for (auto &firstTrack : tracksForSeed) {
675  std::size_t nsecond = 0;
676 
677  auto smoothingResult = Acts::smoothTrack(tgContext, firstTrack, logger());
678  if (!smoothingResult.ok()) {
679  ATH_MSG_DEBUG("Smoothing for seed "
680  << iseed << " and first track " << firstTrack.index()
681  << " failed with error " << smoothingResult.error());
682  continue;
683  }
684 
685  if (m_doTwoWay) {
686  std::optional<RecoTrackStateContainerProxy> firstState;
687  for (auto st : firstTrack.trackStatesReversed()) {
688  bool isMeasurement = st.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag);
689  bool isOutlier = st.typeFlags().test(Acts::TrackStateFlag::OutlierFlag);
690  // We are excluding non measurement states and outlier here. Those can
691  // decrease resolution because only the smoothing corrected the very
692  // first prediction as filtering is not possible.
693  if (isMeasurement && !isOutlier)
694  firstState = st;
695  }
696 
697  if (firstState.has_value()) {
698  Acts::BoundTrackParameters secondInitialParameters(
699  firstState->referenceSurface().getSharedPtr(),
700  firstState->parameters(), firstState->covariance(),
701  initialParameters->particleHypothesis());
702 
703  auto secondResult = trackFinder().ckf.findTracks(secondInitialParameters, *secondOptions, tracksContainerTemp);
704 
705  if (not secondResult.ok()) {
706  ATH_MSG_WARNING("Second track finding failed for " << seedType << " seed " << iseed << " track " << nfirst << " with error" << secondResult.error());
707  } else {
708  auto firstFirstState = std::next(firstTrack.trackStatesReversed().begin(),
709  firstTrack.nTrackStates() - 1);
710 
711  auto &secondTracksForSeed = secondResult.value();
712  for (auto &secondTrack : secondTracksForSeed) {
713  if (secondTrack.nTrackStates() < 2) {
714  ATH_MSG_DEBUG("Second track from " << seedType << " seed " << iseed << " track " << nfirst << " has only " << secondTrack.nTrackStates() << " track states");
715  continue;
716  }
717 
718  secondTrack.reverseTrackStates(true);
719 
720  (*firstFirstState).previous() = (*std::next(secondTrack.trackStatesReversed().begin())).index();
721  secondTrack.tipIndex() = firstTrack.tipIndex();
722 
723  Acts::calculateTrackQuantities(secondTrack);
724 
725  auto extrapolationResult = Acts::extrapolateTrackToReferenceSurface(
726  secondTrack, *pSurface, trackFinder().extrapolator, extrapolationOptions,
727  extrapolationStrategy, logger());
728  if (!extrapolationResult.ok()) {
729  ATH_MSG_WARNING("Extrapolation for seed "
730  << iseed << " and second track " << secondTrack.index()
731  << " failed with error " << extrapolationResult.error());
732 
733  // restore first track
734  (*firstFirstState).previous() = Acts::kTrackIndexInvalid;
735 
736  continue;
737  }
738 
739  addTrack(secondTrack);
740 
741  // restore first track
742  (*firstFirstState).previous() = Acts::kTrackIndexInvalid;
743 
744  ++nsecond;
745  }
746  }
747  }
748  }
749  if (nsecond == 0) {
750  if (m_doTwoWay) {
751  ATH_MSG_DEBUG("No viable result from second track finding for " << seedType << " seed " << iseed << " track " << nfirst);
752  ++event_stat[category_i][kNoSecond];
753  }
754 
755  auto extrapolationResult = Acts::extrapolateTrackToReferenceSurface(
756  firstTrack, *pSurface, trackFinder().extrapolator, extrapolationOptions,
757  extrapolationStrategy, logger());
758  if (!extrapolationResult.ok()) {
759  ATH_MSG_WARNING("Extrapolation for seed "
760  << iseed << " and first " << firstTrack.index()
761  << " failed with error " << extrapolationResult.error());
762  continue;
763  }
764 
765  addTrack(firstTrack);
766  }
767  nfirst++;
768  }
769  if (ntracks == 0) {
770  ATH_MSG_DEBUG("Track finding found no track candidates for " << seedType << " seed " << iseed);
771  ++event_stat[category_i][kNoTrack];
772  } else if (ntracks >= 2) {
773  ++event_stat[category_i][kMultipleBranches];
774  }
775  if (!m_trackStatePrinter.empty())
776  std::cout << std::flush;
777  }
778 
779  ATH_MSG_DEBUG("Completed " << seedType << " track finding with " << computeStatSum(typeIndex, kNOutputTracks, event_stat) << " track candidates.");
780 
781  return StatusCode::SUCCESS;
782  }
783 
784  void
787  DuplicateSeedDetector &duplicateSeedDetector) const {
788 
789  const auto lastMeasurementIndex = track.tipIndex();
790  duplicateSeedDetector.newTrajectory();
791 
792  tracksContainer.trackStateContainer().visitBackwards(
793  lastMeasurementIndex,
794  [&duplicateSeedDetector](const RecoTrackStateContainer::ConstTrackStateProxy &state) -> void
795  {
796  // Check there is a source link
797  if (not state.hasUncalibratedSourceLink())
798  return;
799 
800  // Fill the duplicate selector
801  auto sl = state.getUncalibratedSourceLink().template get<ATLASUncalibSourceLink>();
802  duplicateSeedDetector.addMeasurement(sl);
803  }); // end visitBackwards
804  }
805 
806  // === Statistics printout =================================================
807 
809  {
810  if (!m_statEtaBins.empty())
811  {
812  m_useAbsEtaForStat = (m_statEtaBins[0] > 0.);
813  float last_eta = m_statEtaBins[0];
814  for (float eta : m_statEtaBins)
815  {
816  if (eta < last_eta)
817  {
818  ATH_MSG_FATAL("Eta bins for statistics counter not in ascending order.");
819  }
820  last_eta = eta;
821  }
822  }
823  m_stat.resize(nSeedCollections() * seedCollectionStride());
824  }
825 
826  // copy statistics
827  void TrackFindingAlg::copyStats(const EventStats &event_stat) const
828  {
829  std::lock_guard<std::mutex> lock(m_mutex);
830  std::size_t category_i = 0;
831  for (const std::array<unsigned int, kNStat> &src_stat : event_stat)
832  {
833  std::array<std::size_t, kNStat> &dest_stat = m_stat[category_i++];
834  for (std::size_t i = 0; i < src_stat.size(); ++i)
835  {
836  assert(i < dest_stat.size());
837  dest_stat[i] += src_stat[i];
838  }
839  }
840  }
841 
842  // print statistics
844  {
845  if (msgLvl(MSG::INFO))
846  {
847  std::vector<std::string> stat_labels =
849  {
850  std::make_pair(kNTotalSeeds, "Input seeds"),
851  std::make_pair(kNoTrackParam, "No track parameters"),
852  std::make_pair(kNUsedSeeds, "Used seeds"),
853  std::make_pair(kNoTrack, "Cannot find track"),
854  std::make_pair(kNDuplicateSeeds, "Duplicate seeds"),
855  std::make_pair(kNRejectedRefinedSeeds, "Rejected refined parameters"),
856  std::make_pair(kNOutputTracks, "CKF tracks"),
857  std::make_pair(kNSelectedTracks, "selected tracks"),
858  std::make_pair(kNStoppedTracksMaxHoles, "Stopped tracks reaching max holes"),
859  std::make_pair(kMultipleBranches, "Seeds with more than one branch"),
860  std::make_pair(kNoSecond, "Tracks failing second CKF"),
861  std::make_pair(kNStoppedTracksMinPt, "Stopped tracks below pT cut"),
862  std::make_pair(kNStoppedTracksMaxEta, "Stopped tracks above max eta"),
863  });
864  assert(stat_labels.size() == kNStat);
865  std::vector<std::string> categories;
866  categories.reserve(m_seedLabels.size() + 1);
867  categories.insert(categories.end(), m_seedLabels.begin(), m_seedLabels.end());
868  categories.push_back("ALL");
869 
870  std::vector<std::string> eta_labels;
871  eta_labels.reserve(m_statEtaBins.size() + 2);
872  for (std::size_t eta_bin_i = 0; eta_bin_i < m_statEtaBins.size() + 2; ++eta_bin_i)
873  {
874  eta_labels.push_back(TableUtils::makeEtaBinLabel(m_statEtaBins, eta_bin_i, m_useAbsEtaForStat));
875  }
876 
877  // vector used as 3D array stat[ eta_bin ][ stat_i ][ seed_type]
878  // stat_i = [0, kNStat)
879  // eta_bin = [0, m_statEtaBins.size()+2 ); eta_bin == m_statEtaBinsSize()+1 means sum of all etaBins
880  // seed_type = [0, nSeedCollections()+1) seed_type == nSeedCollections() means sum of all seed collections
881  std::vector<std::size_t> stat =
882  TableUtils::createCounterArrayWithProjections<std::size_t>(nSeedCollections(),
883  m_statEtaBins.size() + 1,
884  m_stat);
885 
886  // the extra columns and rows for the projections are addeded internally:
887  std::size_t stat_stride =
889  m_statEtaBins.size() + 1,
890  kNStat);
891  std::size_t eta_stride =
893  m_statEtaBins.size() + 1,
894  kNStat);
895  std::stringstream table_out;
896 
897  if (m_dumpAllStatEtaBins.value())
898  {
899  // dump for each counter a table with one row per eta bin
900  std::size_t max_label_width = TableUtils::maxLabelWidth(stat_labels) + TableUtils::maxLabelWidth(eta_labels);
901  for (std::size_t stat_i = 0; stat_i < kNStat; ++stat_i)
902  {
903  std::size_t dest_idx_offset = stat_i * stat_stride;
904  table_out << makeTable(stat, dest_idx_offset, eta_stride,
905  eta_labels,
906  categories)
907  .columnWidth(10)
908  // only dump the footer for the last eta bin i.e. total
909  .dumpHeader(stat_i == 0)
910  .dumpFooter(stat_i + 1 == kNStat)
911  .separateLastRow(true) // separate the sum of all eta bins
912  .minLabelWidth(max_label_width)
913  .labelPrefix(stat_labels.at(stat_i));
914  }
915  }
916  else
917  {
918  // dump one table with one row per counter showing the total eta range
919  for (std::size_t eta_bin_i = (m_dumpAllStatEtaBins.value() ? 0 : m_statEtaBins.size() + 1);
920  eta_bin_i < m_statEtaBins.size() + 2;
921  ++eta_bin_i)
922  {
923  std::size_t dest_idx_offset = eta_bin_i * eta_stride;
924  table_out << makeTable(stat, dest_idx_offset, stat_stride,
925  stat_labels,
926  categories,
927  eta_labels.at(eta_bin_i))
928  .columnWidth(10)
929  // only dump the footer for the last eta bin i.e. total
930  .dumpFooter(!m_dumpAllStatEtaBins.value() || eta_bin_i == m_statEtaBins.size() + 1);
931  }
932  }
933  ATH_MSG_INFO("statistics:\n"
934  << table_out.str());
935  table_out.str("");
936 
937  // define retios first element numerator, second element denominator
938  // each element contains a vector of counter and a multiplier e.g. +- 1
939  // ratios are computed as (sum_i stat[stat_i] * multiplier_i ) / (sum_j stat[stat_j] * multiplier_j )
940  auto [ratio_labels, ratio_def] =
942  std::vector<TableUtils::SummandDefinition>{
946  // no track counted as used but want to include it as failed
948  }, // failed seeds i.e. seeds which are not duplicates but did not produce a track
949  std::vector<TableUtils::SummandDefinition>{TableUtils::defineSummand(kNTotalSeeds, 1)}),
951  TableUtils::defineSimpleRatio("Rejected refined params / seeds", kNRejectedRefinedSeeds, kNTotalSeeds),
953  TableUtils::defineSimpleRatio("selected tracks / used seeds", kNSelectedTracks, kNUsedSeeds),
954  TableUtils::defineSimpleRatio("branched tracks / used seeds", kMultipleBranches, kNUsedSeeds),
955  TableUtils::defineSimpleRatio("no 2nd CKF / CKF tracks", kNoSecond, kNOutputTracks)});
956 
957  std::vector<float> ratio = TableUtils::computeRatios(ratio_def,
958  nSeedCollections() + 1,
959  m_statEtaBins.size() + 2,
960  stat);
961 
962  // the extra columns and rows for the projections are _not_ added internally
963  std::size_t ratio_stride = TableUtils::ratioStride(nSeedCollections() + 1,
964  m_statEtaBins.size() + 2,
965  ratio_def);
966  std::size_t ratio_eta_stride = TableUtils::subCategoryStride(nSeedCollections() + 1,
967  m_statEtaBins.size() + 2,
968  ratio_def);
969 
970  std::size_t max_label_width = TableUtils::maxLabelWidth(ratio_labels) + TableUtils::maxLabelWidth(eta_labels);
971  if (m_dumpAllStatEtaBins.value())
972  {
973  // show for each ratio a table with one row per eta bin
974  for (std::size_t ratio_i = 0; ratio_i < ratio_labels.size(); ++ratio_i)
975  {
976  table_out << makeTable(ratio,
977  ratio_i * ratio_stride,
978  ratio_eta_stride,
979  eta_labels,
980  categories)
981  .columnWidth(10)
982  // only dump the footer for the last eta bin i.e. total
983  .dumpHeader(ratio_i == 0)
984  .dumpFooter(ratio_i + 1 == ratio_labels.size())
985  .separateLastRow(true) // separate the sum of las
986  .minLabelWidth(max_label_width)
987  .labelPrefix(ratio_labels.at(ratio_i));
988  }
989  }
990  else
991  {
992  // dump one table with one row per ratio showing the total eta range
993  table_out << makeTable(ratio,
994  (m_statEtaBins.size() + 1) * ratio_eta_stride + 0 * ratio_stride,
995  ratio_stride,
996  ratio_labels,
997  categories)
998  .columnWidth(10)
999  // only dump the footer for the last eta bin i.e. total
1000  .minLabelWidth(max_label_width)
1001  .dumpFooter(false);
1002 
1003  // also dump a table for final tracks over seeds (ratio_i==3) showing one row per eta bin
1004  eta_labels.erase(eta_labels.end() - 1); // drop last line of table which shows again all eta bins summed.
1005  constexpr std::size_t ratio_i = 3;
1006  table_out << makeTable(ratio,
1007  ratio_i * ratio_stride,
1008  ratio_eta_stride,
1009  eta_labels,
1010  categories)
1011  .columnWidth(10)
1012  .dumpHeader(false)
1013  // only dump the footer for the last eta bin i.e. total
1014  .dumpFooter(!m_dumpAllStatEtaBins.value() || ratio_i + 1 == ratio_labels.size())
1015  .separateLastRow(false)
1016  .minLabelWidth(max_label_width)
1017  .labelPrefix(ratio_labels.at(ratio_i));
1018  }
1019 
1020  ATH_MSG_INFO("Ratios:\n"
1021  << table_out.str());
1022  }
1023  }
1024 
1025  inline std::size_t TrackFindingAlg::getStatCategory(std::size_t seed_collection, float eta) const
1026  {
1027  std::vector<float>::const_iterator bin_iter = std::upper_bound(m_statEtaBins.begin(),
1028  m_statEtaBins.end(),
1029  m_useAbsEtaForStat ? std::abs(eta) : eta);
1030  std::size_t category_i = seed_collection * seedCollectionStride() + static_cast<std::size_t>(bin_iter - m_statEtaBins.begin());
1031  assert(category_i < m_stat.size());
1032  return category_i;
1033  }
1034 
1035  inline std::size_t TrackFindingAlg::computeStatSum(std::size_t seed_collection, EStat counter_i, const EventStats &stat) const
1036  {
1037  std::size_t out = 0u;
1038  for (std::size_t category_i = seed_collection * seedCollectionStride() + static_cast<std::size_t>(counter_i);
1039  category_i < (seed_collection + 1) * seedCollectionStride();
1040  ++category_i)
1041  {
1042  assert(category_i < stat.size());
1043  out += stat[category_i][counter_i];
1044  }
1045  return out;
1046  }
1047 
1048 
1050  std::vector<std::pair<float, float> > chi2CutOffOutlier ;
1051  chi2CutOffOutlier .reserve( m_chi2CutOff.size() );
1052  if (!m_chi2OutlierCutOff.empty()) {
1053  if (m_chi2CutOff.size() != m_chi2OutlierCutOff.size()) {
1054  ATH_MSG_ERROR("Outlier chi2 cut off provided but number of elements does not agree with"
1055  " chi2 cut off for measurements which however is required: "
1056  << m_chi2CutOff.size() << " != " << m_chi2OutlierCutOff.size());
1057  return StatusCode::FAILURE;
1058  }
1059  }
1060  unsigned int idx=0;
1061  for (const auto &elm : m_chi2CutOff) {
1062  chi2CutOffOutlier.push_back( std::make_pair(static_cast<float>(elm),
1063  idx < m_chi2OutlierCutOff.size()
1064  ? static_cast<float>(m_chi2OutlierCutOff[idx])
1066  ++idx;
1067  }
1068  std::vector<float> etaBinsf;
1069  if (m_etaBins.size() > 2) {
1070  etaBinsf.assign(m_etaBins.begin() + 1, m_etaBins.end() - 1);
1071  }
1072 
1074  m_pixelCalibTool.isEnabled() ? &(*m_pixelCalibTool) : nullptr,
1075  etaBinsf,
1076  chi2CutOffOutlier,
1077  m_numMeasurementsCutOff.value());
1078 
1079  return m_measurementSelector ? StatusCode::SUCCESS : StatusCode::FAILURE;
1080  }
1081 
1082 } // namespace
SCT_ClusterOnTrack.h
CalculateHighPtTerm.pT
pT
Definition: ICHEP2016/CalculateHighPtTerm.py:57
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ActsTrk::TrackFindingAlg::m_extrapolationTool
ToolHandle< IActsExtrapolationTool > m_extrapolationTool
Definition: TrackFindingAlg.h:88
TrigDefs::Group
Group
Properties of a chain group.
Definition: GroupProperties.h:13
ActsTrk::TrackFindingAlg::m_maxSharedHits
Gaudi::Property< std::vector< std::size_t > > m_maxSharedHits
Definition: TrackFindingAlg.h:136
ActsTrk::TrackFindingAlg::m_statEtaBins
Gaudi::Property< std::vector< float > > m_statEtaBins
Definition: TrackFindingAlg.h:140
get_generator_info.result
result
Definition: get_generator_info.py:21
max
#define max(a, b)
Definition: cfImp.cxx:41
ActsTrk::TrackFindingAlg::kNStoppedTracksMaxEta
@ kNStoppedTracksMaxEta
Definition: TrackFindingAlg.h:160
TrackParameters.h
ActsTrk::TrackFindingAlg::m_trackingGeometryTool
ToolHandle< IActsTrackingGeometryTool > m_trackingGeometryTool
Definition: TrackFindingAlg.h:89
ActsTrk::MutableTrackContainerHandlesHelper::moveToConst
std::unique_ptr< ActsTrk::TrackContainer > moveToConst(ActsTrk::MutableTrackContainer &&tc, const Acts::GeometryContext &geoContext, const EventContext &evtContext) const
produces ActsTrk::ConstTrackContainer with all backends stored in SG
Definition: TrackContainerHandlesHelper.cxx:130
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FullCPAlgorithmsTest_eljob.flush
flush
Definition: FullCPAlgorithmsTest_eljob.py:168
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
ActsGeometryContext.h
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
ActsTrk::TrackFindingAlg::logger
const Acts::Logger & logger() const
Private access to the logger.
Definition: TrackFindingAlg.h:228
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
ActsTrk::TrackFindingAlg::m_absEtaMax
Gaudi::Property< double > m_absEtaMax
Definition: TrackFindingAlg.h:130
ConvertOldUJHistosToNewHistos.etaBins
list etaBins
Definition: ConvertOldUJHistosToNewHistos.py:145
ActsTrk::TrackFindingAlg::TrackFindingAlg
TrackFindingAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrackFindingAlg.cxx:57
ActsTrk::TrackFindingAlg::kNoTrack
@ kNoTrack
Definition: TrackFindingAlg.h:151
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:205
ATLASMagneticFieldWrapper.h
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
ActsTrk::TrackFindingAlg::m_phiMin
Gaudi::Property< std::vector< double > > m_phiMin
Definition: TrackFindingAlg.h:125
TableUtils::defineSimpleRatio
RatioDefinition defineSimpleRatio(T numerator, T denominator)
Definition: TableUtils.h:382
ActsTrk::TrackFindingAlg::trackFinder
CKF_pimpl & trackFinder()
Definition: TrackFindingAlg.cxx:54
ActsTrk::prefixFromTrackContainerName
std::string prefixFromTrackContainerName(const std::string &tracks)
Parse TrackContainer name to get the prefix for backends The name has to contain XYZTracks,...
Definition: TrackContainerHandlesHelper.cxx:18
TrackingSurfaceHelper.h
ActsTrk::TrackFindingAlg::m_maxOutliers
Gaudi::Property< std::vector< std::size_t > > m_maxOutliers
Definition: TrackFindingAlg.h:135
ActsTrk::TrackFindingAlg::kNOutputTracks
@ kNOutputTracks
Definition: TrackFindingAlg.h:153
ActsTrk::TrackFindingAlg::kNUsedSeeds
@ kNUsedSeeds
Definition: TrackFindingAlg.h:150
ActsTrk::TrackFindingAlg::m_useAbsEtaForStat
bool m_useAbsEtaForStat
Definition: TrackFindingAlg.h:223
ActsTrk::TrackFindingAlg::kNoTrackParam
@ kNoTrackParam
Definition: TrackFindingAlg.h:149
ActsTrk::TrackFindingAlg::m_seedContainerKeys
SG::ReadHandleKeyArray< ActsTrk::SeedContainer > m_seedContainerKeys
Definition: TrackFindingAlg.h:100
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
empty
bool empty(TH1 *h)
Definition: computils.cxx:294
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
ActsTrk::MutableTrackContainerHandlesHelper::initialize
StatusCode initialize(const std::string &prefix)
Sets up the handles.
Definition: TrackContainerHandlesHelper.cxx:51
python.utils.AtlRunQueryTimer.timer
def timer(name, disabled=False)
Definition: AtlRunQueryTimer.py:86
ActsTrk::TrackFindingAlg::m_maxPropagationStep
Gaudi::Property< unsigned int > m_maxPropagationStep
Definition: TrackFindingAlg.h:110
ActsTrk::TrackFindingAlg::storeSeedInfo
void storeSeedInfo(const RecoTrackContainer &tracksContainer, const RecoTrackContainerProxy &track, DuplicateSeedDetector &duplicateSeedDetector) const
Definition: TrackFindingAlg.cxx:785
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
TableUtils::subCategoryStride
constexpr std::size_t subCategoryStride([[maybe_unused]] const std::size_t categories, [[maybe_unused]] const std::size_t sub_categories, [[maybe_unused]] const std::size_t n_counter)
Definition: TableUtils.h:302
ActsTrk::UncalibSourceLinkAccessor
GenUncalibSourceLinkAccessor< MeasurementRangeList > UncalibSourceLinkAccessor
Definition: AtlasUncalibSourceLinkAccessor.h:199
ActsTrk::TrackFindingAlg::nSeedCollections
std::size_t nSeedCollections() const
Definition: TrackFindingAlg.h:212
ActsTrk::TrackFindingAlg::m_estimatedTrackParametersKeys
SG::ReadHandleKeyArray< ActsTrk::BoundTrackParametersContainer > m_estimatedTrackParametersKeys
Definition: TrackFindingAlg.h:101
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:269
ActsTrk::TrackFindingAlg::m_uncalibratedMeasurementContainerKeys
SG::ReadHandleKeyArray< xAOD::UncalibratedMeasurementContainer > m_uncalibratedMeasurementContainerKeys
Definition: TrackFindingAlg.h:103
makeActsAthenaLogger
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Definition: Tracking/Acts/ActsInterop/src/Logger.cxx:64
ActsTrk::TrackFindingAlg::copyStats
void copyStats(const EventStats &event_stat) const
Definition: TrackFindingAlg.cxx:827
ActsTrk::TrackFindingAlg::m_chi2OutlierCutOff
Gaudi::Property< std::vector< double > > m_chi2OutlierCutOff
Definition: TrackFindingAlg.h:116
ActsTrk::TrackFindingAlg::finalize
virtual StatusCode finalize() override
Definition: TrackFindingAlg.cxx:236
ActsTrk::TrackFindingAlg::printStatTables
void printStatTables() const
Definition: TrackFindingAlg.cxx:843
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
ActsTrk::TrackFindingAlg::computeStatSum
std::size_t computeStatSum(std::size_t seed_collection, EStat counter_i, const EventStats &stat) const
Definition: TrackFindingAlg.cxx:1035
OnTrackCalibrator.h
ActsTrk::TrackFindingAlg::kNDuplicateSeeds
@ kNDuplicateSeeds
Definition: TrackFindingAlg.h:152
ActsTrk::TrackFindingAlg::m_seedLabels
Gaudi::Property< std::vector< std::string > > m_seedLabels
Definition: TrackFindingAlg.h:141
SCT_ClusterCollection.h
ActsTrk::TrackFindingAlg::RecoTrackContainerProxy
RecoTrackContainer::TrackProxy RecoTrackContainerProxy
Definition: TrackFindingAlg.h:71
xAOD::addTrack
@ addTrack
Definition: TrackingPrimitives.h:465
TableUtils::counterStride
constexpr std::size_t counterStride([[maybe_unused]] const std::size_t categories, [[maybe_unused]] const std::size_t sub_categories, [[maybe_unused]] const std::size_t n_counter)
Definition: TableUtils.h:307
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
python.web.makeTable
def makeTable(name, ids)
Definition: web.py:28
SG::ReadCondHandle::retrieve
const_pointer_type retrieve()
Definition: ReadCondHandle.h:161
fillPileUpNoiseLumi.next
next
Definition: fillPileUpNoiseLumi.py:52
TableUtils::maxLabelWidth
std::size_t maxLabelWidth(const T_Collection &col)
Definition: TableUtils.h:288
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ActsTrk::TrackFindingAlg::m_ptMin
Gaudi::Property< std::vector< double > > m_ptMin
Definition: TrackFindingAlg.h:131
ActsTrk::TrackFindingAlg::m_detEleCollKeys
SG::ReadCondHandleKeyArray< InDetDD::SiDetectorElementCollection > m_detEleCollKeys
Definition: TrackFindingAlg.h:104
ActsTrk::TrackFindingAlg::initializeMeasurementSelector
StatusCode initializeMeasurementSelector()
Definition: TrackFindingAlg.cxx:1049
plotBeamSpotVert.cuts
string cuts
Definition: plotBeamSpotVert.py:93
ActsTrk::TrackFindingAlg::findTracks
StatusCode findTracks(const EventContext &ctx, const TrackFindingMeasurements &measurements, DuplicateSeedDetector &duplicateSeedDetector, const ActsTrk::BoundTrackParametersContainer &estimatedTrackParameters, const ActsTrk::SeedContainer *seeds, ActsTrk::MutableTrackContainer &tracksContainer, size_t seedCollectionIndex, const char *seedType, EventStats &event_stat) const
invoke track finding procedure
Definition: TrackFindingAlg.cxx:394
xAOD::Other
@ Other
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ActsTrk::TrackFindingAlg::kNStoppedTracksMinPt
@ kNStoppedTracksMinPt
Definition: TrackFindingAlg.h:159
ActsTrk::TrackFindingAlg::m_absEtaMin
Gaudi::Property< double > m_absEtaMin
Definition: TrackFindingAlg.h:129
python.AtlRunQueryLib.options
options
Definition: AtlRunQueryLib.py:379
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
TrackSummary.h
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
ActsDetectorElement.h
PixelClusterCollection.h
ActsTrk::TrackFindingAlg::m_numMeasurementsCutOff
Gaudi::Property< std::vector< size_t > > m_numMeasurementsCutOff
Definition: TrackFindingAlg.h:117
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
ActsTrk::TrackFindingAlg::m_useDefaultMeasurementSelector
Gaudi::Property< bool > m_useDefaultMeasurementSelector
Definition: TrackFindingAlg.h:144
beamspotman.stat
stat
Definition: beamspotman.py:266
ActsTrk::TrackFindingAlg::m_monTool
ToolHandle< GenericMonitoringTool > m_monTool
Definition: TrackFindingAlg.h:87
Monitored.h
Header file to be included by clients of the Monitored infrastructure.
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
ActsTrk::TrackFindingAlg::m_measurementSelector
std::unique_ptr< ActsTrk::IMeasurementSelector > m_measurementSelector
Definition: TrackFindingAlg.h:204
ActsTrk::TrackFindingAlg::kNRejectedRefinedSeeds
@ kNRejectedRefinedSeeds
Definition: TrackFindingAlg.h:154
ActsTrk::TrackFindingAlg::initialize
virtual StatusCode initialize() override
Definition: TrackFindingAlg.cxx:67
ActsTrk::TrackFindingAlg::RecoTrackContainer
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
Definition: TrackFindingAlg.h:70
ActsTrk::GenUncalibSourceLinkAccessor::range
std::pair< Iterator, Iterator > range(const Acts::Surface &surface) const
Definition: AtlasUncalibSourceLinkAccessor.h:151
TrackFindingData.h
TableUtils::makeLabelVector
std::vector< std::string > makeLabelVector(T_index n_entries, std::initializer_list< std::pair< T_index, T_string > > a_list)
Definition: TableUtils.h:273
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
RIO_OnTrack.h
AtlasMeasurementSelector.h
ActsTrk::TrackFindingAlg::kMultipleBranches
@ kMultipleBranches
Definition: TrackFindingAlg.h:157
ActsTrk::getMeasurementSelector
std::unique_ptr< ActsTrk::IMeasurementSelector > getMeasurementSelector([[maybe_unused]] const ActsTrk::IActsToTrkConverterTool &ATLASConverterTool, const ActsTrk::IOnBoundStateCalibratorTool *onTrackCalibratorTool, const std::vector< float > &etaBinsf, const std::vector< std::pair< float, float > > &chi2CutOffOutlier, const std::vector< size_t > &numMeasurementsCutOff)
Definition: AtlasMeasurementSelector.cxx:345
WriteCaloSwCorrections.cfg
cfg
Definition: WriteCaloSwCorrections.py:23
TableUtils::splitRatioDefinitionsAndLabels
std::tuple< std::vector< std::string >, std::vector< RatioDefinition > > splitRatioDefinitionsAndLabels(std::initializer_list< std::tuple< std::string, RatioDefinition > > a_ratio_list)
Definition: TableUtils.h:446
ActsTrk::TrackFindingAlg::~TrackFindingAlg
virtual ~TrackFindingAlg()
ActsTrk::TrackFindingAlg::m_chi2CutOff
Gaudi::Property< std::vector< double > > m_chi2CutOff
Definition: TrackFindingAlg.h:115
ActsTrk::TrackFindingAlg::m_doBranchStopper
Gaudi::Property< bool > m_doBranchStopper
Definition: TrackFindingAlg.h:120
TableUtils::makeEtaBinLabel
std::string makeEtaBinLabel(const std::vector< float > &eta_bins, std::size_t eta_bin_i, bool abs_eta=false)
Definition: TableUtils.h:512
DeMoScan.index
string index
Definition: DeMoScan.py:362
ActsTrk::TrackFindingAlg::m_skipDuplicateSeeds
Gaudi::Property< bool > m_skipDuplicateSeeds
Definition: TrackFindingAlg.h:111
mergePhysValFiles.categories
list categories
Definition: PhysicsAnalysis/JetTagging/JetTagValidation/JetTagDQA/scripts/mergePhysValFiles.py:18
ActsTrk::TrackFindingAlg::CKF_pimpl
Definition: TrackFindingAlg.cxx:51
FitterHelperFunctions.h
ActsTrk::TrackFindingAlg::getStatCategory
std::size_t getStatCategory(std::size_t seed_collection, float eta) const
Definition: TrackFindingAlg.cxx:1025
ActsTrk::TrackFindingAlg::initStatTables
void initStatTables()
Definition: TrackFindingAlg.cxx:808
python.compareTCTs.ratio
ratio
Definition: compareTCTs.py:295
ActsTrk::TrackFindingAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: TrackFindingAlg.cxx:244
TrackFindingAlg.h
ActsTrk::TrackFindingAlg::m_etaMin
Gaudi::Property< std::vector< double > > m_etaMin
Definition: TrackFindingAlg.h:127
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
ActsTrk::TrackFindingAlg::kNStat
@ kNStat
Definition: TrackFindingAlg.h:161
ActsTrk::TrackFindingAlg::m_minMeasurements
Gaudi::Property< std::vector< std::size_t > > m_minMeasurements
Definition: TrackFindingAlg.h:133
ActsTrk::TrackFindingAlg::m_ptMinMeasurements
Gaudi::Property< std::vector< std::size_t > > m_ptMinMeasurements
Definition: TrackFindingAlg.h:118
plotBeamSpotMon.mon
mon
Definition: plotBeamSpotMon.py:67
ActsTrk::TrackFindingAlg::m_logger
std::unique_ptr< const Acts::Logger > m_logger
logging instance
Definition: TrackFindingAlg.h:234
ActsTrk::TrackFindingAlg::m_trackStatePrinter
ToolHandle< ActsTrk::TrackStatePrinter > m_trackStatePrinter
Definition: TrackFindingAlg.h:91
ActsTrk::TrackFindingAlg::m_tracksBackendHandlesHelper
ActsTrk::MutableTrackContainerHandlesHelper m_tracksBackendHandlesHelper
Definition: TrackFindingAlg.h:107
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
xAOD::UncalibMeasType
UncalibMeasType
Define the type of the uncalibrated measurement.
Definition: MeasurementDefs.h:24
ActsTrk::TrackFindingAlg::m_trackFinder
std::unique_ptr< CKF_pimpl > m_trackFinder
Definition: TrackFindingAlg.h:205
ActsTrk::TrackFindingAlg::m_stripCalibTool
ToolHandle< ActsTrk::IOnTrackCalibratorTool< RecoTrackStateContainer > > m_stripCalibTool
Definition: TrackFindingAlg.h:95
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
ActsTrk::TrackFindingAlg::m_doTwoWay
Gaudi::Property< bool > m_doTwoWay
Definition: TrackFindingAlg.h:121
ActsTrk::TrackFindingAlg::EventStats
std::vector< std::array< unsigned int, kNStat > > EventStats
Definition: TrackFindingAlg.h:163
ActsTrk::TrackFindingAlg::m_trackContainerKey
SG::WriteHandleKey< ActsTrk::TrackContainer > m_trackContainerKey
Definition: TrackFindingAlg.h:106
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
ActsTrk::TrackFindingAlg::kNTotalSeeds
@ kNTotalSeeds
Definition: TrackFindingAlg.h:148
ActsTrk::TrackFindingAlg::kNSelectedTracks
@ kNSelectedTracks
Definition: TrackFindingAlg.h:155
ActsTrk::TrackFindingAlg::kNoSecond
@ kNoSecond
Definition: TrackFindingAlg.h:158
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:34
ActsTrk::TrackFindingAlg::m_absEtaMaxMeasurements
Gaudi::Property< std::vector< std::size_t > > m_absEtaMaxMeasurements
Definition: TrackFindingAlg.h:119
ActsTrk::TrackFindingAlg::m_etaBins
Gaudi::Property< std::vector< double > > m_etaBins
Definition: TrackFindingAlg.h:113
ActsTrk::TrackFindingAlg::m_maxChi2
Gaudi::Property< std::vector< double > > m_maxChi2
Definition: TrackFindingAlg.h:137
ActsTrk::TrackFindingAlg::seedCollectionStride
std::size_t seedCollectionStride() const
Definition: TrackFindingAlg.h:216
ActsTrk::OnTrackCalibrator
Definition: IOnTrackCalibratorTool.h:13
TableUtils.h
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
TableUtils::makeRatioDefinition
std::tuple< std::string, RatioDefinition > makeRatioDefinition(std::string &&name, std::vector< SummandDefinition > &&numerator, std::vector< SummandDefinition > &&denominator)
Definition: TableUtils.h:436
ActsTrk::TrackFindingAlg::m_ptMax
Gaudi::Property< std::vector< double > > m_ptMax
Definition: TrackFindingAlg.h:132
TableUtils::ratioStride
constexpr std::size_t ratioStride([[maybe_unused]] const std::size_t categories, [[maybe_unused]] const std::size_t sub_categories, [[maybe_unused]] const std::vector< RatioDefinition > &ratio_def)
Definition: TableUtils.h:471
ToolStore.h
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
TableUtils::computeRatios
std::vector< float > computeRatios(const std::vector< RatioDefinition > &ratio_def, const std::size_t categories, const std::size_t sub_categories, const std::vector< std::size_t > &counter)
Definition: TableUtils.cxx:21
TableUtils::defineSummand
SummandDefinition defineSummand(T counter_idx, int multiplier)
Definition: TableUtils.h:400
Logger.h
PixelClusterOnTrack.h
ActsTrk::TrackFindingAlg::m_phiMax
Gaudi::Property< std::vector< double > > m_phiMax
Definition: TrackFindingAlg.h:126
ActsTrk::TrackFindingAlg::EStat
EStat
Definition: TrackFindingAlg.h:147
ActsTrk::MutableTrackContainer
Definition: TrackContainer.h:122
ActsTrk::TrackFindingAlg::m_dumpAllStatEtaBins
Gaudi::Property< bool > m_dumpAllStatEtaBins
Definition: TrackFindingAlg.h:142
ActsTrk::TrackFindingAlg::m_pixelCalibTool
ToolHandle< ActsTrk::IOnTrackCalibratorTool< RecoTrackStateContainer > > m_pixelCalibTool
Definition: TrackFindingAlg.h:93
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrackContainer.h
ActsTrk::TrackFindingAlg::m_etaMax
Gaudi::Property< std::vector< double > > m_etaMax
Definition: TrackFindingAlg.h:128
Monitored::Timer
A monitored timer.
Definition: MonitoredTimer.h:32
checkFileSG.ind
list ind
Definition: checkFileSG.py:118
ActsTrk::TrackFindingAlg::kNStoppedTracksMaxHoles
@ kNStoppedTracksMaxHoles
Definition: TrackFindingAlg.h:156
ActsTrk::TrackFindingAlg::m_fitterTool
ToolHandle< ActsTrk::IFitterTool > m_fitterTool
Definition: TrackFindingAlg.h:92
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
ActsTrk::TrackFindingAlg::m_refitSeeds
Gaudi::Property< bool > m_refitSeeds
Definition: TrackFindingAlg.h:112
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
ActsTrk::TrackFindingAlg::m_maxHoles
Gaudi::Property< std::vector< std::size_t > > m_maxHoles
Definition: TrackFindingAlg.h:134
ActsTrk::TrackFindingAlg::m_ATLASConverterTool
ToolHandle< ActsTrk::IActsToTrkConverterTool > m_ATLASConverterTool
Definition: TrackFindingAlg.h:90