ATLAS Offline Software
Loading...
Searching...
No Matches
KalmanVertexOnJetAxisSmoother.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
13#include <cmath>
14
15//#define KalmanVertexOnJetAxisSmoother_DEBUG
16
17namespace Trk
18{
19
20#if 0
21 namespace {
22 int numRow(int numVertex) {
23 return numVertex+5;
24 }
25 }
26#endif
27
28
30 {
31 AthAlgTool::initialize().ignore();
32
33 //retrieving the udator itself
34 StatusCode sc = m_Updator.retrieve();
35 if(sc.isFailure()) {
36 ATH_MSG_ERROR( " Unable to retrieve "<<m_Updator );
37 return StatusCode::FAILURE;
38 }
39 m_initial_cov_momentum.setZero();
40 m_initial_cov_momentum(0,0) = m_initialMomentumError*m_initialMomentumError;
41 m_initial_cov_momentum(1,1) = m_initialMomentumError*m_initialMomentumError;
42 m_initial_cov_momentum(2,2) = m_initialMomentumError*m_initialMomentumError/10000.;
43
44 return StatusCode::SUCCESS;
45 }
46
47
48 KalmanVertexOnJetAxisSmoother::KalmanVertexOnJetAxisSmoother(const std::string& t, const std::string& n, const IInterface* p):
49 AthAlgTool(t,n,p),
50 m_Updator("Trk::KalmanVertexOnJetAxisUpdator", this),
51 m_maxWeight(0.001),
53 {
54 declareProperty("Updator",m_Updator);
55 declareProperty("MaximalWeight",m_maxWeight);
56 declareProperty("initialMomentumError",m_initialMomentumError);
57 declareInterface<KalmanVertexOnJetAxisSmoother>(this);
58 }
59
61 = default;
62
63
65 const VxJetCandidate* candidateToUpdate,
66 bool updateTrack) const {
67
68 const RecVertexPositions & myFinalPosition=candidateToUpdate->getRecVertexPositions();
69 const VertexPositions & linearizationPositions=candidateToUpdate->getLinearizationVertexPositions();
70 bool isPrimary = (vertexToSmooth==candidateToUpdate->getPrimaryVertex());
71 update(vertexToSmooth,isPrimary,myFinalPosition,linearizationPositions,updateTrack,false);
72
73 }
74
76 const VxJetCandidate* candidateToUpdate,
77 bool updateTrack) const {
78 const RecVertexPositions & myFinalPosition=candidateToUpdate->getRecVertexPositions();
79 const VertexPositions & linearizationPositions=candidateToUpdate->getLinearizationVertexPositions();
80 bool isPrimary = (vertexToSmooth==candidateToUpdate->getPrimaryVertex());
81 update(vertexToSmooth,isPrimary,myFinalPosition,linearizationPositions,updateTrack,true);
82 }
83
84 void KalmanVertexOnJetAxisSmoother::update(VxVertexOnJetAxis* vertexToSmooth,bool isPrimary,
85 const RecVertexPositions & myFinalPosition,
86 const VertexPositions & linearizationPositions,
87 bool updateTrack, bool doFastUpdate) const {
88
89 // void KalmanVertexOnJetAxisSmoother::update(VxVertexOnJetAxis* vertexToSmooth,const VxJetCandidate* candidateToUpdate) const
90 // {
91
92 if (vertexToSmooth==nullptr) {
93 ATH_MSG_WARNING( " Empty pointers then calling fit method update. No fit will be done..." );
94 return;
95 }
96
97 ATH_MSG_DEBUG("It's smoothing "<<(isPrimary? "with":"without")<<" primary vertex ");
98 ATH_MSG_DEBUG("It's " << (updateTrack?"with":"without") << " updating the track.");
99 ATH_MSG_DEBUG("It's the "<<(doFastUpdate?"fast":"normal (weight-formalism)")<<" smoother");
100
101 const std::vector<VxTrackAtVertex*> & allTracksToSmooth(vertexToSmooth->getTracksAtVertex());
102
103 //care first about the transformation matrix (which is the same for all tracks...)
104
105
106 if (allTracksToSmooth.empty()) {
107 ATH_MSG_DEBUG(" Nothing to smooth ");
108 if (!isPrimary)
109 ATH_MSG_WARNING ("Nothing to smooth and it's not a primary vertex: BUG... ");
110 return;
111 }
112
113 const Amg::VectorX & initialjetdir=linearizationPositions.position();
114
115 int numVertex=vertexToSmooth->getNumVertex();
116
117
118 //calculate 3-dim position on jet axis from linearizationPositionVector and calculate Jacobian of transformation
119 std::pair<Amg::Vector3D,Eigen::Matrix3Xd> PosOnJetAxisAndTransformMatrix =
120 m_Updator->createTransformJacobian(initialjetdir, numVertex, isPrimary, /*truncate=*/false);
121
122 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
123 std::cout << " smoother: " << PosOnJetAxisAndTransformMatrix.first << " and transform matrix: " << PosOnJetAxisAndTransformMatrix.second <<
124 std::endl;
125 #endif
126
127
128 //prepare a RecVertexPositions to be updated with removal
129 //of all tracks of the present vertex...
130 //THIS TIME copy the RecVertexPositions to a new object... :-)
131 RecVertexPositions myPositionWithRemovedTracks=myFinalPosition; // for fast updator (cov formalism)
132 RecVertexPositions myPositionInWeightFormalism=myFinalPosition; // for full updator (weight formalism)
133 const Amg::VectorX & final_vrt_pos=myFinalPosition.position();
134 const Amg::MatrixX & final_vrt_covariance = myFinalPosition.covariancePosition();
135
136 Amg::MatrixX final_vrt_weightmatrix;
137 if (!doFastUpdate) {
138 // Hack the JetFitter EDM... avoid to invert big cov matrix at each iteration
139 // by storing position --> weight*position
140 // and covariance -> weightmatrix
141 Eigen::FullPivLU<Amg::MatrixX> lu_decomp(final_vrt_covariance);
142 if (!lu_decomp.isInvertible()) {
143 ATH_MSG_DEBUG("Jet vertex positions matrix not invertible right at start of smoother!" <<
144 " -> stop smoothing.");
145 return;
146 }
147 final_vrt_weightmatrix = final_vrt_covariance.inverse();
148 myPositionInWeightFormalism.setPosition(final_vrt_weightmatrix*
149 myPositionInWeightFormalism.position());
150 myPositionInWeightFormalism.setCovariancePosition(final_vrt_weightmatrix);
151 }
152 //from here onwards (until finishing adding tracks) it is weight*position TO MAKE THINGS FASTER
153
154 double track_compatibility_chi2(0.);
155 double track_ndf(0.);
156
157 //nice! that was easy...
158 //now iterate over all tracks in order to calculated the updated TrackParameters + the residual chi2...
159 const std::vector<VxTrackAtVertex*>::const_iterator TracksBegin=allTracksToSmooth.begin();
160 const std::vector<VxTrackAtVertex*>::const_iterator TracksEnd=allTracksToSmooth.end();
161
162 for (std::vector<VxTrackAtVertex*>::const_iterator TracksIter=TracksBegin;TracksIter!=TracksEnd;++TracksIter) {
163
164 //get linearized track
165 const LinearizedTrack * trk=(*TracksIter)->linState();
166
167 if (trk==nullptr) {
168 ATH_MSG_WARNING (" Empty pointers then calling smoothing method update. No smoothing will be performed...");
169 return;
170 }
171
172 double trackWeight = (*TracksIter)->weight();
173
174 //only position jacobian changed from A ->oldA
175 const AmgMatrix(5,3)& oldA = trk->positionJacobian();
176
177 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
178 std::cout << "the old jacobian xyz d0z0phithetaqoverp vs xyz " << oldA << std::endl;
179 #endif
180
181 //now create the new jacobian which you should use
182 Eigen::Matrix<double,5,Eigen::Dynamic> A = oldA*PosOnJetAxisAndTransformMatrix.second;
183
184 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
185 std::cout << "the new jacobian " << A << std::endl;
186 #endif
187
188 const AmgMatrix(5,3) & B = trk->momentumJacobian();
189 const AmgVector(5)& trackParameters = trk->expectedParametersAtPCA();
190
191 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
192 std::cout << "expected perigee at pca " << trackParameters << std::endl;
193 std::cout << "expected position at pca " << trk->expectedPositionAtPCA() << std::endl;
194 std::cout << " constant term " << trk->constantTerm() <<
195 " old A " << oldA << " * PosOnJetAxis " << PosOnJetAxisAndTransformMatrix.first <<
196 " A " << A << " * initialjetdir " << initialjetdir << std::endl;
197 #endif
198
199 AmgVector(5) constantTerm=trk->constantTerm() + oldA*PosOnJetAxisAndTransformMatrix.first
200 -A*initialjetdir;
201 const AmgSymMatrix(5)& trackParametersWeight = trk->expectedWeightAtPCA();
202 AmgSymMatrix(3) S = B.transpose()*trackParametersWeight*B;
203 if(S.determinant()==0.0) {
204 ATH_MSG_WARNING ("The S matrix inversion failed during smoothing iteration cycle");
205 continue;
206 }
207 S=S.inverse().eval();
208
209 if (doFastUpdate) {
210 const Amg::VectorX old_vrt_pos = myPositionWithRemovedTracks.position();
211 const Amg::MatrixX & old_vrt_cov = myPositionWithRemovedTracks.covariancePosition();
212
213 AmgSymMatrix(5) old_residual_cov = -trk->expectedCovarianceAtPCA() +
214 A*old_vrt_cov*A.transpose() + B*m_initial_cov_momentum*B.transpose();
215 if (old_residual_cov.determinant() == 0.0 ) {
216 ATH_MSG_ERROR ("The old_residual matrix can not be inverted during smoothing interation cycle");
217 continue;
218 }
219 AmgSymMatrix(5) old_residual_cov_inv = old_residual_cov.inverse().eval();
220 Eigen::Matrix<double,Eigen::Dynamic,5> Kk1=old_vrt_cov*A.transpose()*old_residual_cov_inv;
221 AmgVector(5) residual_vector=trackParameters-constantTerm-A*old_vrt_pos;
222 Amg::VectorX new_vrt_pos = old_vrt_pos+Kk1*residual_vector;
223 Amg::MatrixX new_vrt_cov = old_vrt_cov+Kk1*old_residual_cov*Kk1.transpose()
224 - 2.*Kk1*A*old_vrt_cov;
225 myPositionWithRemovedTracks = RecVertexPositions(new_vrt_pos,new_vrt_cov);
226
227 } else {
228
229 //REMEMBER: there's also the RecVertexPositions w/ removed tracks: **myPositionWithRemovedTracks**
230
231 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
232 std::cout << " Old weight Matrix is " << myPositionInWeightFormalism.covariancePosition() << std::endl;
233 #endif
234
235 // the full smoother writes weight matrices into RecVertexPositions
236 const Amg::MatrixX & old_vrt_weight = myPositionInWeightFormalism.covariancePosition();
237 const Amg::VectorX old_vrt_weight_times_vrt_pos = myPositionInWeightFormalism.position();
238
239 //G_b = G_k - G_k*B_k*W_k*B_k^(T)*G_k
240 AmgSymMatrix(5) gB = trackParametersWeight - trackParametersWeight*(B*(S*B.transpose()))*trackParametersWeight.transpose();
241 //(S.similarity(B)).similarity(trackParametersWeight);
242
243 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
244 std::cout<<"Gain factor obtained: "<<trackParametersWeight*(B*(S*B.transpose()))*trackParametersWeight.transpose()<<std::endl;
245 std::cout<<"Resulting Gain Matrix: "<<gB<<std::endl;
246 #endif
247
248 //new vertex weight matrix
249 Amg::MatrixX new_vrt_weight = old_vrt_weight - trackWeight * A.transpose()*gB*A;
250
251 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
252 std::cout<<"New vertex weight obtained: "<<new_vrt_weight<<std::endl;
253 #endif
254
255 //new vertex position
256 Amg::VectorX new_weight_matrix_times_vrt_position =old_vrt_weight_times_vrt_pos - trackWeight * A.transpose() * gB *(trackParameters - constantTerm);
257 // new_vrt_cov*(old_vrt_weight * old_vrt_pos + trackWeight * sign * A.T() * gB *(trackParameters - constantTerm) );
258 // avoid to invert the weight matrix to obtain the COVARIANCE MATRIX!!!
259 //this line COPIES things two times, it would be nice to have a operator=(pos,errm) method in RecVertexPositions...
260 myPositionInWeightFormalism =
261 RecVertexPositions(new_weight_matrix_times_vrt_position,new_vrt_weight);
262 }
263
264 //refitted track momentum
265 Amg::Vector3D newTrackMomentum = S*B.transpose()*trackParametersWeight*(trackParameters - constantTerm - A*final_vrt_pos);
266 //refitted track parameters
267 AmgVector(5) refTrackParameters = constantTerm + A * final_vrt_pos + B * newTrackMomentum;
268
269 if (updateTrack) {
270
271 const AmgSymMatrix(3) final_vrt_covariance_xyz =
272 (PosOnJetAxisAndTransformMatrix.second)*final_vrt_covariance*(PosOnJetAxisAndTransformMatrix.second).transpose();
273
274 AmgVector(5) refTrackParametersToStore(refTrackParameters);
275
276
277 //bring parameter phi again in the limits, if
278 //phi is slightly outside (as can be expected
279 //due to refitting)
280 //thanks to Wolfgang L. / Sebastian F. for the piece of code with fmod!
281 // bool isSth=false;
282 if (refTrackParametersToStore[Trk::phi0] > M_PI) {
283 // isSth=true;
284 ATH_MSG_DEBUG ("-U- phi = " << refTrackParametersToStore[Trk::phi0]);
285 refTrackParametersToStore[Trk::phi0] = fmod(refTrackParametersToStore[Trk::phi0]+M_PI,2*M_PI)-M_PI;
286 ATH_MSG_DEBUG (" out of range, now corrected to " << refTrackParametersToStore[Trk::phi0]);
287 } else if(refTrackParametersToStore[Trk::phi0]<-M_PI) {
288 ATH_MSG_DEBUG ("-U- phi = " << refTrackParametersToStore[Trk::phi0]);
289 refTrackParametersToStore[Trk::phi0] = fmod(refTrackParametersToStore[Trk::phi0]-M_PI,2*M_PI)+M_PI;
290 ATH_MSG_DEBUG (" out of range, now corrected to " << refTrackParametersToStore[Trk::phi0]);
291 }
292
293 if (refTrackParametersToStore[Trk::theta] > M_PI)
294 {
295 ATH_MSG_DEBUG (" Theta out of range: correcting theta: " << refTrackParametersToStore[Trk::theta]);
296 refTrackParametersToStore[Trk::theta]=fmod(refTrackParametersToStore[Trk::theta]+M_PI,2*M_PI)-M_PI;
297 ATH_MSG_DEBUG (" to: " << refTrackParametersToStore[Trk::theta]);
298 }
299 else if (refTrackParametersToStore[Trk::theta]<0) {
300 ATH_MSG_DEBUG (" Theta out of range: correcting theta: " << refTrackParametersToStore[Trk::theta]);
301 refTrackParametersToStore[Trk::theta]=fmod(refTrackParametersToStore[Trk::theta]-M_PI,2*M_PI)+M_PI;
302 ATH_MSG_DEBUG (" to: " << refTrackParametersToStore[Trk::theta]);
303 }
304
305 if (refTrackParametersToStore[Trk::theta] < 0) {
306 refTrackParametersToStore[Trk::theta] =
307 - refTrackParametersToStore[Trk::theta];
308 refTrackParametersToStore[Trk::phi0] +=
309 (refTrackParametersToStore[Trk::phi0] > 0 ? -M_PI : M_PI);
310 }
311 else if (refTrackParametersToStore[Trk::theta] > M_PI) {//this is in principle not needed anymore
312 refTrackParametersToStore[Trk::theta] =
313 2*M_PI - refTrackParametersToStore[Trk::theta];
314 refTrackParametersToStore[Trk::phi0] +=
315 (refTrackParametersToStore[Trk::phi0] > 0 ? -M_PI : M_PI);
316 }
317
318 //making a new track covariance matrix
319 AmgMatrix(Eigen::Dynamic,3) partialCovariance = A.transpose() * trackParametersWeight * B *S;
320
321 AmgMatrix(Eigen::Dynamic,3) posMomentumCovariance = -final_vrt_covariance * partialCovariance;
322
323 AmgMatrix(Eigen::Dynamic,3) posMomentumCovariance_xyz = PosOnJetAxisAndTransformMatrix.second * posMomentumCovariance;
324
325 //new momentum covariance
326 AmgSymMatrix(3) momentumCovariance = doFastUpdate ?
327 S + (partialCovariance.transpose()*final_vrt_covariance*partialCovariance) :
328 S + (posMomentumCovariance.transpose()*final_vrt_weightmatrix*posMomentumCovariance);
329
330 //full (x,y,z,phi, theta, q/p) covariance matrix
331 AmgSymMatrix(6) fullTrkCov; fullTrkCov.setZero();
332
333 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
334 std::cout << " posMomentumCovariance " << posMomentumCovariance <<
335 " final_vrt_covariance " << final_vrt_covariance << " momentumCovariance " <<
336 momentumCovariance << std::endl;
337 #endif
338
339 fullTrkCov.block<3,3>(0,3) = posMomentumCovariance_xyz.transpose();//GP: to be checked: .T() is here or down?
340 fullTrkCov.block<3,3>(3,0) = posMomentumCovariance_xyz;
341 fullTrkCov.block<3,3>(0,0) = final_vrt_covariance_xyz;
342 fullTrkCov.block<3,3>(3,3) = momentumCovariance;
343 //debug hacking
344 AmgMatrix(5,6) trJac; trJac.setZero();
345 trJac(4,5) = 1.;
346 trJac(3,4) = 1.;
347 trJac(2,3) = 1.;
348
349 //first row
350 trJac(0,0) = - sin(refTrackParametersToStore[Trk::phi0]);
351 trJac(0,1) = cos(refTrackParametersToStore[Trk::phi0]);
352
353 //second row
354 trJac(1,0) = -cos(refTrackParametersToStore[Trk::phi0])/tan(refTrackParametersToStore[Trk::theta]);
355 trJac(1,1) = -sin(refTrackParametersToStore[Trk::phi0])/tan(refTrackParametersToStore[Trk::theta]);
356 trJac(1,2) = 1.;
357
358 AmgSymMatrix(5) perFullTrkCov = AmgSymMatrix(5)(trJac*fullTrkCov*trJac.transpose());
360 Trk::TrackParameters* refittedPerigee = new Perigee(refTrackParametersToStore[0],
361 refTrackParametersToStore[1],
362 refTrackParametersToStore[2],
363 refTrackParametersToStore[3],
364 refTrackParametersToStore[4],
365 pSurf,
366 std::move(perFullTrkCov));
367
368 //set the refitted track parameters
369 (*TracksIter)->setPerigeeAtVertex(refittedPerigee);
370 }
371
372
373 //parameters difference
374 AmgVector(5) paramDifference = trackParameters - refTrackParameters;
375
376 track_compatibility_chi2 +=
377 (paramDifference.transpose()*trackParametersWeight*paramDifference)(0,0)*trackWeight;
378 track_ndf+=2.;
379 ATH_MSG_DEBUG ("new chi2 with compatibility of the tracks to the vertices " <<
380 track_compatibility_chi2 << " new ndf: " << track_ndf);
381 }//end iteration of tracks at vertex on jet axis
382
383 if (!isPrimary) {
384 track_ndf-=1.;//consider the vertex
385 }
386 if (!doFastUpdate) { // strange, the original fastSmoother didn't have such calculation
387 //in the end calculate the real position... :-)
388 const Amg::VectorX & vrt_removed_tracks_weight_times_vrt_pos =
389 myPositionInWeightFormalism.position();
390 const Amg::MatrixX & vrt_removed_tracks_weight =
391 myPositionInWeightFormalism.covariancePosition();
392 //perform a FAST inversion of the weight matrix - done here for the first time
393 Amg::MatrixX vrt_removed_tracks_covariance = vrt_removed_tracks_weight;
394
395 //4.October 2014 remove smartInversion for now (problems with numerical accuracy)
396// vrt_removed_tracks_covariance=vrt_removed_tracks_weight.inverse().eval();
397 vrt_removed_tracks_covariance=(vrt_removed_tracks_covariance.transpose().eval()+vrt_removed_tracks_covariance)/2.0;
398// After symmetrizing the matrix before inversion, the smart inversion works again, and move back. wesong@cern.ch 28/05/2016
399 try
400 {
401 m_Updator->smartInvert(vrt_removed_tracks_covariance);
402 }
403 catch (std::string a)
404 {
405 ATH_MSG_ERROR( a << " Doing inversion the normal way " );
406 vrt_removed_tracks_covariance=vrt_removed_tracks_weight.inverse().eval();
407 }
408
409 const Amg::VectorX vrt_removed_tracks_pos=vrt_removed_tracks_covariance*vrt_removed_tracks_weight_times_vrt_pos;
410
411 #ifdef KalmanVertexOnJetAxisSmoother_DEBUG
412 std::cout << " final_vrt_pos " << final_vrt_pos << " vrt_removed_tracks_pos " << vrt_removed_tracks_pos << std::endl;
413 std::cout << " weight removed tracks " << vrt_removed_tracks_weight << std::endl;
414 #endif
415
416 track_compatibility_chi2 +=
417 ((final_vrt_pos-vrt_removed_tracks_pos).transpose()*vrt_removed_tracks_weight*(final_vrt_pos-vrt_removed_tracks_pos))(0,0);
418
419
420 ATH_MSG_DEBUG (" new chi2 with the vertex residual" << track_compatibility_chi2 <<
421 " new ndf: " << track_ndf);
422 }
423 vertexToSmooth->setFitQuality(FitQuality(track_compatibility_chi2,track_ndf));
424#ifdef KalmanVertexOnJetAxisSmoother_DEBUG
425 std::cout << " vertexToSmooth pointer is " << vertexToSmooth << std::endl;
426#endif
427
428 }
429
430}//end of namespace definitions
431
#define M_PI
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
#define AmgVector(rows)
#define AmgMatrix(rows, cols)
static Double_t a
static Double_t sc
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition FitQuality.h:97
void fastUpdate(VxVertexOnJetAxis *vertexToSmooth, const VxJetCandidate *candidateToUpdate, bool updateTrack=true) const
void update(VxVertexOnJetAxis *vertexToSmooth, const VxJetCandidate *candidateToUpdate, bool updateTrack=true) const
Update the VxVertexOnJetAxis (chi2 and ndf) with the knowledge coming from the fitted VxJetCandidate,...
double m_maxWeight
Meaningless in case no adaptive fitting is used.
KalmanVertexOnJetAxisSmoother(const std::string &t, const std::string &n, const IInterface *p)
Constructor.
ToolHandle< KalmanVertexOnJetAxisUpdator > m_Updator
const Amg::Vector3D & expectedPositionAtPCA() const
Access to the expected position at point of closet approach.
const Amg::Vector3D & linearizationPoint() const
An access to an actual linearization point.
Class describing the Line to which the Perigee refers to.
Amg::MatrixX const & covariancePosition() const
return the covDeltaV matrix of the vertex fit
void setCovariancePosition(const Amg::MatrixX &)
VertexPositions class to represent and store a vertex.
void setPosition(const Amg::VectorX &)
const Amg::VectorX & position() const
return position of vertex
const Trk::VertexPositions & getLinearizationVertexPositions() const
const VxVertexOnJetAxis * getPrimaryVertex(void) const
const Trk::RecVertexPositions & getRecVertexPositions() const
VxVertexOnJetAxis inherits from Vertex.
void setFitQuality(const Trk::FitQuality &fitQuality)
Fit quality set method.
int getNumVertex(void) const
Get Method for NumVertex.
const std::vector< VxTrackAtVertex * > & getTracksAtVertex(void) const
get Tracks At Vertex Method
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
ParametersBase< TrackParametersDim, Charged > TrackParameters
hold the test vectors and ease the comparison