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