3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
8 ////////////////////////////////////////////////
9 // Manager class for TPC //
10 ////////////////////////////////////////////////
12 #include "AliDetector.h"
15 #include "AliTPCSecGeo.h"
16 #include "AliTPCParam.h"
19 #include <TClonesArray.h>
27 class AliTPC : public AliDetector {
30 Int_t fSecAL; // Upper sector selector
31 Int_t fSecAU; // Lower sector selector
32 Int_t fSecLows[6]; // List of lower sectors selected
33 Int_t fSecUps[12]; // List of upper sectors selected
34 Int_t fNsectors; // Number of sectors in TPC
35 Int_t fNclusters; // Number of clusters in TPC
36 Int_t fNtracks; // Number of tracks in TPC
37 Int_t *fClustersIndex; // Index for each sector in fClusters
38 Int_t *fDigitsIndex; // Index for each sector in fDigits
42 Float_t fSide; // selects left(-1), right(+1), or both(0) sides of the TPC
43 Int_t fNoComp; // number of a drift gas components
44 Int_t fMixtComp[3]; // drift gas components
45 Float_t fMixtProp[3]; // mixture proportions
49 TClonesArray *fClusters; // List of clusters for all sectors
50 TClonesArray *fTracks; // List of reconstructed tracks
52 AliTPCD * fDigParam; //detector parameters
55 AliTPC(const char *name, const char *title);
57 virtual void AddCluster(Float_t*, Int_t*);
58 /*virtual*/void AddCluster(const AliTPCcluster&);
59 virtual void AddDigit(Int_t*, Int_t*);
60 virtual void AddHit(Int_t, Int_t*, Float_t*);
61 virtual void AddTrack(Float_t*);
62 /*virtual*/void AddTrack(const AliTPCtrack&);
63 Int_t DistancetoPrimitive(Int_t px, Int_t py);
64 virtual void BuildGeometry();
65 virtual void CreateGeometry() {}
66 virtual void CreateMaterials();
67 virtual void Hits2Clusters();
69 virtual void Hits2Digits(); //MI change
70 virtual void Hits2DigitsSector(Int_t isec); //MI change
72 virtual Int_t IsVersion() const =0;
73 virtual void Digits2Clusters();
74 virtual void Clusters2Tracks();
75 TClonesArray *Clusters() {return fClusters;}
76 TClonesArray *Tracks() {return fTracks;}
77 Int_t *GetClustersIndex() {return fClustersIndex;}
78 Int_t *GetDigitsIndex() {return fDigitsIndex;}
79 Int_t GetNsectors() {return fNsectors;}
80 virtual void MakeBranch(Option_t *opt=" ");
81 virtual void ResetDigits();
82 virtual void SetSecAL(Int_t sec);
83 virtual void SetSecAU(Int_t sec);
84 virtual void SetSecLows(Int_t s1,Int_t s2,Int_t s3,Int_t s4,Int_t s5, Int_t s6);
85 virtual void SetSecUps (Int_t s1,Int_t s2,Int_t s3,Int_t s4,Int_t s5, Int_t s6,
86 Int_t s7,Int_t s8,Int_t s9,Int_t s10, Int_t s11, Int_t s12);
87 virtual void SetSens(Int_t sens);
90 virtual void SetSide(Float_t side);
91 virtual void SetGasMixt(Int_t nc,Int_t c1,Int_t c2,Int_t c3,Float_t p1,
92 Float_t p2,Float_t p3);
94 virtual void StepManager()=0;
95 virtual void DrawDetector() {}
96 AliTPCD* GetDigParam() {return fDigParam;} //MI change8
97 void SetDigParam(AliTPCD* param) {fDigParam=param;} //MI must think about it
100 void ElDiff(Float_t *xyz);
101 void MakeTriplet(Int_t row,TObjArray **rowTriplet,
104 void ExB(Float_t *xyz);
105 void DigitizeRow(Int_t irow,Int_t isec,TObjArray **rowTriplet);
106 Float_t GetSignal(TObjArray *p1, Int_t ntr, Int_t np, TMatrix *m1, TMatrix *m2,
108 void GetList (Float_t label,Int_t np,TMatrix *m,Int_t *IndexRange,
110 void MakeSector(Int_t isec,Int_t nrows,TTree *TH,Stat_t ntracks,TObjArray **row);
111 void GetCrossTalk (Int_t iFlag,TObjArray *p,Int_t ntracks,Int_t *npads,
115 ClassDef(AliTPC,2) // Time Projection Chamber class
118 //_____________________________________________________________________________
120 class AliTPCcluster : public TObject {
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
134 fTracks[0]=fTracks[1]=fTracks[2]=0;
136 fY=fZ=fQ=fdEdX=fSigmaY2=fSigmaZ2=0.;
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 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
149 //_____________________________________________________________________________
151 class AliTPCdigit : public AliDigit {
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
161 AliTPCdigit(Int_t *tracks, Int_t *digits);
162 virtual ~AliTPCdigit() {}
164 ClassDef(AliTPCdigit,1) // Time Projection Chamber digits
168 //_____________________________________________________________________________
170 class AliTPChit : public AliHit {
172 Int_t fSector; //sector number
173 Int_t fPadRow; //Pad Row number
174 Float_t fQ ; //charge
178 AliTPChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits);
179 virtual ~AliTPChit() {}
181 ClassDef(AliTPChit,1) // Time Projection Chamber hits
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
197 AliTPCtrack(Float_t *hits);
198 AliTPCtrack(const AliTPCcluster *c, const TVector& xx, const TMatrix& CC,
199 Double_t xr, Double_t alpha);
200 AliTPCtrack(const AliTPCtrack& t);
201 Int_t Compare(TObject *o);
202 int PropagateTo(Double_t xr,
203 Double_t x0=28.94,Double_t rho=0.9e-3,Double_t pm=0.139);
204 void PropagateToVertex(
205 Double_t x0=36.66,Double_t rho=1.2e-3,Double_t pm=0.139);
206 void Update(const AliTPCcluster* c, Double_t chi2);
207 int Rotate(Double_t angle);
209 Bool_t IsSortable() const {return kTRUE;}
210 void UseClusters() const ;
211 Double_t GetPredictedChi2(const AliTPCcluster*) const ;
212 int GetLabel(int nrows) const ;
213 void GetPxPyPz(Double_t&, Double_t&, Double_t&) const ;
214 Double_t GetdEdX(Double_t low, Double_t up) const ;
216 Double_t GetX() const {return fX;}
217 Double_t GetY() const {return x(0);}
218 Double_t GetZ() const {return x(1);}
219 Double_t GetC() const {return x(2);}
220 Double_t GetEta() const {return x(3);}
221 Double_t GetTgl() const {return x(4);}
222 Double_t GetPt() const {return 0.3*0.2/GetC()/100;}
223 Double_t GetP() const {
224 return TMath::Abs(GetPt())*sqrt(1.+GetTgl()*GetTgl());
226 Double_t GetSigmaY2() const {return C(0,0);}
227 Double_t GetSigmaZ2() const {return C(1,1);}
228 Double_t GetSigmaC2() const {return C(2,2);}
229 Double_t GetSigmaTgl2() const {return C(4,4);}
230 Double_t GetAlpha() const {return fAlpha;}
231 Double_t GetChi2() const {return fChi2;}
232 operator int() const {return fClusters.GetEntriesFast();}
234 ClassDef(AliTPCtrack,1) // Time Projection Chamber reconstructed tracks
239 //-----------------------------------------------------------------
240 // Classes for internal tracking use.
241 //-----------------------------------------------------------------
242 const unsigned MAX_CLUSTER_PER_ROW=3500;
245 //-----------------------------------------------------------------
246 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
247 //-----------------------------------------------------------------
248 unsigned num_of_clusters;
249 const AliTPCcluster *clusters[MAX_CLUSTER_PER_ROW];
251 AliTPCRow() {num_of_clusters=0;}
252 void InsertCluster(const AliTPCcluster*);
254 operator int() const {return num_of_clusters;}
255 const AliTPCcluster* operator[](int i) const {return clusters[i];}
256 int Find(Double_t y) const;
260 //-----------------------------------------------------------------
261 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
262 //-----------------------------------------------------------------
264 unsigned num_of_rows;
266 static AliTPCParam *param;
268 AliTPCSector() { row = 0; num_of_rows=0; }
269 virtual ~AliTPCSector() { delete[] row; }
270 static void SetParam(AliTPCParam *p) { param=p; }
271 AliTPCRow& operator[](int i) const { return *(row+i); }
272 int GetNRows() const { return num_of_rows; }
273 virtual Double_t GetX(int l) const = 0;
274 virtual Double_t GetMaxY(int l) const = 0;
275 virtual Double_t GetAlpha() const = 0;
276 virtual Double_t GetAlphaShift() const = 0;
277 virtual Int_t GetRowNumber(Double_t x) const = 0;
280 class AliTPCSSector : public AliTPCSector {
281 //-----------------------------------------------------------------
282 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
283 //-----------------------------------------------------------------
287 fprintf(stderr,"AliTPCSSector: parameters are not set !\n");
290 num_of_rows=param->GetNRowLow();
291 row=new AliTPCRow[num_of_rows];
293 virtual ~AliTPCSSector() {}
294 Double_t GetX(int l) const { return param->GetPadRowRadiiLow(l); }
295 Double_t GetMaxY(int l) const { return GetX(l)*tan(0.5*GetAlpha()); }
296 Double_t GetAlpha() const {return param->GetInnerAngle();}
297 Double_t GetAlphaShift() const {return param->GetInnerAngleShift();}
298 Int_t GetRowNumber(Double_t x) const {
299 Double_t r=param->GetInnerRadiusUp();
300 if (x > r) return param->GetNRowLow();
301 r=param->GetInnerRadiusLow();
302 if (x < r) return -1;
303 return int((x-r)/param->GetPadPitchLength() + 0.5);
307 class AliTPCLSector : public AliTPCSector {
308 //-----------------------------------------------------------------
309 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
310 //-----------------------------------------------------------------
314 fprintf(stderr,"AliTPCLSector: parameters are not set !\n");
317 num_of_rows=param->GetNRowUp();
318 row=new AliTPCRow[num_of_rows];
320 virtual ~AliTPCLSector() {}
321 Double_t GetX(int l) const { return param->GetPadRowRadiiUp(l); }
322 Double_t GetMaxY(int l) const { return GetX(l)*tan(0.5*GetAlpha()); }
323 Double_t GetAlpha() const {return param->GetOuterAngle();}
324 Double_t GetAlphaShift() const {return param->GetOuterAngleShift();}
325 Int_t GetRowNumber(Double_t x) const {
326 Double_t r=param->GetOuterRadiusUp();
327 if (x > r) return param->GetNRowUp();
328 r=param->GetOuterRadiusLow();
329 if (x < r) return -1;
330 return int((x-r)/param->GetPadPitchLength() + 0.5);