Merge with TRDdev.2.0
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackerV1.h
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