Fixes for the proper treatment of T0
[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
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{
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   AliTRDtrackerV1(AliTRDReconstructor *rec = NULL);
72   virtual ~AliTRDtrackerV1();
73   
74   //temporary
75   AliTRDtrackingSector* GetTrackingSector(Int_t sec) {return &fTrSec[sec];}
76   
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);
95   
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);
99
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);}
104
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();
116
117   class AliTRDLeastSquare{
118   public:
119     AliTRDLeastSquare();
120     ~AliTRDLeastSquare(){};
121     
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);
124     void                Eval();
125     void    Reset();
126     
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;
130   private:
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
136   };
137
138   class AliTRDtrackFitterRieman{
139     public:
140       AliTRDtrackFitterRieman();
141       ~AliTRDtrackFitterRieman();
142
143       Double_t Eval();
144       void Reset();
145
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;
152
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; };
156     private:
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();
162
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)
173   };
174
175 protected:
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 seeds, Double_t *params);
187   AliTRDtrackV1* SetTrack(const AliTRDtrackV1 * const track);
188   AliTRDseedV1*  SetTracklet(const AliTRDseedV1 * const tracklet);
189
190 private:
191   AliTRDtrackerV1(const AliTRDtrackerV1 &tracker);
192   AliTRDtrackerV1 &operator=(const AliTRDtrackerV1 &tracker);
193   Double_t              CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]);
194   Double_t              CalculateTrackLikelihood(const AliTRDseedV1 *const tracklets, Double_t *chi2);
195   Int_t                 ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDseedV1 *tracklet);
196   static Float_t        CalculateReferenceX(const AliTRDseedV1 *const tracklets);
197   void        ResetSeedTB();
198   Float_t     GetChi2Y(const AliTRDseedV1 *const tracklets) const;
199   Float_t     GetChi2Z(const AliTRDseedV1 *const tracklets) const;
200
201 private:
202   const AliTRDReconstructor *fkReconstructor;            // reconstructor manager
203   AliTRDgeometry      *fGeom;                           // Pointer to TRD geometry
204   AliTRDtrackingSector fTrSec[kTrackingSectors];        // Array of tracking sectors;    
205   TClonesArray        *fClusters;                       // List of clusters
206   TClonesArray        *fTracklets;                      // List of tracklets
207   TClonesArray        *fTracks;                         // List of tracks
208   Float_t              fR[kNPlanes];                    //! rough radial position of each TRD layer
209
210   // should go to the recoParam
211   static const Double_t    fgkMaxChi2;                  // Max increment in track chi2 
212   static const Float_t     fgkMinClustersInTrack;       // Min number of clusters in track
213   static const Float_t     fgkLabelFraction;            // Min fraction of same label
214   static const Double_t    fgkMaxSnp;                   // Maximal snp for tracking
215   static const Double_t    fgkMaxStep;                  // Maximal step for tracking  
216   
217   // stand alone tracking
218   static Double_t      fgTopologicQA[kNConfigs];        //  Topologic quality
219   Double_t             fTrackQuality[kMaxTracksStack];  //  Track quality 
220   Int_t                fSeedLayer[kMaxTracksStack];     //  Seed layer
221   AliTRDchamberTimeBin *fSeedTB[kNSeedPlanes]; // seeding time bin planes
222   Int_t                fSieveSeeding;                   //! Seeding iterator
223   
224   static const Double_t fgkX0[kNPlanes];                // default values for the position of anode wire
225   static Int_t         fgNTimeBins;                     // Timebins per plane in track prolongation 
226   static TLinearFitter *fgTiltedRieman;                 //  Fitter for the tilted Rieman fit without vertex constriant
227   static TLinearFitter *fgTiltedRiemanConstrained;      //  Fitter for the tilted Rieman fit with vertex constraint     
228   static AliRieman     *fgRieman;                       //  Fitter for the untilted Rieman fit
229   
230   ClassDef(AliTRDtrackerV1, 3)                          //  TRD tracker - tracklet based tracking
231
232 };
233 #endif