removed obsolete AliTPCDigitsDisplay.C
[u/mrichter/AliRoot.git] / TPC / AliTPC.h
1 #ifndef TPC_H
2 #define TPC_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 //  Manager class for TPC                     //
10 ////////////////////////////////////////////////
11 #include "AliDetector.h"
12 #include "AliHit.h" 
13 #include "AliDigit.h" 
14 #include "AliTPCParam.h"
15 #include <TMatrix.h>
16 #include <TTree.h>
17 #include <TClonesArray.h>
18
19 class AliTPCcluster;
20 class AliTPCtrack;
21 class AliTPCParam;
22
23 class AliTPCDigitsArray;
24 class AliTPCClustersArray;
25
26 class AliTPC : public AliDetector {
27 protected:
28   Int_t          fSens;             // ISENS
29   Int_t          fSecAL;            // Upper sector selector
30   Int_t          fSecAU;            // Lower sector selector
31   Int_t          fSecLows[6];       // List of lower sectors selected
32   Int_t          fSecUps[12];       // List of upper sectors selected
33   Int_t          fNsectors;         // Number of sectors in TPC
34   Int_t          fNclusters;        // Number of clusters in TPC
35   Int_t          fNtracks;          // Number of tracks in TPC
36   TClonesArray   *fClusters;        // List of clusters for all sectors
37   TClonesArray   *fTracks;          // List of reconstructed tracks
38   //MI changes
39   AliTPCDigitsArray * fDigitsArray;              //detector digit object  
40   AliTPCClustersArray * fClustersArray; //detector cluster object
41   AliTPCParam *fTPCParam;
42
43   //MK changes
44
45   Float_t        fSide;  // selects left(-1), right(+1), or both(0) sides of the TPC
46   Int_t          fNoComp; // number of a drift gas components
47   Int_t          fMixtComp[3]; // drift gas components
48   Float_t        fMixtProp[3]; // mixture proportions
49
50 public:
51   AliTPC();
52   AliTPC(const char *name, const char *title);
53   virtual      ~AliTPC();
54   virtual void  AddCluster(Float_t*, Int_t*);
55   /*virtual*/void  AddCluster(const AliTPCcluster&);
56   virtual void  AddHit(Int_t, Int_t*, Float_t*);
57   virtual void  AddTrack(Float_t*);
58   /*virtual*/void  AddTrack(const AliTPCtrack&);
59   Int_t         DistancetoPrimitive(Int_t px, Int_t py);
60   virtual void  BuildGeometry();
61   virtual void  CreateGeometry() {}
62   virtual void  CreateMaterials();
63   virtual void  Hits2Clusters();
64   virtual void  Hits2ExactClustersSector(Int_t isec); // MI change calculate "exact" cluster position
65
66   virtual void  Hits2Digits();   //MI change
67   virtual void Hits2DigitsSector(Int_t isec);  //MI change
68   virtual void  Init();
69   virtual Int_t IsVersion() const =0;
70   virtual void  Digits2Clusters();
71   virtual void  Clusters2Tracks();
72   TClonesArray  *Clusters() {return fClusters;}
73   TClonesArray  *Tracks()   {return fTracks;}
74
75   Int_t         GetNsectors()       {return fNsectors;}
76   virtual void  MakeBranch(Option_t *opt=" ");
77   virtual void  ResetDigits();
78   virtual void  SetSecAL(Int_t sec);
79   virtual void  SetSecAU(Int_t sec);
80   virtual void  SetSecLows(Int_t s1,Int_t s2,Int_t s3,Int_t s4,Int_t s5, Int_t s6);
81   virtual void  SetSecUps (Int_t s1,Int_t s2,Int_t s3,Int_t s4,Int_t s5, Int_t s6,
82                            Int_t s7,Int_t s8,Int_t s9,Int_t s10, Int_t s11, Int_t s12);
83   virtual void  SetSens(Int_t sens);
84
85   //MK changes
86
87   //MK changes
88
89   virtual void  SetSide(Float_t side);
90   virtual void  SetGasMixt(Int_t nc,Int_t c1,Int_t c2,Int_t c3,Float_t p1,
91                            Float_t p2,Float_t p3); 
92
93   virtual void  StepManager()=0;
94   virtual void  DrawDetector() {}
95   AliTPCDigitsArray*  GetDigitsArray() {return fDigitsArray;} //MI change
96   AliTPCClustersArray* GetClustersArray(){return fClustersArray;} //MI change
97   AliTPCParam *GetParam(){return fTPCParam;} // M.K, M.I changes
98   void SetParam(AliTPCParam *param){fTPCParam=param;} // M.K, M.I changes
99   void SetDigitsArray(AliTPCDigitsArray* param) {fDigitsArray=param;}  //MI change
100   void SetClustersArray(AliTPCClustersArray *clusters) {fClustersArray = clusters;} //MI change
101 private:
102   //
103   void DigitizeRow(Int_t irow,Int_t isec,TObjArray **rowTriplet);
104   Float_t GetSignal(TObjArray *p1, Int_t ntr, TMatrix *m1, TMatrix *m2,
105                     Int_t *IndexRange);
106   void GetList (Float_t label,Int_t np,TMatrix *m,Int_t *IndexRange,
107                 Float_t **pList);
108   void MakeSector(Int_t isec,Int_t nrows,TTree *TH,Stat_t ntracks,TObjArray **row);
109   void TransportElectron(Float_t *xyz, Int_t *index);
110   Int_t fCurrentIndex[4];// index[0] indicates coordinate system, 
111                          // index[1] sector number, 
112                          // index[2] pad row number  
113                          // index[3] pad row number for which signal is calculated
114   
115   ClassDef(AliTPC,2)  // Time Projection Chamber class
116 };
117
118 //_____________________________________________________________________________
119
120 class AliTPCcluster : public TObject {
121 public:
122   Int_t     fTracks[3];//labels of overlapped tracks
123   Int_t     fSector;   //sector number
124   Int_t     fPadRow;   //PadRow number
125   Float_t   fY ;       //Y of cluster
126   Float_t   fZ ;       //Z of cluster
127   Float_t   fQ ;       //Q of cluster (in ADC counts)
128   Float_t   fdEdX;     //dE/dX inside this cluster
129   Float_t   fSigmaY2;  //Sigma Y square of cluster
130   Float_t   fSigmaZ2;  //Sigma Z square of cluster
131   
132 public:
133   AliTPCcluster() {
134     fTracks[0]=fTracks[1]=fTracks[2]=0; 
135     fSector=fPadRow=0;
136     fY=fZ=fQ=fdEdX=fSigmaY2=fSigmaZ2=0.;
137   }
138   AliTPCcluster(Float_t *hits, Int_t*);
139   virtual ~AliTPCcluster() {;}
140   void Use() {fQ=-fQ;} //if fQ<0 cluster is already associated with a track
141   Int_t IsUsed() const {return (fQ<0) ? 1 : 0;}
142   void GetXYZ(Float_t *x, const AliTPCParam *) const; //Get global x,y,z
143   Bool_t IsSortable() const;
144   Int_t Compare(TObject *o) ;
145   ClassDef(AliTPCcluster,1)  // Time Projection Chamber clusters
146 };
147
148
149 //_____________________________________________________________________________
150
151 class AliTPCdigit : public AliDigit {
152 public:
153    Int_t     fSector;     //array of volumes
154    Int_t     fPadRow;     //Row number
155    Int_t     fPad ;       //Pad number
156    Int_t     fTime;       //Time bucket
157    Int_t     fSignal;     //Signal amplitude
158  
159 public:
160    AliTPCdigit() {}
161    AliTPCdigit(Int_t *tracks, Int_t *digits);
162    virtual ~AliTPCdigit() {}
163  
164    ClassDef(AliTPCdigit,1)  // Time Projection Chamber digits
165 };
166  
167  
168 //_____________________________________________________________________________
169  
170 class AliTPChit : public AliHit {
171 public:
172    Int_t     fSector;     //sector number
173    Int_t     fPadRow;     //Pad Row number
174    Float_t   fQ ;         //charge
175  
176 public:
177    AliTPChit() {}
178    AliTPChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits);
179    virtual ~AliTPChit() {}
180  
181    ClassDef(AliTPChit,1)  // Time Projection Chamber hits
182 };
183  
184  
185 //_____________________________________________________________________________
186 class AliTPCtrack : public TObject {
187 //-----------------------------------------------------------------
188 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
189 //-----------------------------------------------------------------
190    Double_t fAlpha;          // rotation angle
191    Double_t fX;              // X-coordinate of this track (reference plane)
192    TVector x;                // vector of track parameters
193    TMatrix C;                // covariance matrix of track parameters
194    TObjArray fClusters;      // clusters belonging to this track
195    Double_t fChi2;           // total chi2 value for this track
196 public:
197    AliTPCtrack(): x(5), C(5,5), fClusters(200) {fAlpha=fX=fChi2=0.;}
198    AliTPCtrack(Float_t *hits);
199    AliTPCtrack(const AliTPCcluster *c, const TVector& xx, const TMatrix& CC,
200                Double_t xr, Double_t alpha); 
201    AliTPCtrack(const AliTPCtrack& t);
202    Int_t Compare(TObject *o);
203    Int_t PropagateTo(Double_t xr,
204                      Double_t x0=28.94,Double_t rho=0.9e-3,Double_t pm=0.139);
205    void PropagateToVertex(
206                    Double_t x0=36.66,Double_t rho=1.2e-3,Double_t pm=0.139);
207    void Update(const AliTPCcluster* c, Double_t chi2);
208    Int_t Rotate(Double_t angle);
209
210    Bool_t IsSortable() const {return kTRUE;}
211    void UseClusters() const ;
212    Double_t GetPredictedChi2(const AliTPCcluster*) const ;
213    Int_t GetLabel(Int_t nrows) const ;
214    void GetPxPyPz(Double_t&, Double_t&, Double_t&) const ;
215    Double_t GetdEdX(Double_t low, Double_t up) const ;
216
217    Double_t GetX() const {return fX;}
218    Double_t GetY() const {return x(0);}
219    Double_t GetZ() const {return x(1);}
220    Double_t GetC() const {return x(2);}
221    Double_t GetEta() const {return x(3);}
222    Double_t GetTgl() const {return x(4);}
223    Double_t GetPt() const {return 0.3*0.2/GetC()/100;}
224    Double_t GetP() const {
225      return TMath::Abs(GetPt())*sqrt(1.+GetTgl()*GetTgl());
226    }
227    Double_t GetSigmaY2() const {return C(0,0);}
228    Double_t GetSigmaZ2() const {return C(1,1);}
229    Double_t GetSigmaC2() const {return C(2,2);}
230    Double_t GetSigmaTgl2() const {return C(4,4);}
231    Double_t GetAlpha() const {return fAlpha;}
232    Double_t GetChi2() const {return fChi2;}
233    operator Int_t() const {return fClusters.GetEntriesFast();}
234    const AliTPCcluster *GetCluster(Int_t i) const {
235       return (const AliTPCcluster *)fClusters.UncheckedAt(i);
236    }
237  
238    ClassDef(AliTPCtrack,1)  // Time Projection Chamber reconstructed tracks
239 };
240
241
242
243 //-----------------------------------------------------------------
244 // Classes for internal tracking use.
245 //-----------------------------------------------------------------
246 const unsigned MAX_CLUSTER_PER_ROW=3500;
247
248 class AliTPCRow {
249 //-----------------------------------------------------------------
250 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
251 //-----------------------------------------------------------------
252    unsigned num_of_clusters;
253    const AliTPCcluster *clusters[MAX_CLUSTER_PER_ROW];
254 public:
255    AliTPCRow() {num_of_clusters=0;}
256    void InsertCluster(const AliTPCcluster*);
257
258    operator Int_t() const {return num_of_clusters;}
259    const AliTPCcluster* operator[](Int_t i) const {return clusters[i];}
260    Int_t Find(Double_t y) const; 
261 };
262
263 class AliTPCSector {
264 //-----------------------------------------------------------------
265 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
266 //-----------------------------------------------------------------
267 protected:
268    unsigned num_of_rows; 
269    AliTPCRow *row;
270    static AliTPCParam *param; 
271 public:
272    AliTPCSector() { row = 0; num_of_rows=0; }
273    virtual ~AliTPCSector() { delete[] row; }
274    static void SetParam(AliTPCParam *p) { param=p; }
275    AliTPCRow& operator[](Int_t i) const { return *(row+i); }
276    Int_t GetNRows() const { return num_of_rows; }
277    virtual Double_t GetX(Int_t l) const = 0;
278    virtual Double_t GetMaxY(Int_t l) const = 0;
279    virtual Double_t GetAlpha() const = 0;
280    virtual Double_t GetAlphaShift() const = 0;
281    virtual Int_t GetRowNumber(Double_t x) const = 0;
282    virtual Double_t GetPadPitchWidth() const = 0;
283 };
284
285 class AliTPCSSector : public AliTPCSector {
286 //-----------------------------------------------------------------
287 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
288 //-----------------------------------------------------------------
289 public:
290    AliTPCSSector(){
291      if (!param) {
292         fprintf(stderr,"AliTPCSSector: parameters are not set !\n");
293         return;
294      }
295      num_of_rows=param->GetNRowLow();
296      row=new AliTPCRow[num_of_rows];
297    }
298    virtual ~AliTPCSSector() {}
299    Double_t GetX(Int_t l) const { return param->GetPadRowRadiiLow(l); }
300    Double_t GetMaxY(Int_t l) const { return GetX(l)*tan(0.5*GetAlpha()); }
301    Double_t GetAlpha() const {return param->GetInnerAngle();}
302    Double_t GetAlphaShift() const {return param->GetInnerAngleShift();}
303    Double_t GetPadPitchWidth() const {
304       return param->GetInnerPadPitchWidth();
305    }
306    Int_t GetRowNumber(Double_t x) const {
307       Double_t r=param->GetPadRowRadiiLow(param->GetNRowLow()-1);
308       if (x > r) return param->GetNRowLow();
309       r=param->GetPadRowRadiiLow(0);
310       if (x < r) return -1;
311       return Int_t((x-r)/param->GetInnerPadPitchLength() + 0.5);
312    }
313 };
314
315 class AliTPCLSector : public AliTPCSector {
316 //-----------------------------------------------------------------
317 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
318 //-----------------------------------------------------------------
319 public:
320    AliTPCLSector(){
321      if (!param) {
322         fprintf(stderr,"AliTPCLSector: parameters are not set !\n");
323         return;
324      }
325      num_of_rows=param->GetNRowUp();
326      row=new AliTPCRow[num_of_rows];
327    }
328    virtual ~AliTPCLSector() {}
329    Double_t GetX(Int_t l) const { return param->GetPadRowRadiiUp(l); }
330    Double_t GetMaxY(Int_t l) const { return GetX(l)*tan(0.5*GetAlpha()); }
331    Double_t GetAlpha() const {return param->GetOuterAngle();}
332    Double_t GetAlphaShift() const {return param->GetOuterAngleShift();}
333    Double_t GetPadPitchWidth() const {
334       return param->GetOuterPadPitchWidth();
335    }
336    Int_t GetRowNumber(Double_t x) const {
337       Double_t r=param->GetPadRowRadiiUp(param->GetNRowUp()-1);
338       if (x > r) return param->GetNRowUp();
339       r=param->GetPadRowRadiiUp(0);
340       if (x < r) return -1;
341       return Int_t((x-r)/param->GetOuterPadPitchLength() + 0.5);
342    }
343 };
344
345 #endif
346