]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/totEt/AliAnalysisEtSelectorEmcal.cxx
Fixing issues with the reconstruction efficiency, adding histograms to do a simultane...
[u/mrichter/AliRoot.git] / PWGLF / totEt / AliAnalysisEtSelectorEmcal.cxx
1 //_________________________________________________________________________
2 //  Utility Class for transverse energy studies
3 //  Selection class for EMCAL
4 //
5 //*-- Authors: Oystein Djuvsland (Bergen)
6 //_________________________________________________________________________
7
8
9 #include "AliAnalysisEtSelectorEmcal.h"
10 #include "AliAnalysisEtCuts.h"
11 #include "AliEMCALTrack.h"
12 #include "TParticle.h"
13
14 AliAnalysisEtSelectorEmcal::AliAnalysisEtSelectorEmcal(AliAnalysisEtCuts* cuts):AliAnalysisEtSelector(cuts)
15 {
16
17 }
18 AliAnalysisEtSelectorEmcal::AliAnalysisEtSelectorEmcal():AliAnalysisEtSelector()
19 {
20 }
21
22 AliAnalysisEtSelectorEmcal::~AliAnalysisEtSelectorEmcal()
23 {
24
25 }
26
27 void AliAnalysisEtSelectorEmcal::Init()
28 {
29     AliAnalysisEtSelector::Init();
30 }
31
32 Int_t AliAnalysisEtSelectorEmcal::Init(const AliESDEvent* event)
33 {   // Init
34
35     AliAnalysisEtSelector::Init(event);
36     Printf("Initializing selector for run: %d", event->GetRunNumber());
37     fInitialized = kTRUE;
38     return 0;
39 }
40
41 TRefArray* AliAnalysisEtSelectorEmcal::GetClusters()
42 {   // Get clusters
43
44     if(!fClusterArray) fClusterArray = new TRefArray;
45
46     if(fClusterArray)
47     {
48         fEvent->GetEMCALClusters(fClusterArray);
49     }
50     else
51     {
52         Printf("Could not initialize cluster array");
53     }
54     return fClusterArray;
55 }
56
57 Bool_t AliAnalysisEtSelectorEmcal::PassMinEnergyCut(const AliESDCaloCluster& cl) const
58 {
59   Float_t pos[3];
60   cl.GetPosition(pos);
61   TVector3 cp(pos);
62   return TMath::Sin(cp.Theta())*cl.E() > fCuts->GetReconstructedEmcalClusterEnergyCut();
63 }
64
65 Bool_t AliAnalysisEtSelectorEmcal::PassMinEnergyCut(const TParticle& p) const
66 {
67   return TMath::Sin(p.Theta())*p.Energy() > fCuts->GetReconstructedEmcalClusterEnergyCut();
68 }
69
70 Bool_t AliAnalysisEtSelectorEmcal::PassDistanceToBadChannelCut(const AliESDCaloCluster& ) const
71 {
72     return kTRUE;
73 }
74
75 Bool_t AliAnalysisEtSelectorEmcal::PassTrackMatchingCut(const AliESDCaloCluster& cluster) const
76 {
77
78   Int_t nTracksMatched = cluster.GetNTracksMatched();
79   if(nTracksMatched == 0){
80     return kTRUE;
81   }
82   
83   Int_t trackMatchedIndex = cluster.GetTrackMatchedIndex();
84   if(trackMatchedIndex < 0){
85     return kTRUE;
86   }
87   AliVParticle *track = fEvent->GetTrack(trackMatchedIndex);
88   if(track->Pt()<0.5) return kTRUE;//Track matches below about 500 MeV are mostly random.  It takes ~460 MeV to reach the EMCal
89
90   //Float_t recoE = cluster.E();
91   //Float_t pos[3];
92
93 //     //cluster.GetPosition(pos);
94 //     Int_t trackMatchIdx = cluster.GetTrackMatchedIndex();
95 //     //Double_t distance = 9999.0;
96 //     if(trackMatchIdx>-1)
97 //     {
98 //       return kTRUE;
99 //       //distance = CalcTrackClusterDistance(pos, &trackMatchIdx);
100 //     }
101
102
103     return kFALSE;
104     //return distance > fCuts->GetEmcalTrackDistanceCut();
105 }
106
107 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const TParticle& part)
108 {
109   float myphi = part.Phi();
110   myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
111     return TMath::Abs(part.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
112     && myphi < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
113     && myphi > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
114 }
115
116 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const AliVTrack& part)
117 {
118   float myphi = part.Phi();
119   myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
120   return TMath::Abs(part.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
121     && myphi < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
122     && myphi > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
123 }
124
125 Bool_t AliAnalysisEtSelectorEmcal::CutGeometricalAcceptance(const AliESDCaloCluster& cluster)
126 {
127   Float_t pos[3];
128   cluster.GetPosition(pos);
129   TVector3 cp(pos);
130   float myphi = cp.Phi();
131   myphi = AliAnalysisEtSelector::ShiftAngle(myphi);
132   return TMath::Abs(cp.Eta()) < fCuts->GetGeometryEmcalEtaAccCut()
133     && myphi < fCuts->GetGeometryEmcalPhiAccMaxCut()*TMath::Pi()/180.
134     && myphi > fCuts->GetGeometryEmcalPhiAccMinCut()*TMath::Pi()/180.;
135 }
136
137
138 Double_t
139 AliAnalysisEtSelectorEmcal::CalcTrackClusterDistance(const Float_t clsPos[3],Int_t *trkMatchId) const
140 {   // calculate distance between cluster and closest track
141
142     Double_t trkPos[3] = {0,0,0};
143
144     Int_t bestTrkMatchId = -1;
145     Double_t distance = 9999; // init to a big number
146
147     Double_t dist = 0;
148     Double_t distX = 0, distY = 0, distZ = 0;
149
150     for (Int_t iTrack = 0; iTrack < fEvent->GetNumberOfTracks(); iTrack++) {
151         AliESDtrack *track = static_cast<AliESDtrack*>( fEvent->GetTrack(iTrack) );
152         if (!track) {
153             AliError(Form("ERROR: Could not get track %d", iTrack));
154             continue;
155         }
156
157         // check for approx. eta and phi range before we propagate..
158         // TBD
159
160         AliEMCALTrack emctrack(*track);
161         if (!emctrack.PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) ) {
162             continue;
163         }
164         emctrack.GetXYZ(trkPos);
165
166         distX = clsPos[0]-trkPos[0];
167         distY = clsPos[1]-trkPos[1];
168         distZ = clsPos[2]-trkPos[2];
169         dist = TMath::Sqrt(distX*distX + distY*distY + distZ*distZ);
170
171         if (dist < distance) {
172             distance = dist;
173             bestTrkMatchId = iTrack;
174         }
175     } // iTrack
176
177     // printf("CalcTrackClusterDistance: bestTrkMatch %d origTrkMatch %d distance %f\n", bestTrkMatchId, *trkMatchId, distance);
178     *trkMatchId = bestTrkMatchId;
179     return distance;
180 }
181
182
183
184
185