]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDtrack.cxx
Initialization of fAmpThreshold is added to ctors.
[u/mrichter/AliRoot.git] / STEER / AliESDtrack.cxx
index f7927a4f59d24725c6543607d834c28d998b9614..44669f7b2c291cb0548965c035f244f5ac39db64 100644 (file)
 //   This is the class to deal with during the phisics analysis of data
 //      Origin: Iouri Belikov, CERN
 //      e-mail: Jouri.Belikov@cern.ch
+//
+//
+//
+//  What do you need to know before starting analysis
+//  (by Marian Ivanov: marian.ivanov@cern.ch)
+//
+//
+//   AliESDtrack:
+//   1.  What is the AliESDtrack
+//   2.  What informations do we store
+//   3.  How to use the information for analysis
+//   
+//
+//   1.AliESDtrack is the container of the information about the track/particle
+//     reconstructed during Barrel Tracking.
+//     The track information is propagated from one tracking detector to 
+//     other using the functionality of AliESDtrack - Current parameters.  
+//
+//     No global fit model is used.
+//     Barrel tracking use Kalman filtering technique, it gives optimal local 
+//     track parameters at given point under certian assumptions.
+//             
+//     Kalman filter take into account additional effect which are 
+//     difficult to handle using global fit.
+//     Effects:
+//        a.) Multiple scattering
+//        b.) Energy loss
+//        c.) Non homogenous magnetic field
+//
+//     In general case, following barrel detectors are contributing to 
+//     the Kalman track information:
+//         a. TPC
+//         b. ITS
+//         c. TRD
+//
+//      In general 3 reconstruction itteration are performed:
+//         1. Find tracks   - sequence TPC->ITS
+//         2. PropagateBack - sequence ITS->TPC->TRD -> Outer PID detectors
+//         3. Refit invward - sequence TRD->TPC->ITS
+//      The current tracks are updated after each detector (see bellow).
+//      In specical cases a track  sanpshots are stored.   
+// 
+//
+//      For some type of analysis (+visualization) track local parameters at 
+//      different position are neccesary. A snapshots during the track 
+//      propagation are created.
+//      (See AliExternalTrackParam class for desctiption of variables and 
+//      functionality)
+//      Snapshots:
+//      a. Current parameters - class itself (AliExternalTrackParam)
+//         Contributors: general case TRD->TPC->ITS
+//         Preferable usage:  Decission  - primary or secondary track
+//         NOTICE - By default the track parameters are stored at the DCA point
+//                  to the primary vertex. optimal for primary tracks, 
+//                  far from optimal for secondary tracks.
+//      b. Constrained parameters - Kalman information updated with 
+//         the Primary vertex information 
+//         Contributors: general case TRD->TPC->ITS
+//         Preferable usage: Use only for tracks selected as primary
+//         NOTICE - not real constrain - taken as additional measurement 
+//         with corresponding error
+//         Function:  
+//       const AliExternalTrackParam *GetConstrainedParam() const {return fCp;}
+//      c. Inner parameters -  Track parameters at inner wall of the TPC 
+//         Contributors: general case TRD->TPC
+//         function:
+//           const AliExternalTrackParam *GetInnerParam() const { return fIp;}
+//
+//      d. TPCinnerparam  - contributors - TPC only
+//         Contributors:  TPC
+//         Preferable usage: Requested for HBT study 
+//                         (smaller correlations as using also ITS information)
+//         NOTICE - the track parameters are propagated to the DCA to  
+//         to primary vertex
+//         Optimal for primary, far from optimal for secondary tracks
+//         Function:
+//    const AliExternalTrackParam *GetTPCInnerParam() const {return fTPCInner;}
+//     
+//      e. Outer parameters - 
+//           Contributors-  general case - ITS-> TPC -> TRD
+//           The last point - Outer parameters radius is determined
+//           e.a) Local inclination angle bigger than threshold - 
+//                Low momenta tracks 
+//           e.a) Catastrofic energy losss in material
+//           e.b) Not further improvement (no space points)
+//           Usage:             
+//              a.) Tracking: Starting parameter for Refit inward 
+//              b.) Visualization
+//              c.) QA
+//         NOTICE: Should be not used for the physic analysis
+//         Function:
+//            const AliExternalTrackParam *GetOuterParam() const { return fOp;}
+//
 //-----------------------------------------------------------------
 
 #include <TMath.h>
 #include "AliESDVertex.h"
 #include "AliESDtrack.h"
 #include "AliKalmanTrack.h"
+#include "AliVTrack.h"
 #include "AliLog.h"
 #include "AliTrackPointArray.h"
 #include "TPolyMarker3D.h"
@@ -78,7 +172,7 @@ AliESDtrack::AliESDtrack() :
   fTOFCalChannel(0),
   fTOFindex(-1),
   fHMPIDqn(0),
-  fHMPIDcluIdx(0),
+  fHMPIDcluIdx(-1),
   fEMCALindex(kEMCALNoMatch),
   fHMPIDtrkTheta(0),
   fHMPIDtrkPhi(0),
@@ -86,6 +180,7 @@ AliESDtrack::AliESDtrack() :
   fTrackLength(0),
   fdTPC(0),fzTPC(0),
   fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
+  fCchi2TPC(0),
   fD(0),fZ(0),
   fCdd(0),fCdz(0),fCzz(0),
   fCchi2(0),
@@ -94,6 +189,7 @@ AliESDtrack::AliESDtrack() :
   fTRDchi2(0),
   fTOFchi2(0),
   fHMPIDchi2(0),
+  fGlobalChi2(0),
   fITSsignal(0),
   fTPCsignal(0),
   fTPCsignalS(0),
@@ -172,6 +268,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fTrackLength(track.fTrackLength),
   fdTPC(track.fdTPC),fzTPC(track.fzTPC),
   fCddTPC(track.fCddTPC),fCdzTPC(track.fCdzTPC),fCzzTPC(track.fCzzTPC),
+  fCchi2TPC(track.fCchi2TPC),
   fD(track.fD),fZ(track.fZ),
   fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
   fCchi2(track.fCchi2),
@@ -180,6 +277,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fTRDchi2(track.fTRDchi2),
   fTOFchi2(track.fTOFchi2),
   fHMPIDchi2(track.fHMPIDchi2),
+  fGlobalChi2(track.fGlobalChi2),
   fITSsignal(track.fITSsignal),
   fTPCsignal(track.fTPCsignal),
   fTPCsignalS(track.fTPCsignalS),
@@ -242,6 +340,124 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
 }
 
