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

/* $Id: AliTRDtrackInfo.h 27496 2008-07-22 08:35:45Z cblume $ */

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  Reconstruction QA                                                     //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#ifndef ALIPID_H
#include "AliPID.h"
#endif


template <typename Value> class TVectorT;
typedef class TVectorT<Double_t> TVectorD;
class AliTRDseedV1;
class AliTRDtrackV1;
class AliTrackReference;
class AliTrackPointArray;
class AliExternalTrackParam;
class AliTRDtrackInfo : public TObject{
public:
  enum{
    kNTrackRefs = 12
  };
  class AliESDinfo{
    friend class AliTRDtrackInfo;  // Friend class
  public:
    enum EESDinfo{
       kV0       = 0
      ,kElectron = 1
      ,kPion     = 2
      ,kProton   = 3
    };
    AliESDinfo();
    AliESDinfo(const AliESDinfo &esd);
    virtual ~AliESDinfo();
    AliESDinfo& operator=(const AliESDinfo &esd);
    void Delete(const Option_t *);
    Float_t     Eta() const                      { return fEta;}
    Int_t       GetId() const                    { return fId;}
    ULong_t     GetStatus() const                { return fStatus;}
    Int_t       GetKinkIndex() const             { return fKinkIndex;}
    Short_t     GetTOFbc() const                 { return fTOFbc;}
    Float_t     GetTOFbeta() const               { return fTOFbeta;}
    UShort_t    GetTPCncls() const               { return fTPCncls;}
    Float_t     GetTPCdedx() const               { return fTPCdedx;}
    AliTrackPointArray* GetTrackPointArray() const      { return fTPArray; }
    UChar_t     GetPidQuality() const            { return fTRDpidQuality;}
    Int_t       GetNSlices() const               { return fTRDnSlices;}
    Double32_t* GetSliceIter() const             { return fTRDslices;}
    const Double32_t* GetResponseIter() const    { return &fTRDr[0];}
    AliExternalTrackParam* GetOuterParam() const { return fOP;}
    AliExternalTrackParam* GetITSoutParam() const { return fITSout;}
    AliExternalTrackParam* GetTPCoutParam() const { return fTPCout;}
    const Int_t* GetV0pid() const                { return &fTRDv0pid[0];}
    Int_t       GetV0pid(Int_t i) const          { return fTRDv0pid[i];}
    Bool_t      HasV0() const                    { return TESTBIT(fSteer, kV0);}
    Bool_t      IsElectron() const               { return TESTBIT(fSteer, kElectron);}
    Bool_t      IsPion() const                   { return TESTBIT(fSteer, kPion);}
    Bool_t      IsProton() const                 { return TESTBIT(fSteer, kProton);}
    Float_t     Phi() const                      { return fPhi;}
    Float_t     Pt() const                       { return fPt;}
    void        SetElectron(Bool_t e=kTRUE)      { e?SETBIT(fSteer, kElectron):CLRBIT(fSteer, kElectron);}
    void        SetPion(Bool_t e=kTRUE)          { e?SETBIT(fSteer, kPion):CLRBIT(fSteer, kPion);}
    void        SetProton(Bool_t e=kTRUE)        { e?SETBIT(fSteer, kProton):CLRBIT(fSteer, kProton);}
    void        SetV0(Bool_t v=kTRUE)            { v?SETBIT(fSteer, kV0):CLRBIT(fSteer, kV0);}
    void        SetOuterParam(const AliExternalTrackParam *op);
    void        SetITSoutParam(const AliExternalTrackParam *op);
    void        SetTPCoutParam(const AliExternalTrackParam *op);
    void        SetTrackPointArray(const AliTrackPointArray *tps);

  protected:
    UChar_t     fSteer;                   // bit map
    Int_t       fId;                      // ESD track id
    ULong_t     fStatus;                  // ESD track status
    Int_t       fKinkIndex;               // ESD kink index
    UShort_t    fTPCncls;                 // Number of Clusters inside TPC
    Float_t     fTPCdedx;                 // dEdx in TPC
    Float_t     fTOFbeta;                 // time of flight in TOF
    Short_t     fTOFbc;                   // TOF bunch crossing index
    Double32_t  fTRDr[AliPID::kSPECIES];  // TRD radial position
    UChar_t     fTRDpidQuality;           // TRD PID quality
    Int_t       fTRDnSlices;              // number of slices used for PID
    Float_t     fPt;                      // p_t at TRD entrance
    Float_t     fPhi;                     // phi at TRD entrance
    Float_t     fEta;                     // eta at TRD entrance
    Double32_t *fTRDslices;               //[fTRDnSlices]
    AliExternalTrackParam *fOP;           // outer track param
    AliExternalTrackParam *fTPCout;       // outer TPC param
    AliExternalTrackParam *fITSout;       // outer ITS param
    AliTrackPointArray *fTPArray;         // track point array to be used for alignment
    Int_t  fTRDv0pid[AliPID::kSPECIES];   // PID from v0s

