ROOT logo
#ifndef ALITRDTRACKERV1_H
#define ALITRDTRACKERV1_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice                               */ 
/* $Id$ */

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  The TRD tracker                                                       //
//                                                                        //
//  Authors:                                                              //
//    Marian Ivanov <M.Ivanov@gsi.de>                                     //
//    Alex Bercuci <A.Bercuci@gsi.de>                                     //
//    Jouri Belikov <J.Belikov@cern.ch>                                   //
//    Markus Fasel <M.Fasel@gsi.de>                                       //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

//#ifndef ALITRACKER_H
#include "AliTracker.h"
//#endif

//#ifndef ALITRDTRACKINGSECTOR_H
#include "AliTRDtrackingSector.h"
//#endif

//#ifndef ROOT_TMatrixDfwd
#include <TMatrixDfwd.h>
//#endif

/**************************************************************************
* Class Status see source file                                           *
**************************************************************************/

class TFile;
class TTreeSRedirector;
class TClonesArray;
class TLinearFitter;

class AliRieman;
class AliESDEvent;
class AliCluster;
class AliTrackPoint;

class AliTRDcluster;
class AliTRDseedV1;
class AliTRDtrackingChamber;
class AliTRDchamberTimeBin;
class AliTRDtrackerFitter;
class AliTRDtrackV1;
class AliTRDReconstructor;
class AliTRDrecoParam;
class AliTRDtrackerV1 : public AliTracker
{
public:
  enum{
    kOwner            = BIT(14) // owner of clusters
   ,kRemoveContainers = BIT(15) // delete containers after usage
  };
  enum ETRDtrackerV1const {
    kMaxLayersPerSector   = 1000
    , kMaxTimeBinIndex    = 216
    , kTrackingSectors    = 18
    , kNTimeBins          = 35
    , kNPlanes            = 6
    , kNSeedPlanes        = 4
    , kMaxTracksStack     = 100
    , kNConfigs           = 15
  };
  enum ETRDtrackerV1BetheBloch {
     kGeant = 0
    ,kSolid
    ,kGas
  };
  AliTRDtrackerV1(const AliTRDReconstructor *rec = NULL);
  virtual ~AliTRDtrackerV1();
  
  //temporary
  AliTRDtrackingSector* GetTrackingSector(Int_t sec) {return &fTrSec[sec];}
  
  Int_t           Clusters2Tracks(AliESDEvent *esd);
  static ETRDtrackerV1BetheBloch
                  GetBetheBloch()            { return fgBB;}
  AliCluster*     GetCluster(Int_t index) const;
  AliTRDseedV1*   GetTracklet(Int_t index) const;
  AliKalmanTrack* GetTrack(Int_t index) const;
  TClonesArray*   GetListOfClusters() const  { return fClusters;}
  TClonesArray*   GetListOfTracklets() const { return fTracklets;}
  TClonesArray*   GetListOfTracks() const    { return fTracks;}
  static Int_t    GetNTimeBins()             { return fgNTimeBins;}
  static void     GetExtrapolationConfig(Int_t iconfig, Int_t planes[2]);
  static void     GetSeedingConfig(Int_t iconfig, Int_t planes[4]);

