9 #include "TMatrixDSym.h"
81 mPull.ResizeTo(7*nd,1);
130 vtx_st[0][0]=startVtx.X();
131 vtx_st[1][0]=startVtx.Y();
132 vtx_st[2][0]=startVtx.Z();
174 if(Vd_inv==0) {
continue; }
199 TMatrixD Vx0_inv=V_vtx.Invert(&ierr);
217 vtx_new += Vx*Vx0_inv*del_x0 - Vx*mE_t*lam0;
225 TMatrixD lam = lam0 + (Vd *
mE) * (vtx_new - vtx_ex);
232 al_new -=
V_al0*mD_t*lam;
250 if(TMath::IsNaN(chi2_new[0][0]))
continue;
252 double deltaChi=chi2_new[0][0]-chi2[0][0];
255 if (deltaChi>0.1*chi2[0][0]) {
continue;}
256 if( chi2_new[0][0] < chi2[0][0] ) {
266 if( (j1+1 == fNMaxIterations) ||
274 Vd_new -= Vd*(mE*Vx*mE_t)*Vd.T();
277 cov_al_x -=
V_al0*mD_t*Vd*mE*Vx;
283 mPull[0][0] =(
al0[6][0]-al_new[6][0]);
288 if(
fVerbose) { cout <<
"iteration Number " <<
" " << j1 <<
" final." <<endl; }
289 if(
fVerbose) { cout <<
" chi2 in iteration" <<
" " << chi2[0][0] <<
" pull="<<
fPull<< endl; }
293 if(
fVerbose) { cout <<
"iteration Number " <<
" " << j1 << endl; }
294 if(
fVerbose) { cout <<
" vertex Position is "<<vtx_new[0][0]<<
" "<<vtx_new[1][0]<<
" "<<vtx_new[2][0]<<endl; }
295 if(
fVerbose) { cout <<
" chi2 in iteration" <<
" " << chi2[0][0] << endl; }
299 if( TMath::IsNaN(chi2[0][0]) || chi2[0][0]==2000000. )
return kFALSE;
347 for (
int k=0; k<nd; k++) {
353 a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
355 TVector3
pos(
al0[k*7+4][0],
al0[k*7+5][0],
al0[k*7+6][0]);
356 TLorentzVector mom4(
al0[k*7+0][0],
al0[k*7+1][0],
al0[k*7+2][0],
al0[k*7+3][0]);
361 momM.SetXYZM(
al0[k*7+0][0],
al0[k*7+1][0],
al0[k*7+2][0],fM);
371 for(
int i=0;
i<7;
i++) {
372 for (
int j=0; j<7; j++) {
373 p1Cov[
i][j]=
V_al0[k*7+
i][k*7+j];
380 for(
int i=0;
i<7;
i++) {
381 for(
int j=0; j<7; j++) {
384 p2Cov[
i-4][j-4] = p1Cov[
i][j];
385 }
else { p2Cov[
i-4][j+3] = p1Cov[
i][j]; }
388 p2Cov[
i+3][j-4] = p1Cov[
i][j];
389 }
else { p2Cov[
i+3][j+3] = p1Cov[
i][j]; }
395 double invE = 1./
al0[k*7+3][0];
396 p2Cov[3][6] = p2Cov[6][3] = (p1.X()*p1Cov[0][0]+p1.Y()*p1Cov[0][1]+p1.Z()*p1Cov[0][2])*invE;
397 p2Cov[4][6] = p2Cov[6][4] = (p1.X()*p1Cov[1][0]+p1.Y()*p1Cov[1][1]+p1.Z()*p1Cov[1][2])*invE;
398 p2Cov[5][6] = p2Cov[6][5] = (p1.X()*p1Cov[2][0]+p1.Y()*p1Cov[2][1]+p1.Z()*p1Cov[2][2])*invE;
400 p2Cov[6][6] = (p1.X()*p1.X()*p1Cov[0][0]+p1.Y()*p1.Y()*p1Cov[1][1]+p1.Z()*p1.Z()*p1Cov[2][2]
401 +2.0*p1.X()*p1.Y()*p1Cov[0][1]
402 +2.0*p1.X()*p1.Z()*p1Cov[0][2]
403 +2.0*p1.Y()*p1.Z()*p1Cov[1][2])*invE*invE;
405 p2Cov[6][0] = p2Cov[0][6] = (p1.X()*p1Cov[0][4]+p1.Y()*p1Cov[1][4]+p1.Z()*p1Cov[2][4])*invE;
406 p2Cov[6][1] = p2Cov[1][6] = (p1.X()*p1Cov[0][5]+p1.Y()*p1Cov[1][5]+p1.Z()*p1Cov[2][5])*invE;
407 p2Cov[6][2] = p2Cov[2][6] = (p1.X()*p1Cov[0][6]+p1.Y()*p1Cov[1][6]+p1.Z()*p1Cov[2][6])*invE;
421 double fpx=0,fpy=0,fpz=0,
fe=0;
422 for (
int k=0; k<nd; k++) {
424 a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
432 TLorentzVector sum(fpx,fpy,fpz,
fe);
434 head->
SetP7(vtx,sum);
445 if(
fVerbose) { cout<<
"Final Momenta are "<<
al0[0][0]<<
" "<<
al1[1][0]<<
" "<<
al1[2][0]<<endl; }
455 for (
int k=0; k<nd; k++) {
478 for (
int ii=0; ii<6; ii++) {
for(
int jj=0;
jj<6;
jj++) {p3Cov[ii][
jj]=p1Cov[ii][
jj];}}
484 for (
int ii=0; ii<6; ii++) {
for(
int jj=0;
jj<6;
jj++) {J[ii][
jj] = 1;}}
485 for(
int i=3;
i<6; ++
i) {J[6][
i] =
al0[kN+
i-3][0]/
al0[kN+3][0];}
489 for(
int i=0;
i<7;
i++) {
490 for(
int j=0; j<7; j++) {
493 p4Cov[
i-3][j-3] = p2Cov[
i][j];
494 }
else { p4Cov[
i-3][j+4] = p2Cov[
i][j]; }
497 p4Cov[
i+4][j-3] = p2Cov[
i][j];
498 }
else { p4Cov[
i+4][j+4] = p2Cov[
i][j]; }
503 for(
int i=0;
i<7;
i++) {
504 for (
int j=0; j<7; j++) {
505 V_al0[k*7+
i][k*7+j] = p4Cov[
i][j];
522 for (
int k=0; k<nd; k++) {
527 double delX =
vtx_ex[0][0] -
al1[kN+4][0];
528 double delY =
vtx_ex[1][0] - al1[kN+5][0];
529 double delZ =
vtx_ex[2][0] - al1[kN+6][0];
530 double px = al1[kN+0][0];
531 double py = al1[kN+1][0];
532 double pz = al1[kN+2][0];
535 double a = -0.0029979246*ch*bField;
536 double pT_2 = px*px + py*py;
538 double J = a*(delX*px + delY*py)/pT_2;
539 double Rx = delX - 2.*px*(delX*px + delY*py)/pT_2;
540 double Ry = delY - 2.*py*(delX*px + delY*py)/pT_2;
543 if (J>=1.0 || J<= -1.0) { J = (J>=1.0 ? 0.99 : -0.99);}
545 double S = 1./(pT_2*
sqrt(1-(J*J)));
547 double asin_J = asin(J);
550 mD[
fNc+0+k2][kN+0] = delY ;
552 mD[
fNc+0+k2][kN+1] = -(delX) ;
553 mD[
fNc+0+k2][kN+2] = 0. ;
554 mD[
fNc+0+k2][kN+3] = 0. ;
555 mD[
fNc+0+k2][kN+4] = py + a*delX ;
556 mD[
fNc+0+k2][kN+5] = -px + a*delY ;
557 mD[
fNc+0+k2][kN+6] = 0. ;
559 mD[
fNc+1+k2][kN+0] = -pz*S*Rx ;
560 mD[
fNc+1+k2][kN+1] = -pz*S*Ry ;
561 mD[
fNc+1+k2][kN+2] = -asin_J/
a ;
562 mD[
fNc+1+k2][kN+3] = 0.;
563 mD[
fNc+1+k2][kN+4] = px*pz*S;
564 mD[
fNc+1+k2][kN+5] = py*pz*S;
565 mD[
fNc+1+k2][kN+6] = -1.;
568 mD[
fNc+0+k2][kN+0] = delY ;
569 mD[
fNc+0+k2][kN+1] = -(delX) ;
570 mD[
fNc+0+k2][kN+2] = 0. ;
571 mD[
fNc+0+k2][kN+3] = 0. ;
572 mD[
fNc+0+k2][kN+4] = py;
573 mD[
fNc+0+k2][kN+5] = -px;
574 mD[
fNc+0+k2][kN+6] = 0. ;
576 mD[
fNc+1+k2][kN+0] = 2*(delX*px+delY*py)*px*pz/(pT_2*pT_2) - pz*delX/(pT_2);
577 mD[
fNc+1+k2][kN+1] = 2*(delX*px+delY*py)*py*pz/(pT_2*pT_2) - pz*delY/(pT_2);
578 mD[
fNc+1+k2][kN+2] =-(delX*px+delY*py)/(pT_2);
579 mD[
fNc+1+k2][kN+3] = 0.;
580 mD[
fNc+1+k2][kN+4] = px*pz/pT_2;
581 mD[
fNc+1+k2][kN+5] = py*pz/pT_2;
582 mD[
fNc+1+k2][kN+6] = -1.;
587 mE[
fNc+0+k2][0] = -(py + a*delX);
588 mE[
fNc+0+k2][1] = (px - a*delY);
589 mE[
fNc+0+k2][2] = 0.;
590 mE[
fNc+1+k2][0] = -px*pz*S;
591 mE[
fNc+1+k2][1] = -py*pz*S;
592 mE[
fNc+1+k2][2] = 1.;
594 mE[
fNc+0+k2][0] = -py ;
595 mE[
fNc+0+k2][1] = px;
596 mE[
fNc+0+k2][2] = 0.;
597 mE[
fNc+1+k2][0] = -px*pz/pT_2;
598 mE[
fNc+1+k2][1] = -py*pz/pT_2;
599 mE[
fNc+1+k2][2] = 1.;
602 md[
fNc+0+k2][0] = delY*px - delX*py - (a/2.)*(delX*delX + delY*delY);
603 md[
fNc+1+k2][0] = delZ - (pz/
a)*asin_J;
605 md[
fNc+0+k2][0] = delY*px - delX*py;
606 md[
fNc+1+k2][0] = delZ - pz*(delX * px + delY * py)/(pT_2);
681 for(
int k=0; k<nd; ++k) {
685 double delX =
vtx_ex[0][0] - al1p[kN+4][0];
686 double delY =
vtx_ex[1][0] - al1p[kN+5][0];
690 al1p[kN+0][0] = al1p[kN+0][0]-a*delY;
691 al1p[kN+1][0] = al1p[kN+1][0]+a*delX;
693 double E =
TMath::Sqrt(al1p[kN+0][0]* al1p[kN+0][0]+al1p[kN+1][0]*al1p[kN+1][0]+al1p[kN+2][0]*al1p[kN+2][0]+m[k][0]*m[k][0]);
696 Px += al1p[kN+0][0] ;
703 for(
int k=0; k<nd; ++k) {
705 double px = al1p[kN+0][0];
706 double py = al1p[kN+1][0];
707 double pz = al1p[kN+2][0];
709 double E =
TMath::Sqrt(px*px+py*py+pz*pz+m[k][0]*m[k][0]);
714 a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
718 mD[
fNc+0][kN+0] = 2.*(Etot*al1p[kN+0][0]*invE-Px);
719 mD[
fNc+0][kN+1] = 2.*(Etot*al1p[kN+1][0]*invE-Py);
720 mD[
fNc+0][kN+2] = 2.*(Etot*al1p[kN+2][0]*invE-Pz);
721 mD[
fNc+0][kN+3] = 0.;
722 mD[
fNc+0][kN+4] =-2.*(Etot*al1p[kN+1][0]*invE-Py)*a;
723 mD[
fNc+0][kN+5] = 2.*(Etot*al1p[kN+0][0]*invE-Px)*a;
724 mD[
fNc+0][kN+6] = 0.;
726 cout <<
"Sum A: " << sumA << endl;
729 mE[
fNc+0][0] = 2*sumA*Px;
730 mE[
fNc+0][1] = -2*sumA*Py;
826 for(
int k=0; k<nd; k++) {
833 double px=a_in[kN+0][0];
834 double py=a_in[kN+1][0];
835 double pz=a_in[kN+2][0];
838 double x=a_in[kN+4][0];
839 double y=a_in[kN+5][0];
840 double z=a_in[kN+6][0];
841 double ptot=
sqrt(pz*pz+py*py+px*px);
843 double t=(px*(xref[0][0]-
x)+ py*(xref[1][0]-y)+pz*(xref[2][0]-
z))/(ptot*
ptot);
849 a_out[kN+3][0] = a_in[kN+3][0];
850 a_out[kN+4][0] = x+px*
t;
851 a_out[kN+5][0] = y+py*
t;
852 a_out[kN+6][0] = z+pz*
t;
873 double a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
877 double px=a_in[kN+0][0];
878 double py=a_in[kN+1][0];
879 double pz=a_in[kN+2][0];
880 double x=a_in[kN+4][0];
881 double y=a_in[kN+5][0];
882 double z=a_in[kN+6][0];
884 double ptot =
sqrt(px*px + py*py + pz*pz);
889 TVector3 xp(xref[0][0], xref[1][0], xref[2][0]);
890 TVector3 delta= x0-xp;
891 TVector3 p0(px,py,pz);
893 double c = delta.Dot(p0);
894 double b = ptot- rho* delta.Dot( p0.Cross(h) );
895 double delta_h = delta.Dot(h);
896 double p_h = p0.Dot(h);
897 double A = -1.0* ( c - delta_h*p_h)*rho*rho/2.0;
900 if ((b*b-4*A*c)<0) {s1=s2=0;}
902 s1=(-1.0*b -
sqrt(b*b-4*A*c))/(2.0*A);
903 s2=(-1.0*b +
sqrt(b*b-4*A*c))/(2.0*A);
910 TVector3 x1(x+px/a*
sin(rs1)-py/a*(1-
cos(rs1)), y + py/a*
sin(rs1)+px/a*(1-
cos(rs1)), z+pz/ptot*s1 );
911 TVector3 x2(x+px/a*
sin(rs2)-py/a*(1-
cos(rs2)), y + py/a*
sin(rs2)+px/a*(1-
cos(rs2)), z+pz/ptot*s2 );
912 double d1= (x1-xp).Mag();
913 double d2= (x2-xp).Mag();
916 double cos_rho_s=
cos(rho*s);
917 double sin_rho_s=
sin(rho*s);
919 a_out[kN+0][0] = px*cos_rho_s-py*sin_rho_s;
920 a_out[kN+1][0] = py*cos_rho_s+px*sin_rho_s;
922 a_out[kN+3][0] = a_in[kN+3][0];
923 a_out[kN+4][0] = x + (px*sin_rho_s - py*(1-cos_rho_s))/
a;
924 a_out[kN+5][0] = y + (py*sin_rho_s + px*(1-cos_rho_s))/
a;
925 a_out[kN+6][0] = z + (pz/
ptot)*s;
929 U[kN+0][kN+0] = cos_rho_s;
930 U[kN+0][kN+1] = -sin_rho_s;
932 U[kN+1][kN+0] = sin_rho_s;
933 U[kN+1][kN+1] = cos_rho_s;
938 U[4+kN][0+kN] = sin_rho_s/
a;
939 U[4+kN][1+kN] = -1.*(1.-cos_rho_s)/a;
942 U[5+kN][0+kN] = (1.-cos_rho_s)/a;
943 U[5+kN][1+kN] = sin_rho_s/
a;
946 U[6+kN][2+kN] = s/
ptot;
956 a_cov_out = U*a_cov_in*U_t;
970 for(
int k=0; k<nd; k++) {
978 double px=a_in[kN+0][0];
979 double py=a_in[kN+1][0];
980 double pz=a_in[kN+2][0];
983 double x=a_in[kN+4][0];
984 double y=a_in[kN+5][0];
985 double z=a_in[kN+6][0];
991 a_out[kN+3][0] = a_in[kN+3][0];
992 a_out[kN+4][0] = xref[0][0];
993 a_out[kN+5][0] = xref[1][0];
994 a_out[kN+6][0] = xref[2][0];
995 double s=
sqrt((xref[0][0]-x)*(xref[0][0]-x)+(xref[1][0]-y)*(xref[1][0]-y) + (xref[2][0]-z)*(xref[2][0]-z));
996 double ptot=
sqrt(px*px+py*py+pz*pz);
1008 U[4+kN][0+kN] = -1.*
t;
1011 U[5+kN][1+kN] = -1.*
t;
1014 U[6+kN][2+kN] = -1.*
t;
1022 double a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
1028 double px=a_in[kN+0][0];
1029 double py=a_in[kN+1][0];
1030 double pz=a_in[kN+2][0];
1031 double x=a_in[kN+4][0];
1032 double y=a_in[kN+5][0];
1033 double z=a_in[kN+6][0];
1035 double ptot =
sqrt(px*px + py*py + pz*pz);
1037 double rho = a/
ptot;
1040 double cos_rho_s = 1+a*(py*(xref[0][0]-
x)-px*(xref[1][0]-y))/(ptot*ptot-pz*pz);
1041 double sin_rho_s = a*(px*(xref[0][0]-
x) + py*(xref[1][0]-y))/(ptot*ptot-pz*pz);
1046 double s =
atan2(sin_rho_s,cos_rho_s)/rho ;
1047 a_out[kN+0][0] = px*cos_rho_s-py*sin_rho_s;
1048 a_out[kN+1][0] = py*cos_rho_s+px*sin_rho_s;
1049 a_out[kN+2][0] =
pz;
1050 a_out[kN+3][0] = a_in[kN+3][0];
1051 a_out[kN+4][0] = x + (px*sin_rho_s - py*(1-cos_rho_s))/
a;
1052 a_out[kN+5][0] = y + (py*sin_rho_s + px*(1-cos_rho_s))/
a;
1053 a_out[kN+6][0] = z + (pz/
ptot)*s;
1057 U[kN+0][kN+0] = cos_rho_s;
1058 U[kN+0][kN+1] = -sin_rho_s;
1060 U[kN+1][kN+0] = sin_rho_s;
1061 U[kN+1][kN+1] = cos_rho_s;
1066 U[4+kN][0+kN] = sin_rho_s/
a;
1067 U[4+kN][1+kN] = -1.*(1.-cos_rho_s)/a;
1070 U[5+kN][0+kN] = (1.-cos_rho_s)/a;
1071 U[5+kN][1+kN] = sin_rho_s/
a;
1074 U[6+kN][2+kN] = s/
ptot;
1084 a_cov_out = U*a_cov_in*U_t;
1233 for (
int k=0; k<nd; k++) {
1237 a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
1239 pA[jN][kN]=pA[jN+1][kN+1]=pA[jN+2][kN+2]=pA[jN+3][kN+3]=1;
1253 cov_al_xT = cov_al_x_temp.T();
1259 TMatrixD covP = pA*a_cov0*(pA_t.Transpose(pA));
1260 TMatrixD covA=covA_al_xi*(pB_t.Transpose(pB));
1261 TMatrixD covB=pB*(cov_al_xT)*(pA_t.Transpose(pA));
1262 TMatrixD covBV=pB*(V_vtx)*(pB_t.Transpose(pB));
1268 for (
int k=0; k<nd; k++) {
1271 for (
int i=0;
i<4;
i++) {
1272 for (
int j=0; j<4; j++) {
1273 SumcovP[
i][j] += covP[jN+
i][jN+j];
1274 SumcovP[
i][j] += covA[jN+
i][j];
1275 SumcovP[
i][j] += covB[
i][jN+j];
1277 for (
int jj=0;
jj<3;
jj++) {
1278 covA_al_x[
i][
jj] += covA_al_xi[jN+
i][
jj];
1286 covPX += (pB *V_vtx);
1288 covPX_t=covPX_t.Transpose(covPX);
1292 covS.SetSub(0,0,V_vtx);
1293 covS.SetSub(0,3,covPX_t);
1294 covS.SetSub(3,0,covPX);
1295 covS.SetSub(3,3,SumcovP);
void SetP7(const TVector3 &pos, const TLorentzVector &p4)
friend F32vec4 cos(const F32vec4 &a)
void SetPos(const TVector3 &pos)
Bool_t FitNode(RhoCandidate *b)
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
void AddMassConstraint(double mass)
friend F32vec4 sin(const F32vec4 &a)
void GetCovariance(TMatrixD &a_cov0, TMatrixD &cov_al_x, TMatrixD &V_vtx, TMatrixD &covS)
Double_t GetPocaVtx(TVector3 &vertex, RhoCandidate *composite)
void SetOutput(RhoCandidate *head)
friend F32vec4 fabs(const F32vec4 &a)
std::vector< RhoCandidate * > fDaughters
friend F32vec4 atan2(const F32vec4 &y, const F32vec4 &x)
void TransportToVertex(TMatrixD &, TMatrixD &, TMatrixD &, TMatrixD &, TMatrixD &)
Bool_t Compute(RhoCandidate *c)
void SetDaugthersFromComposite(RhoCandidate *cand)
RhoKinHyperonVtxFitter(RhoCandidate *b)
virtual ~RhoKinHyperonVtxFitter()
void SetDecayVertex(RhoCandidate *composite, const TVector3 &vtx, const TMatrixD &CovVV)
void SetCov7(const TMatrixD &cov7)
TMatrixT< double > TMatrixD
void TransportToPoca(TMatrixD &, TMatrixD &, TMatrixD &, TMatrixD &, TMatrixD &)