ATLAS Offline Software
Loading...
Searching...
No Matches
JetFitterV0FinderTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6
12
13using namespace InDet;
14
15JetFitterV0FinderTool::JetFitterV0FinderTool(const std::string &t, const std::string &n, const IInterface *p)
16 : AthAlgTool(t, n, p),
17 m_compatibilityAccessor( "TrackCompatibility" ),
18 m_tracksAccessor( "VxTrackAtVertex" )
19{
20
21 declareInterface< JetFitterV0FinderTool >(this);
22
23 std::string toolname = this->name();
24 std::string delimiter = "_";
25 std::string::size_type firstDelimiter = toolname.find(delimiter);
26 std::string sub = toolname.substr(0, firstDelimiter);
27 std::string decoratorName = std::string("JetFitter_TrackCompatibility_") + sub;
29
30}
31
33
34
36
37 if ( m_jetFitterUtils.retrieve().isFailure() ) {
38 ATH_MSG_ERROR( "Cannot retrieve InDet::InDetJetFitterUtils/InDetJetFitterUtils" );
39 return StatusCode::FAILURE;
40 }
41
42 if ( m_mode3dfinder.retrieve().isFailure() ) {
43 ATH_MSG_ERROR( "Cannot retrieve Trk::Mode3dTo1dFinder/Mode3dTo1dFinder" );
44 return StatusCode::FAILURE;
45 }
46
48 ATH_CHECK(detStore()->retrieve(m_beamPipeMgr, "BeamPipe"));
49 ATH_CHECK(detStore()->retrieve(m_pixelManager, "ITkPixel"));
50
52
54 }
55
56 return StatusCode::SUCCESS;
57}
58
60 return StatusCode::SUCCESS;
61}
62
63
64
66 const TLorentzVector& jetMomentum,
67 std::vector< const Trk::ITrackLink* >& inputTracks,
68 const std::vector< const xAOD::Vertex* >& vertexCandidates,
69 std::vector< const Trk::ITrackLink* >& tracksToUseInFirstFit,
70 std::vector< const Trk::ITrackLink* >& tracksToUseInSecondFit,
71 Amg::Vector3D& JFseedDirection ) const {
72
73 // Vector of seeding vertices.
74 std::vector< Trk::PositionAndWeight > positionsOfSeedingVertices;
75
76 // Using a function here, may become tool in the future!
77 // Phase 3, 4 and 5: find and select v0 candidates
78 std::vector< const xAOD::Vertex* > v0candidates = findV0candidates( primaryVertex,jetMomentum,inputTracks, vertexCandidates );
79 ATH_MSG_DEBUG( "Found " << v0candidates.size() <<" V0 candidates!" );
80
81 // Phase 6
82 // Select tracks for first fit using only the "best tracks" from the two-track vertices
83 ATH_MSG_DEBUG( "Analyzing two track vertices to select the best tracks" );
84 for ( const xAOD::Vertex* v0candidate : v0candidates ) {
85
86 // Check quality for first fit
87 bool satisfyCriteriaFirstFitQuality = checkCriteriaFirstFit( primaryVertex,jetMomentum,*v0candidate );
88 if ( not satisfyCriteriaFirstFitQuality ) {
89 ATH_MSG_DEBUG( "Quality criteria for first fit not satisfied! skipping ... " );
90 continue;
91 }
92
93 // The v0 candidate satisfy the selection criteria
94 // Filling the vector of tracks to be used in the first fit
95 std::vector< const Trk::ITrackLink* > vxTrackAtVertex = m_tracksAccessor( *v0candidate );
96 const Trk::ITrackLink *firstTrack = vxTrackAtVertex.at(0);
97 const Trk::ITrackLink *secondTrack = vxTrackAtVertex.at(1);
98
99 // Second track added first, legacy from old jetfitter
100 bool secondTrackAlreadyStored = InDet::InDetJetFitterUtils::checkIfTrackIsInVector( secondTrack,tracksToUseInFirstFit );
101 if ( not secondTrackAlreadyStored )
102 tracksToUseInFirstFit.push_back( secondTrack );
103
104 // First track
105 bool firstTrackAlreadyStored = InDet::InDetJetFitterUtils::checkIfTrackIsInVector( firstTrack,tracksToUseInFirstFit );
106 if ( not firstTrackAlreadyStored )
107 tracksToUseInFirstFit.push_back( firstTrack );
108
109 positionsOfSeedingVertices.emplace_back( v0candidate->position(),1 );
110 }
111
112
113 // Phase 7
114 ATH_MSG_DEBUG( "Determine single good tracks to add in the fit in a second step" );
115 for ( const Trk::ITrackLink *trackLink : inputTracks ) {
116
117 bool satisfyCriteriaSecondFitQuality = checkCriteriaSecondFit( primaryVertex,trackLink );
118 if ( not satisfyCriteriaSecondFitQuality ) {
119 ATH_MSG_DEBUG( "Quality criteria for second fit not satisfied! skipping ... " );
120 continue;
121 }
122
123 bool alreadyUsed = InDet::InDetJetFitterUtils::checkIfTrackIsInVector( trackLink,tracksToUseInFirstFit );
124 if ( alreadyUsed ) {
125 ATH_MSG_VERBOSE( "Track was already used" );
126 continue;
127 }
128
129 bool trackAlreadyStored = InDet::InDetJetFitterUtils::checkIfTrackIsInVector( trackLink,tracksToUseInSecondFit );
130 if ( not trackAlreadyStored )
131 tracksToUseInSecondFit.push_back( trackLink );
132 }
133
134
135 // Compute JFseedDirection
136 JFseedDirection = computeSeedDirection( primaryVertex,jetMomentum,positionsOfSeedingVertices );
137
138 // First argument is the list of vertex candidates
139 // Second argument is the list of Selected Neutral Tracks To Store
140 // The Trk::TwoTrackVerticesInJet takes over the ownership
141
142 // We need to use normal pointers instead of smart pointers since the code breaks.
143 // We have to fix this issue in the future
144 const Trk::TwoTrackVerticesInJet *twoTrackVerticesInJet = new Trk::TwoTrackVerticesInJet( std::move(v0candidates),
145 std::vector< const Trk::TrackParticleBase* >() );
146 return twoTrackVerticesInJet;
147}
148
149std::vector< const xAOD::Vertex* > JetFitterV0FinderTool::findV0candidates( const xAOD::Vertex& /*primaryVertex*/,
150 const TLorentzVector& /*jetMomentum*/,
151 std::vector< const Trk::ITrackLink* >& /*inputTracks*/,
152 const std::vector< const xAOD::Vertex* >& vertexCandidates ) const {
153
154 std::vector< const xAOD::Vertex* > v0candidates;
155 ATH_MSG_DEBUG( "Looping over " << vertexCandidates.size() <<" input candidates" );
156
157 for ( unsigned int indexA(0); indexA<vertexCandidates.size(); indexA++ ) {
158 const xAOD::Vertex* myCandidate = vertexCandidates.at( indexA );
159
160 // Here a shortlist of candidates will be applied
161
162 // Phase 4 and 5 (not called in old code)!
163 // Check for photon convertion, Ks and Lambda
164 // Veto candidates and tracks
165
166 // Make a copy of the input candidate
167 // This way of creating a copy creates a discrepancy w.r.t. the code in rel21, which is propagated to Jet Fitter variables.
168 // However, this assures that the vertex positions retrieved via position().x() and x() are consistent
169 xAOD::Vertex* toAdd = new xAOD::Vertex();
170 v0candidates.push_back( toAdd );
171 *toAdd = *myCandidate;
172 }
173
174 return v0candidates;
175}
176
178 const TLorentzVector& jetMomentum,
179 const xAOD::Vertex& v0candidate ) const {
180
181
182 // Check vertex probability
183 double vertexProb = TMath::Prob( v0candidate.chiSquared(),
184 v0candidate.numberDoF() );
185
188 ATH_MSG_DEBUG( "V0 candidate does not satisfy the vertex prob criteria!" );
189 return false;
190 }
191
192
193
194 // Retrieve and prepare objects
195 const std::vector< const Trk::ITrackLink* > vxTrackAtVertex = m_tracksAccessor( v0candidate );
196 const Trk::ITrackLink* trackLink1 = vxTrackAtVertex.at( 0 );
197 const Trk::ITrackLink* trackLink2 = vxTrackAtVertex.at( 1 );
198
199 if ( trackLink1 == nullptr || trackLink2 == nullptr ) {
200 ATH_MSG_DEBUG( "Zero pointer (ITrackLink): skipping 2-track candidate" );
201 return false;
202 }
203
204 const Trk::LinkToXAODTrackParticle* linkTrackA = dynamic_cast< const Trk::LinkToXAODTrackParticle* >( trackLink1 );
205 const Trk::LinkToXAODTrackParticle* linkTrackB = dynamic_cast< const Trk::LinkToXAODTrackParticle* >( trackLink2 );
206
207 if ( !linkTrackA || !linkTrackB ) {
208 ATH_MSG_DEBUG( "Zero pointer (LinkToXAODTrackParticle): skipping 2-track candidate" );
209 return false;
210 }
211
212
213 // TO-DO
214 // remove track candidates that are supposed to be voted !
215
216
217
218
219 // Take track compatibility and compute flight significance
220 // compatibility is attached to tracks, so we need to retrieve xAOD::TrackParticles objects
221 float compatibiltyTrackA = m_compatibilityAccessor( ***linkTrackA );
222 float compatibiltyTrackB = m_compatibilityAccessor( ***linkTrackB );
223
224 if ( TMath::Prob( fabs(compatibiltyTrackA),2 ) >= m_cutCompatibilityPrimaryVertexSingleTrackForBFirstSelection ) return false;
225 if ( TMath::Prob( fabs(compatibiltyTrackB),2 ) >= m_cutCompatibilityPrimaryVertexSingleTrackForBFirstSelection ) return false;
226 if ( TMath::Prob( fabs(compatibiltyTrackA) + fabs(compatibiltyTrackB),4 ) >= m_cutCompatibilityPrimaryVertexBothTracksForBFirstSelection ) return false;
227
228
229 // Criteria on D0 and Z0 of the tracks w.r.t. primary vertex
230 const Trk::TrackParameters* initialPerigee1 = linkTrackA->parameters();
231 const Trk::TrackParameters* initialPerigee2 = linkTrackB->parameters();
232
233 if ( !initialPerigee1 || !initialPerigee2 ) {
234 ATH_MSG_DEBUG( "No refitted parameters available for 2-track vertex. Candidate not accepted..." );
235 return false;
236 }
237
238 if ( initialPerigee1->momentum().perp() <= m_cutPtBothTracksForBFirstSelection ) return false;
239 if ( initialPerigee2->momentum().perp() <= m_cutPtBothTracksForBFirstSelection ) return false;
240
241
242
243
244 // Need to create Trk::RecVertex object. Is this really necessary?
245 Trk::RecVertex primaryVertexRecVertex( primaryVertex.position(),
246 primaryVertex.covariancePosition(),
247 primaryVertex.numberDoF(),
248 primaryVertex.chiSquared());
249
250 std::pair<double,double> track1_IPd0z0 = m_jetFitterUtils->getD0andZ0IP( *initialPerigee1,
251 primaryVertexRecVertex );
252
253 std::pair<double,double> track2_IPd0z0 = m_jetFitterUtils->getD0andZ0IP(*initialPerigee2,
254 primaryVertexRecVertex);
255
256
257
258 ATH_MSG_DEBUG( "Checking good quality for track A..." );
259 if ( fabs( track1_IPd0z0.first ) >= m_cutIPD0BothTracksForBFirstSelection ) return false;
260 if ( fabs( track1_IPd0z0.second ) >= m_cutIPZ0BothTracksForBFirstSelection ) return false;
261
262 ATH_MSG_DEBUG( "Checking good quality for track B..." );
263 if ( fabs( track2_IPd0z0.first ) >= m_cutIPD0BothTracksForBFirstSelection ) return false;
264 if ( fabs( track2_IPd0z0.second ) >= m_cutIPZ0BothTracksForBFirstSelection ) return false;
265
266
267
268
269
270 ATH_MSG_DEBUG( "Checking distance and error between two vertices..." );
271 std::pair<double,double> distanceAndError = m_jetFitterUtils->getDistanceAndErrorBetweenTwoVertices( v0candidate,primaryVertexRecVertex );
272
273 Amg::Vector3D jetMomSpatial( jetMomentum.X(), jetMomentum.Y(), jetMomentum.Z() );
274 double sign = ( v0candidate.position() - primaryVertexRecVertex.position() ).dot( jetMomSpatial );
275
276 double signedDistance = distanceAndError.first;
277 if ( sign < 0 ) signedDistance = -signedDistance;
278 double significance = signedDistance/distanceAndError.second;
279
280 double FirstSelectionFirstCriterium = m_cutTwoTrkVtxLifetimeSignificanceForBFirstSelectionFirstCriterium;
281 double FirstSelectionSecondCriterium = m_cutTwoTrkVtxLifetimeSignificanceForBFirstSelectionSecondCriterium;
282
284 FirstSelectionFirstCriterium = -FirstSelectionFirstCriterium;
285 FirstSelectionSecondCriterium = -FirstSelectionSecondCriterium;
286 }
287
288 bool firstCriterium = ( vertexProb > m_cutTwoTrkVtxVertexProbForBFirstSelectionFirstCriterium ) &&
289 ( significance > FirstSelectionFirstCriterium );
290 bool secondCriterium = ( vertexProb > m_cutTwoTrkVtxVertexProbForBFirstSelectionSecondCriterium ) &&
291 ( significance > FirstSelectionSecondCriterium );
292
293 if ( not ( firstCriterium || secondCriterium ) )
294 return false;
295
296
297
298
299 ATH_MSG_DEBUG( "Checking material interaction in layer..." );
300 double radius = v0candidate.position().perp();
301 double z = v0candidate.position().z();
302 bool matinteraction = false;
303
305 int bin = m_ITkPixMaterialMap->FindBin(z,radius);
306 if(m_ITkPixMaterialMap->GetBinContent(bin)>0) matinteraction = true;
307 }
308
309 else{
310 if ( (radius>m_firstLayer_min && radius<m_firstLayer_max)
311 || (radius>m_secondLayer_min && radius<m_secondLayer_max) )
312 matinteraction = true;
313 }
314
315 if ( matinteraction ) {
316 bool signifCutTight = ( TMath::Prob( fabs( compatibiltyTrackA ),2 ) < m_cutCompatibilityToPrimarySingleTrackForMatInteractions ) &&
317 ( TMath::Prob( fabs( compatibiltyTrackB ),2 ) < m_cutCompatibilityToPrimarySingleTrackForMatInteractions ) &&
318 ( TMath::Prob( fabs( compatibiltyTrackA ) + fabs( compatibiltyTrackB ),4 ) < m_cutCompatibilityToPrimaryBothTracksForMatInteractions );
319
320 if ( signifCutTight ) return false;
321 }
322
323
324
325 // TO-DO
326 // Remove candidates with track overlaps
327
328
329
330 return true;
331}
332
333
335 const Trk::ITrackLink *trackLink ) const {
336
337 const Trk::LinkToXAODTrackParticle* linkTrack = dynamic_cast< const Trk::LinkToXAODTrackParticle* >( trackLink );
338 if ( linkTrack == nullptr ) {
339 ATH_MSG_DEBUG( "Zero pointer (LinkToXAODTrackParticle): skipping 2-track candidate" );
340 return false;
341 }
342
343 float compatibilityTrack = m_compatibilityAccessor( ***linkTrack );
344
345
346 const Trk::TrackParameters* perigee = trackLink->parameters();
347 const AmgSymMatrix(5) *measPerigee = perigee->covariance();
348
349 if ( measPerigee == nullptr ) {
350 ATH_MSG_DEBUG( "Track parameters have no covariance. skipping single track candidate..." );
351 return false;
352 }
353
354 // Need to create Trk::RecVertex object. Is this really necessary?
355 Trk::RecVertex primaryVertexRecVertex( primaryVertex.position(),
356 primaryVertex.covariancePosition(),
357 primaryVertex.numberDoF(),
358 primaryVertex.chiSquared());
359
360 std::pair<double,double> track_IPd0z0 = m_jetFitterUtils->getD0andZ0IP( *perigee,
361 primaryVertexRecVertex );
362 std::pair<double,double> track_IPd0z0Sig = m_jetFitterUtils->getD0andZ0IPSig( *perigee,
363 primaryVertexRecVertex );
364
365 const double IPd0 = track_IPd0z0.first;
366 const double IPz0 = track_IPd0z0.second;
367 const double IPd0Sig = track_IPd0z0Sig.first;
368 const double IPz0Sig = track_IPd0z0Sig.second;
369 const double pT = perigee->momentum().perp();
370
371 double cutCompatibilityPrimaryVertexSinglePositiveLifetimeTrackForBSecondSelection = m_cutCompatibilityPrimaryVertexSinglePositiveLifetimeTrackForBSecondSelection;
372 double cutCompatibilityPrimaryVertexSingleNegativeLifetimeTrackForBSecondSelection = m_cutCompatibilityPrimaryVertexSingleNegativeLifetimeTrackForBSecondSelection;
373
375 cutCompatibilityPrimaryVertexSinglePositiveLifetimeTrackForBSecondSelection = m_cutCompatibilityPrimaryVertexSingleNegativeLifetimeTrackForBSecondSelection;
376 cutCompatibilityPrimaryVertexSingleNegativeLifetimeTrackForBSecondSelection = m_cutCompatibilityPrimaryVertexSinglePositiveLifetimeTrackForBSecondSelection;
377 }
378
379 bool passBoxCut = ( fabs(IPd0Sig) < m_cutIPD0SigBoxSingleTrackForBSecondSelection ) &&
381
382
383 if ( fabs(IPd0) > m_cutIPD0SingleTrackForBSecondSelection ||
385 ( compatibilityTrack >= 0 && TMath::Prob( fabs(compatibilityTrack),2) > cutCompatibilityPrimaryVertexSinglePositiveLifetimeTrackForBSecondSelection ) ||
386 ( compatibilityTrack < 0 && TMath::Prob( fabs(compatibilityTrack),2) > cutCompatibilityPrimaryVertexSingleNegativeLifetimeTrackForBSecondSelection ) ||
387 pT < m_cutPtSingleTrackForBSecondSelection || passBoxCut )
388 {
389 ATH_MSG_DEBUG( "Candidate didn't pass one of the selection cuts" );
390 return false;
391 }
392
393 return true;
394}
395
397 const TLorentzVector& jetMomentum,
398 const std::vector< Trk::PositionAndWeight >& positionsOfSeedingVertices ) const {
399
400 Amg::Vector3D JFseedDirection( jetMomentum.X(),jetMomentum.Y(),jetMomentum.Z() );
401 JFseedDirection.normalize();
402 ATH_MSG_VERBOSE( "Jet Direction would be: " << JFseedDirection );
403
404 if ( positionsOfSeedingVertices.empty() )
405 return JFseedDirection;
406
407 Amg::Vector3D theSeedVertex = m_mode3dfinder->getMode( primaryVertex.x(),primaryVertex.y(),positionsOfSeedingVertices );
408 double sign = ( theSeedVertex - primaryVertex.position() ).dot( JFseedDirection );
409
410 if ( m_revertFromPositiveToNegativeTags == false ) {
411
412 if ( sign > 0 ) {
413 JFseedDirection = ( theSeedVertex - primaryVertex.position() ).unit();
414 ATH_MSG_DEBUG( "Using twotrkvtx direction for start: " << JFseedDirection );
415 } else ATH_MSG_DEBUG( "NORMAL SEEDING: Seed vertex is on negative side... Using Jet Direction!" );
416
417 } else {
418
419 if ( sign < 0 ) {
420 JFseedDirection = -( theSeedVertex - primaryVertex.position() ).unit();
421 ATH_MSG_DEBUG( "Using twotrkvtx direction for start: " << JFseedDirection );
422 } else ATH_MSG_DEBUG( "REVERSE SEEDING: Seed vertex is on positive side... Using Jet Direction!" );
423
424 }
425
426 return JFseedDirection;
427}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
int sign(int a)
#define z
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
static bool checkIfTrackIsInVector(const Trk::ITrackLink *trackToCheck, const std::vector< const Trk::ITrackLink * > &vectorOfTracks)
std::unique_ptr< TH2D > ITkPixMaterialMap()
Gaudi::Property< double > m_cutIPZ0SigBoxSingleTrackForBSecondSelection
Gaudi::Property< double > m_cutCompatibilityToPrimarySingleTrackForMatInteractions
Gaudi::Property< double > m_cutTwoTrkVtxLifetimeSignificanceForBFirstSelectionSecondCriterium
ToolHandle< Trk::IMode3dFinder > m_mode3dfinder
Gaudi::Property< double > m_cutCompatibilityPrimaryVertexSingleNegativeLifetimeTrackForBSecondSelection
Gaudi::Property< double > m_firstLayer_min
Gaudi::Property< double > m_cutIPZ0BothTracksForBFirstSelection
SG::AuxElement::Accessor< float > m_compatibilityAccessor
SG::AuxElement::Accessor< std::vector< const Trk::ITrackLink * > > m_tracksAccessor
Gaudi::Property< double > m_cutPtBothTracksForBFirstSelection
const InDetDD::PixelDetectorManager * m_pixelManager
Gaudi::Property< bool > m_revertFromPositiveToNegativeTags
std::unique_ptr< TH2D > m_ITkPixMaterialMap
Gaudi::Property< double > m_cutTwoTrkVtxLifetimeSignificanceForBFirstSelectionFirstCriterium
Gaudi::Property< double > m_cutIPD0SingleTrackForBSecondSelection
bool checkCriteriaFirstFit(const xAOD::Vertex &, const TLorentzVector &, const xAOD::Vertex &) const
Gaudi::Property< bool > m_useITkMaterialRejection
Gaudi::Property< double > m_cutCompatibilityPrimaryVertexBothTracksForBFirstSelection
Gaudi::Property< double > m_secondLayer_max
JetFitterV0FinderTool(const std::string &t, const std::string &n, const IInterface *p)
Gaudi::Property< double > m_cutIPZ0SingleTrackForBSecondSelection
Gaudi::Property< double > m_cutPtSingleTrackForBSecondSelection
const Trk::TwoTrackVerticesInJet * doV0Finding(const xAOD::Vertex &, const TLorentzVector &, std::vector< const Trk::ITrackLink * > &, const std::vector< const xAOD::Vertex * > &, std::vector< const Trk::ITrackLink * > &, std::vector< const Trk::ITrackLink * > &, Amg::Vector3D &) const
Gaudi::Property< double > m_cutIPD0SigBoxSingleTrackForBSecondSelection
Gaudi::Property< double > m_secondLayer_min
Gaudi::Property< double > m_cutTwoTrkVtxVertexProbForBFirstSelectionSecondCriterium
std::vector< const xAOD::Vertex * > findV0candidates(const xAOD::Vertex &, const TLorentzVector &, std::vector< const Trk::ITrackLink * > &, const std::vector< const xAOD::Vertex * > &) const
bool checkCriteriaSecondFit(const xAOD::Vertex &, const Trk::ITrackLink *) const
Gaudi::Property< double > m_cutCompatibilityPrimaryVertexSinglePositiveLifetimeTrackForBSecondSelection
Gaudi::Property< double > m_cutCompatibilityPrimaryVertexSingleTrackForBFirstSelection
Gaudi::Property< double > m_cutIPD0BothTracksForBFirstSelection
Gaudi::Property< double > m_cutCompatibilityToPrimaryBothTracksForMatInteractions
Gaudi::Property< double > m_cutTwoTrkVtxVertexProbForBFirstSelectionFirstCriterium
const BeamPipeDetectorManager * m_beamPipeMgr
Amg::Vector3D computeSeedDirection(const xAOD::Vertex &, const TLorentzVector &, const std::vector< Trk::PositionAndWeight > &) const
Gaudi::Property< double > m_firstLayer_max
ToolHandle< InDet::InDetJetFitterUtils > m_jetFitterUtils
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
Element link to XAOD TrackParticle.
virtual const TrackParameters * parameters() const override final
return the track parameters of the track (to which the EL< TrackCollection
const Amg::Vector3D & momentum() const
Access method for the momentum.
Trk::RecVertex inherits from Trk::Vertex.
Definition RecVertex.h:44
const Amg::Vector3D & position() const
return position of vertex
Definition Vertex.cxx:63
float y() const
Returns the y position.
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
float chiSquared() const
Returns the of the vertex fit as float.
const Amg::Vector3D & position() const
Returns the 3-pos.
float x() const
Returns the x position.
Eigen::Matrix< double, 3, 1 > Vector3D
Primary Vertex Finder.
ParametersBase< TrackParametersDim, Charged > TrackParameters
Vertex_v1 Vertex
Define the latest version of the vertex class.