    ClassDef(AliESDinfo, 9)     // ESD info related to TRD
  };

  class AliMCinfo{
  friend class AliTRDtrackInfo;
  public:
    //typedef AliTrackReference (const* constAliTrackReference);
    AliMCinfo();
    AliMCinfo(const AliMCinfo &mc);
    virtual ~AliMCinfo();
    AliMCinfo& operator=(const AliMCinfo &mc);
    Float_t GetEta() const                                  { return fEta;}
    Int_t   GetLabel() const                                { return fLabel;}
    Int_t   GetTRDlabel() const                             { return fTRDlabel;}
    Int_t   GetNTrackRefs() const                           { return fNTrackRefs;}
    Int_t   GetPDG() const                                  { return fPDG;}
    Int_t   GetPID() const ;
    Float_t GetPhi() const                                  { return fPhi;}
    Float_t GetPt() const                                   { return fPt;}
    Bool_t  GetDirections(Float_t &x0, Float_t &y0, Float_t &z0, Float_t &dydx, Float_t &dzdx, Float_t &pt, Float_t &p, Float_t &eta, Float_t &phi, UChar_t &s) const;
    AliTrackReference const* GetTrackRef(Int_t ref=0) const { return fTrackRefs[ref];}
    static Double_t GetKalmanStep()                         { return fgKalmanStep;}
    static Bool_t IsKalmanUpdate()                          { return fgKalmanUpdate;}
    Bool_t   PropagateKalman(
        TVectorD *x, TVectorD *y, TVectorD *z,
        TVectorD *dx, TVectorD *dy, TVectorD *dz,
        TVectorD *pt, TVectorD *dpt, TVectorD *budget, TVectorD *c, Double_t mass=-1) const;
    static void SetKalmanStep(Double_t s)                   { fgKalmanStep = s;}
    static void SetKalmanUpdate(Bool_t s=kTRUE)             { fgKalmanUpdate = s;}
  protected:
    Int_t   fLabel;               // ESD label
    Int_t   fTRDlabel;            // TRD label
    Int_t   fPDG;                 // particle code
    Int_t   fNTrackRefs;    	    // number of track refs
    Float_t fEta;                 // particle eta (vertex)
    Float_t fPhi;                 // particle phi (vertex)
    Float_t fPt;                  // particle pt (vertex)
    static Double_t fgKalmanStep; // Kalman step propagation
    static Bool_t fgKalmanUpdate; // Kalman update with TRD tracklets
    AliTrackReference  *fTrackRefs[kNTrackRefs];	// track refs array

    ClassDef(AliMCinfo, 4)      // MC info related to TRD
  };

  AliTRDtrackInfo();
  AliTRDtrackInfo(const AliTRDtrackInfo &trdInfo);
  ~AliTRDtrackInfo();

//  void               Clear(const Option_t *){}
  void               Delete(const Option_t *);
  AliTRDtrackInfo&   operator=(const AliTRDtrackInfo &trdInfo);
  void               AddTrackRef(const AliTrackReference *trackRef);
  Int_t              GetTrackId() const               { return fESD.fId;}
  const AliESDinfo*  GetESDinfo() const               { return &fESD; }
  const AliMCinfo*   GetMCinfo() const                { return fMC; }
  Int_t              GetNumberOfClusters() const;
  Int_t              GetNumberOfClustersRefit() const { return fNClusters;}
  Int_t              GetNTracklets() const;
  Int_t              GetNTrackRefs() const            { return fMC ? fMC->fNTrackRefs:0;} 
  Int_t              GetLabel() const                 { return fMC ? fMC->fLabel:0; }
  Int_t              GetKinkIndex() const             { return fESD.fKinkIndex;}
  Short_t            GetTOFbc() const                 { return fESD.fTOFbc;}
  UShort_t           GetTPCncls() const               { return fESD.fTPCncls;}
  Int_t              GetPDG() const                   { return fMC ? fMC->fPDG : 0; }
  Int_t              GetPID() const                   { return fMC ? fMC->GetPID() : -1; }
  ULong_t            GetStatus() const                { return fESD.fStatus;}
  AliTRDtrackV1*     GetTrack() const                 { return fTRDtrack; }
  AliTrackReference* GetTrackRef(Int_t entry) const;
  AliTrackReference* GetTrackRef(const AliTRDseedV1* const tracklet) const;

