]>
Commit | Line | Data |
---|---|---|
1 | #ifndef ALITRDTRACKERV1_H | |
2 | #define ALITRDTRACKERV1_H | |
3 | ||
4 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
5 | * See cxx source for full Copyright notice */ | |
6 | /* $Id$ */ | |
7 | ||
8 | //////////////////////////////////////////////////////////////////////////// | |
9 | // // | |
10 | // The TRD tracker // | |
11 | // // | |
12 | // Authors: // | |
13 | // Marian Ivanov <M.Ivanov@gsi.de> // | |
14 | // Alex Bercuci <A.Bercuci@gsi.de> // | |
15 | // Jouri Belikov <J.Belikov@cern.ch> // | |
16 | // Markus Fasel <M.Fasel@gsi.de> // | |
17 | // // | |
18 | //////////////////////////////////////////////////////////////////////////// | |
19 | ||
20 | //#ifndef ALITRACKER_H | |
21 | #include "AliTracker.h" | |
22 | //#endif | |
23 | ||
24 | //#ifndef ALITRDTRACKINGSECTOR_H | |
25 | #include "AliTRDtrackingSector.h" | |
26 | //#endif | |
27 | ||
28 | //#ifndef ROOT_TMatrixDfwd | |
29 | #include <TMatrixDfwd.h> | |
30 | //#endif | |
31 | ||
32 | /************************************************************************** | |
33 | * Class Status see source file * | |
34 | **************************************************************************/ | |
35 | ||
36 | class TFile; | |
37 | class TTreeSRedirector; | |
38 | class TClonesArray; | |
39 | class TLinearFitter; | |
40 | ||
41 | class AliRieman; | |
42 | class AliESDEvent; | |
43 | class AliCluster; | |
44 | class AliTrackPoint; | |
45 | ||
46 | class AliTRDcluster; | |
47 | class AliTRDseedV1; | |
48 | class AliTRDtrackingChamber; | |
49 | class AliTRDchamberTimeBin; | |
50 | class AliTRDtrackerFitter; | |
51 | class AliTRDtrackV1; | |
52 | class AliTRDReconstructor; | |
53 | class AliTRDrecoParam; | |
54 | class AliTRDtrackerV1 : public AliTracker | |
55 | { | |
56 | public: | |
57 | enum{ | |
58 | kOwner = BIT(14) // owner of clusters | |
59 | ,kRemoveContainers = BIT(15) // delete containers after usage | |
60 | }; | |
61 | enum ETRDtrackerV1const { | |
62 | kMaxLayersPerSector = 1000 | |
63 | , kMaxTimeBinIndex = 216 | |
64 | , kTrackingSectors = 18 | |
65 | , kNTimeBins = 35 | |
66 | , kNPlanes = 6 | |
67 | , kNSeedPlanes = 4 | |
68 | , kMaxTracksStack = 100 | |
69 | , kNConfigs = 15 | |
70 | }; | |
71 | enum ETRDtrackerV1BetheBloch { | |
72 | kGeant = 0 | |
73 | ,kSolid | |
74 | ,kGas | |
75 | }; | |
76 | AliTRDtrackerV1(const AliTRDReconstructor *rec = NULL); | |
77 | virtual ~AliTRDtrackerV1(); | |
78 | ||
79 | //temporary | |
80 | AliTRDtrackingSector* GetTrackingSector(Int_t sec) {return &fTrSec[sec];} | |
81 | ||
82 | Int_t Clusters2Tracks(AliESDEvent *esd); | |
83 | static ETRDtrackerV1BetheBloch | |
84 | GetBetheBloch() { return fgBB;} | |
85 | AliCluster* GetCluster(Int_t index) const; | |
86 | AliTRDseedV1* GetTracklet(Int_t index) const; | |
87 | AliKalmanTrack* GetTrack(Int_t index) const; | |
88 | TClonesArray* GetListOfClusters() const { return fClusters;} | |
89 | TClonesArray* GetListOfTracklets() const { return fTracklets;} | |
90 | TClonesArray* GetListOfTracks() const { return fTracks;} | |
91 | static Int_t GetNTimeBins() { return fgNTimeBins;} | |
92 | static void GetExtrapolationConfig(Int_t iconfig, Int_t planes[2]); | |
93 | static void GetSeedingConfig(Int_t iconfig, Int_t planes[4]); | |
94 | ||
95 | static TLinearFitter* GetTiltedRiemanFitter(); | |
96 | static TLinearFitter* GetTiltedRiemanFitterConstraint(); | |
97 | static AliRieman* GetRiemanFitter(); | |
98 | static void FitRieman(AliTRDcluster **clusters, Double_t chi2[2]); | |
99 | static Float_t FitRieman(AliTRDseedV1 *tracklets, Double_t *chi2, Int_t *const planes = NULL); | |
100 | static Float_t FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Double_t zVertex); | |
101 | static Float_t FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigError); | |
102 | static Double_t FitTiltedRiemanV1(AliTRDseedV1 *tracklets); | |
103 | ||
104 | static Double_t FitRiemanTilt(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL); | |
105 | static Double_t FitLine(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL); | |
106 | static Double_t FitKalman(AliTRDtrackV1 *trk, AliTRDseedV1 * const tracklets = NULL, Bool_t up=0, Int_t np = 0, AliTrackPoint *points = NULL); | |
107 | ||
108 | Bool_t IsClustersOwner() const { return TestBit(kOwner);} | |
109 | Bool_t HasRemoveContainers() const { return TestBit(kRemoveContainers);} | |
110 | ||
111 | static void SetBetheBloch(ETRDtrackerV1BetheBloch bb) {fgBB = bb;} | |
112 | void SetClustersOwner(Bool_t own=kTRUE) {SetBit(kOwner, own); if(!own) fClusters = NULL;} | |
113 | void SetRemoveContainers(Bool_t rm=kTRUE) {SetBit(kRemoveContainers, rm);} | |
114 | ||
115 | Int_t FollowBackProlongation(AliTRDtrackV1 &t); | |
116 | Int_t FollowProlongation(AliTRDtrackV1 &t); | |
117 | Int_t LoadClusters(TTree *cTree); | |
118 | Int_t LoadClusters(TClonesArray *const clusters); | |
119 | Int_t PropagateBack(AliESDEvent *event); | |
120 | static Int_t PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t maxStep); | |
121 | Bool_t ReadClusters(TTree *in); | |
122 | Int_t RefitInward(AliESDEvent *event); | |
123 | static void SetNTimeBins(Int_t nTimeBins){fgNTimeBins = nTimeBins; } | |
124 | void SetReconstructor(const AliTRDReconstructor *rec) {fkReconstructor = rec;} | |
125 | void UnloadClusters(); | |
126 | ||
127 | class AliTRDLeastSquare{ | |
128 | public: | |
129 | AliTRDLeastSquare(); | |
130 | ~AliTRDLeastSquare(){}; | |
131 | ||
132 | void AddPoint(const Double_t * const x, Double_t y, Double_t sigmaY); | |
133 | void RemovePoint(const Double_t * const x, Double_t y, Double_t sigmaY); | |
134 | Bool_t Eval(); | |
135 | void Reset(); | |
136 | ||
137 | Double_t GetFunctionParameter(Int_t ParNumber) const {return fParams[ParNumber];} | |
138 | Double_t GetFunctionValue(const Double_t * const xpos) const; | |
139 | void GetCovarianceMatrix(Double_t *storage) const; | |
140 | private: | |
141 | AliTRDLeastSquare(const AliTRDLeastSquare &); | |
142 | AliTRDLeastSquare& operator=(const AliTRDLeastSquare &); | |
143 | Double_t fParams[2]; // Fitparameter | |
144 | Double_t fCovarianceMatrix[3]; // Covariance Matrix | |
145 | Double_t fSums[6]; // Sums | |
146 | }; | |
147 | ||
148 | class AliTRDtrackFitterRieman{ | |
149 | public: | |
150 | AliTRDtrackFitterRieman(); | |
151 | ~AliTRDtrackFitterRieman(); | |
152 | ||
153 | Double_t Eval(); | |
154 | void Reset(); | |
155 | ||
156 | Double_t GetYat(Double_t x) const; | |
157 | Double_t GetDyDxAt(Double_t x) const; | |
158 | Double_t GetZat(Double_t x) const; | |
159 | Double_t GetDzDx() const { return fParameters[4]; }; | |
160 | Double_t GetCurvature() const; | |
161 | void GetCovAt(Double_t x, Double_t *cov) const; | |
162 | ||
163 | void SetRiemanFitter(TLinearFitter *const fitter) { fTrackFitter = fitter; } | |
164 | void SetTracklet(Int_t il, AliTRDseedV1 * const tracklet); | |
165 | void SetSysClusterError(Double_t err) { fSysClusterError = err; }; | |
166 | private: | |
167 | AliTRDtrackFitterRieman(const AliTRDtrackFitterRieman &); | |
168 | AliTRDtrackFitterRieman &operator=(const AliTRDtrackFitterRieman &); | |
169 | void UpdateFitters(const AliTRDseedV1 * const tracklet); | |
170 | Bool_t CheckAcceptable(Double_t offset, Double_t slope); | |
171 | Double_t CalculateReferenceX(); | |
172 | ||
173 | TLinearFitter *fTrackFitter; // Fitter for linearized track model | |
174 | AliTRDLeastSquare *fZfitter; // Linear fitter in z-Direction | |
175 | AliTRDseedV1 *fTracklets[kNPlanes]; // Tracklet container | |
176 | TMatrixD *fCovarPolY; // Polynomial Covariance Matrix Estimation (y-direction) | |
177 | TMatrixD *fCovarPolZ; // Polynomial Covariance Matrix Estimation (z-direction) | |
178 | Double_t fXref; // Reference x position for fit in z-Direction | |
179 | Double_t fSysClusterError; // Systematic cluster Error | |
180 | Double_t fParameters[5]; // Track Model Parameter | |
181 | Double_t fSumPolY[5]; // Sums for polynomial Covariance Matrix Estimation (y-direction) | |
182 | Double_t fSumPolZ[3]; // Sums for polynomial Covariance Matrix Estimation (z-direction) | |
183 | }; | |
184 | ||
185 | protected: | |
186 | static Bool_t AdjustSector(AliTRDtrackV1 *const track); | |
187 | Double_t BuildSeedingConfigs(AliTRDtrackingChamber **stack, Int_t *configs); | |
188 | Int_t BuildTrackingContainers(); | |
189 | static Float_t CalculateChi2Z(const AliTRDseedV1 *tracklets, Double_t offset, Double_t slope, Double_t xref); | |
190 | Int_t Clusters2TracksSM(Int_t sector, AliESDEvent *esd); | |
191 | Int_t Clusters2TracksStack(AliTRDtrackingChamber **stack, TClonesArray * const esdTrackList); | |
192 | AliTRDseedV1* GetTracklet(const AliTRDtrackV1 *const trk, Int_t plane, Int_t &idx); | |
193 | Bool_t GetTrackPoint(Int_t index, AliTrackPoint &p) const; | |
194 | Float_t GetR4Layer(Int_t ly) const { return fR[ly];} | |
195 | Int_t MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * const sseed, const Int_t * const ipar); | |
196 | AliTRDtrackV1* MakeTrack(AliTRDseedV1 * const tracklet); | |
197 | AliTRDtrackV1* SetTrack(const AliTRDtrackV1 * const track); | |
198 | AliTRDseedV1* SetTracklet(const AliTRDseedV1 * const tracklet); | |
199 | void UnsetTrackletsTrack(const AliTRDtrackV1 * const track); | |
200 | ||
201 | private: | |
202 | AliTRDtrackerV1(const AliTRDtrackerV1 &tracker); | |
203 | AliTRDtrackerV1 &operator=(const AliTRDtrackerV1 &tracker); | |
204 | Double_t CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]); | |
205 | Double_t CalculateTrackLikelihood(Double_t *chi2); | |
206 | Bool_t ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDseedV1 *tracklet, Double_t &chi2); | |
207 | static Float_t CalculateReferenceX(const AliTRDseedV1 *const tracklets); | |
208 | void ResetSeedTB(); | |
209 | Float_t GetChi2Y(const AliTRDseedV1 *const tracklets) const; | |
210 | Float_t GetChi2Z(const AliTRDseedV1 *const tracklets) const; | |
211 | Float_t GetChi2Phi(const AliTRDseedV1 *const tracklets) const; | |
212 | ||
213 | const AliTRDReconstructor *fkReconstructor; // reconstructor manager | |
214 | const AliTRDrecoParam *fkRecoParam; // reco param for the current event | |
215 | AliTRDgeometry *fGeom; // Pointer to TRD geometry | |
216 | AliTRDtrackingSector fTrSec[kTrackingSectors]; // Array of tracking sectors; | |
217 | TClonesArray *fClusters; // List of clusters | |
218 | TClonesArray *fTracklets; // List of tracklets | |
219 | TClonesArray *fTracks; // List of tracks | |
220 | TClonesArray *fTracksESD; // List of ESD tracks in current SM | |
221 | Float_t fR[kNPlanes]; //! rough radial position of each TRD layer | |
222 | ||
223 | // stand alone tracking | |
224 | static Double_t fgTopologicQA[kNConfigs]; // Topologic quality | |
225 | Double_t fTrackQuality[kMaxTracksStack]; // Track quality | |
226 | Int_t fSeedLayer[kMaxTracksStack]; // Seed layer | |
227 | AliTRDchamberTimeBin *fSeedTB[kNSeedPlanes]; // seeding time bin planes | |
228 | Int_t fSieveSeeding; //! Seeding iterator | |
229 | Int_t fEventInFile; //! event in file being tracked (debug purposes) | |
230 | ||
231 | static ETRDtrackerV1BetheBloch fgBB; // Bethe Bloch method | |
232 | static const Double_t fgkX0[kNPlanes]; // default values for the position of anode wire | |
233 | static Int_t fgNTimeBins; // Timebins per plane in track prolongation | |
234 | static TLinearFitter *fgTiltedRieman; // Fitter for the tilted Rieman fit without vertex constriant | |
235 | static TLinearFitter *fgTiltedRiemanConstrained; // Fitter for the tilted Rieman fit with vertex constraint | |
236 | static AliRieman *fgRieman; // Fitter for the untilted Rieman fit | |
237 | ||
238 | ClassDef(AliTRDtrackerV1, 7) // TRD tracker - tracklet based tracking | |
239 | ||
240 | }; | |
241 | #endif |