ATLAS Offline Software
Loading...
Searching...
No Matches
InDet::InDetAmbiTrackSelectionTool Class Reference

This tool cross checks the hits on a track with the hits already stored in a PRD_AssociationTool. More...

#include <InDetAmbiTrackSelectionTool.h>

Inheritance diagram for InDet::InDetAmbiTrackSelectionTool:
Collaboration diagram for InDet::InDetAmbiTrackSelectionTool:

Public Member Functions

 InDetAmbiTrackSelectionTool (const std::string &, const std::string &, const IInterface *)
virtual ~InDetAmbiTrackSelectionTool ()=default
 default destructor
virtual StatusCode initialize () override
 standard Athena-Algorithm method
virtual StatusCode finalize () override
 standard Athena-Algorithm method
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

Private Member Functions

Trk::TrackcreateSubTrack (const std::vector< const Trk::TrackStateOnSurface * > &tsos, const Trk::Track *track) const
 method to create a new track from a vector of TSOS's

Private Attributes

PublicToolHandle< ITrtDriftCircleCutToolm_selectortool {this, "DriftCircleCutTool", "InDet::InDetTrtDriftCircleCutTool"}
 TRT minimum number of drift circles tool- returns allowed minimum number of TRT drift circles.
ToolHandle< Trk::IPRDtoTrackMapToolm_assoTool {this, "AssociationTool", "Trk::PRDtoTrackMapTool" }
const SiliconIDm_detID {nullptr}
 atlas id helper
IntegerProperty m_minHits {this, "minHits", 5}
 some cut values
IntegerProperty m_minTRT_Hits {this, "minTRTHits", 0}
int m_maxShared {0}
IntegerProperty m_maxSharedModules {this, "maxShared", 1}
IntegerProperty m_maxTracksPerPRD {this, "maxTracksPerSharedPRD", 2}
IntegerProperty m_minNotShared {this, "minNotShared", 6}
FloatProperty m_minScoreShareTracks {this, "minScoreShareTracks", 0.0}
BooleanProperty m_cosmics {this, "Cosmics", false}
BooleanProperty m_parameterization {this, "UseParameterization", true}
BooleanProperty m_doPixelClusterSplitting {this, "doPixelSplitting", false}
FloatProperty m_sharedProbCut {this, "sharedProbCut", 0.02}
IntegerProperty m_maxSplitSize {this, "MaximalSplitSize", 49, "A.S.: remove that when solved properly by updating the SplitProb info with isExcluded. A.S.: to be removed once EDM is updated"}

Detailed Description

This tool cross checks the hits on a track with the hits already stored in a PRD_AssociationTool.

Shared hits are allowed to some extent und under certain conditions (e.g. the track score is high enough), additional shared hits are removed if necessary. This tool does not delete any tracks. If the client is going to discard tracks entered into this tool, the tracks have to be deleted by this client.

Author
Martin Siebel Marti.nosp@m.n.Si.nosp@m.ebel@.nosp@m.CERN.nosp@m..ch

Definition at line 46 of file InDetAmbiTrackSelectionTool.h.

Constructor & Destructor Documentation

◆ InDetAmbiTrackSelectionTool()

InDet::InDetAmbiTrackSelectionTool::InDetAmbiTrackSelectionTool ( const std::string & t,
const std::string & n,
const IInterface * p )

Definition at line 29 of file InDetAmbiTrackSelectionTool.cxx.

31 :
32 base_class(t, n, p)
33{
34 // compute the number of shared hits from the number of max shared modules
36}

◆ ~InDetAmbiTrackSelectionTool()

virtual InDet::InDetAmbiTrackSelectionTool::~InDetAmbiTrackSelectionTool ( )
virtualdefault

default destructor

Member Function Documentation

◆ createSubTrack()

Trk::Track * InDet::InDetAmbiTrackSelectionTool::createSubTrack ( const std::vector< const Trk::TrackStateOnSurface * > & tsos,
const Trk::Track * track ) const
private

method to create a new track from a vector of TSOS's

Definition at line 534 of file InDetAmbiTrackSelectionTool.cxx.

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_MSG_DEBUG(x)
void setPatternRecognitionInfo(const TrackPatternRecoInfo &patternReco)
Method setting the pattern recognition algorithm.
@ InDetAmbiTrackSelectionTool
Added because of compilation problems.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.

◆ finalize()

StatusCode InDet::InDetAmbiTrackSelectionTool::finalize ( )
overridevirtual

standard Athena-Algorithm method

Definition at line 54 of file InDetAmbiTrackSelectionTool.cxx.

55{
56 return StatusCode::SUCCESS;
57}

◆ getCleanedOutTrack()

std::tuple< Trk::Track *, bool > InDet::InDetAmbiTrackSelectionTool::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
overridevirtual

Definition at line 60 of file InDetAmbiTrackSelectionTool.cxx.

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;
88 const DataVector<const Trk::TrackParameters>* vpar = ptrTrack->trackParameters();
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}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
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.
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
const ProbabilityInfo & splitProbability(const PrepRawData *cluster) const
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)
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.
void addPatternReco(const TrackInfo &)
A method adding just pattern recognition info without adding the actual properties.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
int get(const SummaryType &type) const
returns the summary information for the passed SummaryType.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
str index
Definition DeMoScan.py:362
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))