  Bool_t             IsCurved() const                 { return TestBit(kCurv);}
  Bool_t             IsPrimary() const                { return TestBit(kPrim);}
  Bool_t             HasESDtrack() const              { return ((fTRDtrack != 0x0) ||(fESD.fOP != 0));}
  Bool_t             HasMCinfo() const                { return (Bool_t)fMC; }

  void               SetElectron(Bool_t c = kTRUE)    { fESD.SetElectron(c);}
  void               SetPion(Bool_t c = kTRUE)        { fESD.SetPion(c);}
  void               SetProton(Bool_t c = kTRUE)      { fESD.SetProton(c);}
  void               SetCurved(Bool_t curv = kTRUE)   { SetBit(kCurv, curv);}
  void               SetLabel(Int_t lab)              { if(fMC) fMC->fLabel = lab; }
  void               SetTRDlabel(Int_t lab)           { if(fMC) fMC->fTRDlabel = lab; }
  void               SetNumberOfClustersRefit(Int_t n){fNClusters = n;}
  inline void        SetMC();
  void               SetMCeta(Float_t eta)            { if(fMC) fMC->fEta = eta; }
  void               SetMCphi(Float_t phi)            { if(fMC) fMC->fPhi = phi; }
  void               SetMCpt(Float_t pt)              { if(fMC) fMC->fPt = pt; }
  void               SetPDG(Int_t pdg)                { if(fMC) fMC->fPDG = pdg; }
  void               SetPrimary(Bool_t prim = kTRUE)  {SetBit(kPrim, prim);}
  void               SetOuterParam(const AliExternalTrackParam *op)  {fESD.SetOuterParam(op);}
  void               SetITSoutParam(const AliExternalTrackParam *op) {fESD.SetITSoutParam(op);}
  void               SetTPCoutParam(const AliExternalTrackParam *op) {fESD.SetTPCoutParam(op);}
  void               SetStatus(ULong_t stat)          { fESD.fStatus = stat;}
  void               SetKinkIndex(Int_t kinkIndex)    { fESD.fKinkIndex = kinkIndex;}
  void               SetTOFbc(Int_t bc)               { fESD.fTOFbc = bc;}
  void               SetTOFbeta(Float_t b)            { fESD.fTOFbeta = b;}
  void               SetTPCncls(UShort_t TPCncls)     { fESD.fTPCncls = TPCncls;}
  void               SetTPCdedx(Float_t dedx)         { fESD.fTPCdedx = dedx;}
  void               SetTrackId(Int_t id)             { fESD.fId = id;}
  void               SetTrack(const AliTRDtrackV1 *track);
  void               SetTrackPointArray(const AliTrackPointArray *tps) {fESD.SetTrackPointArray(tps);}
  void               SetESDpidQuality(UChar_t q)      { fESD.fTRDpidQuality = q;}
  void               SetSlices(Int_t n, Double32_t *s);
  inline void        SetESDpid(Double_t *);
  void               SetESDeta(Float_t eta)           { fESD.fEta = eta;}
  void               SetESDphi(Float_t phi)           { fESD.fPhi = phi;}
  void               SetESDpt(Float_t pt)             { fESD.fPt = pt;}
  inline void        SetV0pid(Int_t *);
  void               SetV0(Bool_t v0=kTRUE)           { fESD.SetV0(v0);}
  
private:
    enum{
      kCurv = 14,
      kPrim = 15
  };
  // this 2 data members have to go to ESD header.
  Int_t              fNClusters;     	// Numer of clusters from refit
  AliTRDtrackV1      *fTRDtrack; 	    // tracklets data array
  AliMCinfo          *fMC;            // MC extract for TRD
  AliESDinfo         fESD;            // ESD extract for TRD

  ClassDef(AliTRDtrackInfo, 4)        // TRD track info
};


//________________________________________________________
inline void AliTRDtrackInfo::SetMC()
{
  if(!fMC) fMC = new AliMCinfo();
}

//________________________________________________________
inline void AliTRDtrackInfo::SetESDpid(Double_t * const r)
{ 
  for(Int_t is = AliPID::kSPECIES; is--;) fESD.fTRDr[is] = r[is];
}

//________________________________________________________
inline void AliTRDtrackInfo::SetV0pid(Int_t * const r)
{ 
  for(Int_t is = AliPID::kSPECIES; is--;) fESD.fTRDv0pid[is] = r[is];
}

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