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 */
8 //-------------------------------------------------------
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 #include "AliBarrelTrack.h"
24 class AliTPCtracker : public AliTracker {
26 AliTPCtracker():AliTracker(),fkNIS(0),fkNOS(0) {
27 fInnerSec=fOuterSec=0; fSeeds=0;
30 AliTPCtracker(const AliTPCParam *par);
33 Int_t ReadSeeds(const TFile *in);
36 Int_t LoadClusters(const TFile *cf);
37 void UnloadClusters();
39 AliCluster *GetCluster(Int_t index) const;
40 Int_t Clusters2Tracks(const TFile *in, TFile *out);
41 Int_t Clusters2Tracks(AliESD *event);
42 Int_t PropagateBack(const TFile *in, TFile *out);
43 Int_t PropagateBack(AliESD *event);
44 Int_t PropagateBack(const TFile *in, const TFile *in2, TFile *out);
45 Int_t RefitInward(TFile *outTracks, TFile *inTracks);
47 virtual void CookLabel(AliKalmanTrack *t,Float_t wrong) const;
50 //**************** Internal tracker class **********************
55 fSize=kMaxClusterPerRow/8;
56 fClusterArray=new AliTPCcluster[fSize];
58 ~AliTPCRow() {delete[] fClusterArray;}
59 void InsertCluster(const AliTPCcluster *c, Int_t sec, Int_t row);
60 void ResetClusters() {fN=0;}
61 operator int() const {return fN;}
62 const AliTPCcluster *operator[](Int_t i) const {return fClusters[i];}
63 const AliTPCcluster *GetUnsortedCluster(Int_t i) const {
64 return fClusterArray+i;
66 UInt_t GetIndex(Int_t i) const {return fIndex[i];}
67 Int_t Find(Double_t y) const;
68 void SetX(Double_t x) {fX=x;}
69 Double_t GetX() const {return fX;}
72 Int_t fN; //number of clusters
73 const AliTPCcluster *fClusters[kMaxClusterPerRow]; //pointers to clusters
74 Int_t fSize; //size of array of clusters
75 AliTPCcluster *fClusterArray; //array of clusters
76 UInt_t fIndex[kMaxClusterPerRow]; //indeces of clusters
77 Double_t fX; //X-coordinate of this row
80 AliTPCRow(const AliTPCRow& r); //dummy copy constructor
81 AliTPCRow &operator=(const AliTPCRow& r); //dummy assignment operator
84 //**************** Internal tracker class **********************
87 AliTPCSector() { fN=0; fRow = 0; }
88 ~AliTPCSector() { delete[] fRow; }
89 AliTPCRow& operator[](Int_t i) const { return *(fRow+i); }
90 Int_t GetNRows() const { return fN; }
91 void Setup(const AliTPCParam *par, Int_t flag);
92 Double_t GetX(Int_t l) const {return fRow[l].GetX();}
93 Double_t GetMaxY(Int_t l) const {
94 return GetX(l)*TMath::Tan(0.5*GetAlpha());
96 Double_t GetAlpha() const {return fAlpha;}
97 Double_t GetAlphaShift() const {return fAlphaShift;}
98 Int_t GetRowNumber(Double_t x) const {
99 //return pad row number for this x
103 if (x > r) return fN;
105 if (x < r) return -1;
106 return Int_t((x-r)/f1PadPitchLength + 0.5);}
109 if (x > r) return fN;
111 if (x < r) return -1;
112 Double_t r1=fRow[64].GetX();
114 return Int_t((x-r)/f1PadPitchLength + 0.5);}
116 return (Int_t((x-r1)/f2PadPitchLength + 0.5)+64);}
119 Double_t GetPadPitchWidth() const {return fPadPitchWidth;}
122 Int_t fN; //number of pad rows
123 AliTPCRow *fRow; //array of pad rows
124 Double_t fAlpha; //opening angle
125 Double_t fAlphaShift; //shift angle;
126 Double_t fPadPitchWidth; //pad pitch width
127 Double_t f1PadPitchLength; //pad pitch length
128 Double_t f2PadPitchLength; //pad pitch length
130 AliTPCSector(const AliTPCSector &s); //dummy copy contructor
131 AliTPCSector& operator=(const AliTPCSector &s);//dummy assignment operator
134 //**************** Internal tracker class **********************
135 class AliTPCseed : public AliTPCtrack {
137 AliTPCseed():AliTPCtrack(){}
138 AliTPCseed(const AliTPCtrack &t):AliTPCtrack(t){}
139 AliTPCseed(const AliKalmanTrack &t, Double_t a):AliTPCtrack(t,a){}
140 AliTPCseed(UInt_t index, const Double_t xx[5],
141 const Double_t cc[15], Double_t xr, Double_t alpha):
142 AliTPCtrack(index, xx, cc, xr, alpha) {}
143 void SetSampledEdx(Float_t q, Int_t i) {
144 Double_t s=GetSnp(), t=GetTgl();
145 q *= TMath::Sqrt((1-s*s)/(1+t*t));
148 void CookdEdx(Double_t low=0.05, Double_t up=0.70);
151 Float_t fdEdxSample[200]; //array of dE/dx samples
156 void MakeSeeds(Int_t i1, Int_t i2);
157 Int_t FollowProlongation(AliTPCseed& t, Int_t rf=0);
158 Int_t FollowBackProlongation(AliTPCseed &s, const AliTPCtrack &t);
159 Int_t FollowRefitInward(AliTPCseed *seed, AliTPCtrack *track);
161 AliTPCtracker(const AliTPCtracker& r); //dummy copy constructor
162 AliTPCtracker &operator=(const AliTPCtracker& r);//dummy assignment operator
164 const Int_t fkNIS; //number of inner sectors
165 AliTPCSector *fInnerSec; //array of inner sectors
166 const Int_t fkNOS; //number of outer sectors
167 AliTPCSector *fOuterSec; //array of outer sectors
169 Int_t fN; //number of "active" sectors
170 AliTPCSector *fSectors; //pointer to "active" sectors;
172 AliTPCParam *fParam; //! TPC parameters for outer reference plane [SR, GSI, 18.02.2003]
173 TObjArray *fSeeds; //array of track seeds
176 void SetBarrelTree(const char *mode);
177 void StoreBarrelTrack(AliTPCtrack *ps, Int_t refPlane, Int_t isIn);
180 TFile *fBarrelFile; // file with "barrel" tracks
181 TTree *fBarrelTree; // tree with "barrel" tracks
182 TBranch *fBarrelBranch;
183 TClonesArray *fBarrelArray;
184 AliBarrelTrack *fBarrelTrack;
186 ClassDef(AliTPCtracker,1) // Time Projection Chamber tracker