+//_______________________________________________________________________
+AliESDtrack::AliESDtrack(const AliVTrack *track) : 
+  AliExternalTrackParam(track),
+  fCp(0),
+  fIp(0),
+  fTPCInner(0),
+  fOp(0),
+  fFriendTrack(0),
+  fTPCClusterMap(159),//number of padrows
+  fTPCSharedMap(159),//number of padrows
+  fFlags(0),
+  fID(),
+  fLabel(0),
+  fITSLabel(0),
+  fTPCLabel(0),
+  fTRDLabel(0),
+  fTOFCalChannel(0),
+  fTOFindex(-1),
+  fHMPIDqn(0),
+  fHMPIDcluIdx(-1),
+  fEMCALindex(kEMCALNoMatch),
+  fHMPIDtrkTheta(0),
+  fHMPIDtrkPhi(0),
+  fHMPIDsignal(0),
+  fTrackLength(0),
+  fdTPC(0),fzTPC(0),
+  fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
+  fCchi2TPC(0),
+  fD(0),fZ(0),
+  fCdd(0),fCdz(0),fCzz(0),
+  fCchi2(0),
+  fITSchi2(0),
+  fTPCchi2(0),
+  fTRDchi2(0),
+  fTOFchi2(0),
+  fHMPIDchi2(0),
+  fGlobalChi2(0),
+  fITSsignal(0),
+  fTPCsignal(0),
+  fTPCsignalS(0),
+  fTRDsignal(0),
+  fTRDQuality(0),
+  fTRDBudget(0),
+  fTOFsignal(0),
+  fTOFsignalToT(0),
+  fTOFsignalRaw(0),
+  fTOFsignalDz(0),
+  fHMPIDtrkX(0),
+  fHMPIDtrkY(0),
+  fHMPIDmipX(0),
+  fHMPIDmipY(0),
+  fTPCncls(0),
+  fTPCnclsF(0),
+  fTPCsignalN(0),
+  fITSncls(0),
+  fITSClusterMap(0),
+  fTRDncls(0),
+  fTRDncls0(0),
+  fTRDpidQuality(0),
+  fTRDnSlices(0),
+  fTRDslices(0x0)
+{
+  //
+  // ESD track from AliVTrack.
+  // This is not a copy constructor !
+  //
+
+  if (track->InheritsFrom("AliExternalTrackParam")) {
+     AliError("This is not a copy constructor. Use AliESDtrack(const AliESDtrack &) !");
+     AliWarning("Calling the default constructor...");
+     AliESDtrack();
+     return;
+  }
+
+  // Reset all the arrays
+  Int_t i;
+  for (i=0; i<AliPID::kSPECIES; i++) {
+    fTrackTime[i]=0.;
+    fR[i]=0.;
+    fITSr[i]=0.;
+    fTPCr[i]=0.;
+    fTRDr[i]=0.;
+    fTOFr[i]=0.;
+    fHMPIDr[i]=0.;
+  }
+  
+  for (i=0; i<3; i++)   { fKinkIndexes[i]=0;}
+  for (i=0; i<3; i++)   { fV0Indexes[i]=-1;}
+  for (i=0;i<kTRDnPlanes;i++) {
+    fTRDTimBin[i]=0;
+  }
+  for (i=0;i<4;i++) {fTPCPoints[i]=0;}
+  for (i=0;i<3;i++) {fTOFLabel[i]=0;}
+  for (i=0;i<10;i++) {fTOFInfo[i]=0;}
+  for (i=0;i<12;i++) {fITSModule[i]=-1;}
+
+  // Set the ID
+  SetID(track->GetID());
+
+  // Set ITS cluster map
+  fITSClusterMap=track->GetITSClusterMap();
+
+  fITSncls=0;
+  for(i=0; i<6; i++) {
+    if(HasPointOnITSLayer(i)) fITSncls++;
+  }
+
+  // Set the combined PID
+  const Double_t *pid = track->PID();
+  if(pid){
+    for (i=0; i<AliPID::kSPECIES; i++) fR[i]=pid[i];
+  }
+  // AliESD track label
+  SetLabel(track->GetLabel());
+  // Set the status
+  SetStatus(track->GetStatus());
+}
+
 //_______________________________________________________________________
 AliESDtrack::AliESDtrack(TParticle * part) : 
   AliExternalTrackParam(),
@@ -261,7 +477,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fTOFCalChannel(0),
   fTOFindex(-1),
   fHMPIDqn(0),
-  fHMPIDcluIdx(0),
+  fHMPIDcluIdx(-1),
   fEMCALindex(kEMCALNoMatch),
   fHMPIDtrkTheta(0),
   fHMPIDtrkPhi(0),
@@ -269,6 +485,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fTrackLength(0),
   fdTPC(0),fzTPC(0),
   fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
+  fCchi2TPC(0),
   fD(0),fZ(0),
   fCdd(0),fCdz(0),fCzz(0),
   fCchi2(0),
@@ -277,6 +494,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fTRDchi2(0),
   fTOFchi2(0),
   fHMPIDchi2(0),
+  fGlobalChi2(0),
   fITSsignal(0),
   fTPCsignal(0),
   fTPCsignalS(0),
@@ -543,19 +761,22 @@ AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
   fCddTPC = source.fCddTPC;
   fCdzTPC = source.fCdzTPC;
   fCzzTPC = source.fCzzTPC;
+  fCchi2TPC = source.fCchi2TPC;
+
   fD  = source.fD; 
   fZ  = source.fZ; 
   fCdd = source.fCdd;
   fCdz = source.fCdz;
   fCzz = source.fCzz;
-
   fCchi2     = source.fCchi2;
+
   fITSchi2   = source.fITSchi2;             
   fTPCchi2   = source.fTPCchi2;            
   fTRDchi2   = source.fTRDchi2;      
   fTOFchi2   = source.fTOFchi2;      
   fHMPIDchi2 = source.fHMPIDchi2;      
 
+  fGlobalChi2 = source.fGlobalChi2;      
 
   fITSsignal  = source.fITSsignal;     
   fTPCsignal  = source.fTPCsignal;     