  static TLinearFitter*  GetTiltedRiemanFitter();
  static TLinearFitter*  GetTiltedRiemanFitterConstraint();
  static AliRieman*      GetRiemanFitter();
  static void     FitRieman(AliTRDcluster **clusters, Double_t chi2[2]);
  static Float_t  FitRieman(AliTRDseedV1 *tracklets, Double_t *chi2, Int_t *const planes = NULL);
  static Float_t  FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Double_t zVertex);
  static Float_t  FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigError);
  static Double_t FitTiltedRiemanV1(AliTRDseedV1 *tracklets);
  
  static Double_t FitRiemanTilt(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL);
  static Double_t FitLine(const AliTRDtrackV1 *trk, AliTRDseedV1 *tracklets = NULL, Bool_t err=0, Int_t np = 0, AliTrackPoint *points = NULL);
  static Double_t FitKalman(AliTRDtrackV1 *trk, AliTRDseedV1 * const tracklets = NULL, Bool_t up=0, Int_t np = 0, AliTrackPoint *points = NULL);

  Bool_t          IsClustersOwner() const    { return TestBit(kOwner);}
  Bool_t          HasRemoveContainers() const    { return TestBit(kRemoveContainers);}

  static void     SetBetheBloch(ETRDtrackerV1BetheBloch bb) {fgBB = bb;}
  void            SetClustersOwner(Bool_t own=kTRUE) {SetBit(kOwner, own); if(!own) fClusters = NULL;}
  void            SetRemoveContainers(Bool_t rm=kTRUE) {SetBit(kRemoveContainers, rm);}

  Int_t           FollowBackProlongation(AliTRDtrackV1 &t);
  Int_t           FollowProlongation(AliTRDtrackV1 &t);
  Int_t           LoadClusters(TTree *cTree);
  Int_t           LoadClusters(TClonesArray *const clusters);
  Int_t           PropagateBack(AliESDEvent *event);
  static Int_t    PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t maxStep);
  Bool_t          ReadClusters(TTree *in);
  Int_t           RefitInward(AliESDEvent *event);
  static void     SetNTimeBins(Int_t nTimeBins){fgNTimeBins = nTimeBins; }
  void            SetReconstructor(const AliTRDReconstructor *rec) {fkReconstructor = rec;}
  void            UnloadClusters();

  class AliTRDLeastSquare{
  public:
    AliTRDLeastSquare();
    ~AliTRDLeastSquare(){};
    
    void          AddPoint(const Double_t * const x, Double_t y, Double_t sigmaY);
    void          RemovePoint(const Double_t * const x, Double_t y, Double_t sigmaY);
    Bool_t        Eval();
    void          Reset();
    
    Double_t      GetFunctionParameter(Int_t ParNumber) const {return fParams[ParNumber];}
    Double_t      GetFunctionValue(const Double_t * const xpos) const;
    void          GetCovarianceMatrix(Double_t *storage) const;
  private:
    AliTRDLeastSquare(const AliTRDLeastSquare &);
    AliTRDLeastSquare& operator=(const AliTRDLeastSquare &);
    Double_t      fParams[2];           // Fitparameter	
    Double_t      fCovarianceMatrix[3]; // Covariance Matrix
    Double_t      fSums[6];             // Sums
  };

  class AliTRDtrackFitterRieman{
    public:
      AliTRDtrackFitterRieman();
      ~AliTRDtrackFitterRieman();

      Double_t Eval();
      void Reset();

      Double_t GetYat(Double_t x) const;
      Double_t GetDyDxAt(Double_t x) const;
      Double_t GetZat(Double_t x) const;
      Double_t GetDzDx() const { return fParameters[4]; };
      Double_t GetCurvature() const;
      void GetCovAt(Double_t x, Double_t *cov) const;

      void SetRiemanFitter(TLinearFitter *const fitter) { fTrackFitter = fitter; }
      void SetTracklet(Int_t il, AliTRDseedV1 * const tracklet);
      void SetSysClusterError(Double_t err) { fSysClusterError = err; };
    private:
      AliTRDtrackFitterRieman(const AliTRDtrackFitterRieman &);
      AliTRDtrackFitterRieman &operator=(const AliTRDtrackFitterRieman &);
      void UpdateFitters(const AliTRDseedV1 * const tracklet);
      Bool_t CheckAcceptable(Double_t offset, Double_t slope);
      Double_t CalculateReferenceX();

      TLinearFitter *fTrackFitter;        // Fitter for linearized track model
      AliTRDLeastSquare *fZfitter;        // Linear fitter in z-Direction
      AliTRDseedV1 *fTracklets[kNPlanes]; // Tracklet container
      TMatrixD *fCovarPolY;               // Polynomial Covariance Matrix Estimation (y-direction)
      TMatrixD *fCovarPolZ;               // Polynomial Covariance Matrix Estimation (z-direction)
      Double_t fXref;                     // Reference x position for fit in z-Direction
      Double_t fSysClusterError;          // Systematic cluster Error
      Double_t fParameters[5];            // Track Model Parameter
      Double_t fSumPolY[5];               // Sums for polynomial Covariance Matrix Estimation (y-direction)
      Double_t fSumPolZ[3];               // Sums for polynomial Covariance Matrix Estimation (z-direction)
  };

