ROOT logo
#ifndef ALITRDTRACKV1_H
#define ALITRDTRACKV1_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  Represents a reconstructed TRD track                                     //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#ifndef ALIKALMANTRACK_H
#include "AliKalmanTrack.h"
#endif

#ifndef ALITRDSEEDV1_H
#include "AliTRDseedV1.h"
#endif

template <typename Value> class TVectorT;
typedef class TVectorT<Double_t> TVectorD;
class AliESDtrack;
class AliTRDcluster;
class AliTRDReconstructor;
class AliTRDtrackV1 : public AliKalmanTrack
{
  friend class AliHLTTRDTrack; // allow HLT special access
public:
  enum ETRDtrackSize { 
    kNdet      = AliTRDgeometry::kNdet
   ,kNstacks   = AliTRDgeometry::kNstack*AliTRDgeometry::kNsector
   ,kNplane    = AliTRDgeometry::kNlayer
   ,kNcham     = AliTRDgeometry::kNstack
   ,kNsect     = AliTRDgeometry::kNsector
   ,kMAXCLUSTERSPERTRACK = 210
  };
  
  // bits from 0-13 are reserved by ROOT (see TObject.h)
  enum ETRDtrackStatus {
    kOwner     = BIT(14)
   ,kStopped   = BIT(15) 
   ,kKink      = BIT(16) 
   ,kPrimary   = BIT(17)
   ,kSeeder    = BIT(18)   // if set other than TPC (ITS, TRD)
  };

  // propagation/update error codes (up to 4 bits)
  enum ETRDtrackError {
    kProlongation = 1
   ,kPropagation
   ,kAdjustSector
   ,kSnp
   ,kTrackletInit
   ,kUpdate
   ,kUnknown      = 0xff
  };

  // data/clusters/tracklet error codes (up to 4 bits/layer)
  enum ETRDlayerError {
    kGeometry = 1
   ,kBoundary
   ,kNoClusters
   ,kNoAttach
   ,kNoClustersTracklet
   ,kNoFit
   ,kChi2
  };

  AliTRDtrackV1();
  AliTRDtrackV1(AliTRDseedV1 * const trklts, const Double_t p[5], const Double_t cov[15], Double_t x, Double_t alpha);
  AliTRDtrackV1(const AliESDtrack &ref);
  AliTRDtrackV1(const AliTRDtrackV1 &ref);
  virtual ~AliTRDtrackV1();
  AliTRDtrackV1 &operator=(const AliTRDtrackV1 &ref);
  virtual void   Copy(TObject &ref) const;
  virtual TObject* Clone(const char* newname = "") const;
  Bool_t         CookPID();
  Double_t       CookTruncatedMean(const Bool_t kinvq, const Double_t mag, const Int_t charge, const Int_t kcalib, Int_t &nch, Int_t &ncls, TVectorD *Qs=NULL, TVectorD *Xs=NULL, Int_t timeBin0=-1, Int_t timeBin1=1000, Int_t tstep=1) const;
 
  Int_t          CookLabel(Float_t wrong, Int_t *labs=NULL, Float_t *freq=NULL);
  AliTRDtrackV1* GetBackupTrack() const {return fBackupTrack;}
  Double_t       GetBudget(Int_t i) const { return fBudget[i];}
  AliTRDcluster* GetCluster(Int_t id);
  Int_t          GetClusterIndex(Int_t id) const;
  Float_t        GetEdep() const {return fDE;}
  Int_t          GetESDid() const {return fESDid;}
  inline Float_t GetMomentum(Int_t plane=-1) const;
  inline Int_t   GetNCross();
  inline Int_t   GetNumberOfTracklets() const;
  Double_t       GetPIDsignal() const   { return 0.;}
  Double_t       GetPID(Int_t is) const { return (is >=0 && is < AliPID::kSPECIES) ? fPID[is] : -1.;}
  UChar_t        GetNumberOfTrackletsPID() const;
  Int_t          GetNumberOfPhysicsSlices() const { return fNdEdxSlices;  };
  Double_t       GetPredictedChi2(const AliTRDseedV1 *tracklet, Double_t *cov) const;
  Double_t       GetPredictedChi2(const AliCluster* /*c*/) const                   { return 0.0; }
  Int_t          GetProlongation(Double_t xk, Double_t &y, Double_t &z) const;
  inline UChar_t GetStatusTRD(Int_t ly=-1) const;
  Int_t          GetSector() const;
  AliTRDseedV1*  GetTracklet(Int_t plane) const {return plane >=0 && plane <kNplane ? fTracklet[plane] : NULL;}
  Int_t          GetTrackletIndex(Int_t plane) const          { return (plane>=0 && plane<kNplane) ? fTrackletIndex[plane] : -1;}
  AliExternalTrackParam*
                 GetTrackIn() const  { return fTrackLow;} 
  AliExternalTrackParam*
                 GetTrackOut() const  { return fTrackHigh;} 
  const Int_t* GetTrackletIndexes() const { return &fTrackletIndex[0];}
  Bool_t         IsEqual(const TObject *inTrack) const;
  Bool_t         IsKink() const           { return TestBit(kKink);}
  Bool_t         IsOwner() const          { return TestBit(kOwner);};
  Bool_t         IsPrimary() const        { return TestBit(kPrimary);};
  Bool_t         IsStopped() const        { return TestBit(kStopped);};
  Bool_t         IsElectron() const;
  Bool_t         IsTPCseeded() const      { return !TestBit(kSeeder);};
  inline static Bool_t IsTrackError(ETRDtrackError error, UInt_t status);
  inline static Bool_t IsLayerError(ETRDlayerError error, Int_t layer, UInt_t status);

