ATLAS Offline Software
InDetIterativePriVxFinderTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3  */
4 
5 /***************************************************************************
6  InDetIterativePriVxFinderTool.cxx - Description
7  -------------------
8  begin : 23-02-2010
9  authors : Giacinto Piacquadio (CERN PH-ADE-ID)
10  changes :
11  2016-04-26 David Shope <david.richard.shope@cern.ch>
12  EDM Migration to xAOD - from Trk::VxCandidate to xAOD::Vertex
13  findVertex will now always return an xAOD::VertexContainer,
14  even when using a TrackCollection.
15  as input.
16 ***************************************************************************/
25 #include "TrkTrack/Track.h"
27 
29 #include "VxVertex/RecVertex.h"
31 
33 #include "TrkTrack/LinkToTrack.h"
35 
39 #include "xAODTracking/Vertex.h"
42 
43 #include <utility>
44 #include <vector>
45 
46 namespace InDet {
48  const std::string& t,
49  const std::string& n,
50  const IInterface* p)
51  : AthAlgTool(t, n, p)
52  , m_useBeamConstraint(false)
53  , m_significanceCutSeeding(10)
54  , m_maximumChi2cutForSeeding(6. * 6.)
55  , m_maxVertices(25)
56  , m_createSplitVertices(false)
57  , m_splitVerticesTrkInvFraction(2)
58  , m_reassignTracksAfterFirstFit(false)
59  , m_doMaxTracksCut(false)
60  , m_maxTracks(5000)
61 {
62  declareInterface<IVertexFinder>(this);
63  declareProperty("useBeamConstraint", m_useBeamConstraint);
64  declareProperty("significanceCutSeeding", m_significanceCutSeeding);
65  declareProperty("maximumChi2cutForSeeding", m_maximumChi2cutForSeeding);
66  declareProperty("maxVertices", m_maxVertices);
67  declareProperty("createSplitVertices", m_createSplitVertices);
68  declareProperty("splitVerticesTrkInvFraction",
69  m_splitVerticesTrkInvFraction,
70  "inverse fraction to split tracks (1:N)");
71  declareProperty("reassignTracksAfterFirstFit", m_reassignTracksAfterFirstFit);
72  declareProperty("doMaxTracksCut", m_doMaxTracksCut);
73  declareProperty("MaxTracks", m_maxTracks);
74 }
75 
77 
80 {
82  ATH_MSG_FATAL(" Split vertices cannot be obtained if beam spot constraint "
83  "is true! Change settings...");
84  return StatusCode::FAILURE;
85  }
86 
87  /* Get the right vertex fitting tool from ToolSvc */
88  if (m_iVertexFitter.retrieve().isFailure()) {
89  ATH_MSG_FATAL("Failed to retrieve tool " << m_iVertexFitter);
90  return StatusCode::FAILURE;
91  }
92 
93  if (m_SeedFinder.retrieve().isFailure()) {
94  ATH_MSG_FATAL("Failed to retrieve tool " << m_SeedFinder);
95  return StatusCode::FAILURE;
96  }
97 
98  if (m_LinearizedTrackFactory.retrieve().isFailure()) {
99  ATH_MSG_FATAL("Failed to retrieve tool " << m_LinearizedTrackFactory);
100  return StatusCode::FAILURE;
101  }
102 
103  if (m_ImpactPoint3dEstimator.retrieve().isFailure()) {
104  ATH_MSG_FATAL("Failed to retrieve tool " << m_ImpactPoint3dEstimator);
105  return StatusCode::FAILURE;
106  }
107 
109 
110  if (m_trkFilter.retrieve().isFailure()) {
111  ATH_MSG_ERROR(" Unable to retrieve " << m_trkFilter);
112  return StatusCode::FAILURE;
113  }
114 
115  // since some parameters special to an inherited class this method
116  // will be overloaded by the inherited class
118 
119  return StatusCode::SUCCESS;
120 }
121 
122 namespace {
123 struct xAODVertex_pair
124 {
125  double first;
127  xAODVertex_pair(double p1, xAOD::Vertex* p2)
128  : first(p1)
129  , second(p2)
130  {}
131  bool operator<(const xAODVertex_pair& other) const
132  {
133  return first > other.first;
134  }
135 };
136 } // anonymous namespace
137 
138 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
139 InDetIterativePriVxFinderTool::findVertex(const EventContext& ctx,
140  const TrackCollection* trackTES) const
141 {
142 
144  " Number of input tracks before track selection: " << trackTES->size());
145 
147  const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
148 
149  std::vector<Trk::ITrackLink*> selectedTracks;
150 
151  using TrackDataVecIter = DataVector<Trk::Track>::const_iterator;
152 
153  bool selectionPassed;
154  for (TrackDataVecIter itr = (*trackTES).begin(); itr != (*trackTES).end();
155  ++itr) {
156 
157  if (m_useBeamConstraint && beamSpot != nullptr) {
158  Trk::RecVertex beamPosition{ beamSpot->beamVtx() };
159  selectionPassed =
160  static_cast<bool>(m_trkFilter->accept(**itr, &beamPosition));
161  } else {
162  Trk::Vertex null(Amg::Vector3D(0, 0, 0));
163  selectionPassed = static_cast<bool>(m_trkFilter->accept(**itr, &null));
164  }
165  if (selectionPassed) {
167  link.setElement(*itr);
168  Trk::LinkToTrack* linkTT = new Trk::LinkToTrack(link);
169  linkTT->setStorableObject(*trackTES);
170  selectedTracks.push_back(linkTT);
171  }
172  }
173 
174  ATH_MSG_DEBUG("Of " << trackTES->size() << " tracks " << selectedTracks.size()
175  << " survived the preselection.");
176 
177  std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
178  returnContainers = findVertex(ctx, selectedTracks);
179 
180  return returnContainers;
181 }
182 
183 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
185  const EventContext& ctx,
186  const xAOD::TrackParticleContainer* trackParticles) const
187 {
188  ATH_MSG_DEBUG(" Number of input tracks before track selection: "
189  << trackParticles->size());
190 
192  const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
193 
194  std::vector<Trk::ITrackLink*> selectedTracks;
195 
196  using TrackParticleDataVecIter =
198 
199  bool selectionPassed;
200  for (TrackParticleDataVecIter itr = trackParticles->begin();
201  itr != trackParticles->end();
202  ++itr) {
203 
204  if (m_useBeamConstraint && beamSpot != nullptr) {
205  xAOD::Vertex beamPosition;
206  beamPosition.makePrivateStore();
207  beamPosition.setPosition(beamSpot->beamVtx().position());
208  beamPosition.setCovariancePosition(
209  beamSpot->beamVtx().covariancePosition());
210  selectionPassed =
211  static_cast<bool>(m_trkFilter->accept(**itr, &beamPosition));
212  } else {
213 
214  xAOD::Vertex null;
215  null.makePrivateStore();
216  null.setPosition(Amg::Vector3D(0, 0, 0));
217  AmgSymMatrix(3) vertexError;
218  vertexError.setZero();
219  null.setCovariancePosition(vertexError);
220  selectionPassed = static_cast<bool>(m_trkFilter->accept(**itr, &null));
221  }
222 
223  if (selectionPassed) {
225  link.setElement(*itr);
228  linkTT->setStorableObject(*trackParticles);
229  selectedTracks.push_back(linkTT);
230  }
231  }
232 
233  ATH_MSG_DEBUG("Of " << trackParticles->size() << " tracks "
234  << selectedTracks.size()
235  << " survived the preselection.");
236 
237  std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
238  returnContainers = findVertex(ctx, selectedTracks);
239 
240  return returnContainers;
241 }
242 
243 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
245  const EventContext& ctx,
246  const std::vector<Trk::ITrackLink*>& trackVector) const
247 {
249  const InDet::BeamSpotData* beamSpot = *beamSpotHandle;
250  // two things need to be added
251  // 1) the seeding mechanism
252  // 2) the iterative removal of tracks
253 
254  std::vector<Trk::ITrackLink*> origTracks = trackVector;
255  std::vector<Trk::ITrackLink*> seedTracks = trackVector;
256 
257  // TODO: xAODVertex_pair never seems to be used?
258  std::vector<xAODVertex_pair> myxAODVertices;
259 
260  xAOD::VertexContainer* theVertexContainer = new xAOD::VertexContainer;
261  xAOD::VertexAuxContainer* theVertexAuxContainer =
263  theVertexContainer->setStore(theVertexAuxContainer);
264 
265  // bail out early with only Dummy vertex if multiplicity cut is applied and
266  // exceeded
267 
268  if (m_doMaxTracksCut && (trackVector.size() > m_maxTracks)) {
269  ATH_MSG_WARNING(trackVector.size()
270  << " tracks - exceeds maximum (" << m_maxTracks
271  << "), skipping vertexing and returning only dummy...");
272  xAOD::Vertex* dummyxAODVertex = new xAOD::Vertex;
273  theVertexContainer->push_back(
274  dummyxAODVertex); // have to add vertex to container here first so it can
275  // use its aux store
276  dummyxAODVertex->setPosition(beamSpot->beamVtx().position());
277  dummyxAODVertex->setCovariancePosition(
278  beamSpot->beamVtx().covariancePosition());
279  dummyxAODVertex->vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
280  dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
281  return std::make_pair(theVertexContainer, theVertexAuxContainer);
282  }
283 
284  int iterations = 0;
285  unsigned int seedtracknumber = seedTracks.size();
286 
287  // used to store seed info
288  Amg::Vector3D actualVertex;
289 
290  // prepare iterators for tracks only necessary for seeding
293 
294  do {
295 
296  seedBegin = seedTracks.begin();
297  seedEnd = seedTracks.end();
298 
299  if (seedtracknumber == 0) {
300  ATH_MSG_DEBUG(" New iteration. No tracks available after track selection "
301  "for seeding. No finding done.");
302  break;
303  }
304 
305  ATH_MSG_DEBUG("ITERATION NUMBER " << iterations);
306 
307  // now find a new SEED
308 
309  std::vector<const Trk::TrackParameters*> perigeeList;
310  for (std::vector<Trk::ITrackLink*>::iterator seedtrkAtVtxIter = seedBegin;
311  seedtrkAtVtxIter != seedEnd;
312  ++seedtrkAtVtxIter) {
313  perigeeList.push_back((*seedtrkAtVtxIter)->parameters());
314  }
315 
316  xAOD::Vertex theconstraint;
317  if (m_useBeamConstraint && beamSpot != nullptr) {
318  theconstraint =
319  xAOD::Vertex(); // Default constructor creates a private store
320  theconstraint.setPosition(beamSpot->beamVtx().position());
321  theconstraint.setCovariancePosition(
322  beamSpot->beamVtx().covariancePosition());
323  theconstraint.setFitQuality(
324  beamSpot->beamVtx().fitQuality().chiSquared(),
325  beamSpot->beamVtx().fitQuality().doubleNumberDoF());
326  actualVertex = m_SeedFinder->findSeed(perigeeList, &theconstraint);
327  } else {
328  actualVertex = m_SeedFinder->findSeed(perigeeList);
329  Amg::MatrixX looseConstraintCovariance(3, 3);
330  looseConstraintCovariance.setIdentity();
331  looseConstraintCovariance = looseConstraintCovariance * 1e+8;
332  theconstraint = xAOD::Vertex();
333  theconstraint.setPosition(actualVertex);
334  theconstraint.setCovariancePosition(looseConstraintCovariance);
335  theconstraint.setFitQuality(0., -3.);
336  }
337 
338  if (msgLvl(MSG::DEBUG)) {
339  msg(MSG::DEBUG) << " seed at x: " << actualVertex.x()
340  << " at y: " << actualVertex.y()
341  << " at z: " << actualVertex.z() << endmsg;
342  }
343 
344  if (actualVertex.z() == 0.) {
345  break;
346  }
347 
348  // now question (remove tracks which are too far away??? I think so...)
349  std::vector<const Trk::TrackParameters*> perigeesToFit;
350  std::vector<const Trk::TrackParameters*> perigeesToFitSplitVertex;
351 
352  int numberOfTracks(perigeeList.size());
353 
354  std::vector<const Trk::TrackParameters*>::const_iterator perigeeListBegin =
355  perigeeList.begin();
356  std::vector<const Trk::TrackParameters*>::const_iterator perigeeListEnd =
357  perigeeList.end();
358 
359  int counter = 0;
360 
361  for (std::vector<const Trk::TrackParameters*>::const_iterator
362  perigeeListIter = perigeeListBegin;
363  perigeeListIter != perigeeListEnd;
364  ++perigeeListIter) {
365  if (numberOfTracks <= 2) {
366  perigeesToFit.push_back(*perigeeListIter);
367  counter += 1;
368  } else if (numberOfTracks <= 4 && !m_createSplitVertices) {
369  perigeesToFit.push_back(*perigeeListIter);
370  counter += 1;
371  } else if (numberOfTracks <= 4 * m_splitVerticesTrkInvFraction &&
373  // few tracks are left, put them into the fit regardless their position!
375  perigeesToFit.push_back(*perigeeListIter);
376  counter += 1;
377  } else {
378  perigeesToFitSplitVertex.push_back(*perigeeListIter);
379  counter += 1;
380  }
381  } else { // check first whether it is not too far away!
382  double distance = 0.;
383  try {
384  std::unique_ptr<Trk::PlaneSurface> mySurface =
385  m_ImpactPoint3dEstimator->Estimate3dIP(
386  *perigeeListIter, &actualVertex, distance);
388  msg(MSG::WARNING) << " ImpactPoint3dEstimator failed to find minimum "
389  "distance between track and vertex seed: "
390  << err.p << endmsg;
391  }
392 
393  if (distance < 0) {
394  msg(MSG::WARNING)
395  << " Distance between track and seed vtx is negative: " << distance
396  << endmsg;
397  }
398 
399  const Trk::TrackParameters* myPerigee = (*perigeeListIter);
400 
401  // very approximate error
402  double error = 0.;
403 
404  if (myPerigee && myPerigee->covariance()) {
405  error = std::sqrt((*myPerigee->covariance())(Trk::d0, Trk::d0) +
406  (*myPerigee->covariance())(Trk::z0, Trk::z0));
407  } // end of the security check
408 
409  if (error == 0.) {
410  msg(MSG::ERROR) << " Error is zero! " << distance << endmsg;
411  error = 1.;
412  }
413 
417  perigeesToFit.push_back(*perigeeListIter);
418  counter += 1;
419  } else {
420  perigeesToFitSplitVertex.push_back(*perigeeListIter);
421  counter += 1;
422  }
423  }
424  }
425  }
426 
427  if (perigeesToFit.empty()) {
428  ATH_MSG_DEBUG(" No good seed found. Exiting search for vertices...");
429  break;
430  }
431 
432  // now you have perigeeToFit and perigeeToFitSplitVertices
433  // AND HERE YOU DO THE FIT
434  // to reassign vertices you look ino what is already in myVxCandidate
435  // you do it only ONCE!
436 
437  xAOD::Vertex* myxAODVertex = nullptr;
438  xAOD::Vertex* myxAODSplitVertex = nullptr;
439 
440  if (m_useBeamConstraint && !perigeesToFit.empty()) {
441  myxAODVertex = m_iVertexFitter->fit(perigeesToFit, theconstraint);
442  } else if (!m_useBeamConstraint && perigeesToFit.size() > 1) {
443  myxAODVertex = m_iVertexFitter->fit(perigeesToFit);
444  }
445  if (m_createSplitVertices && perigeesToFitSplitVertex.size() > 1) {
446  myxAODSplitVertex = m_iVertexFitter->fit(perigeesToFitSplitVertex);
447  }
448 
449  double ndf = 0.;
450  int ntracks = 0;
451  countTracksAndNdf(myxAODVertex, ndf, ntracks);
452 
453  double ndfSplitVertex = 0.;
454  int ntracksSplitVertex = 0;
455  countTracksAndNdf(myxAODSplitVertex, ndfSplitVertex, ntracksSplitVertex);
456 
457  bool goodVertex = myxAODVertex != nullptr &&
458  ((!m_useBeamConstraint && ndf > 0 && ntracks >= 2) ||
459  (m_useBeamConstraint && ndf > 3 && ntracks >= 2));
460 
461  if (msgLvl(MSG::DEBUG)) {
462  msg(MSG::DEBUG) << " xAOD::Vertex is pointer: " << myxAODVertex
463  << " ndf = " << ndf << " ntracks (with weight>0.01) "
464  << ntracks << " beam constraint "
465  << (m_useBeamConstraint ? "yes" : "no") << endmsg;
466  }
467 
468  if (!goodVertex) {
469  removeAllFrom(perigeesToFit, seedTracks);
470  } else {
472  // now you HAVE a good vertex
473  // but you want to add the tracks which you missed...
474 
475  int numberOfAddedTracks = 0;
476 
477  // iterate on remaining vertices and cross-check if tracks need to be
478  // attached to new vertex
479  xAOD::VertexContainer::iterator vxBegin = theVertexContainer->begin();
480  xAOD::VertexContainer::iterator vxEnd = theVertexContainer->end();
481 
482  for (xAOD::VertexContainer::iterator vxIter = vxBegin; vxIter != vxEnd;
483  ++vxIter) {
484  // now iterate on tracks at vertex
485 
486  std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVtx =
487  (&(*vxIter)->vxTrackAtVertex());
488 
489  if (!myVxTracksAtVtx)
490  continue;
491 
493  myVxTracksAtVtx->begin();
495  myVxTracksAtVtx->end();
496 
498  tracksBegin;
499  tracksIter != tracksEnd;) {
500  // only try with tracks which are not too tightly assigned to
501  // another vertex
502  if ((*tracksIter).weight() > 0.01) {
503  ++tracksIter;
504  continue;
505  }
506 
507  const Trk::TrackParameters* trackPerigee =
508  (*tracksIter).initialPerigee();
509 
510  if (trackPerigee == nullptr) {
511  msg(MSG::ERROR) << " Cast to perigee gives 0 pointer " << endmsg;
512  }
513 
514  double chi2_newvtx = compatibility(*trackPerigee, *myxAODVertex);
515  double chi2_oldvtx = compatibility(*trackPerigee, *(*vxIter));
516 
517  bool remove = false;
518 
519  if (chi2_newvtx < chi2_oldvtx) {
520  ATH_MSG_DEBUG(" Found track of old vertex (chi2= "
521  << chi2_oldvtx
522  << ") more compatible to new one (chi2= "
523  << chi2_newvtx << ")");
524 
525  perigeesToFit.push_back(trackPerigee);
526  // but you need to re-add it to the seedTracks too...
527 
528  bool isFound = false;
529 
531  origTracks.begin();
533  origTracks.end();
534 
535  for (std::vector<Trk::ITrackLink*>::iterator origIter = origBegin;
536  origIter != origEnd;
537  ++origIter) {
538  if ((*origIter)->parameters() == trackPerigee) {
539  isFound = true;
540  seedTracks.push_back(*origIter);
541  break;
542  }
543  }
544  if (!isFound) {
545  ATH_MSG_WARNING(" Cannot find old perigee to re-add back to "
546  "seed tracks... ");
547  }
548 
549  numberOfAddedTracks += 1;
550 
551  remove = true;
552  }
553 
554  if (remove) {
555  // now you have to delete the track from the old vertex...
556  // easy???
557  tracksIter = myVxTracksAtVtx->erase(tracksIter);
558  tracksBegin = myVxTracksAtVtx->begin();
559  tracksEnd = myVxTracksAtVtx->end();
560  } else {
561  ++tracksIter;
562  }
563  } // end of iterating on tracks
564  } // end of iterating on already found vertices in event
565 
566  // now you have to delete the previous xAOD::Vertex, do a new fit, then
567  // check if you still have a good vertex
568 
569  if (numberOfAddedTracks > 0) {
570  delete myxAODVertex;
571  myxAODVertex = nullptr;
572 
573  if (m_useBeamConstraint && !perigeesToFit.empty()) {
574  myxAODVertex = m_iVertexFitter->fit(perigeesToFit, theconstraint);
575  } else if (!m_useBeamConstraint && perigeesToFit.size() > 1) {
576  myxAODVertex = m_iVertexFitter->fit(perigeesToFit);
577  }
578 
579  ndf = 0.;
580  ntracks = 0;
581  countTracksAndNdf(myxAODVertex, ndf, ntracks);
582 
583  goodVertex = myxAODVertex != nullptr &&
584  ((!m_useBeamConstraint && ndf > 0 && ntracks >= 2) ||
585  (m_useBeamConstraint && ndf > 3 && ntracks >= 2));
586 
587  ATH_MSG_DEBUG(" Refitted xAODVertex is pointer: "
588  << myxAODVertex << " ndf = " << ndf
589  << " ntracks (with weight>0.01) " << ntracks
590  << " beam constraint "
591  << (m_useBeamConstraint ? "yes" : "no"));
592 
593  if (!goodVertex) {
594  removeAllFrom(perigeesToFit, seedTracks);
595  ATH_MSG_DEBUG(" Adding tracks resulted in an invalid vertex. "
596  "Should be rare. ");
597  }
598  } // end if tracks were added...
599  } // end reassign tracks from previous vertices and refitting if needed
600 
601  // need to re-ask goodVertex since it can be changed in the mean time
602  if (goodVertex) {
603  removeCompatibleTracks(myxAODVertex, perigeesToFit, seedTracks);
604  }
605  } // end else case on if not good Vertex
606 
607  bool goodSplitVertex = false;
608 
609  if (m_createSplitVertices) {
610  goodSplitVertex = myxAODSplitVertex != nullptr && ndfSplitVertex > 0 &&
611  ntracksSplitVertex >= 2;
612 
613  ATH_MSG_DEBUG(" xAODSplitVertex is pointer: "
614  << myxAODSplitVertex << " ndf = " << ndfSplitVertex
615  << " ntracks (with weight>0.01) " << ntracksSplitVertex);
616 
617  if (!goodSplitVertex) {
618  removeAllFrom(perigeesToFitSplitVertex, seedTracks);
619  } else {
621  myxAODSplitVertex, perigeesToFitSplitVertex, seedTracks);
622 
623  } // end else if not good Vertex
624  } // end if create split vertices
625 
626  if (!m_createSplitVertices) {
627  if (goodVertex) {
628  theVertexContainer->push_back(myxAODVertex);
629  } else {
630  if (myxAODVertex) {
631  delete myxAODVertex;
632  myxAODVertex = nullptr;
633  }
634  }
635  } else {
636  if (goodVertex) {
637  // type does not seem to be set earlier
638  myxAODVertex->setVertexType(xAOD::VxType::PriVtx);
639  theVertexContainer->push_back(myxAODVertex);
640  } else {
641  if (myxAODVertex) {
642  delete myxAODVertex;
643  myxAODVertex = nullptr;
644  }
645 
646  xAOD::Vertex* dummyxAODVertex = new xAOD::Vertex;
647  theVertexContainer->push_back(
648  dummyxAODVertex); // have to add vertex to container here first so it
649  // can use its aux store
650  dummyxAODVertex->setPosition(beamSpot->beamVtx().position());
651  dummyxAODVertex->setCovariancePosition(
652  beamSpot->beamVtx().covariancePosition());
653  dummyxAODVertex->vxTrackAtVertex() =
654  std::vector<Trk::VxTrackAtVertex>();
655  dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
656  }
657  if (goodSplitVertex) {
658  // type does not seem to be set earlier
659  myxAODSplitVertex->setVertexType(xAOD::VxType::PriVtx);
660  theVertexContainer->push_back(myxAODSplitVertex);
661  } else {
662  if (myxAODSplitVertex) {
663  delete myxAODSplitVertex;
664  myxAODSplitVertex = nullptr;
665  }
666 
667  xAOD::Vertex* dummyxAODVertex = new xAOD::Vertex;
668  theVertexContainer->push_back(
669  dummyxAODVertex); // have to add vertex to container here first so it
670  // can use its aux store
671  dummyxAODVertex->setPosition(beamSpot->beamVtx().position());
672  dummyxAODVertex->setCovariancePosition(
673  beamSpot->beamVtx().covariancePosition());
674  dummyxAODVertex->vxTrackAtVertex() =
675  std::vector<Trk::VxTrackAtVertex>();
676  dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
677  }
678  }
679 
680  ++iterations;
681  } while (seedTracks.size() > 1 && iterations < m_maxVertices);
682 
683  if (iterations == m_maxVertices) {
684  ATH_MSG_DEBUG("Reached maximum iterations, have "<<iterations<<" vertices");
685  }
686  else if (iterations > m_maxVertices) {
687  ATH_MSG_WARNING("Exceeded maximum iterations, have "<<iterations<<" vertices, m_maxVertices = "<<m_maxVertices);
688  }
689 
690  // unfortunately you have still a problem with the track to links!!!
691 
692  //---- add dummy vertex at the end
693  //------------------------------------------------------//
694  //---- if one or more vertices are already there: let dummy have same position
695  // as primary vertex
696  if (!m_createSplitVertices) {
697  if (!theVertexContainer->empty()) {
698  xAOD::Vertex* primaryVtx = theVertexContainer->front();
699  if (!primaryVtx->vxTrackAtVertex().empty()) {
701  xAOD::Vertex* dummyxAODVertex = new xAOD::Vertex;
702  theVertexContainer->push_back(
703  dummyxAODVertex); // have to add vertex to container here first so it
704  // can use its aux store
705  dummyxAODVertex->setPosition(primaryVtx->position());
706  dummyxAODVertex->setCovariancePosition(
707  primaryVtx->covariancePosition());
708  dummyxAODVertex->vxTrackAtVertex() =
709  std::vector<Trk::VxTrackAtVertex>();
710  dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
711  } else {
712  primaryVtx->setVertexType(xAOD::VxType::NoVtx);
713  }
714  }
715  //---- if no vertex is there let dummy be at beam spot
716 
717  else if (theVertexContainer->empty()) {
718  xAOD::Vertex* dummyxAODVertex = new xAOD::Vertex;
719  theVertexContainer->push_back(
720  dummyxAODVertex); // have to add vertex to container here first so it
721  // can use its aux store
722  dummyxAODVertex->setPosition(beamSpot->beamVtx().position());
723  dummyxAODVertex->setCovariancePosition(
724  beamSpot->beamVtx().covariancePosition());
725  dummyxAODVertex->vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
726  dummyxAODVertex->setVertexType(xAOD::VxType::NoVtx);
727  }
728  // loop over the pile up to set it as pile up (EXCLUDE first and last
729  // vertex, do not do that in split mode)
730  for (unsigned int i = 0; i < theVertexContainer->size() - 1; i++) {
731 
733  " Vtx: " << i << " x= " << (*theVertexContainer)[i]->position().x()
734  << " y= " << (*theVertexContainer)[i]->position().y() << " z= "
735  << (*theVertexContainer)[i]->position().z() << " ntracks= "
736  << (*theVertexContainer)[i]->vxTrackAtVertex().size()
737  << " chi2= " << (*theVertexContainer)[i]->chiSquared()
738  << " ndf = " << (*theVertexContainer)[i]->numberDoF());
739  if (i > 0) {
740  (*theVertexContainer)[i]->setVertexType(xAOD::VxType::PileUp);
741  }
742  }
743  }
744 
745  xAOD::VertexContainer::iterator vxBegin = theVertexContainer->begin();
746  xAOD::VertexContainer::iterator vxEnd = theVertexContainer->end();
747 
748  // prepare iterators for tracks only necessary for seeding
749  std::vector<Trk::ITrackLink*>::iterator origtrkbegin = origTracks.begin();
750  std::vector<Trk::ITrackLink*>::iterator origtrkend = origTracks.end();
751 
752  for (xAOD::VertexContainer::iterator vxIter = vxBegin; vxIter != vxEnd;
753  ++vxIter) {
754  std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVtx =
755  &((*vxIter)->vxTrackAtVertex());
756 
757  if (!myVxTracksAtVtx)
758  continue;
759 
761  myVxTracksAtVtx->begin();
763  myVxTracksAtVtx->end();
764 
765  bool found = false;
766 
767  for (std::vector<Trk::VxTrackAtVertex>::iterator tracksIter = tracksBegin;
768  tracksIter != tracksEnd;
769  ++tracksIter) {
770 
771  // now look for corresponding ITrackLink
772  for (std::vector<Trk::ITrackLink*>::iterator origtrkiter = origtrkbegin;
773  origtrkiter != origtrkend;
774  ++origtrkiter) {
775  if ((*origtrkiter)->parameters() == (*tracksIter).initialPerigee()) {
776  found = true;
777 
778  // assigning the input track to the fitted vertex through
779  // VxTrackAtVertices vector
780  (*tracksIter).setOrigTrack(*origtrkiter);
781 
782  // See if the trklink is to an xAOD::TrackParticle
783  Trk::LinkToXAODTrackParticle* linkToXAODTP = nullptr;
784  Trk::ITrackLink* tmpLink = (*tracksIter).trackOrParticleLink();
785  if (tmpLink->type() == Trk::ITrackLink::ToxAODTrackParticle) {
786  linkToXAODTP = static_cast<Trk::LinkToXAODTrackParticle*>(tmpLink);
787  }
788 
789  // If track is an xAOD::TrackParticle, set directly in xAOD::Vertex
790  if (linkToXAODTP) {
791  (*vxIter)->addTrackAtVertex(*linkToXAODTP, (*tracksIter).weight());
792  }
793 
794  origTracks.erase(origtrkiter);
795  origtrkbegin = origTracks.begin();
796  origtrkend = origTracks.end();
797  break;
798  }
799  }
800  if (!found) {
801  ATH_MSG_ERROR(" Cannot find vector element to fix links (step 4)! ");
802  }
803  } // end iterate on tracks at vtx
804  } // end iterate on vertices
805 
806  for (std::vector<Trk::ITrackLink*>::iterator origtrkiter = origtrkbegin;
807  origtrkiter != origtrkend;
808  ++origtrkiter) {
809  if ((*origtrkiter) != 0) {
810  delete *origtrkiter;
811  *origtrkiter = 0;
812  }
813  }
814 
815  return std::make_pair(theVertexContainer, theVertexAuxContainer);
816 }
817 
820 {
821  return StatusCode::SUCCESS;
822 }
823 
824 void
826 {
827  ATH_MSG_DEBUG("VxPrimary initialize(): Parametersettings "
828  << '\n'
829  << "VertexFitter " << m_iVertexFitter << '\n');
830 }
831 
832 void
833 InDetIterativePriVxFinderTool::SGError(const std::string& errService)
834 {
835  msg(MSG::FATAL) << errService << " not found. Exiting !" << endmsg;
836 }
837 
838 double
840  const Trk::TrackParameters& measPerigee,
841  const xAOD::Vertex& vertex) const
842 {
843  Trk::LinearizedTrack* myLinearizedTrack =
844  m_LinearizedTrackFactory->linearizedTrack(&measPerigee, vertex.position());
845 
846  AmgMatrix(2, 2) weightReduced =
847  myLinearizedTrack->expectedCovarianceAtPCA().block<2, 2>(0, 0);
848 
849  AmgMatrix(2, 2) errorVertexReduced =
850  (myLinearizedTrack->positionJacobian() *
851  (vertex.covariancePosition() *
852  myLinearizedTrack->positionJacobian().transpose()))
853  .block<2, 2>(0, 0);
854 
855  weightReduced += errorVertexReduced;
856 
857  weightReduced = weightReduced.inverse().eval();
858  Amg::Vector2D trackParameters2D =
859  myLinearizedTrack->expectedParametersAtPCA().block<2, 1>(0, 0);
860  double returnValue = trackParameters2D.dot(weightReduced * trackParameters2D);
861 
862  delete myLinearizedTrack;
863  myLinearizedTrack = nullptr;
864 
865  return returnValue;
866 }
867 
868 void
870  std::vector<const Trk::TrackParameters*>& perigeesToFit,
871  std::vector<Trk::ITrackLink*>& seedTracks) const
872 {
873  // remove all perigeesToFit and go on...
874 
875  std::vector<Trk::ITrackLink*>::iterator seedBegin = seedTracks.begin();
876  std::vector<Trk::ITrackLink*>::iterator seedEnd = seedTracks.end();
877 
879  perigeesToFit.begin();
881  perigeesToFit.end();
882 
884  perigeesToFitBegin;
885  perigeesToFitIter != perigeesToFitEnd;
886  ++perigeesToFitIter) {
887 
888  bool found = false;
889 
890  for (std::vector<Trk::ITrackLink*>::iterator seedIter = seedTracks.begin();
891  seedIter != seedEnd;
892  ++seedIter) {
893  if ((*seedIter)->parameters() == *perigeesToFitIter) {
894  found = true;
895  seedTracks.erase(seedIter);
896  seedBegin = seedTracks.begin();
897  seedEnd = seedTracks.end();
898  break;
899  }
900  }
901  if (!found) {
903  " Cannot find vector element to delete when removing BAD vertex! ");
904  }
905  } // for cycle
906 }
907 
908 void
910  double& ndf,
911  int& ntracks)
912 {
913  if (myxAODVertex) {
914  ndf = myxAODVertex->numberDoF();
915 
916  std::vector<Trk::VxTrackAtVertex> myVxTracksAtVtx =
917  myxAODVertex->vxTrackAtVertex();
918 
920  myVxTracksAtVtx.begin();
922  myVxTracksAtVtx.end();
923 
924  for (std::vector<Trk::VxTrackAtVertex>::iterator tracksIter = tracksBegin;
925  tracksIter != tracksEnd;
926  ++tracksIter) {
927  if ((*tracksIter).weight() > 0.01) {
928  ntracks += 1;
929  }
930  }
931  }
932 }
933 
934 void
936  xAOD::Vertex* myxAODVertex,
937  std::vector<const Trk::TrackParameters*>& perigeesToFit,
938  std::vector<Trk::ITrackLink*>& seedTracks) const
939 {
940  // now you have your new vertex with its new tracks
941  // now you have to get the compatibility also of all tracks which DIDN'T
942  // BELONG to the vertex!
943  std::vector<Trk::VxTrackAtVertex>* tracksAtVertex =
944  &(myxAODVertex->vxTrackAtVertex());
945 
946  std::vector<Trk::VxTrackAtVertex>::const_iterator tracksAtVertexBegin =
947  tracksAtVertex->begin();
948  std::vector<Trk::VxTrackAtVertex>::const_iterator tracksAtVertexEnd =
949  tracksAtVertex->end();
950 
951  std::vector<Trk::ITrackLink*>::iterator seedBegin = seedTracks.begin();
952  std::vector<Trk::ITrackLink*>::iterator seedEnd = seedTracks.end();
953 
955  perigeesToFit.begin();
957  perigeesToFit.end();
958 
959  for (std::vector<Trk::VxTrackAtVertex>::const_iterator tracksAtVertexIter =
960  tracksAtVertexBegin;
961  tracksAtVertexIter != tracksAtVertexEnd;
962  ++tracksAtVertexIter) {
963 
964  bool found = false;
965 
966  for (std::vector<Trk::ITrackLink*>::iterator seedIter = seedBegin;
967  seedIter != seedEnd;
968  ++seedIter) {
969  if ((*seedIter)->parameters() == (*tracksAtVertexIter).initialPerigee()) {
970  found = true;
971  if ((*tracksAtVertexIter).weight() > 0.01) {
972  seedTracks.erase(seedIter);
973  seedBegin = seedTracks.begin();
974  seedEnd = seedTracks.end();
975  }
976  break;
977  }
978  }
979 
980  if (!found) {
981  ATH_MSG_ERROR(" Cannot find vector element to delete (step 1)! ");
982  }
983 
984  found = false;
986  perigeesToFitBegin;
987  perigeesToFitIter != perigeesToFitEnd;
988  ++perigeesToFitIter) {
989  if (*perigeesToFitIter == (*tracksAtVertexIter).initialPerigee()) {
990  found = true;
991  if ((*tracksAtVertexIter).weight() > 0.01) {
992  perigeesToFit.erase(perigeesToFitIter);
993  perigeesToFitBegin = perigeesToFit.begin();
994  perigeesToFitEnd = perigeesToFit.end();
995  }
996  break;
997  }
998  }
999 
1000  if (!found) {
1001  ATH_MSG_ERROR(" Cannot find vector element to delete (step 2)! ");
1002  }
1003  } // finishing iterating on tracks at vertex
1004 
1005  std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVertex =
1006  &(myxAODVertex->vxTrackAtVertex());
1007 
1009  myVxTracksAtVertex->begin();
1011  myVxTracksAtVertex->end();
1012 
1014  perigeesToFitBegin;
1015  perigeesToFitIter != perigeesToFitEnd;
1016  ++perigeesToFitIter) {
1017  bool found = false;
1018 
1019  // compute the chi2 with respect to the last fitted vertex!
1020  //(easy since track was NOT used in the last vertex fit...)
1021 
1022  const Trk::TrackParameters* myPerigee = (*perigeesToFitIter);
1023 
1024  if (myPerigee == nullptr) {
1025  ATH_MSG_ERROR(" Cast to perigee gives null pointer ");
1026  return;
1027  }
1028 
1029  double chi2 = compatibility(*myPerigee, *myxAODVertex);
1030 
1031  // check if still sufficiently compatible to previous vertex
1032  //(CAN BE VERY LOOSE TO BE CONSERVATIVE AGAINST FAR OUTLIERS)
1035  seedTracks.begin();
1036  seedIter != seedEnd;
1037  ++seedIter) {
1038  if ((*seedIter)->parameters() == *perigeesToFitIter) {
1039  found = true;
1040  seedTracks.erase(seedIter);
1041  seedBegin = seedTracks.begin();
1042  seedEnd = seedTracks.end();
1043  break;
1044  }
1045  }
1046 
1047  if (!found) {
1048  ATH_MSG_ERROR(" Cannot find vector element to delete (step 3)! ");
1049  }
1050  } else {
1051  // look if the track is attached to the vertex. If this is the case you
1052  // should delete the track from the vertex!
1053  for (std::vector<Trk::VxTrackAtVertex>::iterator tracksIter = tracksBegin;
1054  tracksIter != tracksEnd;
1055  ++tracksIter) {
1056  if ((*tracksIter).initialPerigee() == *perigeesToFitIter) {
1057  // delete *tracksIter;
1058  // delete has to happen BEFORE the erase (because the iterator will
1059  // point to the next object in the vector AFTER the erase!)
1060  myVxTracksAtVertex->erase(tracksIter);
1061  tracksBegin = myVxTracksAtVertex->begin();
1062  tracksEnd = myVxTracksAtVertex->end();
1063  found = true;
1064  break;
1065  }
1066  }
1067  }
1068  } // iterate on all perigeesToFit
1069 }
1070 
1071 } // end namespace InDet
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
covarianceTool.ndf
ndf
Definition: covarianceTool.py:678
operator<
bool operator<(const DataVector< T > &a, const DataVector< T > &b)
Vector ordering relation.
RecVertex.h
LinkToTrack.h
Trk::Vertex
Definition: Tracking/TrkEvent/VxVertex/VxVertex/Vertex.h:26
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
InDet::InDetIterativePriVxFinderTool::m_maxVertices
double m_maxVertices
Definition: InDetIterativePriVxFinderTool.h:160
xAOD::Vertex_v1::setPosition
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
Amg::MatrixX
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Definition: EventPrimitives.h:29
xAOD::Vertex_v1::setFitQuality
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
Definition: Vertex_v1.cxx:150
xAOD::VertexAuxContainer_v1
Temporary container used until we have I/O for AuxStoreInternal.
Definition: VertexAuxContainer_v1.h:32
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
InDet::InDetIterativePriVxFinderTool::m_splitVerticesTrkInvFraction
int m_splitVerticesTrkInvFraction
Integer: 1.
Definition: InDetIterativePriVxFinderTool.h:163
TrackParameters.h
xAOD::Vertex
Vertex_v1 Vertex
Define the latest version of the vertex class.
Definition: Event/xAOD/xAODTracking/xAODTracking/Vertex.h:16
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:19
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
InDet::InDetIterativePriVxFinderTool::m_useBeamConstraint
bool m_useBeamConstraint
Definition: InDetIterativePriVxFinderTool.h:157
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
InDet::InDetIterativePriVxFinderTool::countTracksAndNdf
static void countTracksAndNdf(xAOD::Vertex *myxAODVertex, double &ndf, int &ntracks)
Definition: InDetIterativePriVxFinderTool.cxx:920
InDet
DUMMY Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
EventPrimitivesHelpers.h
InDet::InDetIterativePriVxFinderTool::m_reassignTracksAfterFirstFit
bool m_reassignTracksAfterFirstFit
Definition: InDetIterativePriVxFinderTool.h:166
Trk::z0
@ z0
Definition: ParamDefs.h:70
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
InDet::InDetIterativePriVxFinderTool::m_beamSpotKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Definition: InDetIterativePriVxFinderTool.h:150
xAOD::Vertex_v1::position
const Amg::Vector3D & position() const
Returns the 3-pos.
InDet::InDetIterativePriVxFinderTool::SGError
void SGError(const std::string &errService)
Definition: InDetIterativePriVxFinderTool.cxx:844
InDet::InDetIterativePriVxFinderTool
Definition: InDetIterativePriVxFinderTool.h:71
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
InDet::InDetIterativePriVxFinderTool::finalize
virtual StatusCode finalize() override
Definition: InDetIterativePriVxFinderTool.cxx:830
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:562
xAOD::VertexContainer
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Definition: VertexContainer.h:14
x
#define x
ParamDefs.h
xAOD::VxType::NoVtx
@ NoVtx
Dummy vertex. TrackParticle was not used in vertex fit.
Definition: TrackingPrimitives.h:570
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:52
AmgMatrix
#define AmgMatrix(rows, cols)
Definition: EventPrimitives.h:51
Trk::RecVertex
Trk::RecVertex inherits from Trk::Vertex.
Definition: RecVertex.h:44
InDet::InDetIterativePriVxFinderTool::removeAllFrom
void removeAllFrom(std::vector< const Trk::TrackParameters * > &perigeesToFit, std::vector< Trk::ITrackLink * > &seedTracks) const
Definition: InDetIterativePriVxFinderTool.cxx:880
xAOD::TrackParameters
TrackParameters_v1 TrackParameters
Definition: Event/xAOD/xAODTracking/xAODTracking/TrackParameters.h:11
Track.h
xAOD::VxType::VertexType
VertexType
Vertex types.
Definition: TrackingPrimitives.h:569
InDet::InDetIterativePriVxFinderTool::m_createSplitVertices
bool m_createSplitVertices
Definition: InDetIterativePriVxFinderTool.h:162
PixelModuleFeMask_create_db.remove
string remove
Definition: PixelModuleFeMask_create_db.py:83
xAOD::Vertex_v1::setVertexType
void setVertexType(VxType::VertexType vType)
Set the type of the vertex.
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
GeoPrimitives.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LinkToXAODTrackParticle.h
TrackParticleAuxContainer.h
dqt_zlumi_pandas.err
err
Definition: dqt_zlumi_pandas.py:193
DataModel_detail::iterator
(Non-const) Iterator class for DataVector/DataList.
Definition: DVLIterator.h:184
xAOD::VertexAuxContainer
VertexAuxContainer_v1 VertexAuxContainer
Definition of the current jet auxiliary container.
Definition: VertexAuxContainer.h:19
lumiFormat.i
int i
Definition: lumiFormat.py:92
z
#define z
beamspotman.n
n
Definition: beamspotman.py:731
InDet::InDetIterativePriVxFinderTool::m_LinearizedTrackFactory
ToolHandle< Trk::IVertexLinearizedTrackFactory > m_LinearizedTrackFactory
Definition: InDetIterativePriVxFinderTool.h:144
InDet::InDetIterativePriVxFinderTool::InDetIterativePriVxFinderTool
InDetIterativePriVxFinderTool(const std::string &t, const std::string &n, const IInterface *p)
Constructor.
Definition: InDetIterativePriVxFinderTool.cxx:58
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
vector
Definition: MultiHisto.h:13
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
error::ImpactPoint3dEstimatorProblem
Definition: IImpactPoint3dEstimator.h:72
InDet::InDetIterativePriVxFinderTool::printParameterSettings
virtual void printParameterSettings()
Internal method to print the parameters setting.
Definition: InDetIterativePriVxFinderTool.cxx:836
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:571
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:522
DataVector::front
const T * front() const
Access the first element in the collection as an rvalue.
Trk::LinkToTrack
AUTO - An Undocumented Tracking Object.
Definition: LinkToTrack.h:20
VxTrackAtVertex.h
Trk::LinkToXAODTrackParticle
Element link to XAOD TrackParticle.
Definition: LinkToXAODTrackParticle.h:33
InDet::InDetIterativePriVxFinderTool::m_iVertexFitter
ToolHandle< Trk::IVertexFitter > m_iVertexFitter
Definition: InDetIterativePriVxFinderTool.h:126
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TrackSummary.h
Trk::ParametersBase
Definition: ParametersBase.h:55
DataVector< Trk::Track >
Vertex.h
InDet::InDetIterativePriVxFinderTool::m_significanceCutSeeding
double m_significanceCutSeeding
Definition: InDetIterativePriVxFinderTool.h:158
EventPrimitives.h
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
InDet::InDetIterativePriVxFinderTool::m_maxTracks
unsigned int m_maxTracks
Definition: InDetIterativePriVxFinderTool.h:169
InDet::InDetIterativePriVxFinderTool::m_maximumChi2cutForSeeding
double m_maximumChi2cutForSeeding
Definition: InDetIterativePriVxFinderTool.h:159
xAOD::VxType::PileUp
@ PileUp
Pile-up vertex.
Definition: TrackingPrimitives.h:573
Amg
Definition of ATLAS Math & Geometry primitives (Amg)
Definition: AmgStringHelpers.h:19
Trk::d0
@ d0
Definition: ParamDefs.h:69
InDet::InDetIterativePriVxFinderTool::m_doMaxTracksCut
bool m_doMaxTracksCut
Definition: InDetIterativePriVxFinderTool.h:168
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
SG::AuxElement::makePrivateStore
void makePrivateStore()
Create a new (empty) private store for this object.
Definition: AuxElement.cxx:172
InDet::InDetIterativePriVxFinderTool::removeCompatibleTracks
void removeCompatibleTracks(xAOD::Vertex *myxAODVertex, std::vector< const Trk::TrackParameters * > &perigeesToFit, std::vector< Trk::ITrackLink * > &seedTracks) const
Definition: InDetIterativePriVxFinderTool.cxx:946
InDetIterativePriVxFinderTool.h
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
IDTPM::chiSquared
float chiSquared(const U &p)
Definition: TrackParametersHelper.h:136
xAOD::Vertex_v1::numberDoF
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
TrackParticle.h
InDet::InDetIterativePriVxFinderTool::m_ImpactPoint3dEstimator
ToolHandle< Trk::IImpactPoint3dEstimator > m_ImpactPoint3dEstimator
Definition: InDetIterativePriVxFinderTool.h:138
DataVector.h
An STL vector of pointers that by default owns its pointed-to elements.
InDet::InDetIterativePriVxFinderTool::initialize
virtual StatusCode initialize() override
Definition: InDetIterativePriVxFinderTool.cxx:90
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
InDet::BeamSpotData
Definition: BeamSpotData.h:21
calibdata.delete
list delete
Definition: calibdata.py:46
VertexContainer.h
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
InDet::InDetIterativePriVxFinderTool::m_SeedFinder
ToolHandle< Trk::IVertexSeedFinder > m_SeedFinder
Definition: InDetIterativePriVxFinderTool.h:135
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
y
#define y
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
PlaneSurface.h
DeMoScan.first
bool first
Definition: DeMoScan.py:534
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
python.BuildSignatureFlags.beamSpot
AthConfigFlags beamSpot(AthConfigFlags flags, str instanceName, str recoMode)
Definition: BuildSignatureFlags.py:402
dot
Definition: dot.py:1
Trk::PriVtx
@ PriVtx
Primary Vertex.
Definition: VertexType.h:27
xAOD::Vertex_v1::vxTrackAtVertex
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
Definition: Vertex_v1.cxx:181
AthAlgTool
Definition: AthAlgTool.h:26
FitQuality.h
test_pyathena.counter
counter
Definition: test_pyathena.py:15
InDet::InDetIterativePriVxFinderTool::findVertex
virtual std::pair< xAOD::VertexContainer *, xAOD::VertexAuxContainer * > findVertex(const EventContext &ctx, const TrackCollection *trackTES) const override
Find vertex from Trk::TrackCollection.
Definition: InDetIterativePriVxFinderTool.cxx:150
error
Definition: IImpactPoint3dEstimator.h:70
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
InDet::InDetIterativePriVxFinderTool::compatibility
double compatibility(const Trk::TrackParameters &measPerigee, const xAOD::Vertex &vertex) const
Definition: InDetIterativePriVxFinderTool.cxx:850
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAOD::Vertex_v1::setCovariancePosition
void setCovariancePosition(const AmgSymMatrix(3)&covariancePosition)
Sets the vertex covariance matrix.
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
TrackParticleContainer.h
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
VertexAuxContainer.h
InDet::InDetIterativePriVxFinderTool::~InDetIterativePriVxFinderTool
virtual ~InDetIterativePriVxFinderTool()
Destructor.
Trk::LinearizedTrack
Definition: LinearizedTrack.h:43
InDet::InDetIterativePriVxFinderTool::m_trkFilter
ToolHandle< InDet::IInDetTrackSelectionTool > m_trkFilter
Definition: InDetIterativePriVxFinderTool.h:129