/* $Id$ */
#include <Riostream.h>
-#include <TObject.h>
+#include <TMath.h>
+#include <TVector2.h>
+#include "AliESDtrack.h"
#include "AliTRDgeometry.h"
#include "AliTRDcluster.h"
#include "AliTRDtrack.h"
-#include "AliTRDclusterCorrection.h"
-#include "AliTrackReference.h"
+#include "AliTRDtracklet.h"
-ClassImp(AliTRDtracklet)
ClassImp(AliTRDtrack)
+///////////////////////////////////////////////////////////////////////////////
+// //
+// Represents a reconstructed TRD track //
+// Local TRD Kalman track //
+// //
+///////////////////////////////////////////////////////////////////////////////
+
+AliTRDtrack::AliTRDtrack():
+ AliKalmanTrack(),
+ fSeedLab(-1),
+ fdEdx(0),
+ fdEdxT(0),
+ fDE(0),
+ fAlpha(0),
+ fX(0),
+ fStopped(kFALSE),
+ fY(0),
+ fZ(0),
+ fE(0),
+ fT(0),
+ fC(0),
+ fCyy(1e10),
+ fCzy(0),
+ fCzz(1e10),
+ fCey(0),
+ fCez(0),
+ fCee(1e10),
+ fCty(0),
+ fCtz(0),
+ fCte(0),
+ fCtt(1e10),
+ fCcy(0),
+ fCcz(0),
+ fCce(0),
+ fCct(0),
+ fCcc(1e10),
+ fLhElectron(0),
+ fNWrong(0),
+ fNRotate(0),
+ fNCross(0),
+ fNExpected(0),
+ fNLast(0),
+ fNExpectedLast(0),
+ fNdedx(0),
+ fChi2Last(1e10),
+ fBackupTrack(0x0)
- AliTRDtracklet::AliTRDtracklet():fY(0),fZ(0),fX(0),fAlpha(0),fSigma2(0),fP0(0),fP1(0),fNFound(0),fNCross(0),fPlane(0),fExpectedSigma2(0),fChi2(0),fTilt(0),fMaxPos(0),fMaxPos4(0),fMaxPos5(0){
+{
+ for (Int_t i=0; i<kNplane; i++) {
+ for (Int_t j=0; j<kNslice; j++) {
+ fdEdxPlane[i][j] = 0;
+ }
+ fTimBinPlane[i] = -1;
+ }
+ for (UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) {
+ fIndex[i] = 0;
+ fIndexBackup[i] = 0;
+ fdQdl[i] = 0;
+ }
+ for (Int_t i=0; i<3; i++) fBudget[i] = 0;
}
//_____________________________________________________________________________
-
AliTRDtrack::AliTRDtrack(const AliTRDcluster *c, UInt_t index,
const Double_t xx[5], const Double_t cc[15],
Double_t xref, Double_t alpha) : AliKalmanTrack() {
fdEdx=0.;
fdEdxT=0.;
fDE=0.;
- for (Int_t i=0;i<kNPlane;i++){
- fdEdxPlane[i] = 0.;
- fTimBinPlane[i] = -1;
+ for (Int_t i=0;i<kNplane;i++){
+ for (Int_t j=0; j<kNslice; j++) {
+ fdEdxPlane[i][j] = 0;
+ }
+ fTimBinPlane[i] = -1;
}
fLhElectron = 0.0;
fdQdl[0] = q;
// initialisation [SR, GSI 18.02.2003] (i startd for 1)
- for(UInt_t i=1; i<kMAX_CLUSTERS_PER_TRACK; i++) {
+ for(UInt_t i=1; i<kMAXCLUSTERSPERTRACK; i++) {
fdQdl[i] = 0;
fIndex[i] = 0;
- fIndexBackup[i] = 0; //bacup indexes MI
+ fIndexBackup[i] = 0; //backup indexes MI
}
for (Int_t i=0;i<3;i++) { fBudget[i]=0;};
- fBackupTrack =0;
+
+ fBackupTrack = 0;
+
}
//_____________________________________________________________________________
-AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : AliKalmanTrack(t) {
+AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : AliKalmanTrack(t)
+{
//
// Copy constructor.
//
fdEdx=t.fdEdx;
fdEdxT=t.fdEdxT;
fDE=t.fDE;
- for (Int_t i=0;i<kNPlane;i++){
- fdEdxPlane[i] = t.fdEdxPlane[i];
- fTimBinPlane[i] = t.fTimBinPlane[i];
- fTracklets[i] = t.fTracklets[i];
+ for (Int_t i=0;i<kNplane;i++){
+ for (Int_t j=0; j<kNslice; j++) {
+ fdEdxPlane[i][j] = t.fdEdxPlane[i][j];
+ }
+ fTimBinPlane[i] = t.fTimBinPlane[i];
+ fTracklets[i] = t.fTracklets[i];
}
fLhElectron = 0.0;
}
// initialisation (i starts from n) [SR, GSI, 18.02.2003]
- for(UInt_t i=n; i<kMAX_CLUSTERS_PER_TRACK; i++) {
+ for(UInt_t i=n; i<kMAXCLUSTERSPERTRACK; i++) {
fdQdl[i] = 0;
fIndex[i] = 0;
fIndexBackup[i] = 0; //MI backup indexes
//_____________________________________________________________________________
AliTRDtrack::AliTRDtrack(const AliKalmanTrack& t, Double_t alpha)
- :AliKalmanTrack(t) {
+ :AliKalmanTrack(t)
+{
//
// Constructor from AliTPCtrack or AliITStrack .
//
SetNumberOfClusters(0);
fdEdx=t.GetPIDsignal();
- for (Int_t i=0;i<kNPlane;i++){
- fdEdxPlane[i] = 0.0;
+ 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;
}
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<kMAX_CLUSTERS_PER_TRACK; i++) {
+ 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() {
+ :AliKalmanTrack()
+{
//
// Constructor from AliESDtrack
//
- fDE =0;
+
SetLabel(t.GetLabel());
SetChi2(0.);
SetMass(t.GetMass());
SetNumberOfClusters(t.GetTRDclusters(fIndex));
Int_t ncl = t.GetTRDclusters(fIndexBackup);
- for (UInt_t i=ncl;i<kMAX_CLUSTERS_PER_TRACK;i++) {
+ for (UInt_t i=ncl;i<kMAXCLUSTERSPERTRACK;i++) {
fIndexBackup[i]=0;
fIndex[i] = 0; //MI store indexes
}
- fdEdx=t.GetTRDsignal();
- for (Int_t i=0;i<kNPlane;i++){
- fdEdxPlane[i] = t.GetTRDsignals(i);
+ 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);
}
//Conversion of the covariance matrix
Double_t c[15]; t.GetExternalCovariance(c);
if (t.GetStatus()&AliESDtrack::kTRDbackup){
- t.GetTRDExternalParameters(x,fAlpha,p,c);
+ 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();
}
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<kMAX_CLUSTERS_PER_TRACK; i++) {
+ for(UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) {
fdQdl[i] = 0;
// fIndex[i] = 0; //MI store indexes
}
}
-
-AliTRDtrack * AliTRDtrack::MakeTrack(const AliTrackReference *ref, Double_t mass)
+//____________________________________________________________________________
+AliTRDtrack::~AliTRDtrack()
{
//
- // Make dummy track from the track reference
- // negative mass means opposite charge
- //
- Double_t xx[5];
- Double_t cc[15];
- for (Int_t i=0;i<15;i++) cc[i]=0;
- Double_t x = ref->X(), y = ref->Y(), z = ref->Z();
- Double_t alpha = TMath::ATan2(y,x);
- Double_t xr = TMath::Sqrt(x*x+y*y);
- xx[0] = 0;
- xx[1] = z;
- xx[3] = ref->Pz()/ref->Pt();
- Float_t b[3];
- Float_t xyz[3]={x,y,z};
- Float_t convConst = 0;
- (AliKalmanTrack::GetFieldMap())->Field(xyz,b);
- convConst=1000/0.299792458/(1e-13 - b[2]);
- xx[4] = 1./(convConst*ref->Pt());
- if (mass<0) xx[4]*=-1.; // negative mass - negative direction
- Double_t lcos = (x*ref->Px()+y*ref->Py())/(xr*ref->Pt());
- Double_t lsin = TMath::Sin(TMath::ACos(lcos));
- if (mass<0) lsin*=-1.;
- xx[2] = xr*xx[4]-lsin;
- AliTRDcluster cl;
- AliTRDtrack * track = new AliTRDtrack(&cl,100,xx,cc,xr,alpha);
- track->SetMass(TMath::Abs(mass));
- track->StartTimeIntegral();
- return track;
-}
+ // Destructor
+ //
+ if (fBackupTrack) delete fBackupTrack;
+ fBackupTrack = 0;
-AliTRDtrack::~AliTRDtrack()
+}
+
+//____________________________________________________________________________
+AliTRDtrack &AliTRDtrack::operator=(const AliTRDtrack &t)
{
//
+ // Assignment operator
//
- if (fBackupTrack) delete fBackupTrack;
- fBackupTrack=0;
+ 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()
+}
+
+//____________________________________________________________________________
+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]));
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::GetExternalParameters(Double_t& xr, Double_t x[5]) const {
- //
- // This function returns external TRD track representation
- //
- xr=fX;
- x[0]=GetY();
- x[1]=GetZ();
- x[2]=GetSnp();
- x[3]=GetTgl();
- x[4]=Get1Pt();
-}
-
//_____________________________________________________________________________
-void AliTRDtrack::GetExternalCovariance(Double_t cc[15]) const {
+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;
}
-
//_____________________________________________________________________________
-void AliTRDtrack::GetCovariance(Double_t cc[15]) const {
+void AliTRDtrack::GetCovariance(Double_t cc[15]) const
+{
+ //
+ // Returns the track covariance matrix
+ //
cc[0]=fCyy;
cc[1]=fCzy; cc[2]=fCzz;
}
//_____________________________________________________________________________
-Int_t AliTRDtrack::Compare(const TObject *o) const {
-
-// Compares tracks according to their Y2 or curvature
+Int_t AliTRDtrack::Compare(const TObject *o) const
+{
+ //
+ // Compares tracks according to their Y2 or curvature
+ //
AliTRDtrack *t=(AliTRDtrack*)o;
// Double_t co=t->GetSigmaY2();
Double_t co=TMath::Abs(t->GetC());
Double_t c =TMath::Abs(GetC());
- if (c>co) return 1;
+ if (c>co) return 1;
else if (c<co) return -1;
return 0;
+
}
//_____________________________________________________________________________
return;
}
- Float_t sorted[kMAX_CLUSTERS_PER_TRACK];
+ Float_t sorted[kMAXCLUSTERSPERTRACK];
for (i=0; i < nc; i++) {
sorted[i]=fdQdl[i];
}
for (i=0; i<nc; i++) dedx += sorted[i]; // ADDED by PS
if((nu-nl)) dedx /= (nu-nl); // ADDED by PS
- SetdEdx(dedx);
+ //SetdEdx(dedx);
//
// now real truncated mean
for (i=0; i < nc; i++) {
dedx /= (nu-nl+1);
fdEdxT = dedx;
delete [] index;
-}
+ SetdEdx(dedx);
+}
//_____________________________________________________________________________
Int_t AliTRDtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho)
if((5940*beta2/(1-beta2+1e-10) - beta2) < 0) return 0;
Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2+1e-10)) - beta2)*d*rho;
+ Float_t budget = d* rho;
+ fBudget[0] +=budget;
//
// suspicious part - think about it ?
Double_t kinE = TMath::Sqrt(p2);
}
return 1;
-}
+}
//_____________________________________________________________________________
-Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index, Double_t h01)
+Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index
+ , Double_t h01)
{
// Assignes found cluster to the track and updates track information
fC = cur;
}
else {
- Double_t xu_factor = 100.; // empirical factor set by C.Xu
+ Double_t xuFactor = 100.; // empirical factor set by C.Xu
// in the first tilt version
dy=c->GetY() - fY; dz=c->GetZ() - fZ;
dy=dy+h01*dz;
- r00=c->GetSigmaY2()+errang+add, r01=0., r11=c->GetSigmaZ2()*xu_factor;
+ r00=c->GetSigmaY2()+errang+add, r01=0., r11=c->GetSigmaZ2()*xuFactor;
r00+=(fCyy+2.0*h01*fCzy+h01*h01*fCzz);
r01+=(fCzy+h01*fCzz);
r11+=fCzz;
// cerr<<"in update: fIndex["<<fN<<"] = "<<index<<endl;
return 1;
+
}
+
//_____________________________________________________________________________
Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq, UInt_t index, Double_t h01,
Int_t /*plane*/)
else {
Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12);
- Double_t xu_factor = 1000.; // empirical factor set by C.Xu
+ Double_t xuFactor = 1000.; // empirical factor set by C.Xu
// in the first tilt version
dy=c->GetY() - fY; dz=c->GetZ() - fZ;
//dy=dy+h01*dz+correction;
add =1;
}
Double_t s00 = (c->GetSigmaY2()+errang)*extend+errsys+add; // error pad
- Double_t s11 = c->GetSigmaZ2()*xu_factor; // error pad-row
+ Double_t s11 = c->GetSigmaZ2()*xuFactor; // error pad-row
//
r00 = fCyy + 2*fCzy*h01 + fCzz*h01*h01+s00;
r01 = fCzy + fCzz*h01;
// cerr<<"in update: fIndex["<<fN<<"] = "<<index<<endl;
return 1;
-}
-
+}
//_____________________________________________________________________________
Int_t AliTRDtrack::UpdateMI(const AliTRDtracklet &tracklet)
SetChi2(GetChi2()+chisq);
// cerr<<"in update: fIndex["<<fN<<"] = "<<index<<endl;
*/
- return 1;
-}
+ return 1;
+}
//_____________________________________________________________________________
Int_t AliTRDtrack::Rotate(Double_t alpha, Bool_t absolute)
fCce += b42;
return 1;
-}
+}
//_____________________________________________________________________________
Double_t AliTRDtrack::GetPredictedChi2(const AliTRDcluster *c, Double_t h01) const
{
-
+ //
+ // Returns the track chi2
+ //
+
Bool_t fNoTilt = kTRUE;
if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE;
Double_t chi2, dy, r00, r01, r11;
chi2 = (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det;
}
+
return chi2;
-}
+}
//_________________________________________________________________________
void AliTRDtrack::GetPxPyPz(Double_t& px, Double_t& py, Double_t& pz) const
}
//_________________________________________________________________________
-void AliTRDtrack::ResetCovariance() {
+void AliTRDtrack::ResetCovariance()
+{
//
// Resets covariance matrix
//
fCey=0.; fCez=0.; fCee*=10.;
fCty=0.; fCtz=0.; fCte=0.; fCtt*=10.;
fCcy=0.; fCcz=0.; fCce=0.; fCct=0.; fCcc*=10.;
+
}
-void AliTRDtrack::ResetCovariance(Float_t mult) {
+//_____________________________________________________________________________
+void AliTRDtrack::ResetCovariance(Float_t mult)
+{
//
// Resets covariance matrix
//
fCey*=0.; fCez*=0.; fCee*=mult;
fCty*=0.; fCtz*=0.; fCte*=0.; fCtt*=1.;
fCcy*=0.; fCcz*=0.; fCce*=0.; fCct*=0.; fCcc*=mult;
-}
-
-
-
+}
+//_____________________________________________________________________________
void AliTRDtrack::MakeBackupTrack()
{
//
+ // Creates a backup track
//
+
if (fBackupTrack) delete fBackupTrack;
fBackupTrack = new AliTRDtrack(*this);
}
-Int_t AliTRDtrack::GetProlongation(Double_t xk, Double_t &y, Double_t &z){
+//_____________________________________________________________________________
+Int_t AliTRDtrack::GetProlongation(Double_t xk, Double_t &y, Double_t &z)
+{
//
// Find prolongation at given x
// return 0 if not exist
}
-
+//_____________________________________________________________________________
Int_t AliTRDtrack::PropagateToX(Double_t xr, Double_t step)
{
//
// material budget from geo manager
//
Double_t xyz0[3], xyz1[3],y,z;
- const Double_t alphac = TMath::Pi()/9.;
- const Double_t talphac = TMath::Tan(alphac*0.5);
+ const Double_t kAlphac = TMath::Pi()/9.;
+ const Double_t kTalphac = TMath::Tan(kAlphac*0.5);
// critical alpha - cross sector indication
//
Double_t dir = (fX>xr) ? -1.:1.;
AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);
//
if (param[0]>0&¶m[1]>0) PropagateTo(x,param[1],param[0]);
- if (fY>fX*talphac){
- Rotate(-alphac);
+ if (fY>fX*kTalphac){
+ Rotate(-kAlphac);
}
- if (fY<-fX*talphac){
- Rotate(alphac);
+ if (fY<-fX*kTalphac){
+ Rotate(kAlphac);
}
}
//
PropagateTo(xr);
+
return 0;
-}
+}
+//_____________________________________________________________________________
Int_t AliTRDtrack::PropagateToR(Double_t r,Double_t step)
{
//
//
if (param[1]<=0) param[1] =100000000;
PropagateTo(r,param[1],param[0]);
+
return 0;
+
}
+//_____________________________________________________________________________
+Int_t AliTRDtrack::GetSector() const
+{
+ //
+ // Return the current sector
+ //
+
+ return Int_t(TVector2::Phi_0_2pi(fAlpha)
+ / AliTRDgeometry::GetAlpha())
+ % AliTRDgeometry::kNsect;
+}
+
+//_____________________________________________________________________________
+Double_t AliTRDtrack::Get1Pt() const
+{
+ //--------------------------------------------------------------
+ // Returns the inverse Pt (1/GeV/c)
+ // (or 1/"most probable pt", if the field is too weak)
+ //--------------------------------------------------------------
+ if (TMath::Abs(GetLocalConvConst()) > kVeryBigConvConst)
+ return 1./kMostProbableMomentum/TMath::Sqrt(1.+ GetTgl()*GetTgl());
+ return (TMath::Sign(1e-9,fC) + fC)*GetLocalConvConst();
+}
+
+//_____________________________________________________________________________
+Double_t AliTRDtrack::GetP() const
+{
+ //
+ // Returns the total momentum
+ //
+
+ return TMath::Abs(GetPt())*sqrt(1.+GetTgl()*GetTgl());
+
+}
+
+//_____________________________________________________________________________
+Double_t AliTRDtrack::GetYat(Double_t xk) const
+{
+ //
+ // This function calculates the Y-coordinate of a track at
+ // the plane x = xk.
+ // Needed for matching with the TOF (I.Belikov)
+ //
+
+ Double_t c1 = fC*fX - fE;
+ Double_t r1 = TMath::Sqrt(1.0 - c1*c1);
+ Double_t c2 = fC*xk - fE;
+ Double_t r2 = TMath::Sqrt(1.0- c2*c2);
+ return fY + (xk-fX)*(c1+c2)/(r1+r2);
+
+}
+
+//_____________________________________________________________________________
+void AliTRDtrack::SetSampledEdx(Float_t q, Int_t i)
+{
+ //
+ // The sampled energy loss
+ //
+
+ Double_t s = GetSnp();
+ Double_t t = GetTgl();
+ q *= TMath::Sqrt((1-s*s)/(1+t*t));
+ fdQdl[i] = q;
+
+}
+
+ //_____________________________________________________________________________
+void AliTRDtrack::SetSampledEdx(Float_t q)
+{
+ //
+ // The sampled energy loss
+ //
+
+ Double_t s = GetSnp();
+ Double_t t = GetTgl();
+ q*= TMath::Sqrt((1-s*s)/(1+t*t));
+ fdQdl[fNdedx] = q;
+ fNdedx++;
+
+}
+
+//_____________________________________________________________________________
+void AliTRDtrack::GetXYZ(Float_t r[3]) const
+{
+
+ //---------------------------------------------------------------------
+ // Returns the position of the track in the global coord. system
+ //---------------------------------------------------------------------
+
+ Double_t cs = TMath::Cos(fAlpha);
+ Double_t sn = TMath::Sin(fAlpha);
+ r[0] = fX*cs - fY*sn;
+ r[1] = fX*sn + fY*cs;
+ r[2] = fZ;
+
+}