  Int_t          MakeBackupTrack();
  void           Print(Option_t *o="") const;

  Bool_t         PropagateTo(Double_t xr, Double_t x0 = 8.72, Double_t rho = 5.86e-3);
  Int_t          PropagateToR(Double_t xr, Double_t step);
  Bool_t         Rotate(Double_t angle, Bool_t absolute = kFALSE);
  void           SetBudget(Int_t i, Double_t b) {if(i>=0 && i<3) fBudget[i] = b;}
  void           SetEdep(Double32_t inDE){fDE = inDE;};
  void           SetESDid(Int_t id) {fESDid = id;}
  void           SetKink(Bool_t k)        { SetBit(kKink, k);}
  void           SetPrimary(Bool_t k)     { SetBit(kPrimary, k);}
  void           SetNonTPCseeded(Bool_t k){ SetBit(kSeeder, k);}
  void           SetNumberOfClusters();
  void           SetOwner();
  void           SetPID(Short_t is, Double_t inPID){if (is >=0 && is < AliPID::kSPECIES) fPID[is]=inPID;};
  void           SetPIDquality(UChar_t /*inPIDquality*/) const {/*fPIDquality = inPIDquality*/;};
  inline void    SetErrStat(UChar_t stat, Int_t ly=-1);
  void           SetStopped(Bool_t stop) {SetBit(kStopped, stop);}
  void           SetTracklet(AliTRDseedV1 *const trklt,  Int_t index);
  void           SetTrackIn();
  void           SetTrackOut(const AliExternalTrackParam *op=NULL);
  inline void    SetReconstructor(const AliTRDReconstructor *rec);
  inline Float_t StatusForTOF();
  void           UnsetTracklet(Int_t plane);
  Bool_t         Update(const AliCluster *, Double_t, Int_t) { return kFALSE; };
  void           UpdateChi2(Float_t chi2);
  void           UpdateESDtrack(AliESDtrack *t);

private:
  UInt_t       fStatus;                //  Bit map for the status of propagation
  Int_t        fTrackletIndex[kNplane];//  Tracklets index in the tracker list
  Int_t        fESDid;                 //  ESD track id 
  Double32_t   fPID[AliPID::kSPECIES]; //  PID probabilities
  Double32_t   fBudget[3];             //  Integrated material budget
  Double32_t   fDE;                    //  Integrated delta energy
  Double32_t   fTruncatedMean;         //  Truncated mean
  Int_t        fNchamberdEdx;          //  number of chambers used in calculating truncated mean
  Int_t        fNclusterdEdx;          //  number of clusters used in calculating truncated mean
  Int_t        fNdEdxSlices;           //  number of "physics slices" fill via AliTRDPIDResponse

  const AliTRDReconstructor *fkReconstructor;//! reconstructor link 
  AliTRDtrackV1 *fBackupTrack;         //! Backup track
  AliTRDseedV1  *fTracklet[kNplane];   //  Tracklets array defining the track
  AliExternalTrackParam *fTrackLow;    // parameters of the track which enter TRD from below (TPC) 
  AliExternalTrackParam *fTrackHigh;   // parameters of the track which enter TRD from above (HMPID, PHOS) 

  ClassDef(AliTRDtrackV1, 8)           // TRD track - tracklet based
};

