+AliTRDtrack::AliTRDtrack(const AliKalmanTrack& t, Double_t alpha)
+ :AliKalmanTrack(t)
+{
+ //
+ // Constructor from AliTPCtrack or AliITStrack .
+ //
+
+ SetLabel(t.GetLabel());
+ SetChi2(0.);
+ SetMass(t.GetMass());
+ SetNumberOfClusters(0);
+
+ fdEdx=t.GetPIDsignal();
+ fDE = 0;
+ for (Int_t i=0;i<kNplane;i++){
+ for (Int_t j=0;j<kNslice;j++){
+ fdEdxPlane[i][j] = 0.0;
+ }
+ fTimBinPlane[i] = -1;
+ }
+
+ fLhElectron = 0.0;
+ fNWrong = 0;
+ fNRotate = 0;
+ fStopped = 0;
+ fNExpected=0;
+ fNExpectedLast=0;
+ fNdedx =0;
+ fNCross =0;
+ fNLast =0;
+ fChi2Last =0;
+ fBackupTrack =0;
+
+ fAlpha = alpha;
+ if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi();
+ else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi();
+
+ Double_t x, p[5]; t.GetExternalParameters(x,p);
+
+ fX=x;
+
+ fY=p[0];
+ fZ=p[1];
+ fT=p[3]; x=GetLocalConvConst();
+ fC=p[4]/x;
+ fE=fC*fX - p[2];
+
+ //Conversion of the covariance matrix
+ Double_t c[15]; t.GetExternalCovariance(c);
+
+ c[10]/=x; c[11]/=x; c[12]/=x; c[13]/=x; c[14]/=x*x;
+
+ Double_t c22=fX*fX*c[14] - 2*fX*c[12] + c[5];
+ Double_t c32=fX*c[13] - c[8];
+ Double_t c20=fX*c[10] - c[3], c21=fX*c[11] - c[4], c42=fX*c[14] - c[12];
+
+ fCyy=c[0 ];
+ fCzy=c[1 ]; fCzz=c[2 ];
+ fCey=c20; fCez=c21; fCee=c22;
+ fCty=c[6 ]; fCtz=c[7 ]; fCte=c32; fCtt=c[9 ];
+ fCcy=c[10]; fCcz=c[11]; fCce=c42; fCct=c[13]; fCcc=c[14];
+
+ // Initialization [SR, GSI, 18.02.2003]
+ for(UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) {
+ fdQdl[i] = 0;
+ fIndex[i] = 0;
+ fIndexBackup[i] = 0; // MI backup indexes
+ }
+
+ for (Int_t i=0;i<3;i++) { fBudget[i]=0;};
+}
+
+//_____________________________________________________________________________
+AliTRDtrack::AliTRDtrack(const AliESDtrack& t)
+ :AliKalmanTrack()
+{
+ //
+ // Constructor from AliESDtrack
+ //
+
+ SetLabel(t.GetLabel());
+ SetChi2(0.);
+ SetMass(t.GetMass());
+ SetNumberOfClusters(t.GetTRDclusters(fIndex));
+ Int_t ncl = t.GetTRDclusters(fIndexBackup);
+ for (UInt_t i=ncl;i<kMAXCLUSTERSPERTRACK;i++) {
+ fIndexBackup[i]=0;
+ fIndex[i] = 0; //MI store indexes
+ }
+ fdEdx=t.GetTRDsignal();
+ fDE =0;
+ for (Int_t i=0;i<kNplane;i++){
+ for (Int_t j=0;j<kNslice;j++){
+ fdEdxPlane[i][j] = t.GetTRDsignals(i,j);
+ }
+ fTimBinPlane[i] = t.GetTRDTimBin(i);
+ }
+
+ fLhElectron = 0.0;
+ fNWrong = 0;
+ fStopped = 0;
+ fNRotate = 0;
+ fNExpected =0;
+ fNExpectedLast=0;
+ fNdedx = 0;
+ fNCross =0;
+ fNLast =0;
+ fChi2Last =0;
+ fBackupTrack =0;
+
+ fAlpha = t.GetAlpha();
+ if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi();
+ else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi();
+
+ Double_t x, p[5]; t.GetExternalParameters(x,p);
+ //Conversion of the covariance matrix
+ Double_t c[15]; t.GetExternalCovariance(c);
+ if (t.GetStatus()&AliESDtrack::kTRDbackup){
+ t.GetOuterExternalParameters(fAlpha,x,p);
+ t.GetOuterExternalCovariance(c);
+ if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi();
+ else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi();
+ }
+
+ fX=x;
+
+ fY=p[0];
+ fZ=p[1]; SaveLocalConvConst();
+ fT=p[3]; x=GetLocalConvConst();
+ fC=p[4]/x;
+ fE=fC*fX - p[2];
+
+
+ c[10]/=x; c[11]/=x; c[12]/=x; c[13]/=x; c[14]/=x*x;
+
+ Double_t c22=fX*fX*c[14] - 2*fX*c[12] + c[5];
+ Double_t c32=fX*c[13] - c[8];
+ Double_t c20=fX*c[10] - c[3], c21=fX*c[11] - c[4], c42=fX*c[14] - c[12];
+
+ fCyy=c[0 ];
+ fCzy=c[1 ]; fCzz=c[2 ];
+ fCey=c20; fCez=c21; fCee=c22;
+ fCty=c[6 ]; fCtz=c[7 ]; fCte=c32; fCtt=c[9 ];
+ fCcy=c[10]; fCcz=c[11]; fCce=c42; fCct=c[13]; fCcc=c[14];
+
+ // Initialization [SR, GSI, 18.02.2003]
+ for(UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) {
+ fdQdl[i] = 0;
+ // fIndex[i] = 0; //MI store indexes
+ }
+
+ for (Int_t i=0;i<3;i++) { fBudget[i]=0;};
+ if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
+ StartTimeIntegral();
+ Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times);
+ SetIntegratedLength(t.GetIntegratedLength());
+
+}
+
+//____________________________________________________________________________
+AliTRDtrack::~AliTRDtrack()
+{
+ //
+ // Destructor
+ //
+
+ if (fBackupTrack) delete fBackupTrack;
+ fBackupTrack = 0;
+
+}
+
+//____________________________________________________________________________
+AliTRDtrack &AliTRDtrack::operator=(const AliTRDtrack &t)
+{
+ //
+ // Assignment operator
+ //
+
+ fLhElectron = 0.0;
+ fNWrong = 0;
+ fStopped = 0;
+ fNRotate = 0;
+ fNExpected =0;
+ fNExpectedLast=0;
+ fNdedx = 0;
+ fNCross =0;
+ fNLast =0;
+ fChi2Last =0;
+ fBackupTrack =0;
+
+ fAlpha = t.GetAlpha();
+ if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi();
+ else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi();
+
+ return *this;
+
+}
+
+//____________________________________________________________________________
+Float_t AliTRDtrack::StatusForTOF()
+{
+ //
+ // Defines the status of the TOF extrapolation
+ //
+
+ Float_t res = (0.2 + 0.8*(fN/(fNExpected+5.)))*(0.4+0.6*fTracklets[5].GetN()/20.);
+ res *= (0.25+0.8*40./(40.+fBudget[2]));
+ return res;
+
+ Int_t status=0;
+ if (GetNumberOfClusters()<20) return 0; //
+ if (fN>110&&fChi2/(Float_t(fN))<3) return 3; //gold
+ if (fNLast>30&&fChi2Last/(Float_t(fNLast))<3) return 3; //gold
+ if (fNLast>20&&fChi2Last/(Float_t(fNLast))<2) return 3; //gold
+ if (fNLast/(fNExpectedLast+3.)>0.8 && fChi2Last/Float_t(fNLast)<5&&fNLast>20) return 2; //silber
+ if (fNLast>5 &&((fNLast+1.)/(fNExpectedLast+1.))>0.8&&fChi2Last/(fNLast-5.)<6) return 1;
+
+ return status;
+
+}
+
+//_____________________________________________________________________________
+void AliTRDtrack::GetExternalCovariance(Double_t cc[15]) const
+{
+ //
+ // This function returns external representation of the covriance matrix.
+ //
+
+ Double_t a=GetLocalConvConst();
+
+ Double_t c22=fX*fX*fCcc-2*fX*fCce+fCee;
+ Double_t c32=fX*fCct-fCte;
+ Double_t c20=fX*fCcy-fCey, c21=fX*fCcz-fCez, c42=fX*fCcc-fCce;
+
+ cc[0 ]=fCyy;
+ cc[1 ]=fCzy; cc[2 ]=fCzz;
+ cc[3 ]=c20; cc[4 ]=c21; cc[5 ]=c22;
+ cc[6 ]=fCty; cc[7 ]=fCtz; cc[8 ]=c32; cc[9 ]=fCtt;
+ cc[10]=fCcy*a; cc[11]=fCcz*a; cc[12]=c42*a; cc[13]=fCct*a; cc[14]=fCcc*a*a;
+
+}
+
+//_____________________________________________________________________________
+void AliTRDtrack::GetCovariance(Double_t cc[15]) const
+{
+ //
+ // Returns the track covariance matrix
+ //
+