9 #include "TMatrixDSym.h"
81 mPull.ResizeTo(7*nd,1);
128 vtx_st[0][0]=startVtx.X();
129 vtx_st[1][0]=startVtx.Y();
130 vtx_st[2][0]=startVtx.Z();
171 if(Vd_inv==0) {
continue; }
210 vtx_new -= Vx*mE_t*lam0;
225 al_new -=
V_al0*mD_t*lam;
246 if(TMath::IsNaN(chi2_new[0][0]))
continue;
248 double deltaChi=chi2_new[0][0]-chi2[0][0];
251 if (deltaChi>0.1*chi2[0][0]) {
continue;}
252 if( chi2_new[0][0] < chi2[0][0] ) {
263 if( (j1+1 == fNMaxIterations) ||
270 Vd_new -= Vd*(mE*Vx*mE_t)*Vd.T();
273 cov_al_x -=
V_al0*mD_t*Vd*mE*Vx;
277 mPull[0][0] =(
al0[6][0]-al_new[6][0]);
282 if(
fVerbose) { cout <<
"iteration Number " <<
" " << j1 <<
" final." <<endl; }
283 if(
fVerbose) { cout <<
" chi2 in iteration" <<
" " << chi2[0][0] <<
" pull="<<
fPull<< endl; }
287 if(
fVerbose) { cout <<
"iteration Number " <<
" " << j1 << endl; }
288 if(
fVerbose) { cout <<
" vertex Position is "<<vtx_new[0][0]<<
" "<<vtx_new[1][0]<<
" "<<vtx_new[2][0]<<endl; }
289 if(
fVerbose) { cout <<
" chi2 in iteration" <<
" " << chi2[0][0] << endl; }
293 if( TMath::IsNaN(chi2[0][0]) || chi2[0][0]==2000000. )
return kFALSE;
338 for (
int k=0; k<nd; k++) {
344 a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
346 TVector3
pos(
al0[k*7+4][0],
al0[k*7+5][0],
al0[k*7+6][0]);
349 TLorentzVector mom4(
al0[k*7+0][0],
al0[k*7+1][0],
al0[k*7+2][0],
al0[k*7+3][0]);
354 momM.SetXYZM(
al0[k*7+0][0],
al0[k*7+1][0],
al0[k*7+2][0],fM);
364 for(
int i=0;
i<7;
i++) {
365 for (
int j=0; j<7; j++) {
366 p1Cov[
i][j]=
V_al0[k*7+
i][k*7+j];
373 for(
int i=0;
i<7;
i++) {
374 for(
int j=0; j<7; j++) {
377 p2Cov[
i-4][j-4] = p1Cov[
i][j];
378 }
else { p2Cov[
i-4][j+3] = p1Cov[
i][j]; }
381 p2Cov[
i+3][j-4] = p1Cov[
i][j];
382 }
else { p2Cov[
i+3][j+3] = p1Cov[
i][j]; }
388 double invE = 1./
al0[k*7+3][0];
389 p2Cov[3][6] = p2Cov[6][3] = (p1.X()*p1Cov[0][0]+p1.Y()*p1Cov[0][1]+p1.Z()*p1Cov[0][2])*invE;
390 p2Cov[4][6] = p2Cov[6][4] = (p1.X()*p1Cov[1][0]+p1.Y()*p1Cov[1][1]+p1.Z()*p1Cov[1][2])*invE;
391 p2Cov[5][6] = p2Cov[6][5] = (p1.X()*p1Cov[2][0]+p1.Y()*p1Cov[2][1]+p1.Z()*p1Cov[2][2])*invE;
393 p2Cov[6][6] = (p1.X()*p1.X()*p1Cov[0][0]+p1.Y()*p1.Y()*p1Cov[1][1]+p1.Z()*p1.Z()*p1Cov[2][2]
394 +2.0*p1.X()*p1.Y()*p1Cov[0][1]
395 +2.0*p1.X()*p1.Z()*p1Cov[0][2]
396 +2.0*p1.Y()*p1.Z()*p1Cov[1][2])*invE*invE;
398 p2Cov[6][0] = p2Cov[0][6] = (p1.X()*p1Cov[0][4]+p1.Y()*p1Cov[1][4]+p1.Z()*p1Cov[2][4])*invE;
399 p2Cov[6][1] = p2Cov[1][6] = (p1.X()*p1Cov[0][5]+p1.Y()*p1Cov[1][5]+p1.Z()*p1Cov[2][5])*invE;
400 p2Cov[6][2] = p2Cov[2][6] = (p1.X()*p1Cov[0][6]+p1.Y()*p1Cov[1][6]+p1.Z()*p1Cov[2][6])*invE;
442 if(
fVerbose) { cout<<
"Final Momenta are "<<
al0[0][0]<<
" "<<
al1[1][0]<<
" "<<
al1[2][0]<<endl; }
452 for (
int k=0; k<nd; k++) {
475 for (
int ii=0; ii<6; ii++) {
for(
int jj=0;
jj<6;
jj++) {p3Cov[ii][
jj]=p1Cov[ii][
jj];}}
481 for (
int ii=0; ii<6; ii++) {
for(
int jj=0;
jj<6;
jj++) {J[ii][
jj] = 1;}}
482 for(
int i=3;
i<6; ++
i) {J[6][
i] =
al0[kN+
i-3][0]/
al0[kN+3][0];}
486 for(
int i=0;
i<7;
i++) {
487 for(
int j=0; j<7; j++) {
490 p4Cov[
i-3][j-3] = p2Cov[
i][j];
491 }
else { p4Cov[
i-3][j+4] = p2Cov[
i][j]; }
494 p4Cov[
i+4][j-3] = p2Cov[
i][j];
495 }
else { p4Cov[
i+4][j+4] = p2Cov[
i][j]; }
500 for(
int i=0;
i<7;
i++) {
501 for (
int j=0; j<7; j++) {
502 V_al0[k*7+
i][k*7+j] = p4Cov[
i][j];
519 for (
int k=0; k<nd; k++) {
524 double delX =
vtx_ex[0][0] -
al1[kN+4][0];
525 double delY =
vtx_ex[1][0] - al1[kN+5][0];
526 double delZ =
vtx_ex[2][0] - al1[kN+6][0];
527 double px = al1[kN+0][0];
528 double py = al1[kN+1][0];
529 double pz = al1[kN+2][0];
532 double a = -0.0029979246*ch*bField;
533 double pT_2 = px*px + py*py;
535 double J = a*(delX*px + delY*py)/pT_2;
536 double Rx = delX - 2.*px*(delX*px + delY*py)/pT_2;
537 double Ry = delY - 2.*py*(delX*px + delY*py)/pT_2;
540 if (J>=1.0 || J<= -1.0) { J = (J>=1.0 ? 0.99 : -0.99);}
542 double S = 1./(pT_2*
sqrt(1-(J*J)));
544 double asin_J = asin(J);
547 mD[
fNc+0+k2][kN+0] = delY ;
549 mD[
fNc+0+k2][kN+1] = -(delX) ;
550 mD[
fNc+0+k2][kN+2] = 0. ;
551 mD[
fNc+0+k2][kN+3] = 0. ;
552 mD[
fNc+0+k2][kN+4] = py + a*delX ;
553 mD[
fNc+0+k2][kN+5] = -px + a*delY ;
554 mD[
fNc+0+k2][kN+6] = 0. ;
556 mD[
fNc+1+k2][kN+0] = -pz*S*Rx ;
557 mD[
fNc+1+k2][kN+1] = -pz*S*Ry ;
558 mD[
fNc+1+k2][kN+2] = -asin_J/
a ;
559 mD[
fNc+1+k2][kN+3] = 0.;
560 mD[
fNc+1+k2][kN+4] = px*pz*S;
561 mD[
fNc+1+k2][kN+5] = py*pz*S;
562 mD[
fNc+1+k2][kN+6] = -1.;
565 mD[
fNc+0+k2][kN+0] = delY ;
566 mD[
fNc+0+k2][kN+1] = -(delX) ;
567 mD[
fNc+0+k2][kN+2] = 0. ;
568 mD[
fNc+0+k2][kN+3] = 0. ;
569 mD[
fNc+0+k2][kN+4] = py;
570 mD[
fNc+0+k2][kN+5] = -px;
571 mD[
fNc+0+k2][kN+6] = 0. ;
573 mD[
fNc+1+k2][kN+0] = 2*(delX*px+delY*py)*px*pz/(pT_2*pT_2) - pz*delX/(pT_2);
574 mD[
fNc+1+k2][kN+1] = 2*(delX*px+delY*py)*py*pz/(pT_2*pT_2) - pz*delY/(pT_2);
575 mD[
fNc+1+k2][kN+2] =-(delX*px+delY*py)/(pT_2);
576 mD[
fNc+1+k2][kN+3] = 0.;
577 mD[
fNc+1+k2][kN+4] = px*pz/pT_2;
578 mD[
fNc+1+k2][kN+5] = py*pz/pT_2;
579 mD[
fNc+1+k2][kN+6] = -1.;
584 mE[
fNc+0+k2][0] = -(py + a*delX);
585 mE[
fNc+0+k2][1] = (px - a*delY);
586 mE[
fNc+0+k2][2] = 0.;
587 mE[
fNc+1+k2][0] = -px*pz*S;
588 mE[
fNc+1+k2][1] = -py*pz*S;
589 mE[
fNc+1+k2][2] = 1.;
591 mE[
fNc+0+k2][0] = -py ;
592 mE[
fNc+0+k2][1] = px;
593 mE[
fNc+0+k2][2] = 0.;
594 mE[
fNc+1+k2][0] = -px*pz/pT_2;
595 mE[
fNc+1+k2][1] = -py*pz/pT_2;
596 mE[
fNc+1+k2][2] = 1.;
599 md[
fNc+0+k2][0] = delY*px - delX*py - (a/2.)*(delX*delX + delY*delY);
600 md[
fNc+1+k2][0] = delZ - (pz/
a)*asin_J;
602 md[
fNc+0+k2][0] = delY*px - delX*py;
603 md[
fNc+1+k2][0] = delZ - pz*(delX * px + delY * py)/(pT_2);
678 for(
int k=0; k<nd; ++k) {
682 double delX =
vtx_ex[0][0] - al1p[kN+4][0];
683 double delY =
vtx_ex[1][0] - al1p[kN+5][0];
687 al1p[kN+0][0] = al1p[kN+0][0]-a*delY;
688 al1p[kN+1][0] = al1p[kN+1][0]+a*delX;
690 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]);
693 Px += al1p[kN+0][0] ;
700 for(
int k=0; k<nd; ++k) {
702 double px = al1p[kN+0][0];
703 double py = al1p[kN+1][0];
704 double pz = al1p[kN+2][0];
706 double E =
TMath::Sqrt(px*px+py*py+pz*pz+m[k][0]*m[k][0]);
711 a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
715 mD[
fNc+0][kN+0] = 2.*(Etot*al1p[kN+0][0]*invE-Px);
716 mD[
fNc+0][kN+1] = 2.*(Etot*al1p[kN+1][0]*invE-Py);
717 mD[
fNc+0][kN+2] = 2.*(Etot*al1p[kN+2][0]*invE-Pz);
718 mD[
fNc+0][kN+3] = 0.;
719 mD[
fNc+0][kN+4] =-2.*(Etot*al1p[kN+1][0]*invE-Py)*a;
720 mD[
fNc+0][kN+5] = 2.*(Etot*al1p[kN+0][0]*invE-Px)*a;
721 mD[
fNc+0][kN+6] = 0.;
723 cout <<
"Sum A: " << sumA << endl;
726 mE[
fNc+0][0] = 2*sumA*Px;
727 mE[
fNc+0][1] = -2*sumA*Py;
826 for(
int k=0; k<nd; k++) {
832 double a = 0.00299792458;
835 double px=a_in[kN+0][0];
836 double py=a_in[kN+1][0];
837 double pz=a_in[kN+2][0];
840 double x=a_in[kN+4][0];
841 double y=a_in[kN+5][0];
842 double z=a_in[kN+6][0];
848 a_out[kN+3][0] = a_in[kN+3][0];
849 a_out[kN+4][0] = x+px*inva;
850 a_out[kN+5][0] = y+py*inva;
851 a_out[kN+6][0] = z+pz*inva;
860 U[kN+4][kN+0] = inva;
863 U[kN+5][kN+1] = inva;
866 U[kN+6][kN+2] = inva;
874 double a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
880 double px=a_in[kN+0][0];
881 double py=a_in[kN+1][0];
882 double pz=a_in[kN+2][0];
883 double x=a_in[kN+4][0];
884 double y=a_in[kN+5][0];
885 double z=a_in[kN+6][0];
887 double ptot =
sqrt(px*px + py*py + pz*pz);
890 double A1 = 1 - pow(pz/ptot,2) - ( (x-xref[0][0])*py - (y-xref[1][0])*px )*rho/ptot ;
891 double A2 = (x-xref[0][0])*px + (y-xref[1][0])*py;
895 double det =
sqrt(A1*A1+rho*rho*A2*A2);
896 double cos_rho_s = A1/det;
897 double sin_rho_s = -rho*A2/det;
902 double s =
atan2(sin_rho_s,cos_rho_s)/rho ;
903 a_out[kN+0][0] = px*cos_rho_s-py*sin_rho_s;
904 a_out[kN+1][0] = py*cos_rho_s+px*sin_rho_s;
906 a_out[kN+3][0] = a_in[kN+3][0];
907 a_out[kN+4][0] = x + (px*sin_rho_s - py*(1-cos_rho_s))/
a;
908 a_out[kN+5][0] = y + (py*sin_rho_s + px*(1-cos_rho_s))/
a;
909 a_out[kN+6][0] = z + (pz/
ptot)*s;
913 U[kN+0][kN+0] = cos_rho_s;
914 U[kN+0][kN+1] = -sin_rho_s;
916 U[kN+1][kN+0] = sin_rho_s;
917 U[kN+1][kN+1] = cos_rho_s;
922 U[4+kN][0+kN] = sin_rho_s/
a;
923 U[4+kN][1+kN] = (1.-cos_rho_s)/a;
926 U[5+kN][0+kN] = (1.-cos_rho_s)/a;
927 U[5+kN][1+kN] = sin_rho_s/
a;
930 U[6+kN][2+kN] = s/
ptot;
940 a_cov_out = U*a_cov_in*U_t;
958 for (
int k=0; k<nd; k++) {
962 a = -0.00299792458*bField*
fDaughters[k]->GetCharge();
964 pA[jN][kN]=pA[jN+1][kN+1]=pA[jN+2][kN+2]=pA[jN+3][kN+3]=1;
978 cov_al_xT = cov_al_x_temp.T();
984 TMatrixD covP = pA*a_cov0*(pA_t.Transpose(pA));
985 TMatrixD covA=covA_al_xi*(pB_t.Transpose(pB));
986 TMatrixD covB=pB*(cov_al_xT)*(pA_t.Transpose(pA));
987 TMatrixD covBV=pB*(V_vtx)*(pB_t.Transpose(pB));
993 for (
int k=0; k<nd; k++) {
996 for (
int i=0;
i<4;
i++) {
997 for (
int j=0; j<4; j++) {
998 SumcovP[
i][j] += covP[jN+
i][jN+j];
999 SumcovP[
i][j] += covA[jN+
i][j];
1000 SumcovP[
i][j] += covB[
i][jN+j];
1002 for (
int jj=0;
jj<3;
jj++) {
1003 covA_al_x[
i][
jj] += covA_al_xi[jN+
i][
jj];
1011 covPX += (pB *V_vtx);
1013 covPX_t=covPX_t.Transpose(covPX);
1017 covS.SetSub(0,0,V_vtx);
1018 covS.SetSub(0,3,covPX_t);
1019 covS.SetSub(3,0,covPX);
1020 covS.SetSub(3,3,SumcovP);
void SetPos(const TVector3 &pos)
void TransportToVertex(TMatrixD &, TMatrixD &, TMatrixD &, TMatrixD &, TMatrixD &)
virtual ~RhoKinVtxFitter()
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
Bool_t FitNode(RhoCandidate *b)
void SetFourMomentumByDaughters(RhoCandidate *composite)
Bool_t Compute(RhoCandidate *c)
Double_t GetPocaVtx(TVector3 &vertex, RhoCandidate *composite)
void AddMassConstraint(double mass)
friend F32vec4 fabs(const F32vec4 &a)
std::vector< RhoCandidate * > fDaughters
void GetCovariance(TMatrixD &a_cov0, TMatrixD &cov_al_x, TMatrixD &V_vtx, TMatrixD &covS)
RhoKinVtxFitter(RhoCandidate *b)
friend F32vec4 atan2(const F32vec4 &y, const F32vec4 &x)
void SetOutput(RhoCandidate *head)
void SetDaugthersFromComposite(RhoCandidate *cand)
void SetDecayVertex(RhoCandidate *composite, const TVector3 &vtx, const TMatrixD &CovVV)
TMatrixT< double > TMatrixD