8#include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
26 if(particleMom.size() == 0)
return -999999.;
27 TLorentzVector totalMom;
28 unsigned int NTrk = particleMom.size();
29 for(
unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
35 if(particleMom2.size() == 0)
return -999999.;
36 TLorentzVector totalMom;
37 unsigned int NTrk = particleMom2.size();
38 if (masses.size() != NTrk) {
39 ATH_MSG_DEBUG(
"The provided number of masses does not match the number of tracks in the vertex");
43 for(
unsigned int it=0; it<NTrk; it++) {
44 double esq = particleMom2[it].Px()*particleMom2[it].Px() + particleMom2[it].Py()*particleMom2[it].Py() +
45 particleMom2[it].Pz()*particleMom2[it].Pz() + masses[it]*masses[it];
46 double e = (esq>0.) ? sqrt(esq) : 0.;
48 temp.SetPxPyPzE(particleMom2[it].Px(),particleMom2[it].Py(),particleMom2[it].Pz(),e);
56 if(particleMom.size() == 0)
return -999999.;
57 unsigned int NTrk = particleMom.size();
58 TLorentzVector totalMom;
59 for(
unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
62 for(
unsigned int it=0; it<NTrk; it++) {
63 D_vec(3*it+3) = 2.*(totalMom.E()*particleMom[it].Px()/particleMom[it].E()-totalMom.Px());
64 D_vec(3*it+4) = 2.*(totalMom.E()*particleMom[it].Py()/particleMom[it].E()-totalMom.Py());
65 D_vec(3*it+5) = 2.*(totalMom.E()*particleMom[it].Pz()/particleMom[it].E()-totalMom.Pz());
68 double massVarsq = merr(0,0);
69 if (massVarsq <= 0.)
ATH_MSG_DEBUG(
"massError: negative sqrt massVarsq " << massVarsq);
70 double massVar = (massVarsq>0.) ? sqrt(massVarsq) : 0.;
71 double massErr = massVar/(2.*totalMom.M());
77 if(particleMom2.size() == 0)
return -999999.;
78 unsigned int NTrk = particleMom2.size();
79 if (masses.size() != NTrk) {
80 ATH_MSG_DEBUG(
"The provided number of masses does not match the number of tracks in the vertex");
83 std::vector<TLorentzVector> particleMom(NTrk);
84 for(
unsigned int it=0; it<NTrk; it++) {
85 double esq = particleMom2[it].Px()*particleMom2[it].Px() + particleMom2[it].Py()*particleMom2[it].Py() +
86 particleMom2[it].Pz()*particleMom2[it].Pz() + masses[it]*masses[it];
87 double e = (esq>0.) ? sqrt(esq) : 0.;
88 particleMom[it].SetPxPyPzE(particleMom2[it].Px(),particleMom2[it].Py(),particleMom2[it].Pz(),e);
90 TLorentzVector totalMom;
91 for(
unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
93 std::vector<double>dm2dpx(NTrk), dm2dpy(NTrk), dm2dpz(NTrk);
94 for(
unsigned int it=0; it<NTrk; it++) {
95 dm2dpx[it] = 2.*(totalMom.E()*particleMom[it].Px()/particleMom[it].E()-totalMom.Px());
96 dm2dpy[it] = 2.*(totalMom.E()*particleMom[it].Py()/particleMom[it].E()-totalMom.Py());
97 dm2dpz[it] = 2.*(totalMom.E()*particleMom[it].Pz()/particleMom[it].E()-totalMom.Pz());
100 for(
unsigned int it=0; it<NTrk; it++) {
101 D_vec(3*it+3) = dm2dpx[it];
102 D_vec(3*it+4) = dm2dpy[it];
103 D_vec(3*it+5) = dm2dpz[it];
106 double massVarsq = merr(0,0);
107 if (massVarsq <= 0.)
ATH_MSG_DEBUG(
"massError: negative sqrt massVarsq " << massVarsq);
108 double massVar = (massVarsq>0.) ? sqrt(massVarsq) : 0.;
109 double massErr = massVar/(2.*totalMom.M());
115 if(particleMom.size() == 0)
return -999999.;
122 if(particleMom.size() == 0)
return -999999.;
126 double PT =
P.perp();
128 unsigned int NTrk = particleMom.size();
130 for(
unsigned int it=0; it<NTrk; it++) {
131 D_vec(3*it+3) = Px/PT;
132 D_vec(3*it+4) = Py/PT;
136 double PtErrsq = PtErrSq(0,0);
137 if (PtErrsq <= 0.)
ATH_MSG_DEBUG(
"ptError: negative sqrt PtErrsq " << PtErrsq);
138 return (PtErrsq>0.) ? sqrt(PtErrsq) : 0.;
143 if(particleMom.size() == 0)
return -999999.;
145 double dx = vert.x();
146 double dy = vert.y();
148 double dxy = (
P.x()*dx +
P.y()*dy)/
P.perp();
154 if(particleMom.size() == 0)
return -999999.;
156 double dx = vert.x();
157 double dy = vert.y();
161 double PT =
P.perp();
162 double LXYoverPT = (Px*dx+Py*dy)/(PT*PT);
164 unsigned int NTrk = particleMom.size();
166 double dLxydx = Px/PT;
167 double dLxydy = Py/PT;
168 double dLxydx0 = -dLxydx;
169 double dLxydy0 = -dLxydy;
175 for(
unsigned int it=0; it<NTrk; it++) {
176 D_vec(3*it+3) = (dx - LXYoverPT*Px)/PT;
177 D_vec(3*it+4) = (dy - LXYoverPT*Py)/PT;
180 D_vec(3*NTrk+3) = dLxydx0;
181 D_vec(3*NTrk+4) = dLxydy0;
182 D_vec(3*NTrk+5) = 0.;
184 unsigned int ndim = 3*NTrk+3;
186 W_mat.block(0,0,ndim,ndim) = cov;
187 W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
190 double LxyErrsq = V_err(0,0);
191 if (LxyErrsq <= 0.)
ATH_MSG_DEBUG(
"lxyError: negative sqrt LxyErrsq " << LxyErrsq);
192 return (LxyErrsq>0.) ? sqrt(LxyErrsq) : 0.;
197 if(particleMom.size() == 0)
return -999999.;
199 double LXY =
lxy(particleMom,SV,PV);
200 double PT =
pT(particleMom);
206 if(particleMom.size() == 0)
return -999999.;
209 double dx = vert.x();
210 double dy = vert.y();
214 double PT =
P.perp();
215 double LXY = Px*dx+Py*dy;
217 unsigned int NTrk = particleMom.size();
218 TLorentzVector totalMom;
219 for(
unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
221 double dTaudx = (M*Px)/(PT*PT);
222 double dTaudy = (M*Py)/(PT*PT);
223 double dTaudx0 = -dTaudx;
224 double dTaudy0 = -dTaudy;
230 for(
unsigned int it=0; it<NTrk; it++) {
231 D_vec(3*it+3) = (((totalMom.E()*particleMom[it].Px()*LXY)/(M*particleMom[it].E()))-Px*LXY/M+M*dx)/(PT*PT) - 2.*M*LXY*Px/(PT*PT*PT*PT);
232 D_vec(3*it+4) = (((totalMom.E()*particleMom[it].Py()*LXY)/(M*particleMom[it].E()))-Py*LXY/M+M*dy)/(PT*PT) - 2.*M*LXY*Py/(PT*PT*PT*PT);
235 D_vec(3*NTrk+3) = dTaudx0;
236 D_vec(3*NTrk+4) = dTaudy0;
237 D_vec(3*NTrk+5) = 0.;
239 unsigned int ndim = 3*NTrk+3;
241 W_mat.block(0,0,ndim,ndim) = cov;
242 W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
245 double tauErrsq = V_err(0,0);
246 if (tauErrsq <= 0.)
ATH_MSG_DEBUG(
"tauError: negative sqrt tauErrsq " << tauErrsq);
247 double tauErr = (tauErrsq>0.) ? sqrt(tauErrsq) : 0.;
253 if(particleMom.size() == 0)
return -999999.;
254 double LXY =
lxy(particleMom,SV,PV);
255 double PT =
pT(particleMom);
261 if(particleMom.size() == 0)
return -999999.;
263 double dx = vert.x();
264 double dy = vert.y();
268 double PT =
P.perp();
269 double LXY = Px*dx+Py*dy;
271 unsigned int NTrk = particleMom.size();
272 TLorentzVector totalMom;
273 for(
unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
275 double dTaudx = (M*Px)/(PT*PT);
276 double dTaudy = (M*Py)/(PT*PT);
277 double dTaudx0 = -dTaudx;
278 double dTaudy0 = -dTaudy;
284 for(
unsigned int it=0; it<NTrk; it++) {
285 D_vec(3*it+3) = (M*dx)/(PT*PT) - 2.*M*LXY*Px/(PT*PT*PT*PT);
286 D_vec(3*it+4) = (M*dy)/(PT*PT) - 2.*M*LXY*Py/(PT*PT*PT*PT);
289 D_vec(3*NTrk+3) = dTaudx0;
290 D_vec(3*NTrk+4) = dTaudy0;
291 D_vec(3*NTrk+5) = 0.;
293 unsigned int ndim = 3*NTrk+3;
295 W_mat.block(0,0,ndim,ndim) = cov;
296 W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
299 double tauErrsq = V_err(0,0);
300 if (tauErrsq <= 0.)
ATH_MSG_DEBUG(
"tauError: negative sqrt tauErrsq " << tauErrsq);
301 double tauErr = (tauErrsq>0.) ? sqrt(tauErrsq) : 0.;
307 if(particleMom.size() == 0) {
314 double p2 =
P.mag2();
315 double pdr =
P.dot((sv - pv));
316 return sv -
P*pdr/p2;
321 if(particleMom.size() == 0)
return -999999.;
325 return (
P.dot(vtx))/(
P.mag()*vtx.mag());
330 if(particleMom.size() == 0)
return -999999.;
334 double pT =
P.perp();
335 return (
P.x()*vtx.x()+
P.y()*vtx.y())/(
pT*vtx.perp());
340 if(particleMom.size() == 0)
return -999999.;
349 if(particleMom.size() == 0)
return -999999.;
351 double dx = vert.x();
352 double dy = vert.y();
353 double dz = vert.z();
358 double P2 =
P.mag2();
359 double L = Px*dx+Py*dy+Pz*dz;
361 unsigned int NTrk = particleMom.size();
364 double da0zdx = (Px*Pz)/P2;
365 double da0zdy = (Py*Pz)/P2;
366 double da0zdz = (Pz*Pz)/P2 - 1.;
367 double da0zdx0 = -da0zdx;
368 double da0zdy0 = -da0zdy;
369 double da0zdz0 = -da0zdz;
375 for(
unsigned int it=0; it<NTrk; it++) {
376 D_vec(3*it+3) = (Pz*(P2*dx-2.*L*Px))/(P2*P2);
377 D_vec(3*it+4) = (Pz*(P2*dy-2.*L*Py))/(P2*P2);
378 D_vec(3*it+5) = (Pz*(P2*dz-2.*L*Pz))/(P2*P2)+L/P2;
380 D_vec(3*NTrk+3) = da0zdx0;
381 D_vec(3*NTrk+4) = da0zdy0;
382 D_vec(3*NTrk+5) = da0zdz0;
384 unsigned int ndim = 3*NTrk+3;
386 W_mat.block(0,0,ndim,ndim) = cov;
387 W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
390 double a0zErrsq = V_err(0,0);
391 if (a0zErrsq <= 0.)
ATH_MSG_DEBUG(
"a0zError: negative sqrt a0zErrsq " << a0zErrsq);
392 return (a0zErrsq>0.) ? sqrt(a0zErrsq) : 0.;
397 if(particleMom.size() == 0)
return -999999.;
398 double cosineTheta_xy =
cosTheta_xy(particleMom,SV,PV);
399 double sinTheta_xy = ((1.-cosineTheta_xy*cosineTheta_xy)>0.) ? sqrt((1.-cosineTheta_xy*cosineTheta_xy)) : 0.;
405 if(particleMom.size() == 0)
return -999999.;
407 double dx = vert.x();
408 double dy = vert.y();
412 double P2 =
P.perp()*
P.perp();
413 double L = Px*dx+Py*dy;
414 double dR2 = vert.perp()*vert.perp();
415 double d = sqrt((P2*dR2-L*L)/P2);
417 unsigned int NTrk = particleMom.size();
419 double da0dx = (P2*dx-L*Px)/(P2*d);
420 double da0dy = (P2*dy-L*Py)/(P2*d);
421 double da0dx0 = -da0dx;
422 double da0dy0 = -da0dy;
428 for(
unsigned int it=0; it<NTrk; it++) {
429 D_vec(3*it+3) = (L*(L*Px-P2*dx))/(P2*P2*d);
430 D_vec(3*it+4) = (L*(L*Py-P2*dy))/(P2*P2*d);
433 D_vec(3*NTrk+3) = da0dx0;
434 D_vec(3*NTrk+4) = da0dy0;
435 D_vec(3*NTrk+5) = 0.;
437 unsigned int ndim = 3*NTrk+3;
439 W_mat.block(0,0,ndim,ndim) = cov;
440 W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
443 double a0xyErrsq = V_err(0,0);
444 if (a0xyErrsq <= 0.)
ATH_MSG_DEBUG(
"a0xyError: negative sqrt a0xyErrsq " << a0xyErrsq);
445 return (a0xyErrsq>0.) ? sqrt(a0xyErrsq) : 0.;
450 if(particleMom.size() == 0)
return -999999.;
451 double cosineTheta =
cosTheta(particleMom,SV,PV);
452 double sinTheta = ((1.-cosineTheta*cosineTheta)>0.) ? sqrt((1.-cosineTheta*cosineTheta)) : 0.;
458 if(particleMom.size() == 0)
return -999999.;
460 double dx = vert.x();
461 double dy = vert.y();
462 double dz = vert.z();
467 double P2 =
P.mag2();
468 double L = Px*dx+Py*dy+Pz*dz;
469 double dR2 = vert.mag2();
470 double d = sqrt((P2*dR2-L*L)/P2);
472 unsigned int NTrk = particleMom.size();
474 double da0dx = (P2*dx-L*Px)/(P2*d);
475 double da0dy = (P2*dy-L*Py)/(P2*d);
476 double da0dz = (P2*dz-L*Pz)/(P2*d);
477 double da0dx0 = -da0dx;
478 double da0dy0 = -da0dy;
479 double da0dz0 = -da0dz;
485 for(
unsigned int it=0; it<NTrk; it++) {
486 D_vec(3*it+3) = (L*(L*Px-P2*dx))/(P2*P2*d);
487 D_vec(3*it+4) = (L*(L*Py-P2*dy))/(P2*P2*d);
488 D_vec(3*it+5) = (L*(L*Pz-P2*dz))/(P2*P2*d);
490 D_vec(3*NTrk+3) = da0dx0;
491 D_vec(3*NTrk+4) = da0dy0;
492 D_vec(3*NTrk+5) = da0dz0;
494 unsigned int ndim = 3*NTrk+3;
496 W_mat.block(0,0,ndim,ndim) = cov;
497 W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
500 double a0Errsq = V_err(0,0);
501 if (a0Errsq <= 0.)
ATH_MSG_DEBUG(
"a0Error: negative sqrt a0Errsq " << a0Errsq);
502 return (a0Errsq>0.) ? sqrt(a0Errsq) : 0.;
507 if(particleMom.size() == 0) {
511 TLorentzVector totalMom;
512 unsigned int NTrk = particleMom.size();
513 for(
unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
514 TVector3 P3 = totalMom.Vect();
522 double chi2 = (V0Mass - mass)*(V0Mass - mass)/(massErr*massErr);
524 Genfun::CumulativeChiSquare myCumulativeChiSquare(ndf);
526 double achi2prob = 1.-myCumulativeChiSquare(
chi2);
540 Genfun::CumulativeChiSquare myCumulativeChiSquare(ndf);
542 double chi2prob = 1.-myCumulativeChiSquare(
chi2);
558 std::vector<float> matrix = vxCandidate->
covariance();
562 if ( matrix.size() == (3*NTrk+3)*(3*NTrk+3+1)/2) {
564 }
else if (matrix.size() == (5*NTrk+3)*(5*NTrk+3+1)/2) {
573 for (
int i=1; i<= ndim; i++) {
574 for (
int j=1; j<=i; j++){
576 (*mtx)(i-1,j-1)=matrix[ij];
578 (*mtx).fillSymmetric(i-1,j-1,matrix[ij]);
595 for(
int i=0; i<(3+3*NTrk); i++){
596 for(
int j=0; j<=i; j++){
598 if(i!=j) mtx(j,i)=
Matrix[ij];
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const Amg::Vector3D & position() const
Returns the 3-pos.
const std::vector< float > & covariance() const
Returns the covariance matrix as a simple vector of values.
double chi2(TH1 *h0, TH1 *h1)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Vertex_v1 Vertex
Define the latest version of the vertex class.