95b294b181d6af1ff7f470d24aec0d5077cf78e5
[u/mrichter/AliRoot.git] / PWG1 / TRD / info / AliTRDtrackInfo.h
1 #ifndef ALITRDTRACKINFO_H
2 #define ALITRDTRACKINFO_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice                               */
5
6 /* $Id: AliTRDtrackInfo.h 27496 2008-07-22 08:35:45Z cblume $ */
7
8 ////////////////////////////////////////////////////////////////////////////
9 //                                                                        //
10 //  Reconstruction QA                                                     //
11 //                                                                        //
12 ////////////////////////////////////////////////////////////////////////////
13
14 #ifndef ALIPID_H
15 #include "AliPID.h"
16 #endif
17
18
19 template <typename Value> class TVectorT;
20 typedef struct TVectorT<Double_t> TVectorD;
21 class AliTRDseedV1;
22 class AliTRDtrackV1;
23 class AliTrackReference;
24 class AliExternalTrackParam;
25 class AliTRDtrackInfo : public TObject{
26 public:
27   enum{
28     kNTrackRefs = 12
29   };
30   class AliESDinfo{
31     friend class AliTRDtrackInfo;  // Friend class
32   public:
33     AliESDinfo();
34     AliESDinfo(const AliESDinfo &esd);
35     virtual ~AliESDinfo();
36     AliESDinfo& operator=(const AliESDinfo &esd);
37     void Delete(const Option_t *);
38     Bool_t      HasV0() const                    { return fHasV0;}
39     Int_t       GetId() const                    { return fId;}
40     ULong_t     GetStatus() const                { return fStatus;}
41     Int_t       GetKinkIndex() const             { return fKinkIndex;}
42     UShort_t    GetTOFbc() const                 { return fTOFbc;}
43     UShort_t    GetTPCncls() const               { return fTPCncls;}
44     UChar_t     GetPidQuality() const            { return fTRDpidQuality;}
45     Int_t       GetNSlices() const               { return fTRDnSlices;}
46     Double32_t* GetSliceIter() const             { return fTRDslices;}
47     const Double32_t* GetResponseIter() const    { return &fTRDr[0];}
48     AliExternalTrackParam* GetOuterParam() const { return fOP;}
49     AliExternalTrackParam* GetTPCoutParam() const { return fTPCout;}
50     const Int_t* GetV0pid() const                { return &fTRDv0pid[0];}
51     Int_t       GetV0pid(Int_t i) const          { return fTRDv0pid[i];}
52
53   protected:
54     UChar_t     fHasV0;         // v0 bit
55     Int_t       fId;            // ESD track id
56     ULong_t     fStatus;        // ESD track status
57     Int_t       fKinkIndex;     // ESD kink index
58     UShort_t    fTPCncls;       // Number of Clusters inside TPC
59     UShort_t    fTOFbc;         // TOF bunch crossing index
60     Double32_t  fTRDr[AliPID::kSPECIES];  // TRD radial position
61     UChar_t     fTRDpidQuality; // TRD PID quality
62     Int_t       fTRDnSlices;    // number of slices used for PID
63     Double32_t *fTRDslices;     //[fTRDnSlices] 
64     AliExternalTrackParam *fOP; // outer track param
65     AliExternalTrackParam *fTPCout; // outer TPC param
66     Int_t  fTRDv0pid[AliPID::kSPECIES]; // PID from v0s
67
68     ClassDef(AliESDinfo, 5)     // ESD info related to TRD
69   };
70
71   class AliMCinfo{
72   friend class AliTRDtrackInfo;
73   public:
74     //typedef AliTrackReference (const* constAliTrackReference);
75     AliMCinfo();
76     AliMCinfo(const AliMCinfo &mc);
77     virtual ~AliMCinfo();
78     AliMCinfo& operator=(const AliMCinfo &mc);
79     Int_t   GetLabel() const {return fLabel;}
80     Int_t   GetNTrackRefs() const {return fNTrackRefs;}
81     Int_t   GetPDG() const {return fPDG;}
82     Int_t   GetPID() const ;
83     Bool_t  GetDirections(Float_t &x0, Float_t &y0, Float_t &z0, Float_t &dydx, Float_t &dzdx, Float_t &pt, Float_t &eta, Float_t &phi, UChar_t &s) const;
84     AliTrackReference const* GetTrackRef(Int_t ref=0) const {return fTrackRefs[ref];}
85     static Double_t GetKalmanStep() {return fgKalmanStep;}
86     static Bool_t IsKalmanUpdate() {return fgKalmanUpdate;}
87     Bool_t   PropagateKalman(
88         TVectorD *x, TVectorD *y, TVectorD *z,
89         TVectorD *dx, TVectorD *dy, TVectorD *dz,
90         TVectorD *pt, TVectorD *dpt, TVectorD *budget, TVectorD *c, Double_t mass=-1) const;
91     static void SetKalmanStep(Double_t s) {fgKalmanStep = s;}
92     static void SetKalmanUpdate(Bool_t s=kTRUE) {fgKalmanUpdate = s;}
93   protected:
94     Int_t   fLabel;               // MC label  
95     Int_t   fPDG;                 // particle code
96     Int_t   fNTrackRefs;            // number of track refs
97     static Double_t fgKalmanStep; // Kalman step propagation
98     static Bool_t fgKalmanUpdate; // Kalman update with TRD tracklets
99     AliTrackReference  *fTrackRefs[kNTrackRefs];        // track refs array
100
101     ClassDef(AliMCinfo, 2)      // MC info related to TRD
102   };
103
104   AliTRDtrackInfo();
105   AliTRDtrackInfo(const AliTRDtrackInfo &trdInfo);
106   ~AliTRDtrackInfo();
107
108 //  void               Clear(const Option_t *){}
109   void               Delete(const Option_t *);
110   AliTRDtrackInfo&   operator=(const AliTRDtrackInfo &trdInfo);
111   void               AddTrackRef(const AliTrackReference *trackRef);
112   Int_t              GetTrackId() const               { return fESD.fId;}
113   const AliESDinfo*  GetESDinfo() const               { return &fESD; }
114   const AliMCinfo*   GetMCinfo() const                { return fMC; }
115   Int_t              GetNumberOfClusters() const;
116   Int_t              GetNumberOfClustersRefit() const { return fNClusters;}
117   Int_t              GetNTracklets() const;
118   Int_t              GetNTrackRefs() const            { return fMC ? fMC->fNTrackRefs:0;} 
119   Int_t              GetLabel() const                 { return fMC ? fMC->fLabel:0; }
120   Int_t              GetKinkIndex() const             { return fESD.fKinkIndex;}
121   UShort_t           GetTOFbc() const                 { return fESD.fTOFbc;}
122   UShort_t           GetTPCncls() const               { return fESD.fTPCncls;}
123   Int_t              GetPDG() const                   { return fMC ? fMC->fPDG : 0; }
124   Int_t              GetPID() const                   { return fMC ? fMC->GetPID() : -1; }
125   ULong_t            GetStatus() const                { return fESD.fStatus;}
126   AliTRDtrackV1*     GetTrack() const                 { return fTRDtrack; }
127   AliTrackReference* GetTrackRef(Int_t entry) const;
128   AliTrackReference* GetTrackRef(const AliTRDseedV1* const tracklet) const;
129
130   Bool_t             IsCurved() const                 { return TestBit(kCurv);}
131   Bool_t             IsPrimary() const                { return TestBit(kPrim);}
132   Bool_t             HasESDtrack() const              { return ((fTRDtrack != 0x0) ||(fESD.fOP != 0));}
133   Bool_t             HasMCinfo() const                { return (Bool_t)fMC; }
134
135   void               SetCurved(Bool_t curv = kTRUE)   { SetBit(kCurv, curv);}
136   void               SetLabel(Int_t lab)              { if(fMC) fMC->fLabel = lab; }
137   void               SetNumberOfClustersRefit(Int_t n){fNClusters = n;}
138   inline void        SetMC();
139   void               SetPDG(Int_t pdg)                { if(fMC) fMC->fPDG = pdg; }
140   void               SetPrimary(Bool_t prim = kTRUE)  {SetBit(kPrim, prim);}
141   void               SetOuterParam(const AliExternalTrackParam *op);
142   void               SetTPCoutParam(const AliExternalTrackParam *op);
143   void               SetStatus(ULong_t stat)          { fESD.fStatus = stat;}
144   void               SetKinkIndex(Int_t kinkIndex)    { fESD.fKinkIndex = kinkIndex;}
145   void               SetTOFbc(UShort_t bc)            { fESD.fTOFbc = bc;}
146   void               SetTPCncls(UShort_t TPCncls)     { fESD.fTPCncls = TPCncls;}
147   void               SetTrackId(Int_t id)             { fESD.fId = id;}
148   void               SetTrack(const AliTRDtrackV1 *track);
149   void               SetESDpidQuality(UChar_t q)      { fESD.fTRDpidQuality = q;}
150   void               SetSlices(Int_t n, Double32_t *s);
151   inline void        SetESDpid(Double_t *);
152   inline void        SetV0pid(Int_t *);
153   void               SetV0(Bool_t v0=kTRUE)           { fESD.fHasV0 = v0;}
154   
155 private:
156     enum{
157       kCurv = 14,
158       kPrim = 15
159   };
160   // this 2 data members have to go to ESD header.
161   Int_t              fNClusters;        // Numer of clusters from refit
162   AliTRDtrackV1      *fTRDtrack;            // tracklets data array
163   AliMCinfo          *fMC;            // MC extract for TRD
164   AliESDinfo         fESD;            // ESD extract for TRD
165
166   ClassDef(AliTRDtrackInfo, 4)        // TRD track info
167 };
168
169
170 //________________________________________________________
171 inline void AliTRDtrackInfo::SetMC()
172 {
173   if(!fMC) fMC = new AliMCinfo();
174 }
175
176 //________________________________________________________
177 inline void AliTRDtrackInfo::SetESDpid(Double_t * const r)
178
179   for(Int_t is = AliPID::kSPECIES; is--;) fESD.fTRDr[is] = r[is];
180 }
181
182 //________________________________________________________
183 inline void AliTRDtrackInfo::SetV0pid(Int_t * const r)
184
185   for(Int_t is = AliPID::kSPECIES; is--;) fESD.fTRDv0pid[is] = r[is];
186 }
187
188 #endif