#include "AliESDtrack.h"
#include "AliTracker.h"
#include "AliTOFGeometry.h"
#include "AliTOFtrack.h"
ClassImp(AliTOFtrack)
AliTOFtrack::AliTOFtrack() :
AliKalmanTrack(),
fSeedInd(-1),
fSeedLab(-1)
{
}
AliTOFtrack::AliTOFtrack(const AliTOFtrack& t) :
AliKalmanTrack(t),
fSeedInd(t.fSeedInd),
fSeedLab(t.fSeedLab)
{
}
AliTOFtrack& AliTOFtrack::operator=(const AliESDtrack& t)
{
SetLabel(t.GetLabel());
SetChi2(0.);
SetMass(t.GetMassForTracking());
Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return *this;
StartTimeIntegral();
Double_t times[10];
for(Int_t isp=0;isp<AliPID::kSPECIESC;isp++){
times[isp] = t.GetIntegratedTimesOld(isp);
}
SetIntegratedTimes(times);
SetIntegratedLength(t.GetIntegratedLengthOld());
return *this;
}
AliTOFtrack::AliTOFtrack(const AliESDtrack& t) :
AliKalmanTrack(),
fSeedInd(-1),
fSeedLab(-1)
{
SetLabel(t.GetLabel());
SetChi2(0.);
SetMass(t.GetMassForTracking());
Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
StartTimeIntegral();
Double_t times[10];
for(Int_t isp=0;isp<AliPID::kSPECIESC;isp++){
times[isp] = t.GetIntegratedTimesOld(isp);
}
SetIntegratedTimes(times);
SetIntegratedLength(t.GetIntegratedLengthOld());
}
AliTOFtrack& AliTOFtrack::operator=(const AliTOFtrack &)
{
return *this;
}
Bool_t AliTOFtrack::PropagateTo(Double_t xk,Double_t ,Double_t )
{
if (xk == GetX()) return kTRUE;
Double_t oldX=GetX();
Double_t start[3], end[3], mparam[7];
GetXYZ(start);
Double_t b[3];GetBxByBz(b);
if (!AliExternalTrackParam::PropagateToBxByBz(xk,b)) return kFALSE;
GetXYZ(end);
#if 0 /*** OLD ***/
Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) +
(GetY()-oldY)*(GetY()-oldY) +
(GetZ()-oldZ)*(GetZ()-oldZ));
if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
#endif
Double_t d = TMath::Sqrt((end[0]-start[0])*(end[0]-start[0]) +
(end[1]-start[1])*(end[1]-start[1]) +
(end[2]-start[2])*(end[2]-start[2]));
if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
AliTracker::MeanMaterialBudget(start, end, mparam);
Double_t xTimesRho = mparam[4]*mparam[0];
if (oldX < xk) {
xTimesRho = -xTimesRho;
}
Double_t xOverX0 = mparam[1];
if (!AliExternalTrackParam::CorrectForMeanMaterial(xOverX0,xTimesRho,GetMass())) return kFALSE;
#if 0 /*** OLD ***/
if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass()))
return kFALSE;
#endif
return kTRUE;
}
Bool_t AliTOFtrack::PropagateToInnerTOF()
{
const Double_t kAlphac = AliTOFGeometry::GetAlpha();
const Double_t kTalphac = TMath::Tan(kAlphac*0.5);
const Double_t kStepSize = 0.5;
Double_t x = GetX();
Int_t nsteps = (Int_t)((AliTOFGeometry::Rmin()-x)/kStepSize);
for (Int_t istep=0; istep<nsteps; istep++){
Double_t dir = (GetX() > AliTOFGeometry::Rmin()) ? -1.0 : 1.0;
x = GetX()+dir*kStepSize;
if ( x<GetX() && GetX()<AliTOFGeometry::Rmin()) {
AliDebug(1,Form("Track doesn't reach rho=%f",AliTOFGeometry::Rmin()));
return kFALSE;
}
if (!(PropagateTo(x,0.,0.))) {
return kFALSE;
}
if (GetY() > GetX()*kTalphac) {
if (!(Rotate(kAlphac))) return kFALSE;
} else if (GetY() < -GetX()*kTalphac) {
if (!(Rotate(-kAlphac))) return kFALSE;
}
}
Bool_t check = PropagateTo(AliTOFGeometry::RinTOF(),0.,0.);
if (!check) return kFALSE;
if (GetY() > GetX()*kTalphac) {
if (!(Rotate(kAlphac))) return kFALSE;
} else if (GetY() < -GetX()*kTalphac) {
if (!(Rotate(-kAlphac))) return kFALSE;
}
return kTRUE;
}
Bool_t AliTOFtrack::PropagateToInnerTOFold()
{
Double_t ymax=AliTOFGeometry::RinTOF()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha());
Bool_t skip = kFALSE;
Double_t y=GetYat(AliTOFGeometry::RinTOF(),skip);
if (skip) {
return kFALSE;
}
if (y > ymax) {
if (!Rotate(AliTOFGeometry::GetAlpha())) return kFALSE;
} else if (y <-ymax) {
if (!Rotate(-AliTOFGeometry::GetAlpha())) return kFALSE;
}
Double_t x = GetX();
Int_t nsteps=Int_t((AliTOFGeometry::Rmin()-x)/0.5);
for (Int_t istep=0;istep<nsteps;istep++){
Float_t xp = x+istep*0.5;
if (!(PropagateTo(xp,0.,0.))) {
return kFALSE;
}
}
if (!(PropagateTo(AliTOFGeometry::RinTOF()))) return kFALSE;
return kTRUE;
}
Double_t AliTOFtrack::GetPredictedChi2(const AliCluster3D *c) const {
Double_t p[3]={c->GetX(), c->GetY(), c->GetZ()};
Double_t covyz[3]={c->GetSigmaY2(), c->GetSigmaYZ(), c->GetSigmaZ2()};
Double_t covxyz[3]={c->GetSigmaX2(), c->GetSigmaXY(), c->GetSigmaXZ()};
return AliExternalTrackParam::GetPredictedChi2(p, covyz, covxyz);
}
Bool_t AliTOFtrack::PropagateTo(const AliCluster3D *c) {
Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
Double_t p[3]={c->GetX(), c->GetY(), c->GetZ()};
Double_t covyz[3]={c->GetSigmaY2(), c->GetSigmaYZ(), c->GetSigmaZ2()};
Double_t covxyz[3]={c->GetSigmaX2(), c->GetSigmaXY(), c->GetSigmaXZ()};
Double_t bz=GetBz();
if (!AliExternalTrackParam::PropagateTo(p, covyz, covxyz, bz)) return kFALSE;
if (IsStartedTimeIntegral()) {
Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) +
(GetY()-oldY)*(GetY()-oldY) +
(GetZ()-oldZ)*(GetZ()-oldZ));
if (GetX()<oldX) d=-d;
AddTimeStep(d);
}
if (GetY() > GetX()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha())) {
if (!(Rotate(AliTOFGeometry::GetAlpha()))) return kFALSE;
} else if (GetY() < -GetX()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha())) {
if (!(Rotate(-AliTOFGeometry::GetAlpha()))) return kFALSE;
}
return kTRUE;
}
Double_t AliTOFtrack::GetYat(Double_t xk, Bool_t & skip) const {
Double_t y=0.;
skip=(!GetYAt(xk,GetBz(),y));
return y;
}
Int_t AliTOFtrack::Compare(const TObject *o) const {
AliTOFtrack *t=(AliTOFtrack*)o;
Double_t co=t->GetSigmaY2()*t->GetSigmaZ2();
Double_t c =GetSigmaY2()*GetSigmaZ2();
if (c>co) return 1;
else if (c<co) return -1;
return 0;
}
void AliTOFtrack::GetPropagationParameters(Double_t *param) {
Double_t rTPC = 261.53;
Double_t rTPCTRD = 294.5;
Double_t rTRD = 369.1;
Double_t x0TPC = 40.;
Double_t rhoTPC =0.06124;
Double_t x0Air = 36.66;
Double_t rhoAir =1.2931e-3;
Double_t x0TRD = 171.7;
Double_t rhoTRD =0.33;
Double_t r[3]; GetXYZ(r);
if(GetX() <= rTPC)
{param[0]=x0TPC;param[1]=rhoTPC;}
else if(GetX() > rTPC && GetX() < rTPCTRD)
{param[0]=x0Air;param[1]=rhoAir;}
else if(GetX() >= rTPCTRD && GetX() < rTRD)
{param[0]=x0TRD;param[1]=rhoTRD;}
else if(GetX() >= rTRD )
{param[0]=x0Air;param[1]=rhoAir;}
}