propagate cluster error parametrization
[u/mrichter/AliRoot.git] / TRD / AliTRDseedV1.h
1 #ifndef ALITRDSEEDV1_H
2 #define ALITRDSEEDV1_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 ////////////////////////////////////////////////////////////////////////////
9 //                                                                        //
10 //  The TRD track seed                                                    //
11 //                                                                        //
12 ////////////////////////////////////////////////////////////////////////////
13
14 #ifndef ALITRDSEED_H
15 #include "AliTRDseed.h"
16 #endif
17
18 #ifndef ALITRDGEOMETRY_H
19 #include "AliTRDgeometry.h"
20 #endif
21
22 #ifndef ALIPID_H
23 #include "AliPID.h"
24 #endif
25
26 #ifndef ALIRIEMAN_H
27 #include "AliRieman.h"
28 #endif
29
30 class TTreeSRedirector;
31
32 class AliRieman;
33
34 class AliTRDtrackingChamber;
35 class AliTRDcluster;
36 class AliTRDtrackV1;
37 class AliTRDReconstructor;
38 class AliTRDseedV1 : public AliTRDseed
39 {
40
41   public:
42
43   enum {
44     knSlices = 10
45   };
46   // bits from 0-13 are reserved by ROOT (see TObject.h)
47   enum AliTRDtrackletStatus {
48     kOwner    = BIT(14)
49   , kRowCross = BIT(15) 
50   };
51
52   AliTRDseedV1(Int_t det = -1);
53   ~AliTRDseedV1();
54   AliTRDseedV1(const AliTRDseedV1 &ref);
55   AliTRDseedV1& operator=(const AliTRDseedV1 &ref);
56
57   Bool_t          AttachClustersIter(
58               AliTRDtrackingChamber *chamber, Float_t quality, 
59               Bool_t kZcorr = kFALSE, AliTRDcluster *c=0x0);
60   Bool_t          AttachClusters(
61               AliTRDtrackingChamber *chamber, Bool_t kZcorr = kFALSE);
62   void      Bootstrap(const AliTRDReconstructor *rec);
63   void      CookdEdx(Int_t nslices);
64   Bool_t    Fit(Bool_t tilt=kTRUE, Int_t errors = 2);
65
66   Bool_t    Init(AliTRDtrackV1 *track);
67   inline void      Init(const AliRieman *fit);
68   Bool_t    IsEqual(const TObject *inTracklet) const;
69   Bool_t    IsOwner() const          { return TestBit(kOwner);}
70   Bool_t    IsRowCross() const       { return TestBit(kRowCross);}
71
72   inline Float_t   GetChi2Z(const Float_t z = 999.) const;
73   inline Float_t   GetChi2Y(const Float_t y = 999.) const;
74   static void      GetClusterXY(const AliTRDcluster *c, Double_t &x, Double_t &y);
75   void      GetCovAt(Double_t x, Double_t *cov) const;
76   void      GetCovXY(Double_t *cov) const { memcpy(cov, &fCov[0], 3*sizeof(Double_t));}
77   void      GetCovRef(Double_t *cov) const { memcpy(cov, &fRefCov[0], 3*sizeof(Double_t));}
78   Double_t* GetCrossXYZ()            { return &fCross[0];}
79   Double_t  GetCrossSz2() const      { return fCross[3];}
80   Float_t   GetdX() const            { return fdX;}
81   Float_t*  GetdEdx()                { return &fdEdx[0];}
82   Float_t   GetdQdl(Int_t ic) const;
83   Int_t     GetDetector() const      { return fDet;}
84   Float_t   GetExB() const           { return fExB;}
85   Double_t  GetMomentum() const      { return fMom;}
86   Int_t     GetN() const             { return fN2;}
87   Float_t   GetQuality(Bool_t kZcorr) const;
88   Int_t     GetPlane() const         { return AliTRDgeometry::GetLayer(fDet);    }
89
90   Double_t* GetProbability();
91   Double_t  GetSnp() const           { return fSnp;}
92   Double_t  GetTgl() const           { return fTgl;}
93   Float_t   GetXref() const          { return fXref;}
94   Double_t  GetYat(Double_t x) const { return fYfit[0] + fYfit[1] * (fX0-x);}
95   Double_t  GetZat(Double_t x) const { return fZfit[0] + fZfit[1] * (fX0-x);}
96   
97   inline AliTRDcluster* NextCluster();
98   inline AliTRDcluster* PrevCluster();
99   void      Print(Option_t *o = "") const;
100   inline void ResetClusterIter(Bool_t forward = kTRUE);
101
102   void      SetCovRef(const Double_t *cov) { memcpy(&fRefCov[0], cov, 3*sizeof(Double_t));}
103   void      SetMomentum(Double_t mom){ fMom = mom;}
104   void      SetOwner();
105   void      SetDetector(Int_t d)     { fDet = d;  }
106   void      SetDX(Float_t inDX)      { fdX = inDX;}
107   void      SetSnp(Double_t snp)     { fSnp = snp;}
108   void      SetTgl(Double_t tgl)     { fTgl = tgl;}
109   void      SetReconstructor(const AliTRDReconstructor *rec) {fReconstructor = rec;}
110
111 protected:
112   void Copy(TObject &ref) const;
113   void SetExB();
114
115 private:
116   const AliTRDReconstructor *fReconstructor;//! local reconstructor
117   AliTRDcluster    **fClusterIter;          //! clusters iterator
118   Char_t           fClusterIdx;             //! clusters iterator
119   Int_t            fDet;                    //  TRD detector
120   Float_t          fMom;                    //  Momentum estimate for tracklet [GeV/c]
121   Float_t          fSnp;                    // sin of track with respect to x direction in XY plane     
122   Float_t          fTgl;                    // tg of track with respect to x direction in XZ plane      
123   Float_t          fdX;                     // length of time bin
124   Float_t          fXref;                   // average radial position of clusters
125   Float_t          fExB;                    // tg(a_L) for the tracklet reagion
126   Float_t          fdEdx[knSlices];         // dE/dx measurements for tracklet
127   Double_t         fCross[4];               // spatial parameters of the pad row crossing
128   Double_t         fRefCov[3];              // covariance matrix of the track in the yz plane
129   Double_t         fCov[3];                 // covariance matrix of the tracklet in the xy plane
130   Double_t         fProb[AliPID::kSPECIES]; //  PID probabilities
131
132   ClassDef(AliTRDseedV1, 4)                 //  New TRD seed 
133
134 };
135
136 //____________________________________________________________
137 inline Float_t AliTRDseedV1::GetChi2Z(const Float_t z) const
138 {
139   Float_t z1  = (z == 999.) ? fMeanz : z;
140   Float_t chi = fZref[0] - z1;
141   return chi*chi;
142 }
143
144 //____________________________________________________________
145 inline Float_t AliTRDseedV1::GetChi2Y(const Float_t y) const
146 {
147   Float_t y1  = (y == 999.) ? fYfitR[0] : y;
148   Float_t chi = fYref[0] - y1;
149   return chi*chi;
150 }
151
152 //____________________________________________________________
153 inline void AliTRDseedV1::Init(const AliRieman *rieman)
154 {
155   fZref[0] = rieman->GetZat(fX0);
156   fZref[1] = rieman->GetDZat(fX0);
157   fYref[0] = rieman->GetYat(fX0);
158   fYref[1] = rieman->GetDYat(fX0);
159   fC       = rieman->GetC(); 
160   fChi2    = rieman->GetChi2();
161 }
162
163 //____________________________________________________________
164 inline AliTRDcluster* AliTRDseedV1::NextCluster()
165 {
166 // Mimic the usage of STL iterators.
167 // Forward iterator
168
169   fClusterIdx++; fClusterIter++;
170   while(fClusterIdx < AliTRDseed::knTimebins){
171     if(!(*fClusterIter)){ 
172       fClusterIdx++; 
173       fClusterIter++;
174       continue;
175     }
176     return *fClusterIter;
177   }
178   return 0x0;
179 }
180
181 //____________________________________________________________
182 inline AliTRDcluster* AliTRDseedV1::PrevCluster()
183 {
184 // Mimic the usage of STL iterators.
185 // Backward iterator
186
187   fClusterIdx--; fClusterIter--;
188   while(fClusterIdx >= 0){
189     if(!(*fClusterIter)){ 
190       fClusterIdx--; 
191       fClusterIter--;
192       continue;
193     }
194     return *fClusterIter;
195   }
196   return 0x0;
197 }
198
199 //____________________________________________________________
200 inline void AliTRDseedV1::ResetClusterIter(Bool_t forward) 
201 {
202 // Mimic the usage of STL iterators.
203 // Facilitate the usage of NextCluster for forward like 
204 // iterator (kTRUE) and PrevCluster for backward like iterator (kFALSE)
205
206   if(forward){
207     fClusterIter = &fClusters[0]; fClusterIter--; 
208     fClusterIdx=-1;
209   } else {
210     fClusterIter = &fClusters[AliTRDseed::knTimebins-1]; fClusterIter++; 
211     fClusterIdx=AliTRDseed::knTimebins;
212   }
213 }
214
215 #endif
216
217
218