◆ initialize()

StatusCode InDet::InDetAmbiTrackSelectionTool::initialize ( )
overridevirtual

standard Athena-Algorithm method

Definition at line 40 of file InDetAmbiTrackSelectionTool.cxx.

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}
#define ATH_CHECK
Evaluate an expression and check for errors.
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

Member Data Documentation

◆ m_assoTool

ToolHandle<Trk::IPRDtoTrackMapTool> InDet::InDetAmbiTrackSelectionTool::m_assoTool {this, "AssociationTool", "Trk::PRDtoTrackMapTool" }
private

Definition at line 74 of file InDetAmbiTrackSelectionTool.h.

75{this, "AssociationTool", "Trk::PRDtoTrackMapTool" };

◆ m_cosmics

BooleanProperty InDet::InDetAmbiTrackSelectionTool::m_cosmics {this, "Cosmics", false}
private

Definition at line 88 of file InDetAmbiTrackSelectionTool.h.

88{this, "Cosmics", false};

◆ m_detID

const SiliconID* InDet::InDetAmbiTrackSelectionTool::m_detID {nullptr}
private

atlas id helper

Definition at line 78 of file InDetAmbiTrackSelectionTool.h.

78{nullptr};

◆ m_doPixelClusterSplitting

BooleanProperty InDet::InDetAmbiTrackSelectionTool::m_doPixelClusterSplitting {this, "doPixelSplitting", false}
private

Definition at line 90 of file InDetAmbiTrackSelectionTool.h.

90{this, "doPixelSplitting", false};

◆ m_maxShared

int InDet::InDetAmbiTrackSelectionTool::m_maxShared {0}
private

Definition at line 83 of file InDetAmbiTrackSelectionTool.h.

83{0};

◆ m_maxSharedModules

IntegerProperty InDet::InDetAmbiTrackSelectionTool::m_maxSharedModules {this, "maxShared", 1}
private

Definition at line 84 of file InDetAmbiTrackSelectionTool.h.

84{this, "maxShared", 1};

◆ m_maxSplitSize

IntegerProperty InDet::InDetAmbiTrackSelectionTool::m_maxSplitSize {this, "MaximalSplitSize", 49, "A.S.: remove that when solved properly by updating the SplitProb info with isExcluded. A.S.: to be removed once EDM is updated"}
private

Definition at line 92 of file InDetAmbiTrackSelectionTool.h.

92{this, "MaximalSplitSize", 49, "A.S.: remove that when solved properly by updating the SplitProb info with isExcluded. A.S.: to be removed once EDM is updated"};

◆ m_maxTracksPerPRD

IntegerProperty InDet::InDetAmbiTrackSelectionTool::m_maxTracksPerPRD {this, "maxTracksPerSharedPRD", 2}
private

Definition at line 85 of file InDetAmbiTrackSelectionTool.h.

85{this, "maxTracksPerSharedPRD", 2};

◆ m_minHits

IntegerProperty InDet::InDetAmbiTrackSelectionTool::m_minHits {this, "minHits", 5}
private

some cut values

Definition at line 81 of file InDetAmbiTrackSelectionTool.h.

81{this, "minHits", 5};

◆ m_minNotShared

IntegerProperty InDet::InDetAmbiTrackSelectionTool::m_minNotShared {this, "minNotShared", 6}
private

Definition at line 86 of file InDetAmbiTrackSelectionTool.h.

86{this, "minNotShared", 6};

◆ m_minScoreShareTracks

FloatProperty InDet::InDetAmbiTrackSelectionTool::m_minScoreShareTracks {this, "minScoreShareTracks", 0.0}
private

Definition at line 87 of file InDetAmbiTrackSelectionTool.h.

87{this, "minScoreShareTracks", 0.0};

◆ m_minTRT_Hits

IntegerProperty InDet::InDetAmbiTrackSelectionTool::m_minTRT_Hits {this, "minTRTHits", 0}
private

Definition at line 82 of file InDetAmbiTrackSelectionTool.h.

82{this, "minTRTHits", 0};

◆ m_parameterization

BooleanProperty InDet::InDetAmbiTrackSelectionTool::m_parameterization {this, "UseParameterization", true}
private

Definition at line 89 of file InDetAmbiTrackSelectionTool.h.

89{this, "UseParameterization", true}; // Use table of min number DCs

◆ m_selectortool

PublicToolHandle<ITrtDriftCircleCutTool> InDet::InDetAmbiTrackSelectionTool::m_selectortool {this, "DriftCircleCutTool", "InDet::InDetTrtDriftCircleCutTool"}
private

TRT minimum number of drift circles tool- returns allowed minimum number of TRT drift circles.

Definition at line 71 of file InDetAmbiTrackSelectionTool.h.

72{this, "DriftCircleCutTool", "InDet::InDetTrtDriftCircleCutTool"};

◆ m_sharedProbCut

FloatProperty InDet::InDetAmbiTrackSelectionTool::m_sharedProbCut {this, "sharedProbCut", 0.02}
private

Definition at line 91 of file InDetAmbiTrackSelectionTool.h.

91{this, "sharedProbCut", 0.02};

The documentation for this class was generated from the following files: