Corrected bug in GetRowNumber (class AliTPCSector)
[u/mrichter/AliRoot.git] / TPC / AliTPCtracker.h
1 #ifndef ALITPCTRACKER_H
2 #define ALITPCTRACKER_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 //                       TPC tracker
10 //
11 //   Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch 
12 //-------------------------------------------------------
13 #include "AliTracker.h"
14 #include "AliTPCtrack.h"
15 #include "AliTPCClustersArray.h"
16
17 #include "AliTPCreco.h"
18
19 class TFile;
20 class AliTPCParam;
21
22 class AliTPCtracker : public AliTracker {
23 public:
24    AliTPCtracker():AliTracker(),fkNIS(0),fkNOS(0) {
25       fInnerSec=fOuterSec=0; fSeeds=0; 
26    }
27    AliTPCtracker(const AliTPCParam *par, Int_t eventn=0);
28   ~AliTPCtracker();
29
30    Int_t ReadSeeds(const TFile *in);
31
32    void LoadInnerSectors();
33    void UnloadInnerSectors();
34    void LoadOuterSectors();
35    void UnloadOuterSectors();
36
37    AliCluster *GetCluster(Int_t index) const;
38    Int_t Clusters2Tracks(const TFile *in, TFile *out);
39    Int_t PropagateBack(const TFile *in, TFile *out);
40
41    virtual void  CookLabel(AliKalmanTrack *t,Float_t wrong) const; 
42
43 public:
44 //**************** Internal tracker class ********************** 
45    class AliTPCRow {
46    public:
47      AliTPCRow() {fN=0;}
48      void InsertCluster(const AliTPCcluster *c, UInt_t index);
49      operator int() const {return fN;}
50      const AliTPCcluster* operator[](Int_t i) const {return fClusters[i];}
51      UInt_t GetIndex(Int_t i) const {return fIndex[i];}
52      Int_t Find(Double_t y) const; 
53      void SetX(Double_t x) {fX=x;}
54      Double_t GetX() const {return fX;}
55
56    private:
57      Int_t fN;                                          //number of clusters 
58      const AliTPCcluster *fClusters[kMaxClusterPerRow]; //pointers to clusters
59      UInt_t fIndex[kMaxClusterPerRow];                  //indeces of clusters
60      Double_t fX;                                 //X-coordinate of this row
61
62    private:
63      AliTPCRow(const AliTPCRow& r);            //dummy copy constructor
64      AliTPCRow &operator=(const AliTPCRow& r); //dummy assignment operator
65    };
66
67 //**************** Internal tracker class ********************** 
68    class AliTPCSector {
69    public:
70      AliTPCSector() { fN=0; fRow = 0; }
71     ~AliTPCSector() { delete[] fRow; }
72      AliTPCRow& operator[](Int_t i) const { return *(fRow+i); }
73      Int_t GetNRows() const { return fN; }
74      void Setup(const AliTPCParam *par, Int_t flag);
75      Double_t GetX(Int_t l) const {return fRow[l].GetX();}
76      Double_t GetMaxY(Int_t l) const {
77          return GetX(l)*TMath::Tan(0.5*GetAlpha());
78      } 
79      Double_t GetAlpha() const {return fAlpha;}
80      Double_t GetAlphaShift() const {return fAlphaShift;}
81      Int_t GetRowNumber(Double_t x) const {
82         //return pad row number for this x
83        Double_t r;
84        if (fN < 64){
85          r=fRow[fN-1].GetX();
86          if (x > r) return fN;
87          r=fRow[0].GetX();
88          if (x < r) return -1;
89          return Int_t((x-r)/fPadPitchLength + 0.5);}
90        else{    
91            r=fRow[fN-1].GetX();
92            if (x > r) return fN;
93            r=fRow[0].GetX();
94            if (x < r) return -1;
95           Double_t r1=fRow[64].GetX();
96           if(x<r1){       
97             return Int_t((x-r)/f1PadPitchLength + 0.5);}
98           else{
99             return (Int_t((x-r1)/f2PadPitchLength + 0.5)+64);} 
100        }
101      }
102      Double_t GetPadPitchWidth()  const {return fPadPitchWidth;}
103      Double_t GetPadPitchLength() const {return fPadPitchLength;}
104
105    private:
106      Int_t fN;                        //number of pad rows 
107      AliTPCRow *fRow;                    //array of pad rows
108      Double_t fAlpha;                    //opening angle
109      Double_t fAlphaShift;               //shift angle;
110      Double_t fPadPitchWidth;            //pad pitch width
111      Double_t fPadPitchLength;           //pad pitch length 
112      Double_t f1PadPitchLength;           //pad pitch length
113      Double_t f2PadPitchLength;   
114    private:
115      AliTPCSector(const AliTPCSector &s);           //dummy copy contructor
116      AliTPCSector& operator=(const AliTPCSector &s);//dummy assignment operator
117    };
118
119 //**************** Internal tracker class ********************** 
120    class AliTPCseed : public AliTPCtrack {
121    public:
122      AliTPCseed():AliTPCtrack(){}
123      AliTPCseed(const AliTPCtrack &t):AliTPCtrack(t){}
124      AliTPCseed(const AliKalmanTrack &t, Double_t a):AliTPCtrack(t,a){}
125      AliTPCseed(UInt_t index, const Double_t xx[5], 
126                 const Double_t cc[15], Double_t xr, Double_t alpha): 
127                 AliTPCtrack(index, xx, cc, xr, alpha) {}
128      void SetSampledEdx(Float_t q, Int_t i) {
129         Double_t s=GetSnp(), t=GetTgl();
130         q *= TMath::Sqrt((1-s*s)/(1+t*t));
131         fdEdxSample[i]=q;
132      }
133      void CookdEdx(Double_t low=0.05, Double_t up=0.70);
134
135    private:
136      Float_t fdEdxSample[200]; //array of dE/dx samples 
137    };
138
139 private:
140    void MakeSeeds(Int_t i1, Int_t i2);
141    Int_t FollowProlongation(AliTPCseed& t, Int_t rf=0);
142    Int_t FollowBackProlongation(AliTPCseed &s, const AliTPCtrack &t);
143
144    AliTPCtracker(const AliTPCtracker& r);           //dummy copy constructor
145    AliTPCtracker &operator=(const AliTPCtracker& r);//dummy assignment operator
146
147    const Int_t fkNIS;        //number of inner sectors
148    AliTPCSector *fInnerSec;  //array of inner sectors;
149    const Int_t fkNOS;        //number of outer sectors
150    AliTPCSector *fOuterSec;  //array of outer sectors;
151
152    Int_t fN;               //number of loaded sectors
153    AliTPCSector *fSectors; //pointer to loaded sectors;
154
155    Int_t fEventN;                      //event number
156    AliTPCClustersArray fClustersArray; //array of TPC clusters
157    TObjArray *fSeeds;                  //array of track seeds
158 };
159
160 #endif
161
162