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() +
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() +
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++) {
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);
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++){
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++){