1 #ifndef ALITRDTRACKERV1_H
2 #define ALITRDTRACKERV1_H
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * See cxx source for full Copyright notice */
8 ////////////////////////////////////////////////////////////////////////////
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> //
18 ////////////////////////////////////////////////////////////////////////////
20 //#ifndef ALITRACKER_H
21 #include "AliTracker.h"
24 //#ifndef ALITRDTRACKINGSECTOR_H
25 #include "AliTRDtrackingSector.h"
28 //#ifndef ROOT_TMatrixDfwd
29 #include <TMatrixDfwd.h>
32 /**************************************************************************
33 * Class Status see source file *
34 **************************************************************************/
37 class TTreeSRedirector;
48 class AliTRDtrackingChamber;
49 class AliTRDchamberTimeBin;
50 class AliTRDtrackerFitter;
52 class AliTRDReconstructor;
53 class AliTRDrecoParam;
54 class AliTRDtrackerV1 : public AliTracker
58 kOwner = BIT(14) // owner of clusters
59 ,kRemoveContainers = BIT(15) // delete containers after usage
62 kMaxLayersPerSector = 1000
63 , kMaxTimeBinIndex = 216
64 , kTrackingSectors = 18
68 , kMaxTracksStack = 100
71 AliTRDtrackerV1(AliTRDReconstructor *rec = NULL);
72 virtual ~AliTRDtrackerV1();
75 AliTRDtrackingSector* GetTrackingSector(Int_t sec) {return &fTrSec[sec];}
77 Int_t Clusters2Tracks(AliESDEvent *esd);
78 AliCluster* GetCluster(Int_t index) const;
79 AliTRDseedV1* GetTracklet(Int_t index) const;
80 AliKalmanTrack* GetTrack(Int_t index) const;
81 TClonesArray* GetListOfClusters() const { return fClusters;}
82 TClonesArray* GetListOfTracklets() const { return fTracklets;}
83 TClonesArray* GetListOfTracks() const { return fTracks;}
84 static Int_t GetNTimeBins() { return fgNTimeBins;}
85 static void GetExtrapolationConfig(Int_t iconfig, Int_t planes[2]);
86 static void GetSeedingConfig(Int_t iconfig, Int_t planes[4]);
87 static TLinearFitter* GetTiltedRiemanFitter();
88 static TLinearFitter* GetTiltedRiemanFitterConstraint();
89 static AliRieman* GetRiemanFitter();
90 static void FitRieman(AliTRDcluster **clusters, Double_t chi2[2]);
91 static Float_t FitRieman(AliTRDseedV1 *tracklets, Double_t *chi2, Int_t *const planes = NULL);
92 static Float_t FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Double_t zVertex);
93 static Float_t FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigError);
94 static Double_t FitTiltedRiemanV1(AliTRDseedV1 *tracklets);
96 static Double_t FitRiemanTilt(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL);
97 static Double_t FitLine(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL);
98 static Double_t FitKalman(AliTRDtrackV1 *trk, AliTRDseedV1 * const tracklets = NULL, Bool_t up=0, Int_t np = 0, AliTrackPoint *points = NULL);
100 Bool_t IsClustersOwner() const { return TestBit(kOwner);}
101 Bool_t HasRemoveContainers() const { return TestBit(kRemoveContainers);}
102 void SetClustersOwner(Bool_t own=kTRUE) {SetBit(kOwner, own); if(!own) fClusters = NULL;}
103 void SetRemoveContainers(Bool_t rm=kTRUE) {SetBit(kRemoveContainers, rm);}
105 Int_t FollowBackProlongation(AliTRDtrackV1 &t);
106 Int_t FollowProlongation(AliTRDtrackV1 &t);
107 Int_t LoadClusters(TTree *cTree);
108 Int_t LoadClusters(TClonesArray *const clusters);
109 Int_t PropagateBack(AliESDEvent *event);
110 static Int_t PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t maxStep);
111 Int_t ReadClusters(TClonesArray* &array, TTree *in) const;
112 Int_t RefitInward(AliESDEvent *event);
113 static void SetNTimeBins(Int_t nTimeBins){fgNTimeBins = nTimeBins; }
114 void SetReconstructor(const AliTRDReconstructor *rec) {fkReconstructor = rec;}
115 void UnloadClusters();
117 class AliTRDLeastSquare{
120 ~AliTRDLeastSquare(){};
122 void AddPoint(const Double_t * const x, Double_t y, Double_t sigmaY);
123 void RemovePoint(const Double_t * const x, Double_t y, Double_t sigmaY);
127 Double_t GetFunctionParameter(Int_t ParNumber) const {return fParams[ParNumber];}
128 Double_t GetFunctionValue(const Double_t * const xpos) const;
129 void GetCovarianceMatrix(Double_t *storage) const;
131 AliTRDLeastSquare(const AliTRDLeastSquare &);
132 AliTRDLeastSquare& operator=(const AliTRDLeastSquare &);
133 Double_t fParams[2]; // Fitparameter
134 Double_t fCovarianceMatrix[3]; // Covariance Matrix
135 Double_t fSums[6]; // Sums
138 class AliTRDtrackFitterRieman{
140 AliTRDtrackFitterRieman();
141 ~AliTRDtrackFitterRieman();
146 Double_t GetYat(Double_t x) const;
147 Double_t GetDyDxAt(Double_t x) const;
148 Double_t GetZat(Double_t x) const;
149 Double_t GetDzDx() const { return fParameters[4]; };
150 Double_t GetCurvature() const;
151 void GetCovAt(Double_t x, Double_t *cov) const;
153 void SetRiemanFitter(TLinearFitter *const fitter) { fTrackFitter = fitter; }
154 void SetTracklet(Int_t il, AliTRDseedV1 * const tracklet);
155 void SetSysClusterError(Double_t err) { fSysClusterError = err; };
157 AliTRDtrackFitterRieman(const AliTRDtrackFitterRieman &);
158 AliTRDtrackFitterRieman &operator=(const AliTRDtrackFitterRieman &);
159 void UpdateFitters(AliTRDseedV1 * const tracklet);
160 Bool_t CheckAcceptable(Double_t offset, Double_t slope);
161 Double_t CalculateReferenceX();
163 TLinearFitter *fTrackFitter; // Fitter for linearized track model
164 AliTRDLeastSquare *fZfitter; // Linear fitter in z-Direction
165 AliTRDseedV1 *fTracklets[kNPlanes]; // Tracklet container
166 TMatrixD *fCovarPolY; // Polynomial Covariance Matrix Estimation (y-direction)
167 TMatrixD *fCovarPolZ; // Polynomial Covariance Matrix Estimation (z-direction)
168 Double_t fXref; // Reference x position for fit in z-Direction
169 Double_t fSysClusterError; // Systematic cluster Error
170 Double_t fParameters[5]; // Track Model Parameter
171 Double_t fSumPolY[5]; // Sums for polynomial Covariance Matrix Estimation (y-direction)
172 Double_t fSumPolZ[3]; // Sums for polynomial Covariance Matrix Estimation (z-direction)
176 static Bool_t AdjustSector(AliTRDtrackV1 *const track);
177 Double_t BuildSeedingConfigs(AliTRDtrackingChamber **stack, Int_t *configs);
178 Int_t BuildTrackingContainers();
179 static Float_t CalculateChi2Z(AliTRDseedV1 *tracklets, Double_t offset, Double_t slope, Double_t xref);
180 Int_t Clusters2TracksSM(Int_t sector, AliESDEvent *esd);
181 Int_t Clusters2TracksStack(AliTRDtrackingChamber **stack, TClonesArray * const esdTrackList);
182 AliTRDseedV1* GetTracklet(AliTRDtrackV1 *const trk, Int_t plane, Int_t &idx);
183 Bool_t GetTrackPoint(Int_t index, AliTrackPoint &p) const;
184 Float_t GetR4Layer(Int_t ly) const { return fR[ly];}
185 Int_t MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * const sseed, const Int_t * const ipar);
186 AliTRDtrackV1* MakeTrack(AliTRDseedV1 * const tracklet);
187 AliTRDtrackV1* SetTrack(const AliTRDtrackV1 * const track);
188 AliTRDseedV1* SetTracklet(const AliTRDseedV1 * const tracklet);
189 void UnsetTrackletsTrack(const AliTRDtrackV1 * const track);
192 AliTRDtrackerV1(const AliTRDtrackerV1 &tracker);
193 AliTRDtrackerV1 &operator=(const AliTRDtrackerV1 &tracker);
194 Double_t CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]);
195 Double_t CalculateTrackLikelihood(Double_t *chi2);
196 Bool_t ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDseedV1 *tracklet, Double_t &chi2);
197 static Float_t CalculateReferenceX(const AliTRDseedV1 *const tracklets);
199 Float_t GetChi2Y(const AliTRDseedV1 *const tracklets) const;
200 Float_t GetChi2Z(const AliTRDseedV1 *const tracklets) const;
201 Float_t GetChi2Phi(const AliTRDseedV1 *const tracklets) const;
204 const AliTRDReconstructor *fkReconstructor; // reconstructor manager
205 const AliTRDrecoParam *fkRecoParam; // reco param for the current event
206 AliTRDgeometry *fGeom; // Pointer to TRD geometry
207 AliTRDtrackingSector fTrSec[kTrackingSectors]; // Array of tracking sectors;
208 TClonesArray *fClusters; // List of clusters
209 TClonesArray *fTracklets; // List of tracklets
210 TClonesArray *fTracks; // List of tracks
211 TClonesArray *fTracksESD; // List of ESD tracks in current SM
212 Float_t fR[kNPlanes]; //! rough radial position of each TRD layer
214 // should go to the recoParam
215 static const Double_t fgkMaxChi2; // Max increment in track chi2
216 static const Float_t fgkMinClustersInTrack; // Min number of clusters in track
217 static const Float_t fgkLabelFraction; // Min fraction of same label
218 static const Double_t fgkMaxSnp; // Maximal snp for tracking
219 static const Double_t fgkMaxStep; // Maximal step for tracking
221 // stand alone tracking
222 static Double_t fgTopologicQA[kNConfigs]; // Topologic quality
223 Double_t fTrackQuality[kMaxTracksStack]; // Track quality
224 Int_t fSeedLayer[kMaxTracksStack]; // Seed layer
225 AliTRDchamberTimeBin *fSeedTB[kNSeedPlanes]; // seeding time bin planes
226 Int_t fSieveSeeding; //! Seeding iterator
228 static const Double_t fgkX0[kNPlanes]; // default values for the position of anode wire
229 static Int_t fgNTimeBins; // Timebins per plane in track prolongation
230 static TLinearFitter *fgTiltedRieman; // Fitter for the tilted Rieman fit without vertex constriant
231 static TLinearFitter *fgTiltedRiemanConstrained; // Fitter for the tilted Rieman fit with vertex constraint
232 static AliRieman *fgRieman; // Fitter for the untilted Rieman fit
234 ClassDef(AliTRDtrackerV1, 5) // TRD tracker - tracklet based tracking