protected:
  static Bool_t  AdjustSector(AliTRDtrackV1 *const track); 
  Double_t       BuildSeedingConfigs(AliTRDtrackingChamber **stack, Int_t *configs);
  Int_t          BuildTrackingContainers();
  static Float_t CalculateChi2Z(const AliTRDseedV1 *tracklets, Double_t offset, Double_t slope, Double_t xref);
  Int_t          Clusters2TracksSM(Int_t sector, AliESDEvent *esd);
  Int_t          Clusters2TracksStack(AliTRDtrackingChamber **stack, TClonesArray * const esdTrackList);
  AliTRDseedV1*  GetTracklet(const AliTRDtrackV1 *const trk, Int_t plane, Int_t &idx);
  Bool_t         GetTrackPoint(Int_t index, AliTrackPoint &p) const;	
  Float_t        GetR4Layer(Int_t ly) const { return fR[ly];}
  Int_t          MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * const sseed, const Int_t * const ipar);
  AliTRDtrackV1* MakeTrack(AliTRDseedV1 * const tracklet);
  AliTRDtrackV1* SetTrack(const AliTRDtrackV1 * const track);
  AliTRDseedV1*  SetTracklet(const AliTRDseedV1 * const tracklet);
  void           UnsetTrackletsTrack(const AliTRDtrackV1 * const track);

