Line data Source code
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 0 : AliTRDtrackingSector* GetTrackingSector(Int_t sec) {return &fTrSec[sec];}
81 :
82 : Int_t Clusters2Tracks(AliESDEvent *esd);
83 : static ETRDtrackerV1BetheBloch
84 0 : 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 0 : TClonesArray* GetListOfClusters() const { return fClusters;}
89 0 : TClonesArray* GetListOfTracklets() const { return fTracklets;}
90 0 : TClonesArray* GetListOfTracks() const { return fTracks;}
91 13192 : 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 20 : Bool_t IsClustersOwner() const { return TestBit(kOwner);}
109 16 : Bool_t HasRemoveContainers() const { return TestBit(kRemoveContainers);}
110 :
111 0 : static void SetBetheBloch(ETRDtrackerV1BetheBloch bb) {fgBB = bb;}
112 0 : void SetClustersOwner(Bool_t own=kTRUE) {SetBit(kOwner, own); if(!own) fClusters = NULL;}
113 0 : 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 0 : static void SetNTimeBins(Int_t nTimeBins){fgNTimeBins = nTimeBins; }
124 8 : void SetReconstructor(const AliTRDReconstructor *rec) {fkReconstructor = rec;}
125 : void UnloadClusters();
126 :
127 : class AliTRDLeastSquare{
128 : public:
129 : AliTRDLeastSquare();
130 8 : ~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 6220 : 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 0 : Double_t GetDzDx() const { return fParameters[4]; };
160 : Double_t GetCurvature() const;
161 : void GetCovAt(Double_t x, Double_t *cov) const;
162 :
163 0 : void SetRiemanFitter(TLinearFitter *const fitter) { fTrackFitter = fitter; }
164 : void SetTracklet(Int_t il, AliTRDseedV1 * const tracklet);
165 0 : 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 6444 : ClassDef(AliTRDtrackerV1, 7) // TRD tracker - tracklet based tracking
239 :
240 : };
241 : #endif
|