@@ -640,12 +861,23 @@ TObject *  AliESDtrack::GetCalibObject(Int_t index){
 }
 
 
-const Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
+Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
   
   // Fills the information of the TPC-only first reconstruction pass
   // into the passed ESDtrack object. For consistency fTPCInner is also filled
   // again
 
+
+
+  // For data produced before r26675
+  // RelateToVertexTPC was not properly called during reco
+  // so you'll have to call it again, before FillTPCOnlyTrack
+  //  Float_t p[2],cov[3];
+  // track->GetImpactParametersTPC(p,cov); 
+  // if(p[0]==0&&p[1]==0) // <- Default values
+  //  track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
+  
+
   if(!fTPCInner)return kFALSE;
 
   // fill the TPC track params to the global track parameters
@@ -664,6 +896,7 @@ const Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
   track.fCddTPC = fCddTPC;
   track.fCdzTPC = fCdzTPC;
   track.fCzzTPC = fCzzTPC;
+  track.fCchi2TPC = fCchi2TPC;
 
 
   // copy all other TPC specific parameters
@@ -695,6 +928,7 @@ const Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
   track.fFlags = kTPCin;
   track.fID    = fID;
 
+  track.fFlags |= fFlags & kTPCpid; //copy the TPCpid status flag
  
   for (Int_t i=0;i<3;i++) track.fKinkIndexes[i] = fKinkIndexes[i];
   
@@ -718,7 +952,6 @@ void AliESDtrack::MakeMiniESDtrack(){
 
   // Reset track parameters constrained to the primary vertex
   delete fCp;fCp = 0;
-  fCchi2 = 0;
 
   // Reset track parameters at the inner wall of TPC
   delete fIp;fIp = 0;
@@ -783,7 +1016,7 @@ void AliESDtrack::MakeMiniESDtrack(){
   // Reset HMPID related track information
   fHMPIDchi2 = 0;     
   fHMPIDqn = 0;     
-  fHMPIDcluIdx = 0;     
+  fHMPIDcluIdx = -1;     
   fHMPIDsignal = 0;     
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i] = 0;
   fHMPIDtrkTheta = 0;     
@@ -794,6 +1027,9 @@ void AliESDtrack::MakeMiniESDtrack(){
   fHMPIDmipY = 0;
   fEMCALindex = kEMCALNoMatch;
 
+  // reset global track chi2
+  fGlobalChi2 = 0;
+
   delete fFriendTrack; fFriendTrack = 0;
 } 
 //_______________________________________________________________________
@@ -959,7 +1195,9 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
     fTPCsignal=t->GetPIDsignal();
     break;
 
-  case kTRDout: case kTRDin: case kTRDrefit:
+  case kTRDin: case kTRDrefit:
+    break;
+  case kTRDout:
     index     = fFriendTrack->GetTRDindices();
     fTRDLabel = t->GetLabel(); 
     fTRDchi2  = t->GetChi2();
@@ -1054,6 +1292,16 @@ AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
   return kTRUE;
 }
 
+void 
+AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
+  //
+  // This is a direct setter for the outer track parameters
+  //
+  SetStatus(flags);
+  if (fOp) delete fOp;
+  fOp=new AliExternalTrackParam(*p);
+}
+
 Bool_t 
 AliESDtrack::GetOuterExternalParameters
                  (Double_t &alpha, Double_t &x, Double_t p[5]) const {
@@ -1098,6 +1346,15 @@ Int_t AliESDtrack::GetNcls(Int_t idet) const
     if (fTOFindex != -1)
       ncls = 1;
     break;
+  case 4: //PHOS
+    break;
+  case 5: //HMPID
+    if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
+      if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
+       ncls = 1;
+      }
+    }    
+    break;
   default:
     break;
   }
@@ -1128,9 +1385,11 @@ Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
   case 4: //PHOS
     break;
   case 5:
-    if (fHMPIDcluIdx != 0) {
-      idx[0] = GetHMPIDcluIdx();
-      ncls = 1;
+    if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
+      if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
+       idx[0] = GetHMPIDcluIdx();
+       ncls = 1;
+      }
     }    
     break;
   case 6: //EMCAL
