]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrackerV1.h
Bug fix for the case of more than 30 timebins
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackerV1.h
index e28b9ea53111769d43f6d7d3e91988676375466f..523fa17018c7204b09adaeb6e2467fdb056ffb54 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef ALITRDTRACKERV1_H
 #define ALITRDTRACKERV1_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice                               */ 
 
+/* 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 ALITRDTRACKER_H
-#include "AliTRDtracker.h"
-#endif
+//#ifndef ALITRACKER_H
+#include "AliTracker.h"
+//#endif
 
-#define DEBUG
+//#ifndef ALITRDTRACKINGSECTOR_H
+#include "AliTRDtrackingSector.h"
+//#endif
+
+//#ifndef ROOT_TMatrixDfwd
+#include <TMatrixDfwd.h>
+//#endif
 
 /**************************************************************************
- * Class Status see source file                                           *
- **************************************************************************/
+* 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 AliTRDstackLayer;
+class AliTRDtrackingChamber;
+class AliTRDchamberTimeBin;
 class AliTRDtrackerFitter;
-class AliTRDrecoParam;
 class AliTRDtrackV1;
-class AliTrackPoint;
-class AliTRDtrackerV1 : public AliTRDtracker
-{
+class AliTRDReconstructor;
 
- public:
-       enum{
-               kNTimeBins = 35,
-               kNPlanes = 6,
-               kNSeedPlanes = 4,
-               kMaxTracksStack = 100,
-               kNConfigs = 15
-       };
-       AliTRDtrackerV1(AliTRDrecoParam *p = 0x0);
-       AliTRDtrackerV1(const TFile *in, AliTRDrecoParam *p);
-       virtual ~AliTRDtrackerV1();
+class AliTRDtrackerV1 : public AliTracker
+{
+public:
+  enum{
+    kOwner            = BIT(14) // owner of clusters
+   ,kRemoveContainers = BIT(15) // delete containers after usage
+  };
+  enum{
+    kMaxLayersPerSector   = 1000
+    , kMaxTimeBinIndex    = 216
+    , kTrackingSectors    = 18
+    , kNTimeBins          = 35
+    , kNPlanes            = 6
+    , kNSeedPlanes        = 4
+    , kMaxTracksStack     = 100
+    , kNConfigs           = 15
+  };
+  AliTRDtrackerV1(AliTRDReconstructor *rec = NULL);
+  virtual ~AliTRDtrackerV1();
   
-       Int_t          Clusters2Tracks(AliESDEvent *esd);
-       static void    GetExtrapolationConfig(Int_t iconfig, Int_t planes[2]);
-       static void    GetSeedingConfig(Int_t iconfig, Int_t planes[4]);
-       Int_t          FollowBackProlongation(AliTRDtrackV1 &t);
-       Int_t          FollowProlongation(AliTRDtrackV1 &t);
-       Int_t          PropagateBack(AliESDEvent *event);
-       Int_t          RefitInward(AliESDEvent *event);
-       void           SetRecoParam(AliTRDrecoParam *p){fRecoParam = p;}
-       void           UnloadClusters();
-
- protected:
-       Double_t       BuildSeedingConfigs(AliTRDstackLayer *layer, Int_t *configs);
-       Int_t          Clusters2TracksSM( AliTRDtracker::AliTRDtrackingSector *sector, AliESDEvent *esd);
-       Int_t          Clusters2TracksStack(AliTRDstackLayer *layer, TClonesArray *esdTrackList);
-       void           CookLabel(AliKalmanTrack *pt, Float_t wrong) const;
-       Int_t          GetSeedingLayers(AliTRDstackLayer *layers, Double_t *params);
-       void           GetMeanCLStack(AliTRDstackLayer *layers, Int_t *planes, Double_t *params);
-       AliTRDseedV1*  GetTracklet(AliTRDtrackV1 *trk, Int_t plane, Int_t &idx);
-       virtual Bool_t GetTrackPoint(Int_t index, AliTrackPoint &p) const;
-       AliTRDcluster *FindSeedingCluster(AliTRDstackLayer *layers, AliTRDseedV1/*AliRieman*/ *sfit);
-       
-       Double_t       MakeSeedingPlanes(AliTRDstackLayer *layer);
-       AliTRDstackLayer *MakeSeedingLayer(AliTRDstackLayer *layers, Int_t Plane);
-       Int_t          MakeSeeds(AliTRDstackLayer *layers, AliTRDseedV1 *sseed, Int_t *ipar);
-       AliTRDtrackV1*   MakeTrack(AliTRDseedV1 *seeds, Double_t *params);
-       Int_t          SetTracklet(AliTRDseedV1 *tracklet);
+  //temporary
+  AliTRDtrackingSector* GetTrackingSector(Int_t sec) {return &fTrSec[sec];}
+  
+  Int_t           Clusters2Tracks(AliESDEvent *esd);
+  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, const AliTRDseedV1 * const tracklets = NULL, Bool_t up=0, Int_t np = 0, AliTrackPoint *points = NULL);
 
-private:
-       AliTRDtrackerV1(const AliTRDtrackerV1 &tracker);
-       AliTRDtrackerV1 &operator=(const AliTRDtrackerV1 &tracker);
-       Double_t       CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4], Double_t *chi2);
-       void           ImproveSeedQuality(AliTRDstackLayer *layer, AliTRDseedV1 *cseed);
+  Bool_t          IsClustersOwner() const    { return TestBit(kOwner);}
+  Bool_t          HasRemoveContainers() const    { return TestBit(kRemoveContainers);}
+  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);
+  Int_t           ReadClusters(TClonesArray* &array, TTree *in) const;
+  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);
+    void               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(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(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(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, const AliTRDseedV1 * const sseed, const Int_t * const ipar);
+  AliTRDtrackV1* MakeTrack(const AliTRDseedV1 * const seeds, Double_t *params);
+  AliTRDtrackV1* SetTrack(const AliTRDtrackV1 * const track);
+  AliTRDseedV1*  SetTracklet(const AliTRDseedV1 * const tracklet);
 
 private:
+  AliTRDtrackerV1(const AliTRDtrackerV1 &tracker);
+  AliTRDtrackerV1 &operator=(const AliTRDtrackerV1 &tracker);
+  Double_t             CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]);
+  Double_t             CalculateTrackLikelihood(const AliTRDseedV1 *const tracklets, Double_t *chi2);
+  Int_t                ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRDseedV1 *tracklet);
+  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;
 
