ROOT logo
#ifndef AliMFTTrackerMU_H
#define AliMFTTrackerMU_H

/* Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//====================================================================================================================================================
//
//                          MFT tracker
//
// Class for the creation of the "global muon tracks" built from the tracks reconstructed in the 
// muon spectrometer and the clusters of the Muon Forward Tracker
//
// Contact author: antonio.uras@cern.ch
//
//====================================================================================================================================================

#include "TTree.h"
#include "AliLog.h"
#include "AliGeomManager.h"
#include "AliESDEvent.h"
#include "AliESDMuonTrack.h"
#include "AliESDMuonGlobalTrack.h"
#include "AliTracker.h"
#include "AliRun.h"
#include "AliMFT.h"
#include "AliMUONTrackExtrap.h"
#include "AliMUONTrack.h"
#include "AliMUONESDInterface.h"
#include "AliMuonForwardTrack.h"

//====================================================================================================================================================

class AliMFTTrackerMU : public AliTracker {

public:

  enum {kConverged, kDiverged};

  AliMFTTrackerMU();
  virtual ~AliMFTTrackerMU();

  Int_t LoadClusters(TTree *cf);
  void UnloadClusters();
  Int_t Clusters2Tracks(AliESDEvent *event);

  void SetNPlanesMFT(Int_t nPlanesMFT) { fNPlanesMFT = nPlanesMFT; }
  void SeparateFrontBackClusters();

  Int_t FindClusterInPlane(Int_t planeId);

  void SetMinResearchRadiusAtPlane(Int_t plane, Double_t radius) { if (plane>=0 && plane<fNMaxPlanes) fMinResearchRadiusAtPlane[plane] = radius; }

  Double_t TryOneCluster(const AliMUONTrackParam &trackParam, AliMFTCluster *cluster);

  Bool_t IsCorrectMatch(AliMFTCluster *cluster, Int_t labelMC);

  void GetVertexFromMC();

  /// Dummy implementation
  virtual Int_t PropagateBack(AliESDEvent* /*event*/) {return 0;}
  /// Dummy implementation
  virtual Int_t RefitInward(AliESDEvent* /*event*/) {return 0;}
  /// Dummy implementation
  virtual AliCluster *GetCluster(Int_t /*index*/) const {return 0;}

  void AddClustersFromUnderlyingEvent();
  void AddClustersFromPileUpEvents();

protected:

  static const Int_t fNMaxPlanes = AliMFTConstants::fNMaxPlanes;        // max number of MFT planes
  static const Double_t fRadLengthSi;
  static const Int_t fMaxNCandidates = 1000;

  AliESDEvent *fESD;   //! pointer to the ESD event

  AliMFT *fMFT;                        //!
  AliMFTSegmentation *fSegmentation;   //!
  Int_t fNPlanesMFT, fNPlanesMFTAnalyzed;

  Double_t fSigmaClusterCut;         // to select the clusters in the MFT planes which are compatible with the extrapolated muon track
  Double_t fScaleSigmaClusterCut;    // to tune the cut on the compatible clusters in case of too many candidates

  Int_t fNMaxMissingMFTClusters;              // max. number of MFT clusters which can be missed in the global fit procedure
  Bool_t fIsPlaneMandatory[fNMaxPlanes];      // specifies which MFT planes cannot be missed in the global fit procedure

  Bool_t fGlobalTrackingDiverged;    // to keep memory of a possible divergence in the global tracking finding

  TClonesArray *fMFTClusterArray[fNMaxPlanes];         //! array of clusters for the planes of the MFT
  TClonesArray *fMFTClusterArrayFront[fNMaxPlanes];    //! array of front clusters for the planes of the MFT
  TClonesArray *fMFTClusterArrayBack[fNMaxPlanes];     //! array of back clusters for the planes of the MFT

  TClonesArray *fCandidateTracks;   //! array of candidate global tracks 

  AliMUONTrack *fMUONTrack;  //! muon track being analyzed

  AliMuonForwardTrack *fCurrentTrack;     //! muon extrapolated track being tested
  AliMuonForwardTrack *fFinalBestCandidate;     //! best final candidate (if any)

  // uncertainty on the x position of the primary vertex (seed for the extrapolation of the MUON tracks)
  Double_t fXExtrapVertex;   
  Double_t fYExtrapVertex;
  Double_t fZExtrapVertex;
  Double_t fXExtrapVertexError;
  Double_t fYExtrapVertexError;

  Bool_t fBransonCorrection;    // if TRUE, Branson Correction is applied when extrapolating the MUON tracks to the vertex region

  Double_t fMinResearchRadiusAtPlane[fNMaxPlanes];

private:

  AliMFTTrackerMU(const AliMFTTrackerMU &tracker);
  AliMFTTrackerMU & operator=(const AliMFTTrackerMU &tracker);
  ClassDef(AliMFTTrackerMU,2)   //MFT tracker for muon tracks

};

//====================================================================================================================================================

