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