-       static Double_t      fgTopologicQA[kNConfigs];         //  Topologic quality
-       Double_t             fTrackQuality[kMaxTracksStack];  //  Track quality 
-       Int_t                fSeedLayer[kMaxTracksStack];     //  Seed layer
-       Int_t                fSieveSeeding;                   //! Seeding iterator
-       TClonesArray        *fTracklets;                      // List of tracklets for all sectors
-       AliTRDrecoParam     *fRecoParam;                      //  Reconstruction parameters
-       AliTRDtrackerFitter *fFitter;                         //! Fitter class of the tracker
+private:
+  const AliTRDReconstructor *fkReconstructor;            // reconstructor manager
+  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
+  Float_t              fR[kNPlanes];                    //! rough radial position of each TRD layer
 
-       ClassDef(AliTRDtrackerV1, 1)                          //  Stand alone tracker development class
+  // should go to the recoParam
+  static const Double_t    fgkMaxChi2;                  // Max increment in track chi2 
+  static const Float_t     fgkMinClustersInTrack;       // Min number of clusters in track
+  static const Float_t     fgkLabelFraction;            // Min fraction of same label
+  static const Double_t    fgkMaxSnp;                   // Maximal snp for tracking
+  static const Double_t    fgkMaxStep;                  // Maximal step for tracking  
+  
+  // 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
+  
+  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, 3)                          //  TRD tracker - tracklet based tracking
 
 };
 #endif