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