private:
  AliTRDtrackerV1(const AliTRDtrackerV1 &tracker);
  AliTRDtrackerV1 &operator=(const AliTRDtrackerV1 &tracker);
  Double_t       CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]);
  Double_t       CalculateTrackLikelihood(Double_t *chi2);
  Bool_t         ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDseedV1 *tracklet, Double_t &chi2);
  static Float_t	CalculateReferenceX(const AliTRDseedV1 *const tracklets);
  void        ResetSeedTB();
  Float_t     GetChi2Y(const AliTRDseedV1 *const tracklets) const;
  Float_t     GetChi2Z(const AliTRDseedV1 *const tracklets) const;
  Float_t     GetChi2Phi(const AliTRDseedV1 *const tracklets) const;

  const AliTRDReconstructor *fkReconstructor;           // reconstructor manager
  const AliTRDrecoParam     *fkRecoParam;               // reco param for the current event
  AliTRDgeometry      *fGeom;                           // Pointer to TRD geometry
  AliTRDtrackingSector fTrSec[kTrackingSectors];        // Array of tracking sectors;    
  TClonesArray        *fClusters;                       // List of clusters
  TClonesArray        *fTracklets;                      // List of tracklets
  TClonesArray        *fTracks;                         // List of tracks
  TClonesArray        *fTracksESD;                      // List of ESD tracks in current SM
  Float_t              fR[kNPlanes];                    //! rough radial position of each TRD layer

  // stand alone tracking
  static Double_t      fgTopologicQA[kNConfigs];        //  Topologic quality
  Double_t             fTrackQuality[kMaxTracksStack];  //  Track quality 
  Int_t                fSeedLayer[kMaxTracksStack];     //  Seed layer
  AliTRDchamberTimeBin *fSeedTB[kNSeedPlanes]; // seeding time bin planes
  Int_t                fSieveSeeding;                   //! Seeding iterator
  Int_t                fEventInFile;                    //! event in file being tracked (debug purposes)

  static ETRDtrackerV1BetheBloch fgBB;                  // Bethe Bloch method
  static const Double_t fgkX0[kNPlanes];                // default values for the position of anode wire
  static Int_t         fgNTimeBins;                     // Timebins per plane in track prolongation 
  static TLinearFitter *fgTiltedRieman;                 //  Fitter for the tilted Rieman fit without vertex constriant
  static TLinearFitter *fgTiltedRiemanConstrained;      //  Fitter for the tilted Rieman fit with vertex constraint	
  static AliRieman     *fgRieman;                       //  Fitter for the untilted Rieman fit
  
  ClassDef(AliTRDtrackerV1, 7)                          //  TRD tracker - tracklet based tracking

};
#endif
 AliTRDtrackerV1.h:1
 AliTRDtrackerV1.h:2
 AliTRDtrackerV1.h:3
 AliTRDtrackerV1.h:4
 AliTRDtrackerV1.h:5
 AliTRDtrackerV1.h:6
 AliTRDtrackerV1.h:7
 AliTRDtrackerV1.h:8
 AliTRDtrackerV1.h:9
 AliTRDtrackerV1.h:10
 AliTRDtrackerV1.h:11
 AliTRDtrackerV1.h:12
 AliTRDtrackerV1.h:13
 AliTRDtrackerV1.h:14
 AliTRDtrackerV1.h:15
 AliTRDtrackerV1.h:16
 AliTRDtrackerV1.h:17
 AliTRDtrackerV1.h:18
 AliTRDtrackerV1.h:19
 AliTRDtrackerV1.h:20
 AliTRDtrackerV1.h:21
 AliTRDtrackerV1.h:22
 AliTRDtrackerV1.h:23
 AliTRDtrackerV1.h:24
 AliTRDtrackerV1.h:25
 AliTRDtrackerV1.h:26
 AliTRDtrackerV1.h:27
 AliTRDtrackerV1.h:28
 AliTRDtrackerV1.h:29
 AliTRDtrackerV1.h:30
 AliTRDtrackerV1.h:31
 AliTRDtrackerV1.h:32
 AliTRDtrackerV1.h:33
 AliTRDtrackerV1.h:34
 AliTRDtrackerV1.h:35
 AliTRDtrackerV1.h:36
 AliTRDtrackerV1.h:37
 AliTRDtrackerV1.h:38
 AliTRDtrackerV1.h:39
 AliTRDtrackerV1.h:40
 AliTRDtrackerV1.h:41
 AliTRDtrackerV1.h:42
 AliTRDtrackerV1.h:43
 AliTRDtrackerV1.h:44
 AliTRDtrackerV1.h:45
 AliTRDtrackerV1.h:46
 AliTRDtrackerV1.h:47
 AliTRDtrackerV1.h:48
 AliTRDtrackerV1.h:49
 AliTRDtrackerV1.h:50
 AliTRDtrackerV1.h:51
 AliTRDtrackerV1.h:52
 AliTRDtrackerV1.h:53
 AliTRDtrackerV1.h:54
 AliTRDtrackerV1.h:55
 AliTRDtrackerV1.h:56
 AliTRDtrackerV1.h:57
 AliTRDtrackerV1.h:58
 AliTRDtrackerV1.h:59
 AliTRDtrackerV1.h:60
 AliTRDtrackerV1.h:61
 AliTRDtrackerV1.h:62
 AliTRDtrackerV1.h:63
 AliTRDtrackerV1.h:64
 AliTRDtrackerV1.h:65
 AliTRDtrackerV1.h:66
 AliTRDtrackerV1.h:67
 AliTRDtrackerV1.h:68
 AliTRDtrackerV1.h:69
 AliTRDtrackerV1.h:70
 AliTRDtrackerV1.h:71
 AliTRDtrackerV1.h:72
 AliTRDtrackerV1.h:73
 AliTRDtrackerV1.h:74
 AliTRDtrackerV1.h:75
 AliTRDtrackerV1.h:76
 AliTRDtrackerV1.h:77
 AliTRDtrackerV1.h:78
 AliTRDtrackerV1.h:79
 AliTRDtrackerV1.h:80
 AliTRDtrackerV1.h:81
 AliTRDtrackerV1.h:82
 AliTRDtrackerV1.h:83
 AliTRDtrackerV1.h:84
 AliTRDtrackerV1.h:85
 AliTRDtrackerV1.h:86
 AliTRDtrackerV1.h:87
 AliTRDtrackerV1.h:88
 AliTRDtrackerV1.h:89
 AliTRDtrackerV1.h:90
 AliTRDtrackerV1.h:91
 AliTRDtrackerV1.h:92
 AliTRDtrackerV1.h:93
 AliTRDtrackerV1.h:94
 AliTRDtrackerV1.h:95
 AliTRDtrackerV1.h:96
 AliTRDtrackerV1.h:97
 AliTRDtrackerV1.h:98
 AliTRDtrackerV1.h:99
 AliTRDtrackerV1.h:100
 AliTRDtrackerV1.h:101
 AliTRDtrackerV1.h:102
 AliTRDtrackerV1.h:103
 AliTRDtrackerV1.h:104
 AliTRDtrackerV1.h:105
 AliTRDtrackerV1.h:106
 AliTRDtrackerV1.h:107
 AliTRDtrackerV1.h:108
 AliTRDtrackerV1.h:109
 AliTRDtrackerV1.h:110
 AliTRDtrackerV1.h:111
 AliTRDtrackerV1.h:112
 AliTRDtrackerV1.h:113
 AliTRDtrackerV1.h:114
 AliTRDtrackerV1.h:115
 AliTRDtrackerV1.h:116
 AliTRDtrackerV1.h:117
 AliTRDtrackerV1.h:118
 AliTRDtrackerV1.h:119
 AliTRDtrackerV1.h:120
 AliTRDtrackerV1.h:121
 AliTRDtrackerV1.h:122
 AliTRDtrackerV1.h:123
 AliTRDtrackerV1.h:124
 AliTRDtrackerV1.h:125
 AliTRDtrackerV1.h:126
 AliTRDtrackerV1.h:127
 AliTRDtrackerV1.h:128
 AliTRDtrackerV1.h:129
 AliTRDtrackerV1.h:130
 AliTRDtrackerV1.h:131
 AliTRDtrackerV1.h:132
 AliTRDtrackerV1.h:133
 AliTRDtrackerV1.h:134
 AliTRDtrackerV1.h:135
 AliTRDtrackerV1.h:136
 AliTRDtrackerV1.h:137
 AliTRDtrackerV1.h:138
 AliTRDtrackerV1.h:139
 AliTRDtrackerV1.h:140
 AliTRDtrackerV1.h:141
 AliTRDtrackerV1.h:142
 AliTRDtrackerV1.h:143
 AliTRDtrackerV1.h:144
 AliTRDtrackerV1.h:145
 AliTRDtrackerV1.h:146
 AliTRDtrackerV1.h:147
 AliTRDtrackerV1.h:148
 AliTRDtrackerV1.h:149
 AliTRDtrackerV1.h:150
 AliTRDtrackerV1.h:151
 AliTRDtrackerV1.h:152
 AliTRDtrackerV1.h:153
 AliTRDtrackerV1.h:154
 AliTRDtrackerV1.h:155
 AliTRDtrackerV1.h:156
 AliTRDtrackerV1.h:157
 AliTRDtrackerV1.h:158
 AliTRDtrackerV1.h:159
 AliTRDtrackerV1.h:160
 AliTRDtrackerV1.h:161
 AliTRDtrackerV1.h:162
 AliTRDtrackerV1.h:163
 AliTRDtrackerV1.h:164
 AliTRDtrackerV1.h:165
 AliTRDtrackerV1.h:166
 AliTRDtrackerV1.h:167
 AliTRDtrackerV1.h:168
 AliTRDtrackerV1.h:169
 AliTRDtrackerV1.h:170
 AliTRDtrackerV1.h:171
 AliTRDtrackerV1.h:172
 AliTRDtrackerV1.h:173
 AliTRDtrackerV1.h:174
 AliTRDtrackerV1.h:175
 AliTRDtrackerV1.h:176
 AliTRDtrackerV1.h:177
 AliTRDtrackerV1.h:178
 AliTRDtrackerV1.h:179
 AliTRDtrackerV1.h:180
 AliTRDtrackerV1.h:181
 AliTRDtrackerV1.h:182
 AliTRDtrackerV1.h:183
 AliTRDtrackerV1.h:184
 AliTRDtrackerV1.h:185
 AliTRDtrackerV1.h:186
 AliTRDtrackerV1.h:187
 AliTRDtrackerV1.h:188
 AliTRDtrackerV1.h:189
 AliTRDtrackerV1.h:190
 AliTRDtrackerV1.h:191
 AliTRDtrackerV1.h:192
 AliTRDtrackerV1.h:193
 AliTRDtrackerV1.h:194
 AliTRDtrackerV1.h:195
 AliTRDtrackerV1.h:196
 AliTRDtrackerV1.h:197
 AliTRDtrackerV1.h:198
 AliTRDtrackerV1.h:199
 AliTRDtrackerV1.h:200
 AliTRDtrackerV1.h:201
 AliTRDtrackerV1.h:202
 AliTRDtrackerV1.h:203
 AliTRDtrackerV1.h:204
 AliTRDtrackerV1.h:205
 AliTRDtrackerV1.h:206
 AliTRDtrackerV1.h:207
 AliTRDtrackerV1.h:208
 AliTRDtrackerV1.h:209
 AliTRDtrackerV1.h:210
 AliTRDtrackerV1.h:211
 AliTRDtrackerV1.h:212
 AliTRDtrackerV1.h:213
 AliTRDtrackerV1.h:214
 AliTRDtrackerV1.h:215
 AliTRDtrackerV1.h:216
 AliTRDtrackerV1.h:217
 AliTRDtrackerV1.h:218
 AliTRDtrackerV1.h:219
 AliTRDtrackerV1.h:220
 AliTRDtrackerV1.h:221
 AliTRDtrackerV1.h:222
 AliTRDtrackerV1.h:223
 AliTRDtrackerV1.h:224
 AliTRDtrackerV1.h:225
 AliTRDtrackerV1.h:226
 AliTRDtrackerV1.h:227
 AliTRDtrackerV1.h:228
 AliTRDtrackerV1.h:229
 AliTRDtrackerV1.h:230
 AliTRDtrackerV1.h:231
 AliTRDtrackerV1.h:232
 AliTRDtrackerV1.h:233
 AliTRDtrackerV1.h:234
 AliTRDtrackerV1.h:235
 AliTRDtrackerV1.h:236
 AliTRDtrackerV1.h:237
 AliTRDtrackerV1.h:238
 AliTRDtrackerV1.h:239
 AliTRDtrackerV1.h:240
 AliTRDtrackerV1.h:241