ATLAS Offline Software
InDetExtensionProcessor.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3  */
4 
6 // InDetExtensionProcessor.cxx
7 // Implementation file for class InDetExtensionProcessor
9 // version 0.0 Markus Elsing
11 
18 #include <algorithm> //for std::transform
19 #include <cmath> //for std::abs
20 #include <functional> //for std::plus<>
21 #include <memory>
22 
23 
24 
25 //==================================================================================================
26 namespace {
27  template<typename T, size_t N>
28  std::array<T, N>& //overloaded += operator for std::array
29  operator += (std::array<T, N>& a1, const std::array<T, N>& a2) {
30  std::transform(std::begin(a1), std::end(a1), begin(a2), std::begin(a1), std::plus<int>());
31  return a1;
32  }
33 }
34 
35 //==================================================================================================
36 
37 // Constructor with parameters:
38 InDet::InDetExtensionProcessor::InDetExtensionProcessor(const std::string& name, ISvcLocator* pSvcLocator) :
39  AthReentrantAlgorithm(name, pSvcLocator),
40  m_trackName("Tracks"),
41  m_cosmics(false),
42  m_extensionMapName("TrackExtensionMap"),
43  m_newTrackName("ExtendedTrack"),
44  m_trackFitter("Trk::KalmanFitter/InDetTrackFitter"),
45  m_scoringTool("Trk::TrackScoringTool"),
46  m_runOutlier(true),
47  m_keepFailedExtensionOnTrack(true),
48  m_refitPrds(true),
49  m_matEffects(3),
50  m_suppressHoleSearch(false),
51  m_particleHypothesis(Trk::undefined),
52  m_counters{},
53  m_Nevents(0),
54  m_etabounds{0.8, 1.6, 2.10} {
55  // Get parameter values from jobOptions file
56  declareProperty("TrackName", m_trackName, "Name of the input Trackcollection");
57  declareProperty("Cosmics", m_cosmics, "switch whether we are running on cosmics");
58  declareProperty("ExtensionMap", m_extensionMapName, "Name of the input extension map");
59  declareProperty("NewTrackName", m_newTrackName, "Name of the output Trackcollection");
60  declareProperty("TrackFitter", m_trackFitter, "Toolhandle for the track fitter");
61  declareProperty("ScoringTool", m_scoringTool, "Toolhandle for the track scorer");
62  declareProperty("runOutlier", m_runOutlier, "switch whether to run outlier logics or not");
63  declareProperty("keepFailedExtension", m_keepFailedExtensionOnTrack,
64  "switch whether to keep failed extension as outlier hits on the new track");
65  declareProperty("RefitPrds", m_refitPrds, "switch whether to do the fit with re-calibrated clusters (true) or not");
66  declareProperty("matEffects", m_matEffects, "particle hypothesis to assume for material effects in track fit");
67  declareProperty("suppressHoleSearch", m_suppressHoleSearch, "suppressing hole search for comparison");
68  declareProperty("tryBremFit", m_tryBremFit = false, "brem recover mode");
69  declareProperty("caloSeededBrem", m_caloSeededBrem = false, "calo seeded brem recovery");
70  declareProperty("pTminBrem", m_pTminBrem = 1000., "min pT for trying a brem recovery");
71  declareProperty("etaBounds", m_etabounds, "eta intervals for internal monitoring"); //note: only three values!
72 }
73 
74 //==================================================================================================
75 
76 // Initialize method:
79  ATH_MSG_DEBUG("InDetExtensionProcessor::initialize()");
80  ATH_CHECK(m_trackFitter.retrieve());
81  ATH_MSG_DEBUG("Retrieved tool " << m_trackFitter);
82  // Configuration of the material effects
84  //
85  ATH_CHECK(m_trackSummaryTool.retrieve(DisableTool {m_trackSummaryTool.name().empty()}));
86  ATH_CHECK(m_scoringTool.retrieve());
87  ATH_MSG_DEBUG("Retrieved tool " << m_scoringTool);
88  // brem fitting enabled ?
89  if (m_tryBremFit) ATH_MSG_DEBUG("Try brem fit and recovery for electron like tracks.");
90  //
91  ATH_CHECK(m_trackName.initialize());
93  ATH_CHECK(m_newTrackName.initialize());
94  return StatusCode::SUCCESS;
95 }
96 
97 //==================================================================================================
98 
99 // Execute method:
101 InDet::InDetExtensionProcessor::execute(const EventContext& ctx) const {
102  // process the extensions
105  SG::WriteHandle<TrackCollection> extendedTracksResult(m_newTrackName, ctx);
106  const auto nTracks {tracks->size()};
107  ATH_MSG_DEBUG("Number of Tracks found : " << nTracks);
108  // input statistics
109  {
110  ++m_Nevents;
112  }
113  ATH_CHECK(extendedTracksResult.record(std::unique_ptr<TrackCollection>(
114  createExtendedTracks(ctx, tracks.cptr(), trackExtensionMap.cptr()))));
115  ATH_MSG_DEBUG("Container '" << m_newTrackName.key()
116  << "' recorded in StoreGate, size : "
117  << extendedTracksResult->size());
118  if (extendedTracksResult->size() != nTracks) ATH_MSG_WARNING("Lost tracks after extension ??? This is a bug !");
119  return StatusCode::SUCCESS;
120 }
121 
124  const TrackCollection* pTracks,
125  const TrackExtensionMap* trackExtensionMap) const {
126  std::unique_ptr<TrackCollection> newTracks(std::make_unique<TrackCollection>());
127  std::array< std::array<std::atomic<int>, Nregions>, nTypes> counters{};
128  // loop over tracks
129  for (const Trk::Track* thisTrack : *pTracks) {
130  // statistics
131  incrementRegionCounter(counters[nInput], thisTrack, false);
132  ATH_MSG_DEBUG("evaluate input track : " << thisTrack);
133  // try to find this track in extension map
134  TrackExtensionMap::const_iterator pThisExtensionPair = trackExtensionMap->find(thisTrack);
135  // copy input track if this track is not found in list
136  if (pThisExtensionPair == trackExtensionMap->end()) {
137  ATH_MSG_DEBUG("track not in extension map, copy original track to output");
138  // copy track, set pattern info
139  std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
141  newTracks->push_back(std::move(ntrk));
142  // statistics
144  } else {
145  ATH_MSG_DEBUG("track found in extension map, processing...");
146  // statistics
148  // setup new track
149  std::unique_ptr<Trk::Track> newtrack;
150  // keep old track info
151  const Trk::TrackInfo oldTrackInfo = thisTrack->info();
152  // keep list of PRDs, initially assumed to be same size as pThisExtensionPair->second
153  const auto nRIO_OnTrack {pThisExtensionPair->second.size()};
154  std::vector<const Trk::PrepRawData*> vecPrd;
155  vecPrd.reserve(nRIO_OnTrack);
156  // --- refit PRD ?
157  if (m_refitPrds) {
158  auto getPrepRawDataPtr = [](const Trk::MeasurementBase* m) {
159  const auto& pRot = dynamic_cast <const Trk::RIO_OnTrack*>(m);
160  return pRot ? pRot->prepRawData() : nullptr;
161  };
162  const auto& theRIOs_OnTrack {pThisExtensionPair->second};
163  //NOTE: Assumes success; I don't remove any nullptrs which result! (could use copy_if)
164  std::transform(theRIOs_OnTrack.begin(), theRIOs_OnTrack.end(), std::back_inserter(vecPrd), getPrepRawDataPtr);
165  // we have the PRD Vector, we need to refit the track and see if it is better
166  ATH_MSG_DEBUG("fit track " << thisTrack << " with PRDs, number : " << vecPrd.size());
167  if (!m_cosmics) {
168  // normal event processing
169  if (m_tryBremFit && thisTrack->info().trackProperties(Trk::TrackInfo::BremFit)) {
170  ATH_MSG_DEBUG("brem fit of electron like track");
171  //statistics
173  // try brem fit of combined track
174  newtrack = m_trackFitter->fit(
175  ctx, *thisTrack, vecPrd, m_runOutlier, Trk::electron);
176  } else {
177  ATH_MSG_DEBUG("normal fit track");
178  //statistics
180  // normal fit of combined track
181  newtrack = m_trackFitter->fit(ctx,
182  *thisTrack, vecPrd, m_runOutlier, m_particleHypothesis);
183  if (!newtrack && m_tryBremFit &&
184  thisTrack->trackParameters()->front()->pT() > m_pTminBrem &&
185  (!m_caloSeededBrem || thisTrack->info().patternRecoInfo(
187  ATH_MSG_DEBUG("normal fit track failed, try to recover with brem fit");
188  // statistics
190  // try brem fit of combined track
191  newtrack=m_trackFitter->fit(ctx,*thisTrack, vecPrd, m_runOutlier, Trk::electron);
192  }
193  }
194  } else {
195  // ===> special case for cosmics
196  std::vector<const Trk::PrepRawData*> vecPrdComb;
197  // get track parameters
198  const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
199  if (!siPerigee) {
200  ATH_MSG_DEBUG("no perigee found on track, copy input");
201  // statistics
203  // copy track, set pattern info
204  std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
206  newTracks->push_back(std::move(ntrk));
207  } else {
208  // loop over extension RIO-on-tracks and add PRD it into vecPrdComb
210  pThisExtensionPair->first->measurementsOnTrack()->begin();
211  for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->end(); ++RIOit) {
212  const Trk::RIO_OnTrack* rot = dynamic_cast <const Trk::RIO_OnTrack*> (*RIOit);
213  if (!rot) ATH_MSG_ERROR("cast to ROT failed, should not happen here !");
214  else vecPrdComb.push_back(rot->prepRawData());
215  }
216  // merge lists
217  for (auto & i : vecPrd) {
218  double inprod =
219  (i->detectorElement()->surface(i->identify()).center() - siPerigee->position()).dot(
220  siPerigee->momentum());
221  if (inprod < 0) {
222  vecPrdComb.insert(vecPrdComb.begin(), i);
223  } else {
224  vecPrdComb.push_back(i);
225  }
226  }
227  //statistics
229  // normal fit of combined track
230  newtrack = m_trackFitter->fit(
231  ctx, vecPrdComb, *siPerigee, m_runOutlier, m_particleHypothesis);
232  }
233  }
234  } else {
235  const auto& RIOs_OnTrack {pThisExtensionPair->second};
236  // we have an extension map with RIO-on-tracks, we need to refit the track and see if it is better
237  ATH_MSG_DEBUG("fit track " << thisTrack << " with ROTs, number : " << RIOs_OnTrack.size());
238  if (!m_cosmics) {
239  if (m_tryBremFit && thisTrack->info().trackProperties(Trk::TrackInfo::BremFit)) {
240  ATH_MSG_DEBUG("brem fit of electron like track");
241  //statistics
243  // try brem fit of combined track
244  newtrack=m_trackFitter->fit(ctx,*thisTrack, RIOs_OnTrack, m_runOutlier, Trk::electron);
245  } else {
246  ATH_MSG_DEBUG("normal fit track");
247  //statistics
249  // fit combined track
250  newtrack=m_trackFitter->fit(ctx,*thisTrack, RIOs_OnTrack, m_runOutlier, m_particleHypothesis);
251  if (!newtrack && m_tryBremFit &&
252  thisTrack->trackParameters()->front()->pT() > m_pTminBrem &&
253  (!m_caloSeededBrem || thisTrack->info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI))) {
254  ATH_MSG_DEBUG("normal fit track failed, try to recover with brem fit");
255  // statistics
257  // try to recover with brem fit
258  newtrack=m_trackFitter->fit(ctx,*thisTrack, RIOs_OnTrack, m_runOutlier, Trk::electron);
259  }
260  }//end-if of normal track fit
261  } else {
262  // special case for cosmics
263  Trk::MeasurementSet rotSet;
264  // get track parameters
265  const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
266  if (!siPerigee) {
267  ATH_MSG_DEBUG("no perigee found on track, copy input");
268  // statistics
270  // copy track, set pattern info
271  std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
273  newTracks->push_back(std::move(ntrk));
274  } else {
275  // extract RIO-on-tracks from extension
277  pThisExtensionPair->first->measurementsOnTrack()->begin();
278  for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->end(); ++RIOit) {
279  rotSet.push_back(*RIOit);
280  }
281  // merge RIO-on-track lists
282  for (const auto *i : pThisExtensionPair->second) {
283  double inprod = (i->associatedSurface().center() - siPerigee->position()).dot(
284  siPerigee->momentum());
285  if (inprod < 0) {
286  rotSet.insert(rotSet.begin(), i);
287  } else {
288  rotSet.push_back(i);
289  }
290  }
291  ATH_MSG_DEBUG("normal fit track");
292  //statistics
294  // fit combined track
295  newtrack=m_trackFitter->fit(ctx,rotSet, *siPerigee, m_runOutlier, m_particleHypothesis);
296  }
297  }
298  }
299  if (!newtrack) {
300  ATH_MSG_DEBUG("refit of extended track failed, copy original track to output");
301  // statistics
303  // push track into output, does copy, needs fixing
305  newTracks->push_back(trackPlusExtension(ctx,thisTrack, pThisExtensionPair->second));
306  } else {
307  // copy track, set pattern info
308  std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
310  newTracks->push_back(std::move(ntrk));
311  }
312  } else {
313  if (m_trackSummaryTool.isEnabled()) {
314  m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *newtrack, m_suppressHoleSearch);
315  }
316  // score old and new tool and decide which one to push back
317  Trk::TrackScore oldScore = m_scoringTool->score(*thisTrack);
318  ATH_MSG_DEBUG("original track has score : " << oldScore);
319  Trk::TrackScore newScore = m_scoringTool->score(*newtrack);
320  ATH_MSG_DEBUG("new track has score : " << newScore);
321  // do we need to recover with a brem fit
322  if (newScore < oldScore && m_tryBremFit &&
324  thisTrack->trackParameters()->front()->pT() > m_pTminBrem &&
325  (!m_caloSeededBrem || thisTrack->info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI))) {
326  ATH_MSG_DEBUG("new track has low score, try to recover track using brem fit");
327  // statistics
329  std::unique_ptr<Trk::Track> newBremTrack;
330  // try to recover with brem fit
331  if (m_refitPrds) {
332  newBremTrack=m_trackFitter->fit(ctx,*thisTrack, vecPrd, m_runOutlier, Trk::electron);
333  } else {
334  newBremTrack=m_trackFitter->fit(ctx,*thisTrack, pThisExtensionPair->second, m_runOutlier, Trk::electron);
335  }
336  if (newBremTrack) {
337  // score again
338  // @TODO should score newBremTrack
339  if (m_trackSummaryTool.isEnabled()) {
340  m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *newBremTrack, m_suppressHoleSearch);
341  }
342  newScore = m_scoringTool->score(*newtrack);
343  ATH_MSG_DEBUG("recovered new track has score : " << newScore);
344  // copy pointer
345  newtrack = std::move(newBremTrack);
346  }
347  }
348  if (newScore >= oldScore) {
349  ATH_MSG_DEBUG("take extended track, it's better !");
350  // statistics
354  }
355  //storing the precedent info
356  newtrack->info().addPatternReco(oldTrackInfo);
357  // push track into output
359  newTracks->push_back(std::move(newtrack));
360  } else {
361  ATH_MSG_DEBUG("take original track, new one is worse !");
362  // statistics
364  // push track into output, does copy
365  std::unique_ptr<Trk::Track> ntrk;
367  ntrk.reset(trackPlusExtension(ctx,thisTrack, pThisExtensionPair->second));
368  } else {
369  ntrk = std::make_unique<Trk::Track>(*thisTrack);
370  }
372  newTracks->push_back(std::move(ntrk));
373  }
374  }
375  }
376  }
377 
378  {
379 
380  for (unsigned int itype = 0; itype < InDet::InDetExtensionProcessor::nTypes; itype++) m_counters[itype] += counters[itype];
381  }
382  return newTracks.release();
383 }
384 
385 //==================================================================================================
386 
388  bool updateAll) const {
389  if (updateAll) Ntracks[InDet::InDetExtensionProcessor::iAll] += 1;
390  // test
391  if (!track) {
392  ATH_MSG_ERROR("track pointer zero, should not happen!");
393  return;
394  }
395  const auto *const pTrackParameters {track->trackParameters()};
396  // use first parameter
397  if (not pTrackParameters) {
398  ATH_MSG_WARNING("No track parameters, needed for statistics code in Trk::SimpleAmbiguityProcessorTool!");
399  } else {
400  const double absEta = std::abs(pTrackParameters->front()->eta());
404  }
405 }
406 
407 //==================================================================================================
408 
409 Trk::Track*
411  const EventContext& ctx,
412  const Trk::Track* siTrack,
413  const std::vector<const Trk::MeasurementBase*>& extension) const
414 {
415  const auto& trackStatesOnSurfaces{ *(siTrack->trackStateOnSurfaces()) };
416  auto pExtendedTrajectory = std::make_unique<Trk::TrackStates>();
417 
418  pExtendedTrajectory->reserve(trackStatesOnSurfaces.size() + extension.size());
419  int nSiStates = 0, nExtStates = 0;
420  // copy existing si track as first part to new track - including all track pars since fit does not change
421  auto cloneTSOS = [](const Trk::TrackStateOnSurface* pTSOS) {
422  return new Trk::TrackStateOnSurface(*pTSOS);
423  };
424  std::transform(trackStatesOnSurfaces.begin(), trackStatesOnSurfaces.end(), std::back_inserter(
425  *pExtendedTrajectory), cloneTSOS);
426  nSiStates += trackStatesOnSurfaces.size();
427  // copy proposed (but failed) extension as second part onto new track - all hits flagged as outliers.
428  constexpr auto outlierDigit {1 << Trk::TrackStateOnSurface::Outlier};
429  constexpr std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> outlierPattern(outlierDigit);
430  //create new track state on surface
431  auto createNewTSOS = [outlierPattern](const Trk::MeasurementBase* pm) -> const Trk::TrackStateOnSurface*{
432  return new Trk::TrackStateOnSurface(pm->uniqueClone(), nullptr, nullptr, outlierPattern);
433  };
434  //Adding to cosmic tracks beginning or end depending on the direction of track
435  auto addNewTSOS_ForCosmics = [&pExtendedTrajectory, siTrack, createNewTSOS](const Trk::MeasurementBase* pm) {
436  const auto& perigee {siTrack->perigeeParameters()};
437  //the sign of this gives the direction
438  const double inprod = (pm->associatedSurface().center() - perigee->position()).dot(
439  perigee->momentum());
440  if (inprod < 0) {
441  pExtendedTrajectory->insert(pExtendedTrajectory->begin(), createNewTSOS(pm));
442  } else {
443  pExtendedTrajectory->push_back(createNewTSOS(pm));
444  }
445  };
446  //actual copying done here, using preceding lambda functions
447  if (not m_cosmics) {
448  std::transform(extension.begin(), extension.end(), std::back_inserter(*pExtendedTrajectory), createNewTSOS);
449  } else {
450  //difficult to use std::transform here, since don't know whether back or front are added to
451  for (const auto *const pMeasurementBase: extension) {
452  addNewTSOS_ForCosmics(pMeasurementBase);
453  }
454  }
455  nExtStates += pExtendedTrajectory->size();
456  const auto& pFitQuality {siTrack->fitQuality()};
457  Trk::Track* extTrack =
458  new Trk::Track(siTrack->info(), std::move(pExtendedTrajectory), (pFitQuality ? pFitQuality->uniqueClone() : nullptr));
459  if (m_trackSummaryTool.isEnabled()) {
460  m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *extTrack, m_suppressHoleSearch);
461  }
462  Trk::TrackScore extScore = m_scoringTool->score(*extTrack);
463  ATH_MSG_DEBUG("rejected extension saved as Trk::Track with " << nSiStates <<
464  " fitted hits and " << nExtStates << " additional Outliers, score :" << extScore);
465  return extTrack;
466 }
467 
468 //==================================================================================================
469 
470 // Finalize method:
472  if (msgLvl(MSG::INFO)) {
473  MsgStream &out = msg(MSG::INFO);
474  out << "::finalize() -- statistics:" << std::endl;
475  dumpStat(out);
476  out << endmsg;
477  }
478  return StatusCode::SUCCESS;
479 }
480 
481 MsgStream &InDet::InDetExtensionProcessor::dumpStat(MsgStream &out) const
482 {
483  int iw = 9;
484  out.width(9);
485  out << "-------------------------------------------------------------------------------" << std::endl;
486  out << " Number of events processed : " << m_Nevents << std::endl;
487  out << " statistics by eta range ------All---Barrel---Trans.-- Endcap-- " << std::endl;
488  out << "-------------------------------------------------------------------------------" << std::endl;
489  out << " Number of tracks at input :" << std::setiosflags(std::ios::dec) << std::setw(iw)
490  << m_counters[InDet::InDetExtensionProcessor::nInput][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
491  << m_counters[InDet::InDetExtensionProcessor::nInput][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(iw)
492  << m_counters[InDet::InDetExtensionProcessor::nInput][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(iw)
494  out << " Number of not extended tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
495  << m_counters[InDet::InDetExtensionProcessor::nNotExtended][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
496  std::setw(iw)
497  << m_counters[InDet::InDetExtensionProcessor::nNotExtended][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
498  std::setw(iw)
499  << m_counters[InDet::InDetExtensionProcessor::nNotExtended][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
500  std::setw(iw)
502  out << " Number of proposed ext. roads :" << std::setiosflags(std::ios::dec) << std::setw(iw)
503  << m_counters[InDet::InDetExtensionProcessor::nRecognised][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
504  << m_counters[InDet::InDetExtensionProcessor::nRecognised][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(
505  iw)
506  << m_counters[InDet::InDetExtensionProcessor::nRecognised][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(
507  iw)
509  out << "-------------------------------------------------------------------------------" << std::endl;
510  out << " Number of track fits :" << std::setiosflags(std::ios::dec) << std::setw(iw)
511  << m_counters[InDet::InDetExtensionProcessor::nFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
512  << m_counters[InDet::InDetExtensionProcessor::nFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(iw)
513  << m_counters[InDet::InDetExtensionProcessor::nFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(iw)
515  if (m_tryBremFit) {
516  out << " + brem fits for electron tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
517  << m_counters[InDet::InDetExtensionProcessor::nBremFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
518  << m_counters[InDet::InDetExtensionProcessor::nBremFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(
519  iw)
520  << m_counters[InDet::InDetExtensionProcessor::nBremFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(
521  iw)
523  out << " + brem fit to recover failed fit:" << std::setiosflags(std::ios::dec) << std::setw(iw)
524  << m_counters[InDet::InDetExtensionProcessor::nRecoveryBremFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
525  std::setw(iw)
526  << m_counters[InDet::InDetExtensionProcessor::nRecoveryBremFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
527  std::setw(iw)
528  << m_counters[InDet::InDetExtensionProcessor::nRecoveryBremFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
529  std::setw(iw)
531  out << " + brem fit to recover low score :" << std::setiosflags(std::ios::dec) << std::setw(iw)
532  << m_counters[InDet::InDetExtensionProcessor::nLowScoreBremFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
533  std::setw(iw)
534  << m_counters[InDet::InDetExtensionProcessor::nLowScoreBremFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
535  std::setw(iw)
536  << m_counters[InDet::InDetExtensionProcessor::nLowScoreBremFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
537  std::setw(iw)
539  }
540  out << "-------------------------------------------------------------------------------" << std::endl;
541  out << " Number of track fit failing :" << std::setiosflags(std::ios::dec) << std::setw(iw)
542  << m_counters[InDet::InDetExtensionProcessor::nFailed][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
543  << m_counters[InDet::InDetExtensionProcessor::nFailed][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(iw)
544  << m_counters[InDet::InDetExtensionProcessor::nFailed][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(iw)
546  out << " Number of rejected extensions :" << std::setiosflags(std::ios::dec) << std::setw(iw)
547  << m_counters[InDet::InDetExtensionProcessor::nRejected][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
548  << m_counters[InDet::InDetExtensionProcessor::nRejected][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
549  std::setw(iw)
550  << m_counters[InDet::InDetExtensionProcessor::nRejected][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
551  std::setw(iw)
553  out << " Number of successful extensions :" << std::setiosflags(std::ios::dec) << std::setw(iw)
554  << m_counters[InDet::InDetExtensionProcessor::nExtended][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
555  << m_counters[InDet::InDetExtensionProcessor::nExtended][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
556  std::setw(iw)
557  << m_counters[InDet::InDetExtensionProcessor::nExtended][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
558  std::setw(iw)
560  if (m_tryBremFit) {
561  out << " including brem fitted tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
562  << m_counters[InDet::InDetExtensionProcessor::nExtendedBrem][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
563  std::setw(iw)
564  << m_counters[InDet::InDetExtensionProcessor::nExtendedBrem][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
565  std::setw(iw)
566  << m_counters[InDet::InDetExtensionProcessor::nExtendedBrem][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
567  std::setw(iw)
569  }
570  out << "-------------------------------------------------------------------------------" << std::endl;
571  out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setprecision(2)
572  << " definition: ( 0.0 < Barrel < " << m_etabounds[0] << " < Transition < " << m_etabounds[1]
573  << " < Endcap < " << m_etabounds[2] << " )" << std::setprecision(-1) << std::endl;
574  out << "-------------------------------------------------------------------------------" << std::endl;
575  return out;
576 }
Trk::TrackInfo
Contains information about the 'fitter' of this track.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:32
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:76
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
InDet::InDetExtensionProcessor::m_trackSummaryTool
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
Definition: InDetExtensionProcessor.h:69
TrackParameters.h
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
InDet::InDetExtensionProcessor::nInput
@ nInput
Definition: InDetExtensionProcessor.h:95
InDet::InDetExtensionProcessor::InDetExtensionProcessor
InDetExtensionProcessor(const std::string &name, ISvcLocator *pSvcLocator)
Default Algorithm constructor with parameters.
Definition: InDetExtensionProcessor.cxx:38
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
Trk::Track::trackStateOnSurfaces
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
Trk::Track::info
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
InDet::InDetExtensionProcessor::m_keepFailedExtensionOnTrack
bool m_keepFailedExtensionOnTrack
switch whether to append a rejected extension as outlier trajectory
Definition: InDetExtensionProcessor.h:76
xAOD::JetInput::Track
@ Track
Definition: JetContainerInfo.h:61
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
InDet::InDetExtensionProcessor::m_suppressHoleSearch
bool m_suppressHoleSearch
no hole search ?
Definition: InDetExtensionProcessor.h:81
InDet::InDetExtensionProcessor::m_tryBremFit
bool m_tryBremFit
brem recovery mode ?
Definition: InDetExtensionProcessor.h:82
InDet::InDetExtensionProcessor::nRejected
@ nRejected
Definition: InDetExtensionProcessor.h:95
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
InDet::InDetExtensionProcessor::trackPlusExtension
Trk::Track * trackPlusExtension(const EventContext &ctx, const Trk::Track *, const std::vector< const Trk::MeasurementBase * > &) const
internal structuring: creates new track with original one plus extension as outliers
Definition: InDetExtensionProcessor.cxx:410
atn_test_sgProducerConsumerDataPool_jobOptions.end
end
Definition: atn_test_sgProducerConsumerDataPool_jobOptions.py:25
ITrackScoringTool.h
PrepRawData.h
InDet::InDetExtensionProcessor::m_runOutlier
Trk::RunOutlierRemoval m_runOutlier
whether to run outlier logics
Definition: InDetExtensionProcessor.h:74
InDet::InDetExtensionProcessor::nRecognised
@ nRecognised
Definition: InDetExtensionProcessor.h:95
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
InDet::InDetExtensionProcessor::m_refitPrds
bool m_refitPrds
fitter steering: whether to do the fit with re-calibrated clusters (true) or not
Definition: InDetExtensionProcessor.h:78
Trk::TrackStateOnSurface::Outlier
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
Definition: TrackStateOnSurface.h:122
InDet::InDetExtensionProcessor::nExtended
@ nExtended
Definition: InDetExtensionProcessor.h:95
InDetExtensionProcessor.h
Trk::TrackInfo::addPatternReco
void addPatternReco(const TrackInfo &)
A method adding just pattern recognition info without adding the actual properties.
InDet::InDetExtensionProcessor::m_trackFitter
ToolHandle< Trk::ITrackFitter > m_trackFitter
track fitter tool handle
Definition: InDetExtensionProcessor.h:65
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDet::InDetExtensionProcessor::m_cosmics
bool m_cosmics
whether we are running cosmics
Definition: InDetExtensionProcessor.h:62
InDet::InDetExtensionProcessor::m_scoringTool
ToolHandle< Trk::ITrackScoringTool > m_scoringTool
track scorer tool handle
Definition: InDetExtensionProcessor.h:73
lumiFormat.i
int i
Definition: lumiFormat.py:92
InDet::InDetExtensionProcessor::iTransi
@ iTransi
Definition: InDetExtensionProcessor.h:91
InDet::InDetExtensionProcessor::Nregions
@ Nregions
Definition: InDetExtensionProcessor.h:91
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Trk::electron
@ electron
Definition: ParticleHypothesis.h:27
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
InDet::InDetExtensionProcessor::nLowScoreBremFits
@ nLowScoreBremFits
Definition: InDetExtensionProcessor.h:96
InDet::InDetExtensionProcessor::createExtendedTracks
TrackCollection * createExtendedTracks(const EventContext &ctx, const TrackCollection *tracks_in, const TrackExtensionMap *track_extension_map) const
process events
Definition: InDetExtensionProcessor.cxx:123
InDet::InDetExtensionProcessor::nTypes
@ nTypes
Definition: InDetExtensionProcessor.h:96
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
Trk::TrackInfo::InDetExtensionProcessor
@ InDetExtensionProcessor
Tracks with InDetExtensionProcessor used.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:111
Trk::TrackScore
float TrackScore
Definition: TrackScore.h:10
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::TrackInfo::BremFit
@ BremFit
A brem fit was performed on this track.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:78
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
InDet::InDetExtensionProcessor::iAll
@ iAll
Definition: InDetExtensionProcessor.h:91
Trk::TrackInfo::TrackInCaloROI
@ TrackInCaloROI
A track in a CaloROI.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:236
DataVector< Trk::Track >
InDet::InDetExtensionProcessor::nNotExtended
@ nNotExtended
Definition: InDetExtensionProcessor.h:96
InDet::InDetExtensionProcessor::m_pTminBrem
float m_pTminBrem
min pt for a brem fit
Definition: InDetExtensionProcessor.h:84
InDet::InDetExtensionProcessor::iBarrel
@ iBarrel
Definition: InDetExtensionProcessor.h:91
InDet::InDetExtensionProcessor::incrementRegionCounter
void incrementRegionCounter(std::array< std::atomic< int >, 4 > &, const Trk::Track *, bool=true) const
monitoring and validation: does success/failure counting for each detector region
Definition: InDetExtensionProcessor.cxx:387
Trk::MeasurementSet
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
Definition: FitterTypes.h:30
lumiFormat.array
array
Definition: lumiFormat.py:98
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
InDet::InDetExtensionProcessor::execute
virtual StatusCode execute(const EventContext &ctx) const
Definition: InDetExtensionProcessor.cxx:101
InDet::InDetExtensionProcessor::nRecoveryBremFits
@ nRecoveryBremFits
Definition: InDetExtensionProcessor.h:95
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
RIO_OnTrack.h
InDet::InDetExtensionProcessor::m_caloSeededBrem
bool m_caloSeededBrem
run in Calo seeded mode
Definition: InDetExtensionProcessor.h:83
InDet::InDetExtensionProcessor::m_trackName
SG::ReadHandleKey< TrackCollection > m_trackName
Name of input Trackcollection.
Definition: InDetExtensionProcessor.h:61
InDet::InDetExtensionProcessor::nExtendedBrem
@ nExtendedBrem
Definition: InDetExtensionProcessor.h:96
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
test_pythinning.out
out
Definition: test_pythinning.py:94
InDet::InDetExtensionProcessor::dumpStat
MsgStream & dumpStat(MsgStream &out) const
Definition: InDetExtensionProcessor.cxx:481
InDet::InDetExtensionProcessor::nFits
@ nFits
Definition: InDetExtensionProcessor.h:96
InDet::InDetExtensionProcessor::initialize
virtual StatusCode initialize()
Definition: InDetExtensionProcessor.cxx:78
Trk::RIO_OnTrack::prepRawData
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
InDet::InDetExtensionProcessor::m_etabounds
std::vector< float > m_etabounds
eta intervals for internal monitoring
Definition: InDetExtensionProcessor.h:103
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
InDet::InDetExtensionProcessor::m_matEffects
int m_matEffects
type of material interaction in extrapolation
Definition: InDetExtensionProcessor.h:80
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
TrackExtensionMap
AUTO - An Undocumented Tracking Object.
Definition: TrackExtensionMap.h:16
AthCommonMsg< Gaudi::Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
InDet::InDetExtensionProcessor::finalize
virtual StatusCode finalize()
Definition: InDetExtensionProcessor.cxx:471
TauGNNUtils::Variables::absEta
bool absEta(const xAOD::TauJet &tau, double &out)
Definition: TauGNNUtils.cxx:232
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
Trk::TrackInfo::setPatternRecognitionInfo
void setPatternRecognitionInfo(const TrackPatternRecoInfo &patternReco)
Method setting the pattern recognition algorithm.
xAOD::undefined
@ undefined
Definition: TrackingPrimitives.h:205
InDet::InDetExtensionProcessor::m_extensionMapName
SG::ReadHandleKey< TrackExtensionMap > m_extensionMapName
Name of input extension map.
Definition: InDetExtensionProcessor.h:63
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
ITrackFitter.h
Trk::TrackInfo::trackProperties
bool trackProperties(const TrackProperties &property) const
Access methods for track properties.
InDet::InDetExtensionProcessor::nBremFits
@ nBremFits
Definition: InDetExtensionProcessor.h:96
InDet::InDetExtensionProcessor::m_particleHypothesis
Trk::ParticleHypothesis m_particleHypothesis
nomen est omen
Definition: InDetExtensionProcessor.h:87
InDet::InDetExtensionProcessor::m_newTrackName
SG::WriteHandleKey< TrackCollection > m_newTrackName
Name of output Trackcollection.
Definition: InDetExtensionProcessor.h:64
GlobalSim::dot
void dot(const Digraph &G, const std::string &fn)
Definition: dot.cxx:10
InDet::InDetExtensionProcessor::iEndcap
@ iEndcap
Definition: InDetExtensionProcessor.h:91
InDet::InDetExtensionProcessor::nFailed
@ nFailed
Definition: InDetExtensionProcessor.h:95
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.