ATLAS Offline Software
Loading...
Searching...
No Matches
InDetAmbiTrackSelectionTool.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// InDetAmbiTrackSelectionTool.cxx, (c) ATLAS Detector software
7// Markus Elsing
9
11
20#include "TrkSurfaces/Surface.h"
21#include "TrkTrack/Track.h"
22#include "TrkTrack/TrackInfo.h"
26
27//================ Constructor =================================================
28
30 const std::string& n,
31 const IInterface* p) :
32 base_class(t, n, p)
33{
34 // compute the number of shared hits from the number of max shared modules
36}
37
38//================ Initialisation =================================================
39
41{
42 // Get segment selector tool
43 //
44 ATH_CHECK(m_selectortool.retrieve(DisableTool{!m_parameterization}));
45 ATH_CHECK(detStore()->retrieve(m_detID, "SiliconID" ));
46 ATH_MSG_DEBUG( "initialize() successful" );
47
48 ATH_CHECK(m_assoTool.retrieve() );
49 return StatusCode::SUCCESS;
50}
51
52//================ Finalisation =================================================
53
55{
56 return StatusCode::SUCCESS;
57}
58
59//============================================================================================
60std::tuple<Trk::Track*,bool> InDet::InDetAmbiTrackSelectionTool::getCleanedOutTrack(const Trk::Track *ptrTrack,
61 const Trk::TrackScore score,
62 Trk::ClusterSplitProbabilityContainer &splitProbContainer,
63 Trk::PRDtoTrackMap &prd_to_track_map,
64 int trackId /* = -1*/,
65 int subtrackId /* = -1*/) const
66{
67 // flag if the track is ok (true) or needs cleaning (false)
68 bool TrkCouldBeAccepted = true;
69
70 // some counters used in the logic
71 int numUnused = 0;
72 int numTRT_Unused = 0;
73 int numShared = 0;
74 int numWeightedShared = 0;
75 bool thishasblayer = false;
76 bool hassharedblayer = false;
77 bool hassharedpixel = false;
78 bool firstisshared = true; // logic is that it is set to false if we find a first hit unshared
79
80 // let's remember the last 2 ROTs on the track
81 const Trk::RIO_OnTrack* lastrot = nullptr;
82 const Trk::RIO_OnTrack* lastbutonerot = nullptr;
83 int lastrotindex = 0;
84
85 // cut on TRT hits, might use eta dependent cuts here
86 int nCutTRT = m_minTRT_Hits;
89 const Trk::TrackParameters* par = (*vpar)[0];
90 // ME bugfix
91 int expected = m_selectortool->minNumberDCs(par);
92 if (expected > nCutTRT) nCutTRT = expected;
93 }
94
95 // get all TSOS the track
96 const Trk::TrackStates* tsos = ptrTrack->trackStateOnSurfaces();
97 ATH_MSG_DEBUG ("Study new Track "<< ptrTrack<<"\t , it has "<<tsos->size()<<"\t track states");
98 ATH_MSG_DEBUG ("trackId "<< trackId <<", subtrackId "<<subtrackId);
99
100 // is this a track from the pattern or a fitted track ?
101 bool ispatterntrack = (ptrTrack->info().trackFitter()==Trk::TrackInfo::Unknown);
102 if (ispatterntrack) {
103 ATH_MSG_DEBUG ("==> this is a pattern track, outliers are good hits (reintegration) !");
104 } else {
105 ATH_MSG_DEBUG ("==> this is a refitted track, so we can use the chi2 ! ");
106 }
107
108 // some pre-processing of the summary information, if available, needed for special cuts
109 int nPixelDeadSensor = -1;
110 int nSCTDeadSensor = -1;
111 int npixel = 0;
112 int npixholes = 0;
113 int nsctholes = 0;
114 const Trk::TrackSummary* trkSummary=ptrTrack->trackSummary();
115 if (trkSummary) {
116 ATH_MSG_VERBOSE ("---> Found summary information");
117 nPixelDeadSensor = trkSummary->get(Trk::numberOfPixelDeadSensors);
118 nSCTDeadSensor = trkSummary->get(Trk::numberOfSCTDeadSensors);
119 npixel = trkSummary->get(Trk::numberOfPixelHits);
120 npixholes = trkSummary->get(Trk::numberOfPixelHoles);
121 nsctholes = trkSummary->get(Trk::numberOfSCTHoles);
122 }
123 // set nDeadSensors to 0 in case trkSummary wasn't called with HoleSearch
124 // (i.e. number of deadSensors not available)
125 if (nPixelDeadSensor == -1) nPixelDeadSensor = 0;
126 if (nSCTDeadSensor == -1) nSCTDeadSensor = 0;
127 ATH_MSG_VERBOSE ("---> Number of dead si sensors: " << nPixelDeadSensor + nSCTDeadSensor);
128
129 // possible classification of TSOS
130 enum TsosTypes {
131 // A measurement not yet used in any other track
132 UnusedHit = 1,
133 // A measurement shared with another track
134 SharedHit = 2,
135 // A hit that needs to be removed from the track
136 RejectedHit = 3,
137 // an outlier, to be copied in case
138 Outlier = 4,
139 // other TSOS types to be copied in case
140 OtherTsos = 5
141 };
142 // create an array of types for each TSOS
143 std::vector<int> tsosType;
144 tsosType.resize(tsos->size());
145
146 // loop over TSOS
148 Trk::TrackStates::const_iterator iTsosEnd = tsos->end();
149 for (int index = 0 ; iTsos != iTsosEnd ; ++iTsos, ++index) {
150
151 // init array
152 tsosType[index] = OtherTsos;
153
154 // get measurment from TSOS
155 const Trk::MeasurementBase* meas = (*iTsos)->measurementOnTrack();
156
157 // if we do not have a measurement, we should just mark it
158 if (!meas) {
159 ATH_MSG_VERBOSE ("-> No measurement on TSOS, it is another type, to be copied over");
160 tsosType[index] = OtherTsos;
161 continue;
162 }
163
164 // ok, let try to get the ROT then
165 const Trk::RIO_OnTrack* rot = dynamic_cast <const Trk::RIO_OnTrack*> (meas);
166 if (!rot) {
167 // could be a Pseudo-Measurement ?
168 const Trk::PseudoMeasurementOnTrack* pseudo = dynamic_cast <const Trk::PseudoMeasurementOnTrack*> (meas);
169 if (pseudo){
170 ATH_MSG_VERBOSE ("-> Copy pseudo measurement");
171 } else {
172 ATH_MSG_WARNING ("-> Measurement is not a pseudo measurment, not yet supported, try to copy !");
173 }
174 tsosType[index] = OtherTsos;
175 continue;
176 }
177
178 //
179 // we have a TSOS with a measurement, keep analysing it
180 //
181
182 // let's get some information about the measurement
183 const Identifier& id = rot->identify();
184 bool isTRT = m_detID->is_trt(id);
185 bool isPixel = m_detID->is_pixel(id);
186 bool isBlayer = isPixel ? m_detID->is_blayer(id) : false;
187 bool isoutlier = (*iTsos)->type(Trk::TrackStateOnSurface::Outlier);
188
189 // do we have some b-layer hit here (sorting of TSOS is inside out)
190 if (isBlayer && (!isoutlier || ispatterntrack)) thishasblayer = true; // we may reintegrate outliers from pattern
191
192 // special cut to remove problematic combinations in the pixels
193 if ( isPixel && !thishasblayer && npixholes>0 && // a pixel hit, no b-layer, we do have pixel holes
194 ( ( npixel==1 && !isoutlier ) || // one pixel on track, it is not an additional outlier
195 ( ispatterntrack && npixel==0 && isoutlier) ) ) { // pattern track, no pixels, but an outlier (we may reintegrate it)
196 ATH_MSG_VERBOSE ("-> Special case, problematic single pixel hit on track, reject it !");
197 tsosType[index] = RejectedHit;
198 // mark track as bad !
199 TrkCouldBeAccepted = false;
200 continue;
201 }
202
203 // do we have an outlier (an not a pattern track) ?
204 // if ( (isoutlier && !ispatterntrack) || !(m_detID->is_indet(id)) ) {
205 if ( (isoutlier && !ispatterntrack) || !(m_detID->is_indet(id)) ) {
206 ATH_MSG_VERBOSE ("-> Prd is outlier on a fitter track (or not InDet), copy it over");
207 tsosType[index] = Outlier;
208 continue;
209 }
210
211 // let's check if this is a shared hit (even if it is an outlier on a pattern track) ?
212 if (!prd_to_track_map.isUsed(*(rot->prepRawData()))) {
213 if ( !isoutlier ) {
214 ATH_MSG_VERBOSE ("-> Prd is unused, copy it over");
215 } else {
216 ATH_MSG_VERBOSE ("-> Prd is outlier on a pattern track and is unused, copy it over");
217 }
218
219 tsosType[index] = UnusedHit;
220 // increase some counters
221 if (isTRT) numTRT_Unused++;
222 else numUnused++;
223 // remember if first hit is shared, we need that later
224 if (numShared == 0) firstisshared = false;
225 // remember the last 2 ROTs
226 lastbutonerot = lastrot;
227 lastrot = rot;
228 lastrotindex = index;
229
230 continue;
231 }
232
233 //
234 // ok, we have a shared hit
235 //
236
237 // do we have an outlier and a pattern track, but the hit is shared, so reject it (we reintegrate it otherwise)
238 if ( isoutlier && ispatterntrack ) {
239 ATH_MSG_VERBOSE ("-> Shared Prd is outlier on a pattern track, we do not want to reintegrate it, so reject it ");
240 tsosType[index] = RejectedHit;
241 // mark track as bad !
242 TrkCouldBeAccepted = false;
243 continue;
244 }
245
246 // first check if it is a shared TRT hit, this is not allowed
247 if (isTRT) {
248 ATH_MSG_VERBOSE ("-> Share TRT hit, drop it !");
249 tsosType[index] = RejectedHit;
250 // mark track as bad !
251 TrkCouldBeAccepted = false;
252 continue;
253 }
254
255 /* consider hit to be a shared one, if
256 - not too many tracks share this hit already
257 - the score of the track is high enough to allow for shared hits
258 */
260 int numberOfTracksWithThisPrd = std::distance(range.first,range.second);
261 ATH_MSG_VERBOSE ("---> number of tracks with this share Prd: " << numberOfTracksWithThisPrd << " maxtracks: " << m_maxTracksPerPRD);
262
263 // see if we try keeping it as a shared hit ?
264 if ( numberOfTracksWithThisPrd < m_maxTracksPerPRD && // we do not allow to share with to many tracks
265 score > m_minScoreShareTracks && // score needs to be good
266 (!isPixel || npixholes<=0) ) { // we do not share pixels if there are holes in pixels
267
268 // special treatment of share split pixel clusters...
269 if (m_doPixelClusterSplitting && isPixel) {
270 // get pixel cluster
271 const InDet::PixelCluster* clus = dynamic_cast <const InDet::PixelCluster*> (rot->prepRawData());
272
273 if ( !clus ) {
274 ATH_MSG_WARNING ("-----> cast to Pixel cluster failed, should not happen !");
275 // mark track as bad !
276 TrkCouldBeAccepted = false; // we have to remove at least one PRD
277 continue;
278 } else {
279
280 // split clusters are not allowed to be shared at all, unless
281 const Trk::ClusterSplitProbabilityContainer::ProbabilityInfo &splitProb = splitProbContainer.splitProbability(clus);
282 if ( splitProb.isSplit() ) {
283 ATH_MSG_VERBOSE ("-----> Pixel cluster is split, reject shared hit !!!");
284 tsosType[index] = RejectedHit;
285 // mark track as bad !
286 TrkCouldBeAccepted = false; // we have to remove at least one PRD
287 continue;
288 }
289
290 // is cluster compatible with being a shared cluster ?
291 // A.S.: also a hack for the max size: allows large clusters that are exluded from the splitter to be shared
292 // needs isExcluded() flag in the future
293 if (splitProb.splitProbability1() < m_sharedProbCut && clus->rdoList().size() <= size_t(m_maxSplitSize) ) {
294 ATH_MSG_VERBOSE ("-----> Pixel cluster is not compatible with being shared (splitProb = "
295 << splitProb.splitProbability1() << ") , reject shared hit !!!");
296 tsosType[index] = RejectedHit;
297 // mark track as bad !
298 TrkCouldBeAccepted = false; // we have to remove at least one PRD
299 continue;
300 }
301 }
302 }
303
304 ATH_MSG_VERBOSE ("---> Shared hit, but good track, let's enter hit in the list and try to keep it !");
305 tsosType[index] = SharedHit;
306 numShared++; // increase counter
307 numWeightedShared += (isPixel ? 2 : 1); // increase counter
308
309 // some additional bookkeeping, we need this later
310 if (isPixel) {
311 // ME: bugfix, either shared blayer or shared pixel
312 if (isBlayer) hassharedblayer = true;
313 else hassharedpixel = true;
314 }
315 // remember the last 2 ROTs
316 lastbutonerot = lastrot;
317 lastrot = rot;
318 lastrotindex = index;
319
320 continue;
321 }
322
323 // ok, we failed to keep the share hit, let's reject it.
324 ATH_MSG_VERBOSE ("---> Share hit and bad track, reject it !");
325 tsosType[index] = RejectedHit;
326 // mark track as bad !
327 TrkCouldBeAccepted = false; // we have to remove at least one PRD
328 }
329
330 // total number of hits with dead modules
331 int totalSiHits = numUnused + nPixelDeadSensor + nSCTDeadSensor;
332
333 // special cut, do not allow the last hit to be to far away or after to many holes
334 if (ispatterntrack && // pattern track and
335 totalSiHits > m_minHits && // we have enough hits on the track
336 (lastrot && lastbutonerot) && // has enough ROTs
337 (lastrot->globalPosition()-lastbutonerot->globalPosition()).mag()>1000*CLHEP::mm) { // distance cut
338 ATH_MSG_DEBUG ("Special cut on distance, reject last hit on track !");
339 tsosType[lastrotindex] = RejectedHit;
340 numUnused--; // update counter
341 // mark track as bad !
342 TrkCouldBeAccepted = false;
343 }
344
345 // special cut, do not allow the last hit to be after to many holes
346 if (ispatterntrack && // pattern track and
347 totalSiHits > m_minHits && // we have enough hits on the track
348 nsctholes>3 ) { // too many holes cut
349 ATH_MSG_DEBUG ("Special cut on too many holes, reject last hit on track !");
350 tsosType[lastrotindex] = RejectedHit;
351 numUnused--; // update counter
352 // mark track as bad !
353 TrkCouldBeAccepted = false;
354 }
355
356
357
358 // get chi2/NDF, if track is fitted
359 if ( !ispatterntrack ) {
360 double trackchi2 = 0.;
361 if (ptrTrack->fitQuality() && ptrTrack->fitQuality()->numberDoF()>0 )
362 trackchi2 = ptrTrack->fitQuality()->chiSquared()/ptrTrack->fitQuality()->numberDoF();
363
364 // if we have share hits and this is a bad track, we reject it
365 if ( numShared > 0 && !ispatterntrack && trackchi2 > 3 ) {
366 ATH_MSG_DEBUG ("Shared hits, we have a bad chi2 track, mark it as bad !");
367 // mark track as bad !
368 TrkCouldBeAccepted = false;
369 }
370 }
371
372
373 // numTRT cut, special for back tracking
374 if ( numTRT_Unused < nCutTRT) {
375 ATH_MSG_DEBUG ("Track fails TRT hit cut, mark it as bad !");
376 // mark track as bad !
377 TrkCouldBeAccepted = false;
378 }
379
380 //
381 // now see what to do with the track
382 //
383
384 // best case, we like this track and it passes this complex if statement
385 if ( TrkCouldBeAccepted && // we did not mark the track as bad before
386 ( !hassharedblayer || npixholes<=1 ) && // if blayer, at most 1 pixel hole
387 !hassharedpixel && // no shared pixel hits
388 ( ( totalSiHits >= m_minHits && numShared == 0 ) || // no shared and enough hits OR
389 ( totalSiHits >= m_minNotShared && numWeightedShared <= m_maxShared && // shared hits and enough unique hits and shared hits with good quality
390 ( totalSiHits + std::min(numShared,m_maxShared) ) >= m_minHits && score > m_minScoreShareTracks ) ) ) {
391 ATH_MSG_DEBUG ("=> Suggest to keep track with "<<numShared<<" shared hits !");
392 return std::make_tuple(static_cast<Trk::Track *>(nullptr),true); // keep input track
393
394 // ok, failed that one, can we recover the track ?
395 } else if ( numTRT_Unused >= nCutTRT && // TRT track or no TRT at all (back tracking)
396 ( totalSiHits >= m_minHits || // we have enough hits OR
397 ( totalSiHits >= m_minNotShared && // shared hits and enough unique hits and shared hits with good quality
398 totalSiHits+std::min(numShared,m_maxShared) >= m_minHits && score > m_minScoreShareTracks ) ) ) {
399 // catch, if this is cosmics, accept the incoming track
400 if (m_cosmics) {
401 ATH_MSG_DEBUG ("=> Cosmics, accept input track even with shared hits");
402 return std::make_tuple(static_cast<Trk::Track *>(nullptr),true); // keep input track;
403 }
404
405 // if ( numShared == 0 && TrkCouldBeAccepted ) {
406 // ATH_MSG_DEBUG ("=> Nothing to recover from, drop track !");
407 // return std::make_tuple(static_cast<Trk::Track *>(nullptr),false); // reject input track;
408 // }
409
410 // Track is potentially ok, create a stripped down version from the unused hits and the allowed shared hits
411 // join shared to unused hits, if requirements are met
412
413 ATH_MSG_VERBOSE ("Trying to recover track, allow for some shared hits is possible.");
414
415 // new TSOS vector
416 std::vector<const Trk::TrackStateOnSurface*> newTSOS;
417
418 // counter for the weighted number of added shared hits
419 int cntIns = 0;
420
421 // loop over all TSOS (and types) and copy the good ones over
423 Trk::TrackStates::const_iterator iTsosEnd = tsos->end();
424
425 for (int index = 0 ; iTsos != iTsosEnd ; ++iTsos,++index ) {
426
427 // remove rejected hits
428 if (tsosType[index] == RejectedHit) {
429 ATH_MSG_VERBOSE ("-> Dropping rejected hit");
430
431 } else if (tsosType[index] != SharedHit ) {
432 ATH_MSG_VERBOSE ("-> Copy good TSOS");
433 newTSOS.push_back(*iTsos);
434
435 } else if (cntIns >= m_maxShared) {
436 ATH_MSG_VERBOSE ("-> Too many share hits, dropping outer hit(s)");
437
438 } else {
439 ATH_MSG_VERBOSE ("-> Try to recover a shared hit");
440
441 // get measurment from TSOS
442 const Trk::MeasurementBase* meas = (*iTsos)->measurementOnTrack();
443 // get ROT from this TSOS
444 const Trk::RIO_OnTrack* rot = dynamic_cast <const Trk::RIO_OnTrack*> (meas);
445
446 if (!rot) {
447 ATH_MSG_WARNING ("Cast to RIO_OnTrack failed, should never happen !");
448 continue;
449 }
450
451 // is it a pixel cluster ?
452 bool isPixel = m_detID->is_pixel(rot->identify());
453
454 // find out how many tracks use this hit already
456 int numberOfTracksWithThisPrd = std::distance(range.first,range.second);
457 ATH_MSG_VERBOSE ("---> number of tracks with this shared Prd: " << numberOfTracksWithThisPrd << " maxtracks: " << m_maxTracksPerPRD);
458
459 // check if this newly shared hit would exceed the shared hits limit of the already accepted track (**)
460 int iShared = 0;
461 int othernpixel = 0;
462 bool otherhasblayer = false;
463 if ( numberOfTracksWithThisPrd == 1 ) {
464 // @TODO is it ensured that the prds of all tracks have been registered already ?
465 std::vector< const Trk::PrepRawData* > prdsToCheck = m_assoTool->getPrdsOnTrack(prd_to_track_map,*(range.first->second));
466 for (const Trk::PrepRawData* prd : prdsToCheck) {
467 if (prd_to_track_map.isShared(*prd))
468 ++iShared;
469 if (m_detID->is_pixel(prd->identify())) {
470 othernpixel++;
471 if (m_detID->is_blayer(prd->identify())) otherhasblayer=true;
472 }
473 }
474 }
475
476 // now decide what to do, can we keep the shared hit
477 if ( numberOfTracksWithThisPrd < m_maxTracksPerPRD && // number of tracks sharing hit
478 score > m_minScoreShareTracks && // score cut
479 (!isPixel || !hassharedblayer || npixholes <= 0) && // shared b-layer only if no pixel holes
480 ( iShared < m_maxShared || (isPixel && !firstisshared) ) && // do not allow other accepted track to exceed the shared limit, if first pixel hit is shared
481 (!isPixel || thishasblayer == otherhasblayer ) && // only allow shared pixel if both have blayer or both not
482 (!isPixel || npixel >= othernpixel ) ) { // only allow shared pixel if new track as at least as many pixel hits
483
484 ATH_MSG_VERBOSE ("---> Accepted hit shared with " << numberOfTracksWithThisPrd << " tracks !");
485 newTSOS.push_back(*iTsos);
486 numUnused++; // update counter
487
488 // update shared hit counter
489 cntIns += (isPixel ? 2 : 1);
490
491 } else {
492 ATH_MSG_VERBOSE ("---> Reject hit shared with " << numberOfTracksWithThisPrd << " tracks !");
493 }
494 }
495 }
496
497 // this still may happen per (**) see above.
498 if ( numUnused+nPixelDeadSensor+nSCTDeadSensor < m_minHits || newTSOS.size() <= 3 ) {
499 ATH_MSG_DEBUG ("=> Too few hits, reject track with shared hits");
500 return std::make_tuple(static_cast<Trk::Track *>(nullptr),false); // reject input track;
501 }
502
503 // check that this is not the input track
504 if ( newTSOS.size() == tsos->size() ) {
505 ATH_MSG_DEBUG ("=> Recovered input track, accept it !");
506 return std::make_tuple(static_cast<Trk::Track *>(nullptr),true); // keep input track;
507 } else {
508 // ok, done, create subtrack
509 Trk::Track* newTrack = createSubTrack(newTSOS,ptrTrack);
510 if (!newTrack) {
511 ATH_MSG_DEBUG ("=> Failed to create subtrack");
512 return std::make_tuple(static_cast<Trk::Track *>(nullptr),false); // reject input track;
513 }
514
515 Trk::TrackInfo info;
516 info.addPatternRecoAndProperties(ptrTrack->info());
517 Trk::TrackInfo newInfo;
519 info.addPatternReco(newInfo);
520 newTrack->info().addPatternReco(ptrTrack->info());
521
522 ATH_MSG_DEBUG ("=> Successfully created subtrack with shared hits recovered !");
523 return std::make_tuple(newTrack,false); // new cleaned track, reject input track ;
524 }
525 } else {
526 ATH_MSG_DEBUG ("=> Track is recommended to be dropped");
527 }
528
529 return std::make_tuple(static_cast<Trk::Track *>(nullptr),false); // reject input track;
530}
531
532//==========================================================================================
533
534Trk::Track* InDet::InDetAmbiTrackSelectionTool::createSubTrack( const std::vector<const Trk::TrackStateOnSurface*>& tsos, const Trk::Track* track ) const
535{
536 int nmeas=0;
537 for (const Trk::TrackStateOnSurface* tsosIt : tsos) {
538 if (tsosIt->type(Trk::TrackStateOnSurface::Measurement)) nmeas++;
539 }
540 if (nmeas<3) {
541 ATH_MSG_DEBUG ("Less than 3 measurements, reject track !");
542 return nullptr;
543 }
544
545 auto vecTsos = std::make_unique<Trk::TrackStates>();
546
547 // loop over TSOS, copy TSOS and push into vector
548 for (const Trk::TrackStateOnSurface* tsosIt : tsos) {
549 const Trk::TrackStateOnSurface* newTsos = new Trk::TrackStateOnSurface(*tsosIt);
550 vecTsos->push_back(newTsos);
551 }
552
553 Trk::TrackInfo info;
554 info.addPatternRecoAndProperties(track->info());
555 Trk::TrackInfo newInfo;
557 info.addPatternReco(newInfo);
558
559 Trk::Track* newTrack = new Trk::Track(info, std::move(vecTsos),nullptr);
560
561 return newTrack;
562
563}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
An STL vector of pointers that by default owns its pointed-to elements.
This is an Identifier helper class for both the Pixel and SCT subdetectors.
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual std::tuple< Trk::Track *, bool > getCleanedOutTrack(const Trk::Track *track, const Trk::TrackScore score, Trk::ClusterSplitProbabilityContainer &splitProbContainer, Trk::PRDtoTrackMap &prd_to_track_map, int trackId=-1, int subtrackId=-1) const override
virtual StatusCode initialize() override
standard Athena-Algorithm method
Trk::Track * createSubTrack(const std::vector< const Trk::TrackStateOnSurface * > &tsos, const Trk::Track *track) const
method to create a new track from a vector of TSOS's
ToolHandle< Trk::IPRDtoTrackMapTool > m_assoTool
PublicToolHandle< ITrtDriftCircleCutTool > m_selectortool
TRT minimum number of drift circles tool- returns allowed minimum number of TRT drift circles.
const SiliconID * m_detID
atlas id helper
virtual StatusCode finalize() override
standard Athena-Algorithm method
InDetAmbiTrackSelectionTool(const std::string &, const std::string &, const IInterface *)
Container to associate Cluster with cluster splitting probabilities.
const ProbabilityInfo & splitProbability(const PrepRawData *cluster) const
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition FitQuality.h:60
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
This class is the pure abstract base class for all fittable tracking measurements.
bool isUsed(const PrepRawData &prd) const
does this PRD belong to at least one track?
PrepRawDataTrackMapRange onTracks(const PrepRawData &prd)
get the Tracks associated with this PrepRawData.
std::pair< PrepRawDataTrackMap::const_iterator, PrepRawDataTrackMap::const_iterator > ConstPrepRawDataTrackMapRange
bool isShared(const PrepRawData &prd) const
does this PRD belong to more than one track?
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
Class to handle pseudo-measurements in fitters and on track objects.
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.
Identifier identify() const
return the identifier -extends MeasurementBase
virtual const Amg::Vector3D & globalPosition() const override=0
Interface method to get the global Position.
Contains information about the 'fitter' of this track.
void addPatternReco(const TrackInfo &)
A method adding just pattern recognition info without adding the actual properties.
void setPatternRecognitionInfo(const TrackPatternRecoInfo &patternReco)
Method setting the pattern recognition algorithm.
@ InDetAmbiTrackSelectionTool
Added because of compilation problems.
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
A summary of the information contained by a track.
int get(const SummaryType &type) const
returns the summary information for the passed SummaryType.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const DataVector< const TrackParameters > * trackParameters() const
Return a pointer to a vector of TrackParameters.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
const Trk::TrackSummary * trackSummary() const
Returns a pointer to the const Trk::TrackSummary owned by this const track (could be nullptr)
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
float TrackScore
Definition TrackScore.h:10
DataVector< const Trk::TrackStateOnSurface > TrackStates
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfSCTHoles
number of Holes in both sides of a SCT module
@ numberOfPixelHoles
number of pixels which have a ganged ambiguity.
@ numberOfPixelDeadSensors
number of pixel hits with broad errors (width/sqrt(12))
Definition index.py:1