ATLAS Offline Software
InDetTrackHoleSearchTool.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 // InDetTrackHoleSearchTool.cxx, (c) ATLAS Detector software
8 
10 
11 //Trk
12 #include "TrkTrack/Track.h"
22 #include "Identifier/Identifier.h"
26 #include "TrkVolumes/Volume.h"
29 #include <set>
30 
31 //================ Constructor =================================================
33  const std::string& n,
34  const IInterface* p) :
35  AthAlgTool(t,n,p),
36  m_atlasId(nullptr),
37  m_warning(0) {
38  declareInterface<ITrackHoleSearchTool>(this);
39 }
40 
41 //================ Destructor =================================================
43 
44 //================ Initialisation =================================================
46 
48  if (sc.isFailure()) return sc;
49 
50  ATH_CHECK(detStore()->retrieve(m_atlasId, "AtlasID"));
51 
52  ATH_CHECK(m_extrapolator.retrieve());
53 
54  if (m_extendedListOfHoles) ATH_MSG_INFO("Search for extended list of holes ");
55 
56  return StatusCode::SUCCESS;
57 }
58 
59 //================ Finalisation =================================================
62  return sc;
63 }
64 
65 //============================================================================================
67  std::vector<int>& information,
68  const Trk::ParticleHypothesis partHyp) const {
69  std::vector<const Trk::TrackStateOnSurface*>* listOfHoles = nullptr;
70  searchForHoles(track,&information,listOfHoles,partHyp);
71  if (listOfHoles) {
72  ATH_MSG_ERROR("listOfHoles is leaking in countHoles !!!");
73  for (const auto *listOfHole : *listOfHoles) {
74  delete listOfHole;
75  }
76  delete listOfHoles;
77  listOfHoles = nullptr;
78  }
79  }
80 
81 //============================================================================================
83  const Trk::ParticleHypothesis partHyp) const {
84  std::vector<const Trk::TrackStateOnSurface*>* listOfHoles = new std::vector<const Trk::TrackStateOnSurface*>;
85  searchForHoles(track, nullptr, listOfHoles,partHyp);
86 
88  for (const auto *listOfHole : *listOfHoles)
89  output->push_back(listOfHole);
90 
91  delete listOfHoles;
92  listOfHoles = nullptr;
93  return output;
94 }
95 
96 //============================================================================================
98  const Trk::ParticleHypothesis partHyp) const {
99  std::vector<const Trk::TrackStateOnSurface*>* listOfHoles = new std::vector<const Trk::TrackStateOnSurface*>;
100  searchForHoles(track, nullptr, listOfHoles,partHyp);
101  const Trk::Track* newTrack = addHolesToTrack(track,listOfHoles);
102  delete listOfHoles;
103  listOfHoles = nullptr;
104  return newTrack;
105 }
106 
107 //============================================================================================
109  const Trk::ParticleHypothesis partHyp) const {
110  return getTrackWithHoles(track,partHyp);
111 }
112 
113 
114 //============================================================================================
115 
117  std::vector<int>* information,
118  std::vector<const Trk::TrackStateOnSurface*>* listOfHoles,
119  const Trk::ParticleHypothesis partHyp) const {
120  ATH_MSG_DEBUG("starting searchForHoles()");
121 
122  if (information) {
123  (*information)[Trk::numberOfPixelHoles] = -1;
124  (*information)[Trk::numberOfSCTHoles] = -1;
125  (*information)[Trk::numberOfSCTDoubleHoles] = -1;
126  (*information)[Trk::numberOfPixelDeadSensors] = -1;
127  (*information)[Trk::numberOfSCTDeadSensors] = -1;
128  (*information)[Trk::numberOfTRTHoles] = -1;
129  (*information)[Trk::numberOfTRTDeadStraws] = -1;
130 
131  }
132 
133  std::map<const Identifier, const Trk::TrackStateOnSurface*> mapOfHits;
134 
135  // JEF: fix of [bug #44382] Poor Tracking Software Performance without SCT
136  // the mapOfPrediction needs the knowledge weather a holesearch should be carried out
137  // on this identifier or just the search for dead modules
138  // therefore: if the boolean is set to true, a holesearch will be caarried out, otherwise just
139  // the search for dead modules
140  // for identifiers BEFORE the last measurement (and after the first): holesearch will be carried out always
141  // for identifiers AFTER the last measurement (or before the first), we have to distiguish two different scenarios:
142  // 1) extendedListOfHoles==True: a hole search will be carried out for all identifiers
143  // 2) extendedListOfHoles==False (default for collisions): dead modules will be counted after the last
144  // measurement, but no holes
145  std::map<const Identifier, std::pair<const Trk::TrackParameters*,const bool> > mapOfPredictions;
146 
147  bool listOk = getMapOfHits(
148  Gaudi::Hive::currentContext(), track, partHyp, mapOfHits, mapOfPredictions);
149 
150  if (listOk) {
151  ATH_MSG_DEBUG("Perform stepwise hole search");
152  performHoleSearchStepWise(mapOfHits, mapOfPredictions, information, listOfHoles);
153  } else {
154  ATH_MSG_DEBUG("List of hits not properly obtained, abort hole search.");
155  }
156 
157  for (auto & mapOfPrediction : mapOfPredictions) {
158  delete (mapOfPrediction.second).first;
159  (mapOfPrediction.second).first = nullptr;
160  }
161 
162  }
163 
164 // ====================================================================================================================
166  const Trk::Track& track,
167  const Trk::ParticleHypothesis partHyp,
168  std::map<const Identifier, const Trk::TrackStateOnSurface*>& mapOfHits,
169  std::map<const Identifier, std::pair<const Trk::TrackParameters*,const bool> >& mapOfPredictions) const {
170 
171  /* find all Si TSOS
172  - all of the above have to have identifiers
173  - keep outliers and holes
174  - mark tracks with TRT
175  - sort into map by identifier
176  */
177  //std::cout << "track: " << track << std::endl;
178  int imeas = 0;
179  const Trk::TrackParameters* firstsipar = nullptr;
180 
181  for (const auto *iterTSOS : *track.trackStateOnSurfaces()) {
182  // type of state is measurement, hole or outlier ?
183  if (iterTSOS->type(Trk::TrackStateOnSurface::Measurement) ||
184  iterTSOS->type(Trk::TrackStateOnSurface::Outlier)) {
185  Identifier id ;
186  bool hasID = false;
187  if (iterTSOS->measurementOnTrack() != nullptr
188  && iterTSOS->measurementOnTrack()->associatedSurface().associatedDetectorElement() != nullptr
189  && iterTSOS->measurementOnTrack()->associatedSurface().associatedDetectorElement()->identify() != 0) {
190  id = iterTSOS->measurementOnTrack()->associatedSurface().associatedDetectorElement()->identify();
191  hasID = true;
192  } else if (iterTSOS->trackParameters() != nullptr
193  && iterTSOS->trackParameters()->associatedSurface().associatedDetectorElement() != nullptr
194  && iterTSOS->trackParameters()->associatedSurface().associatedDetectorElement()->identify() != 0) {
195  id = iterTSOS->trackParameters()->associatedSurface().associatedDetectorElement()->identify();
196  hasID = true;
197  }
198  // copy all Si track states, including the holes and outliers
199  if (hasID && (m_atlasId->is_pixel(id) || m_atlasId->is_sct(id))) {
200  // sort the state according to the id
201  mapOfHits.insert(std::pair<const Identifier, const Trk::TrackStateOnSurface*>(id,iterTSOS));
202  if (!iterTSOS->type(Trk::TrackStateOnSurface::Outlier)) {
203  ++imeas;
204  if (!iterTSOS->trackParameters() && m_warning<10) {
205  m_warning++;
206  ATH_MSG_WARNING("No track parameters available for state of type measurement");
207  ATH_MSG_WARNING("Don't run this tool on slimmed tracks!");
208  if (m_warning==10) ATH_MSG_WARNING("(last message!)");
209  }
210  }
211  // for cosmics: remember parameters of first SI TSOS
212  if (m_cosmic && !firstsipar && iterTSOS->trackParameters()) firstsipar=iterTSOS->trackParameters();
213  if (iterTSOS->trackParameters()) {
214  ATH_MSG_VERBOSE("TSOS pos: " << iterTSOS->trackParameters()->position()
215  << " r: " << sqrt(pow(iterTSOS->trackParameters()->position().x(),2)
216  +pow(iterTSOS->trackParameters()->position().y(),2))
217  << " Si measurement");
218  }
219  } else {
220  if (iterTSOS->trackParameters()) {
221  ATH_MSG_VERBOSE("TSOS pos: " << iterTSOS->trackParameters()->position()
222  << " r: " << sqrt(pow(iterTSOS->trackParameters()->position().x(),2)
223  +pow(iterTSOS->trackParameters()->position().y(),2))
224  << " TRT measurement");
225  }
226  }
227  }
228  }
229 
230  ATH_MSG_DEBUG("Number of Si hits + outliers on original track: " << mapOfHits.size() << " , hits only: " << imeas);
231  if ((imeas<m_minSiHits && ! m_extendedListOfHoles) || imeas==0 || (!firstsipar && m_cosmic)) {
232  ATH_MSG_DEBUG("Less than "<< m_minSiHits << " Si measurements " << "on track, abort ID hole search");
233  mapOfHits.clear();
234  return false;
235  }
236 
237  // find starting point for 2nd iteration to find predictions
238  std::unique_ptr<const Trk::TrackParameters> startParameters;
239 
240  // ------- special logic for cosmics to obtain start point for hole search
241 
242  if (m_cosmic) {
243  // retrieve surface, from which hole search should start
244  // retrieve tracking geometry
245  const Trk::TrackingGeometry* trackingGeometry = m_extrapolator->trackingGeometry();
246  // get sct volume
247  const Trk::TrackingVolume* sctVolume = trackingGeometry->trackingVolume("InDet::Detectors::SCT::Barrel");
248  //get BoundarySurface for cylinder between sct and trt
249  const Trk::CylinderSurface* sctCylinder = nullptr;
250  const Trk::Surface* sctSurface= &(sctVolume->boundarySurfaces()[Trk::tubeOuterCover]->surfaceRepresentation());
251  if(sctSurface->type()==Trk::SurfaceType::Cylinder){
252  sctCylinder= static_cast<const Trk::CylinderSurface*> (sctSurface);
253  }
254  if (!sctCylinder) {
255  ATH_MSG_ERROR ("cast to CylinderSurface failed, should never happen !");
256  return false;
257  }
258  // extrapolate track to cylinder; take this as starting point for hole search
259 
260  if (firstsipar) {
261  //std::cout << "firstsipar: " << *firstsipar << " pos: " << firstsipar->position() << std::endl;
262  startParameters = m_extrapolator->extrapolate(
263  ctx, *firstsipar, *sctCylinder, Trk::oppositeMomentum, true, partHyp);
264  }
265 
266  // if track can't be extrapolated to this cylinder (EC track!), extrapolate to disc outside TRT/SCT EC
267  if (!startParameters) {
268  ATH_MSG_DEBUG("no start parameters on SCT cylinder, try TRT ec disc");
269  // get BoundarySurface for disk which encloses TRT ECs
270  // depending on track origin use neg or pos EC
271  const Trk::DiscSurface* trtDisc=nullptr;
272  // inverse logic: tracks with theta < M_PI/2 have origin in negative EC
273  if (firstsipar->parameters()[Trk::theta] < M_PI/2.) {
274  const Trk::TrackingVolume* trtVolume = trackingGeometry->trackingVolume("InDet::Detectors::TRT::NegativeEndcap");
275  const Trk::Surface* trtSurface = &(trtVolume->boundarySurfaces()[Trk::negativeFaceXY]->surfaceRepresentation());
276  if(trtSurface->type()==Trk::SurfaceType::Disc){
277  trtDisc = static_cast<const Trk::DiscSurface*> (trtSurface);
278  }
279  } else {
280  const Trk::TrackingVolume* trtVolume = trackingGeometry->trackingVolume("InDet::Detectors::TRT::PositiveEndcap");
281  const Trk::Surface* trtSurface = &(trtVolume->boundarySurfaces()[Trk::positiveFaceXY]->surfaceRepresentation());
282  if(trtSurface->type()==Trk::SurfaceType::Disc){
283  trtDisc = static_cast<const Trk::DiscSurface*> (trtSurface);
284  }
285  }
286 
287  if (trtDisc) {
288  // extrapolate track to disk
289  startParameters = m_extrapolator->extrapolate(
290  ctx, *firstsipar, *trtDisc, Trk::oppositeMomentum, true, partHyp);
291  }
292  }
293  } else { // no cosmics
294 
295  if (track.perigeeParameters()) {
296  startParameters.reset( track.perigeeParameters()->clone());
297  } else if (track.trackParameters()->front()) {
298  ATH_MSG_DEBUG("No perigee, extrapolate to 0,0,0");
299  // go back to perigee
300  startParameters =
301  m_extrapolator->extrapolate(ctx,
302  *(track.trackParameters()->front()),
305  false,
306  partHyp);
307  }
308  }
309 
310  if (!startParameters) {
311  ATH_MSG_DEBUG("No start point obtained, hole search not performed.");
312  mapOfHits.clear();
313  return false;
314  }
315 
316  bool foundFirst = false;
317  // ME - if we look for an extended list of holes, we take the first module, otherwise we searchfor the first measurment
318  // if we have a cosmics track, we want to get the extended list as well!
320  ATH_MSG_DEBUG("We are looking for an extended list of holes, so add eventual holes before first hits");
321  foundFirst = true;
322  }
323 
324  Identifier id(0);
325  const Trk::Surface* surf = nullptr;
326  bool hasID = false;
327 
328  // 2nd iteration to find predictions
329  Trk::TrackStates::const_iterator iterTSOS = track.trackStateOnSurfaces()->begin();
330 
331  // for cosmics: go to the first si mearsurement on track
332  // for cosmics: add perigee as intermediate state, as the extrapolator does nothing if the starting layer and destination layer are the same
333  if (m_cosmic) {
334  while (iterTSOS!=track.trackStateOnSurfaces()->end()
335  && (!(*iterTSOS)->type(Trk::TrackStateOnSurface::Measurement)
336  || (*iterTSOS)->measurementOnTrack()->associatedSurface().type()!=Trk::SurfaceType::Plane)) {
337  ++iterTSOS;
338  }
339  }
340 
341  ATH_MSG_VERBOSE("start position: " << startParameters->position()
342  << " r: " << sqrt(pow(startParameters->position().x(),2)
343  +pow(startParameters->position().y(),2)));
344 
345  int measno=0;
346  int nmeas=(int)track.measurementsOnTrack()->size();
347  for (; iterTSOS!=track.trackStateOnSurfaces()->end();++iterTSOS) {
348  const Trk::Perigee *per=nullptr;
349  // type of state is measurement ?
350  if ((*iterTSOS)->type(Trk::TrackStateOnSurface::Measurement) ||
351  (*iterTSOS)->type(Trk::TrackStateOnSurface::Outlier) ||
352  ((*iterTSOS)->type(Trk::TrackStateOnSurface::Perigee) && m_cosmic)) {
353  hasID=false;
354  per=nullptr;
355  const Trk::TrackParameters* tmpParam= (*iterTSOS)->trackParameters();
356  if (m_cosmic && tmpParam) {
358  per=static_cast<const Trk::Perigee*>(tmpParam) ;
359  }
360  }
361  if ((*iterTSOS)->measurementOnTrack() != nullptr
362  && (*iterTSOS)->measurementOnTrack()->associatedSurface().associatedDetectorElement() != nullptr
363  && (*iterTSOS)->measurementOnTrack()->associatedSurface().associatedDetectorElement()->identify() != 0) {
364  id = (*iterTSOS)->measurementOnTrack()->associatedSurface().associatedDetectorElement()->identify();
365  surf = &(*iterTSOS)->measurementOnTrack()->associatedSurface();
366  hasID = true;
367  } else if ((*iterTSOS)->trackParameters() != nullptr
368  && (*iterTSOS)->trackParameters()->associatedSurface().associatedDetectorElement() != nullptr
369  && (*iterTSOS)->trackParameters()->associatedSurface().associatedDetectorElement()->identify() != 0) {
370  id = (*iterTSOS)->trackParameters()->associatedSurface().associatedDetectorElement()->identify();
371  surf = &((*iterTSOS)->trackParameters()->associatedSurface());
372  hasID = true;
373  } else if (m_cosmic && per) {
374  surf=&((*iterTSOS)->trackParameters()->associatedSurface());
375  }
376 
377  // see if this is an Si state !
378  if ((m_cosmic && per) || (hasID && (m_atlasId->is_pixel(id) || m_atlasId->is_sct(id) || m_atlasId->is_trt(id)))) {
379 
380  if (m_atlasId->is_trt(id)) ATH_MSG_VERBOSE("Target is TRT, see if we can add something");
381 
382  // extrapolate stepwise to this parameter (be careful, sorting might be wrong)
383 
384  if(std::abs(startParameters->position().z())>5000.){
385  ATH_MSG_DEBUG("Pathological track parameter well outside of tracking detector");
386  ATH_MSG_DEBUG("Propagator might have issue with this, discarding");
387  ATH_MSG_VERBOSE("dumping track parameters " << *startParameters);
388  continue;
389  }
390 
391  std::vector<std::unique_ptr<Trk::TrackParameters> > paramList =
392  m_extrapolator->extrapolateStepwise(ctx,
393  *startParameters,
394  *surf,
396  false, partHyp);
397 
398  if (paramList.empty()) {
399  ATH_MSG_VERBOSE("--> Did not manage to extrapolate to surface!!!");
400  continue;
401  }
402 
403  ATH_MSG_VERBOSE("Number of parameters in this step: " << paramList.size());
404 
405  // loop over the predictons and analyze them
406  for (std::unique_ptr<Trk::TrackParameters>& thisParameters : paramList) {
407  ATH_MSG_VERBOSE("extrapolated pos: " << thisParameters->position() << " r: " <<
408  sqrt(pow(thisParameters->position().x(),2)+pow(thisParameters->position().y(),2)));
409 
410  // check if surface has identifer !
411  Identifier id2;
412  if ((thisParameters->associatedSurface()).associatedDetectorElement() != nullptr &&
413  (thisParameters->associatedSurface()).associatedDetectorElement()->identify() != 0) {
414  id2 = (thisParameters->associatedSurface()).associatedDetectorElement()->identify();
415  } else {
416  ATH_MSG_VERBOSE("Surface has no detector element ID, skip it");
417  if(thisParameters->associatedSurface().type()==Trk::SurfaceType::Perigee){
418  startParameters = std::move(thisParameters);
419  }
420  continue;
421  }
422 
423  // check if it is Si or Pixel
424  if (!(m_atlasId->is_pixel(id2) || m_atlasId->is_sct(id2))) {
425  ATH_MSG_VERBOSE("Surface is not Pixel or SCT, stop loop over parameters in this step");
426  // for collisions, we want to stop at the first trt measurement; whereas for cosmics not
427  // here we will have trt measurements on the track before the first si measurement!
428  if(thisParameters->associatedSurface().type()==Trk::SurfaceType::Perigee){
429  startParameters = std::move(thisParameters);
430  }
431  if (m_cosmic) continue;
432  else break;
433  }
434 
435  // see if this surface is in the list
437 
438  if (iTSOS == mapOfHits.end() && !foundFirst) {
439  ATH_MSG_VERBOSE("Si surface before first Si measurement, skip it and continue");
440  continue;
441  }
442 
443  // this is a measurement on the track ?
444  if (iTSOS != mapOfHits.end()) {
445  if (!foundFirst && !(*iterTSOS)->type(Trk::TrackStateOnSurface::Outlier)) {
446  ATH_MSG_VERBOSE("Found first Si measurement !");
447  foundFirst = true;
448  }
449 
450  // is this a surface which might have a better prediction ?
451  if (iTSOS->second->trackParameters()) {
452  ATH_MSG_VERBOSE("Found track parameter on Si surface, take it");
453  startParameters.reset( iTSOS->second->trackParameters()->clone());
454  } else {
455  ATH_MSG_VERBOSE("No parameter, take extrapolation");
456  startParameters.reset(thisParameters->clone());
457  }
458  }
459 
460  // add surface, test insert !
461  std::pair<const Trk::TrackParameters*,const bool> trackparampair (thisParameters.release(),true);
462  if (mapOfPredictions.insert(std::pair<const Identifier, std::pair<const Trk::TrackParameters*,const bool> >(id2,trackparampair)).second) {
463  ATH_MSG_VERBOSE("Added Si surface to mapOfPredictions");
464  } else {
465  ATH_MSG_VERBOSE("Had this, it is a double, skipped");
466  delete trackparampair.first;
467  trackparampair.first=nullptr;
468  }
469  }
470 
471  if (!(m_atlasId->is_pixel(id) || m_atlasId->is_sct(id))) {
472  ATH_MSG_VERBOSE("Target was no longer an Si element, break loop");
473  break;
474  }
475 
476  }
477  }
478  if ((*iterTSOS)->type(Trk::TrackStateOnSurface::Measurement) && !(*iterTSOS)->type(Trk::TrackStateOnSurface::Outlier)) measno++;
479  if (measno==nmeas) break; // don't count holes after last measurement, this is done below...
480  }
481 
482 
483  // if last extrapolation is not TRT:
484  // - if countDeadModulesAfterLastHit (robustness): search for dead modules
485  // - if cosmics or extendedListOfHoles: search for more holes after the last measurement (and also dead modules)
487  ATH_MSG_DEBUG("Search for dead modules after the last Si measurement");
488  if (m_extendedListOfHoles || m_cosmic) ATH_MSG_DEBUG("Search for extended list of holes");
489 
490  Trk::CylinderVolumeBounds* cylinderBounds = new Trk::CylinderVolumeBounds(560, 2750);
491  // don't delete the cylinderBounds -> it's taken care of by Trk::VOlume (see Trk::SharedObject)
492  Trk::Volume* boundaryVol = new Trk::Volume(nullptr, cylinderBounds);
493  // extrapolate this parameter blindly to search for more Si hits (not very fast, I know)
494 
495  std::vector<std::unique_ptr<Trk::TrackParameters> > paramList =
496  m_extrapolator->extrapolateBlindly(ctx,
497  *startParameters,
499  false, partHyp,
500  boundaryVol);
501  if (paramList.empty()) {
502  ATH_MSG_VERBOSE("--> Did not manage to extrapolate to another surface, break loop");
503  } else {
504  ATH_MSG_VERBOSE("Number of parameters in this step: " << paramList.size());
505 
506  // loop over the predictions and analyze them
507  for (std::unique_ptr<Trk::TrackParameters>& thisParameter : paramList) {
508  // check if surface has identifer !
509  Identifier id2;
510  if (thisParameter->associatedSurface().associatedDetectorElement() != nullptr &&
511  thisParameter->associatedSurface().associatedDetectorElement()->identify() != 0) {
512  id2 = thisParameter->associatedSurface().associatedDetectorElement()->identify();
513 
514  // check if it is Si or Pixel
515  if (!(m_atlasId->is_pixel(id2) || m_atlasId->is_sct(id2))) {
516  ATH_MSG_VERBOSE("Surface is not Pixel or SCT, stop loop over parameters in this step");
517  break;
518  }
519 
520  // JEF: bool parameter in trackparampair: flag weather this hit should be considered as hole; if
521  // not, just cound dead modules
522  std::pair<Trk::TrackParameters*, const bool> trackparampair(
523  thisParameter.release(), m_extendedListOfHoles || m_cosmic);
524  if (mapOfPredictions
525  .insert(std::pair<const Identifier, std::pair<const Trk::TrackParameters*, const bool>>(
526  id2, trackparampair))
527  .second) {
528  thisParameter.reset(trackparampair.first->clone());
529  ATH_MSG_VERBOSE("Added Si surface");
530  } else {
531  thisParameter.reset(trackparampair.first);
532  ATH_MSG_VERBOSE("Had this, it is a double, skipped");
533  }
534  } else {
535  ATH_MSG_VERBOSE("Surface has no detector element ID, skip it");
536  }
537 
538  // keep going...
539  startParameters = std::move(thisParameter);
540  }
541  }
542 
543  // gotta clean up ...
544  delete boundaryVol;
545  boundaryVol = nullptr;
546  //delete cylinderBounds; cylinderBounds = 0; // Till : don't delete this guy, it's deleted already when the boundaryVol gets deleted !
547  }
548 
549  ATH_MSG_DEBUG("Number of Predictions found: " << mapOfPredictions.size());
550  return true;
551 
552 }
553 
554 //=================================================================================================================
555 void InDet::InDetTrackHoleSearchTool::performHoleSearchStepWise(std::map<const Identifier, const Trk::TrackStateOnSurface*>& mapOfHits,
556  std::map<const Identifier, std::pair<const Trk::TrackParameters*, const bool> >& mapOfPredictions,
557  std::vector<int>* information,
558  std::vector<const Trk::TrackStateOnSurface*>* listOfHoles) const {
569  // counters to steer first/last Si hit logic
570  unsigned int foundTSOS = 0;
571  int PixelHoles = 0, SctHoles = 0, SctDoubleHoles = 0, PixelDead=0, SctDead=0;
572  std::set<Identifier> SctHoleIds;
573 
574  ATH_MSG_DEBUG("Start iteration");
575  ATH_MSG_DEBUG("Number of hits+outliers: " << mapOfHits.size() << " and predicted parameters:" << mapOfPredictions.size());
576 
577  for (std::map<const Identifier,std::pair<const Trk::TrackParameters*,const bool> >::const_iterator it = mapOfPredictions.begin();
578  it != mapOfPredictions.end(); ++it) {
579 
580  const Trk::TrackParameters* nextParameters = (it->second).first;
581 
583 
584  // search for this ID in the list
586 
587  if (iTSOS == mapOfHits.end()) {
588  switch (m_boundaryCheckTool->boundaryCheck(*nextParameters)) {
590  if (m_atlasId->is_pixel(id)) {
591 
592  ATH_MSG_VERBOSE("Found element is a dead pixel module, add it to the list and continue");
593  ++PixelDead;
594  } else if (m_atlasId->is_sct(id)) {
595 
596  ATH_MSG_VERBOSE("Found element is a dead SCT module, add it to the list and continue");
597  ++SctDead;
598  }
603  continue;
605  break;
606  }
607 
608  // increment tmp counters only if this detElement should be considered for a proper holesearch
609  // this info is the boolean in the (mapOfPredictions->second).second
610  if (((it->second).second)) {
611  if (m_atlasId->is_pixel(id)) {
612  ATH_MSG_VERBOSE("Found element is a Pixel hole, add it to the list and continue");
613  ++PixelHoles;
614  } else if (m_atlasId->is_sct(id)) {
615  ATH_MSG_VERBOSE("Found element is a SCT hole, add it to the list and continue");
616  ++SctHoles;
617 
618  // check double sct
619  // obtain backside of SCT module
620  const InDetDD::SiDetectorElement* thisElement =
621  dynamic_cast<const InDetDD::SiDetectorElement *> (nextParameters->associatedSurface().associatedDetectorElement());
622  if (!thisElement) {
623  ATH_MSG_ERROR ("cast to SiDetectorElement failed, should never happen !");
624  continue;
625  }
626 
627  const Identifier otherId = thisElement->otherSide()->identify();
628  // loop over holes and look for the other one
629  if (SctHoleIds.find(otherId) != SctHoleIds.end()) {
630  ATH_MSG_VERBOSE("Found an SCT double hole !!!");
631  ++SctDoubleHoles;
632  }
633  // keep this id for double side check
634  SctHoleIds.insert(id);
635 
636  }
637  // add to tmp list of holes
638  if (listOfHoles) listOfHoles->push_back(createHoleTSOS(nextParameters));
639  continue;
640  } else {
641  continue;
642  }
643  } // end (iTSOS == mapOfHits.end())
644 
645  if (iTSOS->second->type(Trk::TrackStateOnSurface::Outlier)) {
646  ++foundTSOS;
647  ATH_MSG_VERBOSE("Found TSOS is an outlier, not a hole, skip it and continue");
648  // remove this one from the map
649  mapOfHits.erase(iTSOS);
650  continue;
651  }
652 
653  if (iTSOS->second->type(Trk::TrackStateOnSurface::Measurement)) {
654  ++foundTSOS;
655  ATH_MSG_VERBOSE("Found TSOS is a measurement, continue");
656  // remove this one from the map
657  mapOfHits.erase(iTSOS);
658  continue;
659  }
660  } // end of loop
661 
662  ATH_MSG_DEBUG("==> Total number of holes found: "
663  << PixelHoles << " Pixel holes, "
664  << SctHoles << " Sct holes, "
665  << SctDoubleHoles << " Double holes");
666 
667  if (listOfHoles) ATH_MSG_DEBUG("==> Size of listOfHoles: " << listOfHoles->size());
668 
669  if (!mapOfHits.empty()) {
670  int ioutliers = 0, imeasurements = 0;
671  for (std::map<const Identifier, const Trk::TrackStateOnSurface*>::const_iterator iter = mapOfHits.begin();
672  iter != mapOfHits.end(); ++iter) {
673  if (iter->second->type(Trk::TrackStateOnSurface::Outlier)) ++ioutliers;
674  else if (iter->second->type(Trk::TrackStateOnSurface::Measurement)) ++imeasurements;
675  else ATH_MSG_ERROR("Found wrong TSOS in map !!!");
676  }
677 
678  if (imeasurements > 0) {
679  if (PixelHoles+SctHoles+SctDoubleHoles > 0) {
680  ATH_MSG_DEBUG("Not all measurements found, but holes. Left measurements: "
681  << imeasurements << " outliers: " << ioutliers << " found: " << foundTSOS
682  << " Pixel holes: " << PixelHoles << " Sct holes: " << SctHoles
683  << " Double holes: " << SctDoubleHoles);
684  } else {
685  ATH_MSG_DEBUG("Problem ? Not all measurements found. Left measurements: "
686  << imeasurements << " outliers: " << ioutliers << " found: " << foundTSOS);
687  }
688  }
689  }
690 
691  // update information and return
692  if (information) {
693  (*information)[Trk::numberOfPixelHoles] = PixelHoles;
694  (*information)[Trk::numberOfSCTHoles] = SctHoles;
695  (*information)[Trk::numberOfSCTDoubleHoles] = SctDoubleHoles;
696  (*information)[Trk::numberOfPixelDeadSensors] = PixelDead;
697  (*information)[Trk::numberOfSCTDeadSensors] = SctDead;
698  }
699 
700  }
701 
702 // ====================================================================================================================
704  std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
705  typePattern.set(Trk::TrackStateOnSurface::Hole);
706  const Trk::TrackStateOnSurface* tsos = new Trk::TrackStateOnSurface(nullptr,trackPar->uniqueClone(),nullptr,typePattern);
707  return tsos;
708 }
709 
710 // ====================================================================================================================
712  std::vector<const Trk::TrackStateOnSurface*>* listOfHoles) const {
713  auto trackTSOS = std::make_unique<Trk::TrackStates>();
714 
715  // get states from track
716  for (const auto *it : *oldTrack.trackStateOnSurfaces()) {
717  // veto old holes
718  if (!it->type(Trk::TrackStateOnSurface::Hole)) trackTSOS->push_back(new Trk::TrackStateOnSurface(*it));
719  }
720 
721  // if we have no holes on the old track and no holes found by search, then we just copy the track
722  if (oldTrack.trackStateOnSurfaces()->size() == trackTSOS->size() && listOfHoles->empty()) {
723  ATH_MSG_DEBUG("No holes on track, copy input track to new track");
724  // create copy of track
725  const Trk::Track* newTrack = new Trk::Track(
726  oldTrack.info(),
727  std::move(trackTSOS),
728  oldTrack.fitQuality() ? oldTrack.fitQuality()->uniqueClone() : nullptr);
729  return newTrack;
730  }
731 
732  // add new holes
733  for (const auto *listOfHole : *listOfHoles) {
734  trackTSOS->push_back(listOfHole);
735  }
736 
737  // sort
738  const Trk::TrackParameters* perigee = oldTrack.perigeeParameters();
739  if (!perigee) perigee = (*(oldTrack.trackStateOnSurfaces()->begin()))->trackParameters();
740 
741  if (perigee) {
742 
744 
745  // we always have to sort holes in
746  // if (!is_sorted(trackTSOS->begin(),trackTSOS->end(), CompFunc)) {
747 
748  if (fabs(perigee->parameters()[Trk::qOverP]) > 0.002) {
749  /* invest n*(logN)**2 sorting time for lowPt, coping with a possibly
750  not 100% transitive comparison functor.
751  */
752  ATH_MSG_DEBUG("sorting vector with stable_sort ");
753  std::stable_sort(trackTSOS->begin(), trackTSOS->end(), CompFunc);
754  } else {
755  trackTSOS->sort(CompFunc); // respects DV object ownership
756  }
757 
758  }
759 
760  // create copy of track
761  const Trk::Track* newTrack = new Trk::Track(
762  oldTrack.info(),
763  std::move(trackTSOS),
764  oldTrack.fitQuality() ? oldTrack.fitQuality()->uniqueClone() : nullptr);
765 
766  return newTrack;
767 }
768 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
AtlasDetectorID::is_pixel
bool is_pixel(Identifier id) const
Definition: AtlasDetectorID.h:760
Trk::anyDirection
@ anyDirection
Definition: PropDirection.h:22
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
InDet::InDetTrackHoleSearchTool::addHolesToTrack
const Trk::Track * addHolesToTrack(const Trk::Track &oldTrack, std::vector< const Trk::TrackStateOnSurface * > *listOfHoles) const
This Method creates a new Track from the TSOS of the input track combined with the TSOS from listOfHo...
Definition: InDetTrackHoleSearchTool.cxx:711
Trk::TrackStateOnSurface::Perigee
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
Definition: TrackStateOnSurface.h:117
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
Trk::Track::fitQuality
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
InDet::InDetTrackHoleSearchTool::m_cosmic
BooleanProperty m_cosmic
Definition: InDetTrackHoleSearchTool.h:128
Trk::Surface::associatedDetectorElement
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
TrackParameters.h
Trk::BoundaryCheckResult::DeadElement
@ DeadElement
outside the element
MeasurementBase.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
InDet::InDetTrackHoleSearchTool::m_warning
std::atomic_int m_warning
number of warnings printed when no track parameters available
Definition: InDetTrackHoleSearchTool.h:138
Trk::BoundaryCheckResult::Insensitive
@ Insensitive
close to the edge of an active element
Trk::PerigeeSurface
Definition: PerigeeSurface.h:43
AtlasDetectorID::is_sct
bool is_sct(Identifier id) const
Definition: AtlasDetectorID.h:770
Trk::ParametersBase::position
const Amg::Vector3D & position() const
Access method for the position.
Trk::oppositeMomentum
@ oppositeMomentum
Definition: PropDirection.h:21
InDet::InDetTrackHoleSearchTool::InDetTrackHoleSearchTool
InDetTrackHoleSearchTool(const std::string &, const std::string &, const IInterface *)
Definition: InDetTrackHoleSearchTool.cxx:32
Trk::ParametersBase::associatedSurface
virtual const Surface & associatedSurface() const override=0
Access to the Surface associated to the Parameters.
Trk::ParametersBase::uniqueClone
std::unique_ptr< ParametersBase< DIM, T > > uniqueClone() const
clone method for polymorphic deep copy returning unique_ptr; it is not overriden, but uses the existi...
Definition: ParametersBase.h:97
Trk::numberOfSCTDeadSensors
@ numberOfSCTDeadSensors
number of TRT hits
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:76
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::TrackingVolume::boundarySurfaces
std::vector< SharedObject< BoundarySurface< TrackingVolume > > > & boundarySurfaces()
Method to return the BoundarySurfaces.
Definition: TrackingVolume.cxx:982
Trk::Track::info
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
initialize
void initialize()
Definition: run_EoverP.cxx:894
Trk::BoundaryCheckResult::Candidate
@ Candidate
xAOD::JetInput::Track
@ Track
Definition: JetContainerInfo.h:61
InDet::InDetTrackHoleSearchTool::m_extendedListOfHoles
BooleanProperty m_extendedListOfHoles
Configure outwards hole search.
Definition: InDetTrackHoleSearchTool.h:127
skel.it
it
Definition: skel.GENtoEVGEN.py:396
M_PI
#define M_PI
Definition: ActiveFraction.h:11
TrackStateOnSurfaceComparisonFunction.h
Trk::positiveFaceXY
@ positiveFaceXY
Definition: BoundarySurfaceFace.h:33
InDet::InDetTrackHoleSearchTool::m_extrapolator
ToolHandle< Trk::IExtrapolator > m_extrapolator
Pointer to Extrapolator AlgTool.
Definition: InDetTrackHoleSearchTool.h:113
Trk::alongMomentum
@ alongMomentum
Definition: PropDirection.h:20
Trk::DiscSurface
Definition: DiscSurface.h:54
AtlasDetectorID::is_trt
bool is_trt(Identifier id) const
Definition: AtlasDetectorID.h:782
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
Trk::TrkDetElementBase::identify
virtual Identifier identify() const =0
Identifier.
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Trk::numberOfSCTHoles
@ numberOfSCTHoles
number of Holes in both sides of a SCT module
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:73
Trk::numberOfTRTHoles
@ numberOfTRTHoles
number of TRT hits which pass the high threshold (only xenon counted) total number of TRT hits which ...
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:83
ParamDefs.h
InDet::InDetTrackHoleSearchTool::~InDetTrackHoleSearchTool
virtual ~InDetTrackHoleSearchTool()
default destructor
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
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
Trk::numberOfTRTDeadStraws
@ numberOfTRTDeadStraws
number of TRT tube hits
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:95
Track.h
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:25
Trk::ParametersT::associatedSurface
virtual const S & associatedSurface() const override final
Access to the Surface method.
IInDetTestPixelLayerTool.h
CylinderVolumeBounds.h
AtlasDetectorID.h
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
Trk::TrackStateOnSurfaceComparisonFunction
Class providing comparison function, or relational definition, for sorting MeasurementBase objects.
Definition: TrackStateOnSurfaceComparisonFunction.h:37
Volume.h
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
InDet::InDetTrackHoleSearchTool::getTrackWithHolesAndOutliers
virtual const Trk::Track * getTrackWithHolesAndOutliers(const Trk::Track &track, const Trk::ParticleHypothesis partHyp=Trk::pion) const
Input : track, parthyp Return: A pointer to a new Trk::Track which containes the information of the i...
Definition: InDetTrackHoleSearchTool.cxx:108
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
id2
HWIdentifier id2
Definition: LArRodBlockPhysicsV0.cxx:562
Trk::TrackStates
DataVector< const Trk::TrackStateOnSurface > TrackStates
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:30
Trk::TrackStateOnSurface::Hole
@ Hole
A hole on the track - this is defined in the following way.
Definition: TrackStateOnSurface.h:128
InDet::InDetTrackHoleSearchTool::finalize
virtual StatusCode finalize()
standard Athena-Algorithm method
Definition: InDetTrackHoleSearchTool.cxx:60
beamspotman.n
n
Definition: beamspotman.py:731
Trk::theta
@ theta
Definition: ParamDefs.h:66
Trk::TrackingGeometry
Definition: TrackingGeometry.h:67
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Trk::CylinderSurface
Definition: CylinderSurface.h:55
Trk::numberOfPixelDeadSensors
@ numberOfPixelDeadSensors
number of pixel hits with broad errors (width/sqrt(12))
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:65
InDet::InDetTrackHoleSearchTool::countHoles
virtual void countHoles(const Trk::Track &track, std::vector< int > &information, const Trk::ParticleHypothesis partHyp=Trk::pion) const
Input : track, partHyp Output: Changes in information This method first calls the method getMapOfHits...
Definition: InDetTrackHoleSearchTool.cxx:66
InDet::InDetTrackHoleSearchTool::initialize
virtual StatusCode initialize()
standard Athena-Algorithm method
Definition: InDetTrackHoleSearchTool.cxx:45
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::negativeFaceXY
@ negativeFaceXY
Definition: BoundarySurfaceFace.h:32
TrackSummary.h
Trk::ParametersBase
Definition: ParametersBase.h:55
Trk::BoundaryCheckResult::Outside
@ Outside
with the insensitive area of an active element
DataVector< const Trk::TrackStateOnSurface >
InDet::InDetTrackHoleSearchTool::getHolesOnTrack
virtual const Trk::TrackStates * getHolesOnTrack(const Trk::Track &track, const Trk::ParticleHypothesis partHyp=Trk::pion) const
Input : track, parthyp Return: A DataVector containing pointers to TrackStateOnSurfaces which each re...
Definition: InDetTrackHoleSearchTool.cxx:82
SharedObject.h
InDet::InDetTrackHoleSearchTool::m_boundaryCheckTool
ToolHandle< Trk::IBoundaryCheckTool > m_boundaryCheckTool
Definition: InDetTrackHoleSearchTool.h:119
Trk::numberOfPixelHoles
@ numberOfPixelHoles
number of pixels which have a ganged ambiguity.
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:59
merge.output
output
Definition: merge.py:17
Trk::CylinderVolumeBounds
Definition: CylinderVolumeBounds.h:70
Trk::Track::perigeeParameters
const Perigee * perigeeParameters() const
return Perigee.
Definition: Tracking/TrkEvent/TrkTrack/src/Track.cxx:163
Trk::SurfaceType::Perigee
@ Perigee
InDet::InDetTrackHoleSearchTool::getMapOfHits
bool getMapOfHits(const EventContext &ctx, const Trk::Track &track, const Trk::ParticleHypothesis partHyp, std::map< const Identifier, const Trk::TrackStateOnSurface * > &mapOfHits, std::map< const Identifier, std::pair< const Trk::TrackParameters *, const bool >> &mapOfPredictions) const
Input: track Output: changes in mapOfHits (filling it) and hasTRT Return value: True if filling was s...
Definition: InDetTrackHoleSearchTool.cxx:165
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
InDetDD::SiDetectorElement::otherSide
const SiDetectorElement * otherSide() const
Useful for SCT only.
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:227
Trk::FitQuality::uniqueClone
std::unique_ptr< FitQuality > uniqueClone() const
NVI uniqueClone.
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
InDet::InDetTrackHoleSearchTool::searchForHoles
void searchForHoles(const Trk::Track &track, std::vector< int > *information, std::vector< const Trk::TrackStateOnSurface * > *listOfHoles, const Trk::ParticleHypothesis partHyp=Trk::pion) const
Input : track, parthyp Return: Changes in information and/or listOfHoles The interfacing method to th...
Definition: InDetTrackHoleSearchTool.cxx:116
InDetTrackHoleSearchTool.h
InDet::InDetTrackHoleSearchTool::getTrackWithHoles
virtual const Trk::Track * getTrackWithHoles(const Trk::Track &track, const Trk::ParticleHypothesis partHyp=Trk::pion) const
Input : track, parthyp Return: A pointer to a new Trk::Track which containes the information of the i...
Definition: InDetTrackHoleSearchTool.cxx:97
SiDetectorElement.h
InDet::InDetTrackHoleSearchTool::m_minSiHits
IntegerProperty m_minSiHits
Min number of hits.
Definition: InDetTrackHoleSearchTool.h:131
Trk::ParametersBase::momentum
const Amg::Vector3D & momentum() const
Access method for the momentum.
TrackingVolume.h
InDet::InDetTrackHoleSearchTool::performHoleSearchStepWise
void performHoleSearchStepWise(std::map< const Identifier, const Trk::TrackStateOnSurface * > &mapOfHits, std::map< const Identifier, std::pair< const Trk::TrackParameters *, const bool > > &mapOfPredictions, std::vector< int > *information, std::vector< const Trk::TrackStateOnSurface * > *listOfHoles) const
This method searches for holes in a track.
Definition: InDetTrackHoleSearchTool.cxx:555
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
InDet::InDetTrackHoleSearchTool::m_countDeadModulesAfterLastHit
BooleanProperty m_countDeadModulesAfterLastHit
Definition: InDetTrackHoleSearchTool.h:135
DeMoScan.first
bool first
Definition: DeMoScan.py:536
Trk::qOverP
@ qOverP
perigee
Definition: ParamDefs.h:67
Trk::SurfaceType::Disc
@ Disc
Trk::SurfaceType::Cylinder
@ Cylinder
Trk::TrackingGeometry::trackingVolume
const TrackingVolume * trackingVolume(const std::string &name) const
return the tracking Volume by name, 0 if it doesn't exist
InDet::InDetTrackHoleSearchTool::m_atlasId
const AtlasDetectorID * m_atlasId
ID pixel helper.
Definition: InDetTrackHoleSearchTool.h:110
Trk::tubeOuterCover
@ tubeOuterCover
Definition: BoundarySurfaceFace.h:40
TrackingGeometry.h
Trk::SurfaceType::Plane
@ Plane
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
Trk::BoundaryCheckResult::Error
@ Error
within the nominally active area of a dead element
AthAlgTool
Definition: AthAlgTool.h:26
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75
InDet::InDetTrackHoleSearchTool::createHoleTSOS
static const Trk::TrackStateOnSurface * createHoleTSOS(const Trk::TrackParameters *trackPar)
This method creates a TSOS to represent a detected hole.
Definition: InDetTrackHoleSearchTool.cxx:703
IGeoModelSvc.h
Trk::Volume
Definition: Volume.h:35
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
Trk::numberOfSCTDoubleHoles
@ numberOfSCTDoubleHoles
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:75
Trk::TrackingVolume
Definition: TrackingVolume.h:121
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
Trk::Surface::type
constexpr virtual SurfaceType type() const =0
Returns the Surface type to avoid dynamic casts.
InDetDD::SolidStateDetectorElementBase::identify
virtual Identifier identify() const override final
identifier of this detector element (inline)
Trk::TrackStateOnSurface::Measurement
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Definition: TrackStateOnSurface.h:101
TrackStateOnSurface.h
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
Trk::BoundaryCheckResult::OnEdge
@ OnEdge
within the sensitive area of an active element
Identifier
Definition: IdentifierFieldParser.cxx:14