//____________________________________________________
inline Float_t AliTRDtrackV1::GetMomentum(Int_t plane) const
{
// Return ESD momentum stored in the tracklet reconstructed in layer = "plane". 
// By default returns the ESD momentum in first tracklet attached to track
  if(plane==-1){
    for(Int_t i(0); i<kNplane; i++){
      if(fTracklet[i]) return fTracklet[i]->GetMomentum();
    }
  } else if( plane >=0 && plane < kNplane){
    if(fTracklet[plane]) return fTracklet[plane]->GetMomentum();
  }
  return -1.;
}

//____________________________________________________
inline Int_t AliTRDtrackV1::GetNCross()
{
  Int_t ncross = 0;
  for(Int_t ip=0; ip<kNplane; ip++){
    if(!fTracklet[ip]) continue;
    ncross += fTracklet[ip]->IsRowCross();
  }
  return ncross;
}

//____________________________________________________
inline Int_t AliTRDtrackV1::GetNumberOfTracklets() const
{
  Int_t n = 0;
  for(Int_t ip=0; ip<kNplane; ip++){
    if(!fTracklet[ip]) continue;
    n++;
  }
  return n;
}

//____________________________________________________
inline UChar_t AliTRDtrackV1::GetStatusTRD(Int_t ly) const
{
  if(ly>=-1 && ly<kNplane) return (fStatus>>((ly+1)*4))&0xf;
  return kUnknown;
}

//____________________________________________________
inline Bool_t AliTRDtrackV1::IsTrackError(ETRDtrackError error, UInt_t status)
{
  return (status&0xf)==UChar_t(error);
}

//____________________________________________________
inline Bool_t AliTRDtrackV1::IsLayerError(ETRDlayerError error, Int_t ly, UInt_t status)
{
  if(ly>=kNplane || ly<0) return kFALSE;
  return ((status>>((ly+1)*4))&0xf) == UChar_t(error);
}

//____________________________________________________
inline void AliTRDtrackV1::SetReconstructor(const AliTRDReconstructor *rec)
{
  for(Int_t ip=0; ip<kNplane; ip++){
    if(!fTracklet[ip]) continue;
    fTracklet[ip]->SetReconstructor(rec);
  }
  fkReconstructor = rec;
}

//____________________________________________________
inline void AliTRDtrackV1::SetErrStat(UChar_t status, Int_t ly)
{
  if(ly<kNplane) fStatus|=((status&0xf)<<((ly+1)*4));
  return;
}


//____________________________________________________________________________
inline Float_t AliTRDtrackV1::StatusForTOF()
{
  // OBSOLETE
  // Defines the status of the TOF extrapolation
  //

  if(!fTracklet[5]) return 0.;

  // Definition of res ????
  Float_t res = /*(0.2 + 0.8 * (fN / (fNExpected + 5.0))) **/ (0.4 + 0.6 * fTracklet[5]->GetN() / 20.0);
  res *= (0.25 + 0.8 * 40.0 / (40.0 + fBudget[2]));
  return res;
}

