Fix histo title axis name; fix checking of NLM in Pi0EbE
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackerV1.h
... / ...
CommitLineData
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
36class TFile;
37class TTreeSRedirector;
38class TClonesArray;
39class TLinearFitter;
40
41class AliRieman;
42class AliESDEvent;
43class AliCluster;
44class AliTrackPoint;
45
46class AliTRDcluster;
47class AliTRDseedV1;
48class AliTRDtrackingChamber;
49class AliTRDchamberTimeBin;
50class AliTRDtrackerFitter;
51class AliTRDtrackV1;
52class AliTRDReconstructor;
53class AliTRDrecoParam;
54class AliTRDtrackerV1 : public AliTracker
55{
56public:
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
185protected:
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
201private:
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