@@ -1173,7 +1432,10 @@ Char_t AliESDtrack::GetITSclusters(Int_t *idx) const {
   //---------------------------------------------------------------------
   if (idx!=0) {
      Int_t *index=fFriendTrack->GetITSindices();
-     for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) idx[i]=index[i];
+     for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) {
+         if ( (i>=fITSncls) && (i<6) ) idx[i]=-1;
+         else idx[i]=index[i];
+     }
   }
   return fITSncls;
 }
@@ -1197,7 +1459,6 @@ Bool_t AliESDtrack::GetITSModuleIndexInfo(Int_t ilayer,Int_t &idet,Int_t &status
   //----------------------------------------------------------------------
 
   if(fITSModule[ilayer]==-1) {
-    AliError("fModule was not set !");
     idet = -1;
     status=0;
     xloc=-99.; zloc=-99.;
@@ -1453,16 +1714,21 @@ void AliESDtrack::GetESDpid(Double_t *p) const {
 }
 
 //_______________________________________________________________________
-Bool_t AliESDtrack::RelateToVertexTPC
-(const AliESDVertex *vtx, Double_t b, Double_t maxd) {
+Bool_t AliESDtrack::RelateToVertexTPC(const AliESDVertex *vtx, 
+Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
   //
-  // Try to relate the TPC-only track paramters to the vertex "vtx", 
+  // Try to relate the TPC-only track parameters to the vertex "vtx", 
   // if the (rough) transverse impact parameter is not bigger then "maxd". 
   //            Magnetic field is "b" (kG).
   //
   // a) The TPC-only paramters are extapolated to the DCA to the vertex.
   // b) The impact parameters and their covariance matrix are calculated.
+  // c) An attempt to constrain the TPC-only params to the vertex is done.
+  //    The constrained params are returned via "cParam".
   //
+  // In the case of success, the returned value is kTRUE
+  // otherwise, it's kFALSE)
+  // 
 
   if (!fTPCInner) return kFALSE;
   if (!vtx) return kFALSE;
@@ -1476,12 +1742,26 @@ Bool_t AliESDtrack::RelateToVertexTPC
   fCdzTPC = cov[1];
   fCzzTPC = cov[2];
   
+  Double_t covar[6]; vtx->GetCovMatrix(covar);
+  Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
+  Double_t c[3]={covar[2],0.,covar[5]};
+
+  Double_t chi2=GetPredictedChi2(p,c);
+  if (chi2>kVeryBig) return kFALSE;
+
+  fCchi2TPC=chi2;
+
+  if (!cParam) return kTRUE;
+
+  *cParam = *fTPCInner;
+  if (!cParam->Update(p,c)) return kFALSE;
+
   return kTRUE;
 }
 
 //_______________________________________________________________________
-Bool_t AliESDtrack::RelateToVertex
-(const AliESDVertex *vtx, Double_t b, Double_t maxd) {
+Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx, 
+Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
   //
   // Try to relate this track to the vertex "vtx", 
   // if the (rough) transverse impact parameter is not bigger then "maxd". 
@@ -1490,9 +1770,10 @@ Bool_t AliESDtrack::RelateToVertex
   // a) The track gets extapolated to the DCA to the vertex.
   // b) The impact parameters and their covariance matrix are calculated.
   // c) An attempt to constrain this track to the vertex is done.
+  //    The constrained params are returned via "cParam".
   //
-  //    In the case of success, the returned value is kTRUE
-  //    (otherwise, it's kFALSE)
+  // In the case of success, the returned value is kTRUE
+  // (otherwise, it's kFALSE)
   //  
 
   if (!vtx) return kFALSE;
@@ -1511,14 +1792,24 @@ Bool_t AliESDtrack::RelateToVertex
   Double_t c[3]={covar[2],0.,covar[5]};
 
   Double_t chi2=GetPredictedChi2(p,c);
-  if (chi2>77.) return kFALSE;
+  if (chi2>kVeryBig) return kFALSE;
 
+  fCchi2=chi2;
+
+
+  //--- Could now these lines be removed ? ---
   delete fCp;
   fCp=new AliExternalTrackParam(*this);  
 
   if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
-  
-  fCchi2=chi2;
+  //----------------------------------------
+
+
+  if (!cParam) return kTRUE;
+
+  *cParam = *this;
+  if (!cParam->Update(p,c)) return kFALSE; 
+
   return kTRUE;
 }