#endif 

 AliMFTTrackerMU.h:1
 AliMFTTrackerMU.h:2
 AliMFTTrackerMU.h:3
 AliMFTTrackerMU.h:4
 AliMFTTrackerMU.h:5
 AliMFTTrackerMU.h:6
 AliMFTTrackerMU.h:7
 AliMFTTrackerMU.h:8
 AliMFTTrackerMU.h:9
 AliMFTTrackerMU.h:10
 AliMFTTrackerMU.h:11
 AliMFTTrackerMU.h:12
 AliMFTTrackerMU.h:13
 AliMFTTrackerMU.h:14
 AliMFTTrackerMU.h:15
 AliMFTTrackerMU.h:16
 AliMFTTrackerMU.h:17
 AliMFTTrackerMU.h:18
 AliMFTTrackerMU.h:19
 AliMFTTrackerMU.h:20
 AliMFTTrackerMU.h:21
 AliMFTTrackerMU.h:22
 AliMFTTrackerMU.h:23
 AliMFTTrackerMU.h:24
 AliMFTTrackerMU.h:25
 AliMFTTrackerMU.h:26
 AliMFTTrackerMU.h:27
 AliMFTTrackerMU.h:28
 AliMFTTrackerMU.h:29
 AliMFTTrackerMU.h:30
 AliMFTTrackerMU.h:31
 AliMFTTrackerMU.h:32
 AliMFTTrackerMU.h:33
 AliMFTTrackerMU.h:34
 AliMFTTrackerMU.h:35
 AliMFTTrackerMU.h:36
 AliMFTTrackerMU.h:37
 AliMFTTrackerMU.h:38
 AliMFTTrackerMU.h:39
 AliMFTTrackerMU.h:40
 AliMFTTrackerMU.h:41
 AliMFTTrackerMU.h:42
 AliMFTTrackerMU.h:43
 AliMFTTrackerMU.h:44
 AliMFTTrackerMU.h:45
 AliMFTTrackerMU.h:46
 AliMFTTrackerMU.h:47
 AliMFTTrackerMU.h:48
 AliMFTTrackerMU.h:49
 AliMFTTrackerMU.h:50
 AliMFTTrackerMU.h:51
 AliMFTTrackerMU.h:52
 AliMFTTrackerMU.h:53
 AliMFTTrackerMU.h:54
 AliMFTTrackerMU.h:55
 AliMFTTrackerMU.h:56
 AliMFTTrackerMU.h:57
 AliMFTTrackerMU.h:58
 AliMFTTrackerMU.h:59
 AliMFTTrackerMU.h:60
 AliMFTTrackerMU.h:61
 AliMFTTrackerMU.h:62
 AliMFTTrackerMU.h:63
 AliMFTTrackerMU.h:64
 AliMFTTrackerMU.h:65
 AliMFTTrackerMU.h:66
 AliMFTTrackerMU.h:67
 AliMFTTrackerMU.h:68
 AliMFTTrackerMU.h:69
 AliMFTTrackerMU.h:70
 AliMFTTrackerMU.h:71
 AliMFTTrackerMU.h:72
 AliMFTTrackerMU.h:73
 AliMFTTrackerMU.h:74
 AliMFTTrackerMU.h:75
 AliMFTTrackerMU.h:76
 AliMFTTrackerMU.h:77
 AliMFTTrackerMU.h:78
 AliMFTTrackerMU.h:79
 AliMFTTrackerMU.h:80
 AliMFTTrackerMU.h:81
 AliMFTTrackerMU.h:82
 AliMFTTrackerMU.h:83
 AliMFTTrackerMU.h:84
 AliMFTTrackerMU.h:85
 AliMFTTrackerMU.h:86
 AliMFTTrackerMU.h:87
 AliMFTTrackerMU.h:88
 AliMFTTrackerMU.h:89
 AliMFTTrackerMU.h:90
 AliMFTTrackerMU.h:91
 AliMFTTrackerMU.h:92
 AliMFTTrackerMU.h:93
 AliMFTTrackerMU.h:94
 AliMFTTrackerMU.h:95
 AliMFTTrackerMU.h:96
 AliMFTTrackerMU.h:97
 AliMFTTrackerMU.h:98
 AliMFTTrackerMU.h:99
 AliMFTTrackerMU.h:100
 AliMFTTrackerMU.h:101
 AliMFTTrackerMU.h:102
 AliMFTTrackerMU.h:103
 AliMFTTrackerMU.h:104
 AliMFTTrackerMU.h:105
 AliMFTTrackerMU.h:106
 AliMFTTrackerMU.h:107
 AliMFTTrackerMU.h:108
 AliMFTTrackerMU.h:109
 AliMFTTrackerMU.h:110
 AliMFTTrackerMU.h:111
 AliMFTTrackerMU.h:112
 AliMFTTrackerMU.h:113
 AliMFTTrackerMU.h:114
 AliMFTTrackerMU.h:115
 AliMFTTrackerMU.h:116
 AliMFTTrackerMU.h:117
 AliMFTTrackerMU.h:118
 AliMFTTrackerMU.h:119
 AliMFTTrackerMU.h:120
 AliMFTTrackerMU.h:121
 AliMFTTrackerMU.h:122
 AliMFTTrackerMU.h:123