bug fix in the vertex selection
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALTracker.h
CommitLineData
fe17d4cb 1//========================================================================
2// Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved.
3// See cxx source for full Copyright notice
4//========================================================================
5//
6// Class AliEMCALTracker
7// -----------------------
8// Implementation of the track matching method between barrel tracks and
9// EMCAL clusters.
10// Besides algorithm implementation, some cuts are required to be set
11// in order to define, for each track, an acceptance window where clusters
12// are searched to find best match (if any).
13// The class accepts as input an ESD container, and works directly on it,
14// simply setting, for each of its tracks, the fEMCALindex flag, for each
15// track which is matched to a cluster.
16// In order to use method, one must launch PropagateBack().
17//
18// ------------------------------------------------------------------------
19// author: A. Pulvirenti (alberto.pulvirenti@ct.infn.it)
20//=========================================================================
21
22#ifndef ALIEMCALTRACKER_H
23#define ALIEMCALTRACKER_H
24
25#include "AliTracker.h"
6d05130c 26#include "TMath.h"
fe17d4cb 27class TList;
c61f0e70 28class TTree;
fe17d4cb 29class TObjArray;
af885e0f 30class AliESDEvent;
fe17d4cb 31class AliESDCaloCluster;
32class AliEMCALTrack;
33class AliEMCALRecPoint;
c61f0e70 34class AliEMCALGeometry;
fe17d4cb 35
36class AliEMCALTracker : public AliTracker
37{
38public:
39
40 AliEMCALTracker();
41 AliEMCALTracker(const AliEMCALTracker &t);
42 AliEMCALTracker& operator=(const AliEMCALTracker &source);
43
44 virtual ~AliEMCALTracker() {Clear();}
45
46 virtual void Clear(Option_t *option="ALL");
af885e0f 47 virtual Int_t Clusters2Tracks(AliESDEvent*) {return -1;}
8ba062b1 48 void InitParameters();
fe17d4cb 49 virtual Int_t LoadClusters(TTree*);
af885e0f 50 Int_t LoadClusters(AliESDEvent* esd);
51 Int_t LoadTracks(AliESDEvent* esd);
52 virtual Int_t PropagateBack(AliESDEvent* esd);
53 virtual Int_t RefitInward(AliESDEvent*) {return -1;}
fe17d4cb 54 virtual void UnloadClusters();
55 virtual AliCluster* GetCluster(Int_t) const {return NULL;};
c61f0e70 56 TTree* SearchTrueMatches();
fe17d4cb 57 void SetCorrection(Double_t rho, Double_t x0) {fRho=rho;fX0=x0;}
58 void SetCutAlpha(Double_t min, Double_t max) {fCutAlphaMin=min;fCutAlphaMax=max;}
59 void SetCutAngle(Double_t value) {fCutAngle=value;}
60 void SetCutX(Double_t value) {fCutX=value;}
61 void SetCutY(Double_t value) {fCutY=value;}
62 void SetCutZ(Double_t value) {fCutZ=value;}
c61f0e70 63 void SetGeometry(AliEMCALGeometry *geom) {fGeom=geom;}
fe17d4cb 64 void SetMaxDistance(Double_t value) {fMaxDist=value;}
dcd86c5d 65 void SetCutNITS(Double_t value) {fCutNITS=value;}
66 void SetCutNTPC(Double_t value) {fCutNTPC=value;}
fe17d4cb 67 void SetNumberOfSteps(Int_t n) {fNPropSteps=n;if(!n)SetTrackCorrectionMode("NONE");}
68 void SetTrackCorrectionMode(Option_t *option);
69
c61f0e70 70 enum {
71 kUnmatched = -99999
72 };
73
fe17d4cb 74 class AliEMCALMatchCluster : public TObject
75 {
76 public:
c61f0e70 77 AliEMCALMatchCluster(Int_t ID, AliEMCALRecPoint *recPoint);
78 AliEMCALMatchCluster(Int_t ID, AliESDCaloCluster *caloCluster);
79 virtual ~AliEMCALMatchCluster() { }
80 //----------------------------------------------------------------------------
b9560ae2 81 Int_t Index() const {return fIndex;}
82 Int_t Label() const {return fLabel;}
83 Double_t X() const {return fX;}
84 Double_t Y() const {return fY;}
85 Double_t Z() const {return fZ;}
86 Double_t Phi() const {return TMath::ATan2(fY, fX);}
fe17d4cb 87 private:
88 Int_t fIndex; // index of cluster in its native container (ESD or TClonesArray)
89 Int_t fLabel; // track label of assigned cluster
90 Double_t fX; // global X position
91 Double_t fY; // global Y position
92 Double_t fZ; // global Z position
93 };
94
95 class AliEMCALMatch : public TObject
96 {
97 public:
c61f0e70 98 AliEMCALMatch();
99 AliEMCALMatch(const AliEMCALMatch& copy);
100 virtual ~AliEMCALMatch() { }
101 //----------------------------------------------------------------------------
fe17d4cb 102 Bool_t& CanBeSaved() {return fCanBeSaved;}
103 Int_t Compare(const TObject *obj) const;
b9560ae2 104 Double_t GetDistance() const {return fDistance;}
105 Double_t GetPt() const {return fPt;}
106 Int_t GetIndexC() const {return fIndexC;}
107 Int_t GetIndexT() const {return fIndexT;}
fe17d4cb 108 Bool_t IsSortable() const {return kTRUE;}
109 void SetIndexC(Int_t icl) {fIndexC=icl;}
110 void SetIndexT(Int_t itr) {fIndexT=itr;}
111 void SetDistance(Double_t dist) {fDistance=dist;}
c61f0e70 112 void SetPt(Double_t pt) {fPt=pt;}
fe17d4cb 113 private:
114 Bool_t fCanBeSaved; // when true, this match can be saved, otherwise it will not be
115 Int_t fIndexC; // cluster index in 'fClusters' array
116 Int_t fIndexT; // track index in 'fTracks' array
117 Double_t fDistance; // track - cluster distance
c61f0e70 118 Double_t fPt; // track pt
fe17d4cb 119 };
120
121private:
122
123 Double_t AngleDiff(Double_t angle1, Double_t angle2);
124 Double_t CheckPair(AliEMCALTrack *tr, AliEMCALMatchCluster *cluster);
125 Double_t CheckPairV2(AliEMCALTrack *tr, AliEMCALMatchCluster *cluster);
c61f0e70 126 Double_t CheckPairV3(AliEMCALTrack *tr, AliEMCALMatchCluster *cluster);
fe17d4cb 127 Int_t CreateMatches();
c61f0e70 128 Bool_t PropagateToEMCAL(AliEMCALTrack *tr);
fe17d4cb 129 Int_t SolveCompetitions();
130
131 enum ETrackCorr {
132 kTrackCorrNone = 0, // do not correct for energy loss
133 kTrackCorrMMB = 1, // use MeanMaterialBudget() function to evaluate correction
134 kTrackCorrFixed = 2 // use fixed "X0" and "rho" parameters to correct
135 };
136
137 Int_t fNPropSteps; // number of propagation steps (when correcting). If =0 no correction is done
138 ETrackCorr fTrackCorrMode; // track correction mode
139
140 Double_t fCutX; // cut on X difference
141 Double_t fCutY; // cut on Y difference
142 Double_t fCutZ; // cut on Z difference
143 Double_t fCutAlphaMin; // cut on difference between track 'alpha' and phi
144 Double_t fCutAlphaMax; // cut on difference between track 'alpha' and phi
145 Double_t fCutAngle; // cut on angle between track projection and cluster
146 Double_t fMaxDist; // maximum allowed total distance between track proj an cluster
dcd86c5d 147 Double_t fCutNITS; // mimimum number of track hits in the ITS
148 Double_t fCutNTPC; // mimimum number of track hits in the TPC
149
fe17d4cb 150 Double_t fRho; // energy correction: density
151 Double_t fX0; // energy correction: radiation length
152
c61f0e70 153 TObjArray *fTracks; //! collection of tracks
fe17d4cb 154 TObjArray *fClusters; //! collection of EMCAL clusters (ESDCaloCluster or EMCALRecPoint)
155 TList *fMatches; //! collection of matches between tracks and clusters
156
c61f0e70 157 AliEMCALGeometry *fGeom; //! EMCAL geometry
158
ba6de5ea 159 ClassDef(AliEMCALTracker, 3) // EMCAL "tracker"
fe17d4cb 160};
161
162#endif