/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ //------------------------------------------------------------------------- // Implementation of the ITS track class // // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch //------------------------------------------------------------------------- #include #include #include #include "AliCluster.h" #include "../TPC/AliTPCtrack.h" #include "AliITStrackV2.h" ClassImp(AliITStrackV2) const Int_t kWARN=1; //____________________________________________________________________________ AliITStrackV2::AliITStrackV2(const AliTPCtrack& t) throw (const Char_t *) { //------------------------------------------------------------------ //Conversion TPC track -> ITS track //------------------------------------------------------------------ SetLabel(t.GetLabel()); SetChi2(0.); SetNumberOfClusters(0); //SetConvConst(t.GetConvConst()); fdEdx = 0.; fAlpha = t.GetAlpha(); if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi(); else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi(); //Conversion of the track parameters Double_t x,p[5]; t.GetExternalParameters(x,p); fX=x; x=GetConvConst(); fP0=p[0]; fP1=p[1]; fP2=p[2]; fP3=p[3]; fP4=p[4]/x; //Conversion of the covariance matrix Double_t c[15]; t.GetExternalCovariance(c); fC00=c[0 ]; fC10=c[1 ]; fC11=c[2 ]; fC20=c[3 ]; fC21=c[4 ]; fC22=c[5 ]; fC30=c[6 ]; fC31=c[7 ]; fC32=c[8 ]; fC33=c[9 ]; fC40=c[10]/x; fC41=c[11]/x; fC42=c[12]/x; fC43=c[13]/x; fC44=c[14]/x/x; if (!Invariant()) throw "AliITStrackV2: conversion failed !\n"; } //____________________________________________________________________________ AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) : AliKalmanTrack(t) { //------------------------------------------------------------------ //Copy constructor //------------------------------------------------------------------ fX=t.fX; fAlpha=t.fAlpha; fdEdx=t.fdEdx; fP0=t.fP0; fP1=t.fP1; fP2=t.fP2; fP3=t.fP3; fP4=t.fP4; fC00=t.fC00; fC10=t.fC10; fC11=t.fC11; fC20=t.fC20; fC21=t.fC21; fC22=t.fC22; fC30=t.fC30; fC31=t.fC31; fC32=t.fC32; fC33=t.fC33; fC40=t.fC40; fC41=t.fC41; fC42=t.fC42; fC43=t.fC43; fC44=t.fC44; Int_t n=GetNumberOfClusters(); for (Int_t i=0; iGet1Pt()); Double_t c =TMath::Abs(Get1Pt()); if (c>co) return 1; else if (c= 0.99999) { Int_t n=GetNumberOfClusters(); if (n>kWARN) cerr<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-10) { Int_t n=GetNumberOfClusters(); if (n>4) cerr<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, Double_t pm) 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 + pm*pm); 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-25) { Int_t n=GetNumberOfClusters(); if (n>kWARN) cerr<= 0.99999) { Int_t n=GetNumberOfClusters(); if (n>kWARN) cerr<GetSigmaY2(), r01=0., r11=c->GetSigmaZ2(); r00+=fC00; r01+=fC10; r11+=fC11; Double_t det=r00*r11 - r01*r01; Double_t tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det; Double_t k00=fC00*r00+fC10*r01, k01=fC00*r01+fC10*r11; Double_t k10=fC10*r00+fC11*r01, k11=fC10*r01+fC11*r11; Double_t k20=fC20*r00+fC21*r01, k21=fC20*r01+fC21*r11; Double_t k30=fC30*r00+fC31*r01, k31=fC30*r01+fC31*r11; Double_t k40=fC40*r00+fC41*r01, k41=fC40*r01+fC41*r11; Double_t dy=c->GetY() - fP0, dz=c->GetZ() - fP1; Double_t sf=fP2 + k20*dy + k21*dz; /* if (TMath::Abs(sf) >= 0.99999) { Int_t n=GetNumberOfClusters(); if (n>kWARN) cerr<11.5) //if (fP1*fP4<0) {cout<<"fP1*fP4="<=1) {cout<<"fP2="<= 0.99999) { Int_t n=GetNumberOfClusters(); if (n>kWARN) cerr<= TMath::Pi()) fAlpha -= 2*TMath::Pi(); Double_t x1=fX, y1=fP0; fX = x1*ca + y1*sa; fP0=-x1*sa + y1*ca; fP2 = pp2; cf=ca + sf*sa/cf; if (!Invariant()) {cout<= 0.99999) { Int_t n=GetNumberOfClusters(); if (n>kWARN) cerr<