ATLAS Offline Software
Loading...
Searching...
No Matches
InDetExtensionProcessor.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 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//==================================================================================================
26namespace {
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:
38InDet::InDetExtensionProcessor::InDetExtensionProcessor(const std::string& name, ISvcLocator* pSvcLocator) :
39 AthReentrantAlgorithm(name, pSvcLocator),
40 m_counters{},
41 m_Nevents(0)
42{}
43
44//==================================================================================================
45
46// Initialize method:
47StatusCode
49 ATH_MSG_DEBUG("InDetExtensionProcessor::initialize()");
50 ATH_CHECK(m_trackFitter.retrieve());
51 ATH_MSG_DEBUG("Retrieved tool " << m_trackFitter);
52 // Configuration of the material effects
54 //
55 ATH_CHECK(m_trackSummaryTool.retrieve(DisableTool {m_trackSummaryTool.name().empty()}));
56 ATH_CHECK(m_scoringTool.retrieve());
57 ATH_MSG_DEBUG("Retrieved tool " << m_scoringTool);
58 // brem fitting enabled ?
59 if (m_tryBremFit) ATH_MSG_DEBUG("Try brem fit and recovery for electron like tracks.");
60 //
61 ATH_CHECK(m_trackName.initialize());
62 ATH_CHECK(m_extensionMapName.initialize());
63 ATH_CHECK(m_newTrackName.initialize());
64 return StatusCode::SUCCESS;
65}
66
67//==================================================================================================
68
69// Execute method:
70StatusCode
71InDet::InDetExtensionProcessor::execute(const EventContext& ctx) const {
72 // process the extensions
75 SG::WriteHandle<TrackCollection> extendedTracksResult(m_newTrackName, ctx);
76 const auto nTracks {tracks->size()};
77 ATH_MSG_DEBUG("Number of Tracks found : " << nTracks);
78 // input statistics
79 {
80 ++m_Nevents;
82 }
83 ATH_CHECK(extendedTracksResult.record(std::unique_ptr<TrackCollection>(
84 createExtendedTracks(ctx, tracks.cptr(), trackExtensionMap.cptr()))));
85 ATH_MSG_DEBUG("Container '" << m_newTrackName.key()
86 << "' recorded in StoreGate, size : "
87 << extendedTracksResult->size());
88 if (extendedTracksResult->size() != nTracks) ATH_MSG_WARNING("Lost tracks after extension ??? This is a bug !");
89 return StatusCode::SUCCESS;
90}
91
94 const TrackCollection* pTracks,
95 const TrackExtensionMap* trackExtensionMap) const {
96 std::unique_ptr<TrackCollection> newTracks(std::make_unique<TrackCollection>());
97 std::array< std::array<std::atomic<int>, Nregions>, nTypes> counters{};
98 // loop over tracks
99 for (const Trk::Track* thisTrack : *pTracks) {
100 // statistics
101 incrementRegionCounter(counters[nInput], thisTrack, false);
102 ATH_MSG_DEBUG("evaluate input track : " << thisTrack);
103 // try to find this track in extension map
104 TrackExtensionMap::const_iterator pThisExtensionPair = trackExtensionMap->find(thisTrack);
105 // copy input track if this track is not found in list
106 if (pThisExtensionPair == trackExtensionMap->end()) {
107 ATH_MSG_DEBUG("track not in extension map, copy original track to output");
108 // copy track, set pattern info
109 std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
110 ntrk->info().setPatternRecognitionInfo(Trk::TrackInfo::InDetExtensionProcessor);
111 newTracks->push_back(std::move(ntrk));
112 // statistics
114 } else {
115 ATH_MSG_DEBUG("track found in extension map, processing...");
116 // statistics
118 // setup new track
119 std::unique_ptr<Trk::Track> newtrack;
120 // keep old track info
121 const Trk::TrackInfo oldTrackInfo = thisTrack->info();
122 // keep list of PRDs, initially assumed to be same size as pThisExtensionPair->second
123 const auto nRIO_OnTrack {pThisExtensionPair->second.size()};
124 std::vector<const Trk::PrepRawData*> vecPrd;
125 vecPrd.reserve(nRIO_OnTrack);
126 // --- refit PRD ?
127 if (m_refitPrds) {
128 auto getPrepRawDataPtr = [](const Trk::MeasurementBase* m) {
129 const auto& pRot = dynamic_cast <const Trk::RIO_OnTrack*>(m);
130 return pRot ? pRot->prepRawData() : nullptr;
131 };
132 const auto& theRIOs_OnTrack {pThisExtensionPair->second};
133 //NOTE: Assumes success; I don't remove any nullptrs which result! (could use copy_if)
134 std::transform(theRIOs_OnTrack.begin(), theRIOs_OnTrack.end(), std::back_inserter(vecPrd), getPrepRawDataPtr);
135 // we have the PRD Vector, we need to refit the track and see if it is better
136 ATH_MSG_DEBUG("fit track " << thisTrack << " with PRDs, number : " << vecPrd.size());
137 if (!m_cosmics) {
138 // normal event processing
139 if (m_tryBremFit && thisTrack->info().trackProperties(Trk::TrackInfo::BremFit)) {
140 ATH_MSG_DEBUG("brem fit of electron like track");
141 //statistics
143 // try brem fit of combined track
144 newtrack = m_trackFitter->fit(
145 ctx, *thisTrack, vecPrd, m_runOutlier, Trk::electron);
146 } else {
147 ATH_MSG_DEBUG("normal fit track");
148 //statistics
150 // normal fit of combined track
151 newtrack = m_trackFitter->fit(ctx,
152 *thisTrack, vecPrd, m_runOutlier, m_particleHypothesis);
153 if (!newtrack && m_tryBremFit &&
154 thisTrack->trackParameters()->front()->pT() > m_pTminBrem &&
155 (!m_caloSeededBrem || thisTrack->info().patternRecoInfo(
157 ATH_MSG_DEBUG("normal fit track failed, try to recover with brem fit");
158 // statistics
160 // try brem fit of combined track
161 newtrack=m_trackFitter->fit(ctx,*thisTrack, vecPrd, m_runOutlier, Trk::electron);
162 }
163 }
164 } else {
165 // ===> special case for cosmics
166 std::vector<const Trk::PrepRawData*> vecPrdComb;
167 // get track parameters
168 const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
169 if (!siPerigee) {
170 ATH_MSG_DEBUG("no perigee found on track, copy input");
171 // statistics
173 // copy track, set pattern info
174 std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
175 ntrk->info().setPatternRecognitionInfo(Trk::TrackInfo::InDetExtensionProcessor);
176 newTracks->push_back(std::move(ntrk));
177 } else {
178 // loop over extension RIO-on-tracks and add PRD it into vecPrdComb
180 pThisExtensionPair->first->measurementsOnTrack()->begin();
181 for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->end(); ++RIOit) {
182 const Trk::RIO_OnTrack* rot = dynamic_cast <const Trk::RIO_OnTrack*> (*RIOit);
183 if (!rot) ATH_MSG_ERROR("cast to ROT failed, should not happen here !");
184 else vecPrdComb.push_back(rot->prepRawData());
185 }
186 // merge lists
187 for (auto & i : vecPrd) {
188 double inprod =
189 (i->detectorElement()->surface(i->identify()).center() - siPerigee->position()).dot(
190 siPerigee->momentum());
191 if (inprod < 0) {
192 vecPrdComb.insert(vecPrdComb.begin(), i);
193 } else {
194 vecPrdComb.push_back(i);
195 }
196 }
197 //statistics
199 // normal fit of combined track
200 newtrack = m_trackFitter->fit(
201 ctx, vecPrdComb, *siPerigee, m_runOutlier, m_particleHypothesis);
202 }
203 }
204 } else {
205 const auto& RIOs_OnTrack {pThisExtensionPair->second};
206 // we have an extension map with RIO-on-tracks, we need to refit the track and see if it is better
207 ATH_MSG_DEBUG("fit track " << thisTrack << " with ROTs, number : " << RIOs_OnTrack.size());
208 if (!m_cosmics) {
209 if (m_tryBremFit && thisTrack->info().trackProperties(Trk::TrackInfo::BremFit)) {
210 ATH_MSG_DEBUG("brem fit of electron like track");
211 //statistics
213 // try brem fit of combined track
214 newtrack=m_trackFitter->fit(ctx,*thisTrack, RIOs_OnTrack, m_runOutlier, Trk::electron);
215 } else {
216 ATH_MSG_DEBUG("normal fit track");
217 //statistics
219 // fit combined track
220 newtrack=m_trackFitter->fit(ctx,*thisTrack, RIOs_OnTrack, m_runOutlier, m_particleHypothesis);
221 if (!newtrack && m_tryBremFit &&
222 thisTrack->trackParameters()->front()->pT() > m_pTminBrem &&
223 (!m_caloSeededBrem || thisTrack->info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI))) {
224 ATH_MSG_DEBUG("normal fit track failed, try to recover with brem fit");
225 // statistics
227 // try to recover with brem fit
228 newtrack=m_trackFitter->fit(ctx,*thisTrack, RIOs_OnTrack, m_runOutlier, Trk::electron);
229 }
230 }//end-if of normal track fit
231 } else {
232 // special case for cosmics
233 Trk::MeasurementSet rotSet;
234 // get track parameters
235 const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
236 if (!siPerigee) {
237 ATH_MSG_DEBUG("no perigee found on track, copy input");
238 // statistics
240 // copy track, set pattern info
241 std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
242 ntrk->info().setPatternRecognitionInfo(Trk::TrackInfo::InDetExtensionProcessor);
243 newTracks->push_back(std::move(ntrk));
244 } else {
245 // extract RIO-on-tracks from extension
247 pThisExtensionPair->first->measurementsOnTrack()->begin();
248 for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->end(); ++RIOit) {
249 rotSet.push_back(*RIOit);
250 }
251 // merge RIO-on-track lists
252 for (const auto *i : pThisExtensionPair->second) {
253 double inprod = (i->associatedSurface().center() - siPerigee->position()).dot(
254 siPerigee->momentum());
255 if (inprod < 0) {
256 rotSet.insert(rotSet.begin(), i);
257 } else {
258 rotSet.push_back(i);
259 }
260 }
261 ATH_MSG_DEBUG("normal fit track");
262 //statistics
264 // fit combined track
265 newtrack=m_trackFitter->fit(ctx,rotSet, *siPerigee, m_runOutlier, m_particleHypothesis);
266 }
267 }
268 }
269 if (!newtrack) {
270 ATH_MSG_DEBUG("refit of extended track failed, copy original track to output");
271 // statistics
273 // push track into output, does copy, needs fixing
275 newTracks->push_back(trackPlusExtension(ctx,thisTrack, pThisExtensionPair->second));
276 } else {
277 // copy track, set pattern info
278 std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
279 ntrk->info().setPatternRecognitionInfo(Trk::TrackInfo::InDetExtensionProcessor);
280 newTracks->push_back(std::move(ntrk));
281 }
282 } else {
283 // score old and new tool and decide which one to push back
284 Trk::TrackScore oldScore = m_scoringTool->score(*thisTrack);
285 ATH_MSG_DEBUG("original track has score : " << oldScore);
286 Trk::TrackScore newScore = Trk::TrackScore(0);
287 bool passBasicSelections = m_scoringTool->passBasicSelections(*newtrack);
288 if(passBasicSelections){
289 if (m_trackSummaryTool.isEnabled()) {
290 m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *newtrack, m_suppressHoleSearch);
291 }
292 bool recheckBasicSel = false;
293 newScore = m_scoringTool->score(*newtrack, recheckBasicSel);
294 }
295 ATH_MSG_DEBUG("new track has score : " << newScore);
296 // do we need to recover with a brem fit
297 if (newScore < oldScore && m_tryBremFit &&
298 !newtrack->info().trackProperties(Trk::TrackInfo::BremFit) &&
299 thisTrack->trackParameters()->front()->pT() > m_pTminBrem &&
300 (!m_caloSeededBrem || thisTrack->info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI))) {
301 ATH_MSG_DEBUG("new track has low score, try to recover track using brem fit");
302 // statistics
304 std::unique_ptr<Trk::Track> newBremTrack;
305 // try to recover with brem fit
306 if (m_refitPrds) {
307 newBremTrack=m_trackFitter->fit(ctx,*thisTrack, vecPrd, m_runOutlier, Trk::electron);
308 } else {
309 newBremTrack=m_trackFitter->fit(ctx,*thisTrack, pThisExtensionPair->second, m_runOutlier, Trk::electron);
310 }
311 if (newBremTrack) {
312 // score again
313 // @TODO should score newBremTrack + only replace summary if passBasicSelection
314 if (m_trackSummaryTool.isEnabled()) {
315 m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *newBremTrack, m_suppressHoleSearch);
316 }
317 newScore = m_scoringTool->score(*newtrack);
318 ATH_MSG_DEBUG("recovered new track has score : " << newScore);
319 // copy pointer
320 newtrack = std::move(newBremTrack);
321 }
322 }
323 if (newScore >= oldScore) {
324 ATH_MSG_DEBUG("take extended track, it's better !");
325 // statistics
327 if (m_tryBremFit && newtrack->info().trackProperties(Trk::TrackInfo::BremFit)) {
329 }
330 //storing the precedent info
331 newtrack->info().addPatternReco(oldTrackInfo);
332 // push track into output
333 newtrack->info().setPatternRecognitionInfo(Trk::TrackInfo::InDetExtensionProcessor);
334 newTracks->push_back(std::move(newtrack));
335 } else {
336 ATH_MSG_DEBUG("take original track, new one is worse !");
337 // statistics
339 // push track into output, does copy
340 std::unique_ptr<Trk::Track> ntrk;
342 ntrk.reset(trackPlusExtension(ctx,thisTrack, pThisExtensionPair->second));
343 } else {
344 ntrk = std::make_unique<Trk::Track>(*thisTrack);
345 }
346 ntrk->info().setPatternRecognitionInfo(Trk::TrackInfo::InDetExtensionProcessor);
347 newTracks->push_back(std::move(ntrk));
348 }
349 }
350 }
351 }
352
353 {
354
355 for (unsigned int itype = 0; itype < InDet::InDetExtensionProcessor::nTypes; itype++) m_counters[itype] += counters[itype];
356 }
357 return newTracks.release();
358}
359
360//==================================================================================================
361
362void InDet::InDetExtensionProcessor::incrementRegionCounter(std::array<std::atomic<int>, 4>& Ntracks, const Trk::Track* track,
363 bool updateAll) const {
364 if (updateAll) Ntracks[InDet::InDetExtensionProcessor::iAll] += 1;
365 // test
366 if (!track) {
367 ATH_MSG_ERROR("track pointer zero, should not happen!");
368 return;
369 }
370 const auto *const pTrackParameters {track->trackParameters()};
371 // use first parameter
372 if (not pTrackParameters) {
373 ATH_MSG_WARNING("No track parameters, needed for statistics code in Trk::SimpleAmbiguityProcessorTool!");
374 } else {
375 const double absEta = std::abs(pTrackParameters->front()->eta());
376 if (absEta < m_etabounds[0]) ++Ntracks[InDet::InDetExtensionProcessor::iBarrel];
377 else if (absEta < m_etabounds[1]) ++Ntracks[InDet::InDetExtensionProcessor::iTransi];
378 else if (absEta < m_etabounds[2]) ++Ntracks[InDet::InDetExtensionProcessor::iEndcap];
379 }
380}
381
382//==================================================================================================
383
386 const EventContext& ctx,
387 const Trk::Track* siTrack,
388 const std::vector<const Trk::MeasurementBase*>& extension) const
389{
390 const auto& trackStatesOnSurfaces{ *(siTrack->trackStateOnSurfaces()) };
391 auto pExtendedTrajectory = std::make_unique<Trk::TrackStates>();
392
393 pExtendedTrajectory->reserve(trackStatesOnSurfaces.size() + extension.size());
394 int nSiStates = 0, nExtStates = 0;
395 // copy existing si track as first part to new track - including all track pars since fit does not change
396 auto cloneTSOS = [](const Trk::TrackStateOnSurface* pTSOS) {
397 return new Trk::TrackStateOnSurface(*pTSOS);
398 };
399 std::transform(trackStatesOnSurfaces.begin(), trackStatesOnSurfaces.end(), std::back_inserter(
400 *pExtendedTrajectory), cloneTSOS);
401 nSiStates += trackStatesOnSurfaces.size();
402 // copy proposed (but failed) extension as second part onto new track - all hits flagged as outliers.
403 constexpr auto outlierDigit {1 << Trk::TrackStateOnSurface::Outlier};
404 constexpr std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> outlierPattern(outlierDigit);
405 //create new track state on surface
406 auto createNewTSOS = [outlierPattern](const Trk::MeasurementBase* pm) -> const Trk::TrackStateOnSurface*{
407 return new Trk::TrackStateOnSurface(pm->uniqueClone(), nullptr, nullptr, outlierPattern);
408 };
409 //Adding to cosmic tracks beginning or end depending on the direction of track
410 auto addNewTSOS_ForCosmics = [&pExtendedTrajectory, siTrack, createNewTSOS](const Trk::MeasurementBase* pm) {
411 const auto& perigee {siTrack->perigeeParameters()};
412 //the sign of this gives the direction
413 const double inprod = (pm->associatedSurface().center() - perigee->position()).dot(
414 perigee->momentum());
415 if (inprod < 0) {
416 pExtendedTrajectory->insert(pExtendedTrajectory->begin(), createNewTSOS(pm));
417 } else {
418 pExtendedTrajectory->push_back(createNewTSOS(pm));
419 }
420 };
421 //actual copying done here, using preceding lambda functions
422 if (not m_cosmics) {
423 std::transform(extension.begin(), extension.end(), std::back_inserter(*pExtendedTrajectory), createNewTSOS);
424 } else {
425 //difficult to use std::transform here, since don't know whether back or front are added to
426 for (const auto *const pMeasurementBase: extension) {
427 addNewTSOS_ForCosmics(pMeasurementBase);
428 }
429 }
430 nExtStates += pExtendedTrajectory->size();
431 const auto& pFitQuality {siTrack->fitQuality()};
432 Trk::Track* extTrack =
433 new Trk::Track(siTrack->info(), std::move(pExtendedTrajectory), (pFitQuality ? pFitQuality->uniqueClone() : nullptr));
434 if (m_trackSummaryTool.isEnabled()) {
435 m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *extTrack, m_suppressHoleSearch);
436 }
437 Trk::TrackScore extScore = m_scoringTool->score(*extTrack);
438 ATH_MSG_DEBUG("rejected extension saved as Trk::Track with " << nSiStates <<
439 " fitted hits and " << nExtStates << " additional Outliers, score :" << extScore);
440 return extTrack;
441}
442
443//==================================================================================================
444
445// Finalize method:
447 if (msgLvl(MSG::INFO)) {
448 MsgStream &out = msg(MSG::INFO);
449 out << "::finalize() -- statistics:" << std::endl;
450 dumpStat(out);
451 out << endmsg;
452 }
453 return StatusCode::SUCCESS;
454}
455
456MsgStream &InDet::InDetExtensionProcessor::dumpStat(MsgStream &out) const
457{
458 int iw = 9;
459 out.width(9);
460 out << "-------------------------------------------------------------------------------" << std::endl;
461 out << " Number of events processed : " << m_Nevents << std::endl;
462 out << " statistics by eta range ------All---Barrel---Trans.-- Endcap-- " << std::endl;
463 out << "-------------------------------------------------------------------------------" << std::endl;
464 out << " Number of tracks at input :" << std::setiosflags(std::ios::dec) << std::setw(iw)
465 << m_counters[InDet::InDetExtensionProcessor::nInput][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
466 << m_counters[InDet::InDetExtensionProcessor::nInput][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(iw)
467 << m_counters[InDet::InDetExtensionProcessor::nInput][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(iw)
469 out << " Number of not extended tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
470 << m_counters[InDet::InDetExtensionProcessor::nNotExtended][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
471 std::setw(iw)
472 << m_counters[InDet::InDetExtensionProcessor::nNotExtended][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
473 std::setw(iw)
474 << m_counters[InDet::InDetExtensionProcessor::nNotExtended][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
475 std::setw(iw)
477 out << " Number of proposed ext. roads :" << std::setiosflags(std::ios::dec) << std::setw(iw)
478 << m_counters[InDet::InDetExtensionProcessor::nRecognised][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
479 << m_counters[InDet::InDetExtensionProcessor::nRecognised][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(
480 iw)
481 << m_counters[InDet::InDetExtensionProcessor::nRecognised][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(
482 iw)
484 out << "-------------------------------------------------------------------------------" << std::endl;
485 out << " Number of track fits :" << std::setiosflags(std::ios::dec) << std::setw(iw)
486 << m_counters[InDet::InDetExtensionProcessor::nFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
487 << m_counters[InDet::InDetExtensionProcessor::nFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(iw)
488 << m_counters[InDet::InDetExtensionProcessor::nFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(iw)
490 if (m_tryBremFit) {
491 out << " + brem fits for electron tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
492 << m_counters[InDet::InDetExtensionProcessor::nBremFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
493 << m_counters[InDet::InDetExtensionProcessor::nBremFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(
494 iw)
495 << m_counters[InDet::InDetExtensionProcessor::nBremFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(
496 iw)
498 out << " + brem fit to recover failed fit:" << std::setiosflags(std::ios::dec) << std::setw(iw)
499 << m_counters[InDet::InDetExtensionProcessor::nRecoveryBremFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
500 std::setw(iw)
501 << m_counters[InDet::InDetExtensionProcessor::nRecoveryBremFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
502 std::setw(iw)
503 << m_counters[InDet::InDetExtensionProcessor::nRecoveryBremFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
504 std::setw(iw)
506 out << " + brem fit to recover low score :" << std::setiosflags(std::ios::dec) << std::setw(iw)
507 << m_counters[InDet::InDetExtensionProcessor::nLowScoreBremFits][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
508 std::setw(iw)
509 << m_counters[InDet::InDetExtensionProcessor::nLowScoreBremFits][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
510 std::setw(iw)
511 << m_counters[InDet::InDetExtensionProcessor::nLowScoreBremFits][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
512 std::setw(iw)
514 }
515 out << "-------------------------------------------------------------------------------" << std::endl;
516 out << " Number of track fit failing :" << std::setiosflags(std::ios::dec) << std::setw(iw)
517 << m_counters[InDet::InDetExtensionProcessor::nFailed][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
518 << m_counters[InDet::InDetExtensionProcessor::nFailed][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) << std::setw(iw)
519 << m_counters[InDet::InDetExtensionProcessor::nFailed][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) << std::setw(iw)
521 out << " Number of rejected extensions :" << std::setiosflags(std::ios::dec) << std::setw(iw)
522 << m_counters[InDet::InDetExtensionProcessor::nRejected][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
523 << m_counters[InDet::InDetExtensionProcessor::nRejected][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
524 std::setw(iw)
525 << m_counters[InDet::InDetExtensionProcessor::nRejected][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
526 std::setw(iw)
528 out << " Number of successful extensions :" << std::setiosflags(std::ios::dec) << std::setw(iw)
529 << m_counters[InDet::InDetExtensionProcessor::nExtended][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) << std::setw(iw)
530 << m_counters[InDet::InDetExtensionProcessor::nExtended][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
531 std::setw(iw)
532 << m_counters[InDet::InDetExtensionProcessor::nExtended][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
533 std::setw(iw)
535 if (m_tryBremFit) {
536 out << " including brem fitted tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
537 << m_counters[InDet::InDetExtensionProcessor::nExtendedBrem][InDet::InDetExtensionProcessor::iAll] << std::setiosflags(std::ios::dec) <<
538 std::setw(iw)
539 << m_counters[InDet::InDetExtensionProcessor::nExtendedBrem][InDet::InDetExtensionProcessor::iBarrel] << std::setiosflags(std::ios::dec) <<
540 std::setw(iw)
541 << m_counters[InDet::InDetExtensionProcessor::nExtendedBrem][InDet::InDetExtensionProcessor::iTransi] << std::setiosflags(std::ios::dec) <<
542 std::setw(iw)
544 }
545 out << "-------------------------------------------------------------------------------" << std::endl;
546 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setprecision(2)
547 << " definition: ( 0.0 < Barrel < " << m_etabounds[0] << " < Transition < " << m_etabounds[1]
548 << " < Endcap < " << m_etabounds[2] << " )" << std::setprecision(-1) << std::endl;
549 out << "-------------------------------------------------------------------------------" << std::endl;
550 return out;
551}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
bool msgLvl(const MSG::Level lvl) const
An algorithm that can be simultaneously executed in multiple threads.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
SG::WriteHandleKey< TrackCollection > m_newTrackName
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
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
SG::ReadHandleKey< TrackCollection > m_trackName
Trk::ParticleHypothesis m_particleHypothesis
nomen est omen
SG::ReadHandleKey< TrackExtensionMap > m_extensionMapName
PublicToolHandle< Trk::ITrackFitter > m_trackFitter
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
PublicToolHandle< Trk::ITrackScoringTool > m_scoringTool
Gaudi::Property< std::vector< float > > m_etabounds
MsgStream & dumpStat(MsgStream &out) const
TrackCollection * createExtendedTracks(const EventContext &ctx, const TrackCollection *tracks_in, const TrackExtensionMap *track_extension_map) const
process events
Gaudi::Property< Trk::RunOutlierRemoval > m_runOutlier
virtual StatusCode execute(const EventContext &ctx) const
InDetExtensionProcessor(const std::string &name, ISvcLocator *pSvcLocator)
Default Algorithm constructor with parameters.
const_pointer_type cptr()
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
AUTO - An Undocumented Tracking Object.
This class is the pure abstract base class for all fittable tracking measurements.
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
Contains information about the 'fitter' of this track.
@ BremFit
A brem fit was performed on this track.
@ InDetExtensionProcessor
Tracks with InDetExtensionProcessor used.
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
const Perigee * perigeeParameters() const
return Perigee.
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
Definition FitterTypes.h:30
float TrackScore
Definition TrackScore.h:10
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee