- Double_t r00=c->GetSigmaY2(), r01=0., r11=c->GetSigmaZ2();
- r00+=fC00; r01+=fC10; r11+=fC11;
-
- Double_t det=r00*r11 - r01*r01;
- if (TMath::Abs(det) < 1.e-30) {
- Int_t n=GetNumberOfClusters();
- if (n>kWARN)
- cerr<<n<<" AliKalmanTrack::GetPredictedChi2: Singular matrix !\n";
- return 1e10;
- }
- Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01;
-
- Double_t dy=c->GetY() - fP0, dz=c->GetZ() - fP1;
-
- return (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det;
-}
-
-//_____________________________________________________________________________
-Double_t AliITStrackV2::GetPredictedChi2(const AliCluster *c,Double_t *m,
-Double_t x0) const {
- //-----------------------------------------------------------------
- // This function calculates a chi2 increment with a vertex contraint
- //-----------------------------------------------------------------
- TVectorD x(5); x(0)=fP0; x(1)=fP1; x(2)=fP2; x(3)=fP3; x(4)=fP4;
- TMatrixD C(5,5);
- C(0,0)=fC00;
- C(1,0)=fC10; C(1,1)=fC11;
- C(2,0)=fC20; C(2,1)=fC21; C(2,2)=fC22;
- C(3,0)=fC30; C(3,1)=fC31; C(3,2)=fC32; C(3,3)=fC33;
- C(4,0)=fC40; C(4,1)=fC41; C(4,2)=fC42; C(4,3)=fC43; C(4,4)=fC44;
-
- C(0,1)=C(1,0);
- C(0,2)=C(2,0); C(1,2)=C(2,1);
- C(0,3)=C(3,0); C(1,3)=C(3,1); C(2,3)=C(3,2);
- C(0,4)=C(4,0); C(1,4)=C(4,1); C(2,4)=C(4,2); C(3,4)=C(4,3);
-
- TMatrixD H(4,5); H.UnitMatrix();
- Double_t dy=(c->GetY() - m[0]), dz=(c->GetZ() - m[1]);
-
- Double_t dr=TMath::Sqrt(fX*fX + dy*dy);
- Double_t r =TMath::Sqrt(4/dr/dr - fP4*fP4);
- Double_t sn=0.5*(fP4*fX + dy*r);
- Double_t tg=0.5*fP4*dz/TMath::ASin(0.5*fP4*dr);
- TVectorD mm(4);
- mm(0)=m[0]=c->GetY(); mm(1)=m[1]=c->GetZ(); mm(2)=m[2]=sn; mm(3)=m[3]=tg;
-
- Double_t v22=0.,v33=0.;
- //x0=0.;
- if (x0!=0.) {
- Double_t pp2=(1.+ GetTgl()*GetTgl())/(Get1Pt()*Get1Pt());
- Double_t beta2=pp2/(pp2 + GetMass()*GetMass());
- x0*=TMath::Sqrt((1.+ GetTgl()*GetTgl())/(1.- GetSnp()*GetSnp()));
- Double_t theta2=14.1*14.1/(beta2*pp2*1e6)*x0;
- v22 = theta2*(1.- GetSnp()*GetSnp())*(1. + GetTgl()*GetTgl());
- v33 = theta2*(1.+ GetTgl()*GetTgl())*(1. + GetTgl()*GetTgl());
- }
- Double_t sy2=c->GetSigmaY2(), sz2=c->GetSigmaZ2();
- v22+=kSigmaYV*kSigmaYV/dr/dr;
- v22+=sy2/dr/dr;
- Double_t v20=sy2/dr;
-
- v33+=kSigmaZV*kSigmaZV/dr/dr;
- v33+=sz2/dr/dr;
- Double_t v31=sz2/dr;
-
- TMatrixD V(4,4);
- V(0,0)=m[4 ]=sy2; V(0,1)=m[5 ]=0.; V(0,2)=m[6 ]=v20; V(0,3)=m[7 ]=0.;
- V(1,0)=m[8 ]=0.; V(1,1)=m[9 ]=sz2; V(1,2)=m[10]=0.; V(1,3)=m[11]=v31;
- V(2,0)=m[12]=v20; V(2,1)=m[13]=0.; V(2,2)=m[14]=v22; V(2,3)=m[15]=0.;
- V(3,0)=m[16]=0.; V(3,1)=m[17]=v31; V(3,2)=m[18]=0.; V(3,3)=m[19]=v33;
-
- TVectorD res=x; res*=H; res-=mm; //res*=-1;
- TMatrixD tmp(H,TMatrixD::kMult,C);
- TMatrixD R(tmp,TMatrixD::kMult,TMatrixD(TMatrixD::kTransposed,H)); R+=V;
-
- Double_t det=R.Determinant();
- if (TMath::Abs(det) < 1.e-30) {
- Int_t n=GetNumberOfClusters();
- if (n>kWARN)
- cerr<<n<<" AliITStrackV2::GetPredictedChi2: Singular matrix !\n";
- return 1e10;
- }
-
- R.Invert();
-
- TVectorD rs=res;
- res*=R;
- return rs*res;