#endif



 AliTRDtrackV1.h:1
 AliTRDtrackV1.h:2
 AliTRDtrackV1.h:3
 AliTRDtrackV1.h:4
 AliTRDtrackV1.h:5
 AliTRDtrackV1.h:6
 AliTRDtrackV1.h:7
 AliTRDtrackV1.h:8
 AliTRDtrackV1.h:9
 AliTRDtrackV1.h:10
 AliTRDtrackV1.h:11
 AliTRDtrackV1.h:12
 AliTRDtrackV1.h:13
 AliTRDtrackV1.h:14
 AliTRDtrackV1.h:15
 AliTRDtrackV1.h:16
 AliTRDtrackV1.h:17
 AliTRDtrackV1.h:18
 AliTRDtrackV1.h:19
 AliTRDtrackV1.h:20
 AliTRDtrackV1.h:21
 AliTRDtrackV1.h:22
 AliTRDtrackV1.h:23
 AliTRDtrackV1.h:24
 AliTRDtrackV1.h:25
 AliTRDtrackV1.h:26
 AliTRDtrackV1.h:27
 AliTRDtrackV1.h:28
 AliTRDtrackV1.h:29
 AliTRDtrackV1.h:30
 AliTRDtrackV1.h:31
 AliTRDtrackV1.h:32
 AliTRDtrackV1.h:33
 AliTRDtrackV1.h:34
 AliTRDtrackV1.h:35
 AliTRDtrackV1.h:36
 AliTRDtrackV1.h:37
 AliTRDtrackV1.h:38
 AliTRDtrackV1.h:39
 AliTRDtrackV1.h:40
 AliTRDtrackV1.h:41
 AliTRDtrackV1.h:42
 AliTRDtrackV1.h:43
 AliTRDtrackV1.h:44
 AliTRDtrackV1.h:45
 AliTRDtrackV1.h:46
 AliTRDtrackV1.h:47
 AliTRDtrackV1.h:48
 AliTRDtrackV1.h:49
 AliTRDtrackV1.h:50
 AliTRDtrackV1.h:51
 AliTRDtrackV1.h:52
 AliTRDtrackV1.h:53
 AliTRDtrackV1.h:54
 AliTRDtrackV1.h:55
 AliTRDtrackV1.h:56
 AliTRDtrackV1.h:57
 AliTRDtrackV1.h:58
 AliTRDtrackV1.h:59
 AliTRDtrackV1.h:60
 AliTRDtrackV1.h:61
 AliTRDtrackV1.h:62
 AliTRDtrackV1.h:63
 AliTRDtrackV1.h:64
 AliTRDtrackV1.h:65
 AliTRDtrackV1.h:66
 AliTRDtrackV1.h:67
 AliTRDtrackV1.h:68
 AliTRDtrackV1.h:69
 AliTRDtrackV1.h:70
 AliTRDtrackV1.h:71
 AliTRDtrackV1.h:72
 AliTRDtrackV1.h:73
 AliTRDtrackV1.h:74
 AliTRDtrackV1.h:75
 AliTRDtrackV1.h:76
 AliTRDtrackV1.h:77
 AliTRDtrackV1.h:78
 AliTRDtrackV1.h:79
 AliTRDtrackV1.h:80
 AliTRDtrackV1.h:81
 AliTRDtrackV1.h:82
 AliTRDtrackV1.h:83
 AliTRDtrackV1.h:84
 AliTRDtrackV1.h:85
 AliTRDtrackV1.h:86
 AliTRDtrackV1.h:87
 AliTRDtrackV1.h:88
 AliTRDtrackV1.h:89
 AliTRDtrackV1.h:90
 AliTRDtrackV1.h:91
 AliTRDtrackV1.h:92
 AliTRDtrackV1.h:93
 AliTRDtrackV1.h:94
 AliTRDtrackV1.h:95
 AliTRDtrackV1.h:96
 AliTRDtrackV1.h:97
 AliTRDtrackV1.h:98
 AliTRDtrackV1.h:99
 AliTRDtrackV1.h:100
 AliTRDtrackV1.h:101
 AliTRDtrackV1.h:102
 AliTRDtrackV1.h:103
 AliTRDtrackV1.h:104
 AliTRDtrackV1.h:105
 AliTRDtrackV1.h:106
 AliTRDtrackV1.h:107
 AliTRDtrackV1.h:108
 AliTRDtrackV1.h:109
 AliTRDtrackV1.h:110
 AliTRDtrackV1.h:111
 AliTRDtrackV1.h:112
 AliTRDtrackV1.h:113
 AliTRDtrackV1.h:114
 AliTRDtrackV1.h:115
 AliTRDtrackV1.h:116
 AliTRDtrackV1.h:117
 AliTRDtrackV1.h:118
 AliTRDtrackV1.h:119
 AliTRDtrackV1.h:120
 AliTRDtrackV1.h:121
 AliTRDtrackV1.h:122
 AliTRDtrackV1.h:123
 AliTRDtrackV1.h:124
 AliTRDtrackV1.h:125
 AliTRDtrackV1.h:126
 AliTRDtrackV1.h:127
 AliTRDtrackV1.h:128
 AliTRDtrackV1.h:129
 AliTRDtrackV1.h:130
 AliTRDtrackV1.h:131
 AliTRDtrackV1.h:132
 AliTRDtrackV1.h:133
 AliTRDtrackV1.h:134
 AliTRDtrackV1.h:135
 AliTRDtrackV1.h:136
 AliTRDtrackV1.h:137
 AliTRDtrackV1.h:138
 AliTRDtrackV1.h:139
 AliTRDtrackV1.h:140
 AliTRDtrackV1.h:141
 AliTRDtrackV1.h:142
 AliTRDtrackV1.h:143
 AliTRDtrackV1.h:144
 AliTRDtrackV1.h:145
 AliTRDtrackV1.h:146
 AliTRDtrackV1.h:147
 AliTRDtrackV1.h:148
 AliTRDtrackV1.h:149
 AliTRDtrackV1.h:150
 AliTRDtrackV1.h:151
 AliTRDtrackV1.h:152
 AliTRDtrackV1.h:153
 AliTRDtrackV1.h:154
 AliTRDtrackV1.h:155
 AliTRDtrackV1.h:156
 AliTRDtrackV1.h:157
 AliTRDtrackV1.h:158
 AliTRDtrackV1.h:159
 AliTRDtrackV1.h:160
 AliTRDtrackV1.h:161
 AliTRDtrackV1.h:162
 AliTRDtrackV1.h:163
 AliTRDtrackV1.h:164
 AliTRDtrackV1.h:165
 AliTRDtrackV1.h:166
 AliTRDtrackV1.h:167
 AliTRDtrackV1.h:168
 AliTRDtrackV1.h:169
 AliTRDtrackV1.h:170
 AliTRDtrackV1.h:171
 AliTRDtrackV1.h:172
 AliTRDtrackV1.h:173
 AliTRDtrackV1.h:174
 AliTRDtrackV1.h:175
 AliTRDtrackV1.h:176
 AliTRDtrackV1.h:177
 AliTRDtrackV1.h:178
 AliTRDtrackV1.h:179
 AliTRDtrackV1.h:180
 AliTRDtrackV1.h:181
 AliTRDtrackV1.h:182
 AliTRDtrackV1.h:183
 AliTRDtrackV1.h:184
 AliTRDtrackV1.h:185
 AliTRDtrackV1.h:186
 AliTRDtrackV1.h:187
 AliTRDtrackV1.h:188
 AliTRDtrackV1.h:189
 AliTRDtrackV1.h:190
 AliTRDtrackV1.h:191
 AliTRDtrackV1.h:192
 AliTRDtrackV1.h:193
 AliTRDtrackV1.h:194
 AliTRDtrackV1.h:195
 AliTRDtrackV1.h:196
 AliTRDtrackV1.h:197
 AliTRDtrackV1.h:198
 AliTRDtrackV1.h:199
 AliTRDtrackV1.h:200
 AliTRDtrackV1.h:201
 AliTRDtrackV1.h:202
 AliTRDtrackV1.h:203
 AliTRDtrackV1.h:204
 AliTRDtrackV1.h:205
 AliTRDtrackV1.h:206
 AliTRDtrackV1.h:207
 AliTRDtrackV1.h:208
 AliTRDtrackV1.h:209
 AliTRDtrackV1.h:210
 AliTRDtrackV1.h:211
 AliTRDtrackV1.h:212
 AliTRDtrackV1.h:213
 AliTRDtrackV1.h:214
 AliTRDtrackV1.h:215
 AliTRDtrackV1.h:216
 AliTRDtrackV1.h:217
 AliTRDtrackV1.h:218
 AliTRDtrackV1.h:219
 AliTRDtrackV1.h:220
 AliTRDtrackV1.h:221
 AliTRDtrackV1.h:222
 AliTRDtrackV1.h:223
 AliTRDtrackV1.h:224
 AliTRDtrackV1.h:225
 AliTRDtrackV1.h:226
 AliTRDtrackV1.h:227
 AliTRDtrackV1.h:228
 AliTRDtrackV1.h:229
 AliTRDtrackV1.h:230
 AliTRDtrackV1.h:231
 AliTRDtrackV1.h:232
 AliTRDtrackV1.h:233
 AliTRDtrackV1.h:234
 AliTRDtrackV1.h:235
 AliTRDtrackV1.h:236
 AliTRDtrackV1.h:237
 AliTRDtrackV1.h:238
 AliTRDtrackV1.h:239
 AliTRDtrackV1.h:240
 AliTRDtrackV1.h:241
 AliTRDtrackV1.h:242
 AliTRDtrackV1.h:243
 AliTRDtrackV1.h:244
 AliTRDtrackV1.h:245
 AliTRDtrackV1.h:246
 AliTRDtrackV1.h:247
 AliTRDtrackV1.h:248
 AliTRDtrackV1.h:249
 AliTRDtrackV1.h:250
 AliTRDtrackV1.h:251
 AliTRDtrackV1.h:252
 AliTRDtrackV1.h:253
 AliTRDtrackV1.h:254
 AliTRDtrackV1.h:255
 AliTRDtrackV1.h:256
 AliTRDtrackV1.h:257
 AliTRDtrackV1.h:258
 AliTRDtrackV1.h:259
 AliTRDtrackV1.h:260