1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
17 //_________________________________________________________________________
\r
19 // Class for the electron identification.
\r
20 // Clusters from EMCAL matched to tracks
\r
21 // and kept in the AOD. Few histograms produced.
\r
23 // -- Author: J.L. Klay (Cal Poly), M. Heinz (Yale)
\r
24 //////////////////////////////////////////////////////////////////////////////
\r
26 // --- ROOT system ---
\r
28 #include <TParticle.h>
\r
29 #include <TNtuple.h>
\r
30 #include <TClonesArray.h>
\r
31 #include <TObjString.h>
\r
32 //#include <Riostream.h>
\r
34 // --- Analysis system ---
\r
35 #include "AliAnaElectron.h"
\r
36 #include "AliCaloTrackReader.h"
\r
37 #include "AliMCAnalysisUtils.h"
\r
38 #include "AliAODCaloCluster.h"
\r
39 #include "AliFidutialCut.h"
\r
40 #include "AliAODTrack.h"
\r
41 #include "AliAODPid.h"
\r
42 #include "AliCaloPID.h"
\r
43 #include "AliAODMCParticle.h"
\r
44 #include "AliStack.h"
\r
45 #include "AliExternalTrackParam.h"
\r
46 #include "AliESDv0.h"
\r
47 #include "AliESDtrack.h"
\r
48 #include "AliAODJet.h"
\r
49 #include "AliAODEvent.h"
\r
51 ClassImp(AliAnaElectron)
\r
53 //____________________________________________________________________________
\r
54 AliAnaElectron::AliAnaElectron()
\r
55 : AliAnaPartCorrBaseClass(),fCalorimeter(""),
\r
56 fpOverEmin(0.),fpOverEmax(0.),fResidualCut(0.),
\r
57 fDrCut(0.),fPairDcaCut(0.),fDecayLenCut(0.),fImpactCut(0.),
\r
58 fAssocPtCut(0.),fMassCut(0.),fSdcaCut(0.),fITSCut(0),
\r
59 fNTagTrkCut(0),fIPSigCut(0.),
\r
60 fWriteNtuple(kFALSE),
\r
63 fh1pOverE(0),fh1dR(0),fh2EledEdx(0),fh2MatchdEdx(0),fh2dEtadPhi(0),
\r
64 fh2dEtadPhiMatched(0),fh2dEtadPhiUnmatched(0),
\r
65 fh2TrackPVsClusterE(0),fh2TrackPtVsClusterE(0),fh2TrackPhiVsClusterPhi(0),fh2TrackEtaVsClusterEta(0),
\r
66 //Photonic electron checks
\r
67 fh1OpeningAngle(0),fh1MinvPhoton(0),
\r
69 fhPtElectron(0),fhPhiElectron(0),fhEtaElectron(0),
\r
70 fhPtNPE(0),fhPhiNPE(0),fhEtaNPE(0),
\r
71 fhPtPE(0),fhPhiPE(0),fhEtaPE(0),
\r
72 fhPtConversion(0),fhPhiConversion(0),fhEtaConversion(0),
\r
73 fhPtBottom(0),fhPhiBottom(0),fhEtaBottom(0),
\r
74 fhPtCharm(0),fhPhiCharm(0),fhEtaCharm(0),
\r
75 fhPtCFromB(0),fhPhiCFromB(0),fhEtaCFromB(0),
\r
76 fhPtDalitz(0),fhPhiDalitz(0),fhEtaDalitz(0),
\r
77 fhPtWDecay(0),fhPhiWDecay(0),fhEtaWDecay(0),
\r
78 fhPtZDecay(0),fhPhiZDecay(0),fhEtaZDecay(0),
\r
79 fhPtAll(0),fhPhiAll(0),fhEtaAll(0),
\r
80 fhPtUnknown(0),fhPhiUnknown(0),fhEtaUnknown(0),
\r
81 fhPtMisidentified(0),fhPhiMisidentified(0),fhEtaMisidentified(0),
\r
82 fhPtHadron(0),fhPtEleTrkDet(0),
\r
84 fhImpactXY(0),fhRefMult(0),fhRefMult2(0),
\r
86 fhDVMBtagCut1(0),fhDVMBtagCut2(0),fhDVMBtagCut3(0),fhDVMBtagQA1(0),fhDVMBtagQA2(0),fhDVMBtagQA3(0),
\r
87 fhDVMBtagQA4(0),fhDVMBtagQA5(0),fhIPSigBtagQA1(0),fhIPSigBtagQA2(0),
\r
89 fhJetType(0),fhBJetXsiFF(0),fhBJetPtFF(0),fhBJetEtaPhi(0),fhNonBJetXsiFF(0),fhNonBJetPtFF(0),fhNonBJetEtaPhi(0),
\r
91 fMCEleNtuple(0),fhPtMCHadron(0),fhPtMCBottom(0),fhPtMCCharm(0),fhPtMCCFromB(0),fhPtMCConversion(0),
\r
92 fhPtMCDalitz(0),fhPtMCWDecay(0),fhPtMCZDecay(0),fhPtMCUnknown(0)
\r
96 //Initialize parameters
\r
101 //____________________________________________________________________________
\r
102 AliAnaElectron::AliAnaElectron(const AliAnaElectron & g)
\r
103 : AliAnaPartCorrBaseClass(g),fCalorimeter(g.fCalorimeter),
\r
104 fpOverEmin(g.fpOverEmin),fpOverEmax(g.fpOverEmax),fResidualCut(g.fResidualCut),
\r
105 fDrCut(g.fDrCut),fPairDcaCut(g.fPairDcaCut),fDecayLenCut(g.fDecayLenCut),fImpactCut(g.fImpactCut),
\r
106 fAssocPtCut(g.fAssocPtCut),fMassCut(g.fMassCut),fSdcaCut(g.fSdcaCut),fITSCut(g.fITSCut),
\r
107 fNTagTrkCut(g.fNTagTrkCut),fIPSigCut(g.fIPSigCut),
\r
108 fWriteNtuple(g.fWriteNtuple),
\r
110 fEleNtuple(g.fEleNtuple),
\r
111 fh1pOverE(g.fh1pOverE),fh1dR(g.fh1dR),
\r
112 fh2EledEdx(g.fh2EledEdx),fh2MatchdEdx(g.fh2MatchdEdx),fh2dEtadPhi(g.fh2dEtadPhi),
\r
113 fh2dEtadPhiMatched(g.fh2dEtadPhiMatched),fh2dEtadPhiUnmatched(g.fh2dEtadPhiUnmatched),
\r
114 fh2TrackPVsClusterE(g.fh2TrackPVsClusterE),fh2TrackPtVsClusterE(g.fh2TrackPtVsClusterE),
\r
115 fh2TrackPhiVsClusterPhi(g.fh2TrackPhiVsClusterPhi),fh2TrackEtaVsClusterEta(g.fh2TrackEtaVsClusterEta),
\r
116 //Photonic electron checks
\r
117 fh1OpeningAngle(g.fh1OpeningAngle),fh1MinvPhoton(g.fh1MinvPhoton),
\r
119 fhPtElectron(g.fhPtElectron),fhPhiElectron(g.fhPhiElectron),fhEtaElectron(g.fhEtaElectron),
\r
120 fhPtNPE(g.fhPtNPE),fhPhiNPE(g.fhPhiNPE),fhEtaNPE(g.fhEtaNPE),
\r
121 fhPtPE(g.fhPtPE),fhPhiPE(g.fhPhiPE),fhEtaPE(g.fhEtaPE),
\r
122 fhPtConversion(g.fhPtConversion),fhPhiConversion(g.fhPhiConversion),fhEtaConversion(g.fhEtaConversion),
\r
123 fhPtBottom(g.fhPtBottom),fhPhiBottom(g.fhPhiBottom),fhEtaBottom(g.fhEtaBottom),
\r
124 fhPtCharm(g.fhPtCharm),fhPhiCharm(g.fhPhiCharm),fhEtaCharm(g.fhEtaCharm),
\r
125 fhPtCFromB(g.fhPtCFromB),fhPhiCFromB(g.fhPhiCFromB),fhEtaCFromB(g.fhEtaCFromB),
\r
126 fhPtDalitz(g.fhPtDalitz),fhPhiDalitz(g.fhPhiDalitz),fhEtaDalitz(g.fhEtaDalitz),
\r
127 fhPtWDecay(g.fhPtWDecay),fhPhiWDecay(g.fhPhiWDecay),fhEtaWDecay(g.fhEtaWDecay),
\r
128 fhPtZDecay(g.fhPtZDecay),fhPhiZDecay(g.fhPhiZDecay),fhEtaZDecay(g.fhEtaZDecay),
\r
129 fhPtAll(g.fhPtAll),fhPhiAll(g.fhPhiAll),fhEtaAll(g.fhEtaAll),
\r
130 fhPtUnknown(g.fhPtUnknown),fhPhiUnknown(g.fhPhiUnknown),fhEtaUnknown(g.fhEtaUnknown),
\r
131 fhPtMisidentified(g.fhPtMisidentified),fhPhiMisidentified(g.fhPhiMisidentified),fhEtaMisidentified(g.fhEtaMisidentified),
\r
132 fhPtHadron(g.fhPtHadron),fhPtEleTrkDet(g.fhPtEleTrkDet),
\r
134 fhImpactXY(g.fhImpactXY),fhRefMult(g.fhRefMult),fhRefMult2(g.fhRefMult2),
\r
136 fhDVMBtagCut1(g.fhDVMBtagCut1),fhDVMBtagCut2(g.fhDVMBtagCut2),fhDVMBtagCut3(g.fhDVMBtagCut3),
\r
137 fhDVMBtagQA1(g.fhDVMBtagQA1),fhDVMBtagQA2(g.fhDVMBtagQA2),fhDVMBtagQA3(g.fhDVMBtagQA3),
\r
138 fhDVMBtagQA4(g.fhDVMBtagQA4),fhDVMBtagQA5(g.fhDVMBtagQA5),fhIPSigBtagQA1(g.fhIPSigBtagQA1),
\r
139 fhIPSigBtagQA2(g.fhIPSigBtagQA2),
\r
141 fhJetType(g.fhJetType),fhBJetXsiFF(g.fhBJetXsiFF),fhBJetPtFF(g.fhBJetPtFF),fhBJetEtaPhi(g.fhBJetEtaPhi),
\r
142 fhNonBJetXsiFF(g.fhNonBJetXsiFF),fhNonBJetPtFF(g.fhNonBJetPtFF),fhNonBJetEtaPhi(g.fhNonBJetEtaPhi),
\r
144 fMCEleNtuple(g.fMCEleNtuple),fhPtMCHadron(g.fhPtMCHadron),fhPtMCBottom(g.fhPtMCBottom),
\r
145 fhPtMCCharm(g.fhPtMCCharm),fhPtMCCFromB(g.fhPtMCCFromB),fhPtMCConversion(g.fhPtMCConversion),
\r
146 fhPtMCDalitz(g.fhPtMCDalitz),fhPtMCWDecay(g.fhPtMCWDecay),
\r
147 fhPtMCZDecay(g.fhPtMCZDecay),fhPtMCUnknown(g.fhPtMCUnknown)
\r
153 //_________________________________________________________________________
\r
154 AliAnaElectron & AliAnaElectron::operator = (const AliAnaElectron & g)
\r
156 // assignment operator
\r
158 if(&g == this) return *this;
\r
159 fCalorimeter = g.fCalorimeter;
\r
160 fpOverEmin = g.fpOverEmin;
\r
161 fpOverEmax = g.fpOverEmax;
\r
162 fResidualCut = g.fResidualCut;
\r
164 fPairDcaCut = g.fPairDcaCut;
\r
165 fDecayLenCut = g.fDecayLenCut;
\r
166 fImpactCut = g.fImpactCut;
\r
167 fAssocPtCut = g.fAssocPtCut;
\r
168 fMassCut = g.fMassCut;
\r
169 fSdcaCut = g.fSdcaCut;
\r
170 fITSCut = g.fITSCut;
\r
171 fNTagTrkCut = g.fNTagTrkCut;
\r
172 fIPSigCut = g.fIPSigCut;
\r
173 fWriteNtuple = g.fWriteNtuple;
\r
174 fEleNtuple = g.fEleNtuple;
\r
175 fh1pOverE = g.fh1pOverE;
\r
177 fh2EledEdx = g.fh2EledEdx;
\r
178 fh2MatchdEdx = g.fh2MatchdEdx;
\r
179 fh2dEtadPhi = g.fh2dEtadPhi;
\r
180 fh2dEtadPhiMatched = g.fh2dEtadPhiMatched;
\r
181 fh2dEtadPhiUnmatched = g.fh2dEtadPhiUnmatched;
\r
182 fh2TrackPVsClusterE = g.fh2TrackPVsClusterE;
\r
183 fh2TrackPtVsClusterE = g.fh2TrackPtVsClusterE;
\r
184 fh2TrackPhiVsClusterPhi = g.fh2TrackPhiVsClusterPhi;
\r
185 fh2TrackEtaVsClusterEta = g.fh2TrackEtaVsClusterEta;
\r
186 fh1OpeningAngle = g.fh1OpeningAngle;
\r
187 fh1MinvPhoton = g.fh1MinvPhoton;
\r
188 fhPtElectron = g.fhPtElectron;
\r
189 fhPhiElectron = g.fhPhiElectron;
\r
190 fhEtaElectron = g.fhEtaElectron;
\r
191 fhPtNPE = g.fhPtNPE;
\r
192 fhPhiNPE = g.fhPhiNPE;
\r
193 fhEtaNPE = g.fhEtaNPE;
\r
195 fhPhiPE = g.fhPhiPE;
\r
196 fhEtaPE = g.fhEtaPE;
\r
197 fhPtConversion = g.fhPtConversion;
\r
198 fhPhiConversion = g.fhPhiConversion;
\r
199 fhEtaConversion = g.fhEtaConversion;
\r
200 fhPtBottom = g.fhPtBottom;
\r
201 fhPhiBottom = g.fhPhiBottom;
\r
202 fhEtaBottom = g.fhEtaBottom;
\r
203 fhPtCharm = g.fhPtCharm;
\r
204 fhPhiCharm = g.fhPhiCharm;
\r
205 fhEtaCharm = g.fhEtaCharm;
\r
206 fhPtCFromB = g.fhPtCFromB;
\r
207 fhPhiCFromB = g.fhPhiCFromB;
\r
208 fhEtaCFromB = g.fhEtaCFromB;
\r
209 fhPtDalitz = g.fhPtDalitz;
\r
210 fhPhiDalitz = g.fhPhiDalitz;
\r
211 fhEtaDalitz = g.fhEtaDalitz;
\r
212 fhPtWDecay = g.fhPtWDecay;
\r
213 fhPhiWDecay = g.fhPhiWDecay;
\r
214 fhEtaWDecay = g.fhEtaWDecay;
\r
215 fhPtZDecay = g.fhPtZDecay;
\r
216 fhPhiZDecay = g.fhPhiZDecay;
\r
217 fhEtaZDecay = g.fhEtaZDecay;
\r
218 fhPtAll = g.fhPtAll;
\r
219 fhPhiAll = g.fhPhiAll;
\r
220 fhEtaAll = g.fhEtaAll;
\r
221 fhPtUnknown = g.fhPtUnknown;
\r
222 fhPhiUnknown = g.fhPhiUnknown;
\r
223 fhEtaUnknown = g.fhEtaUnknown;
\r
224 fhPtMisidentified = g.fhPtMisidentified;
\r
225 fhPhiMisidentified = g.fhPhiMisidentified;
\r
226 fhEtaMisidentified = g.fhEtaMisidentified;
\r
228 fhPtHadron = g.fhPtHadron;
\r
229 fhPtEleTrkDet = g.fhPtEleTrkDet;
\r
232 fhImpactXY = g.fhImpactXY;
\r
233 fhRefMult = g.fhRefMult;
\r
234 fhRefMult2 = g.fhRefMult2;
\r
237 fhDVMBtagCut1 = g.fhDVMBtagCut1;
\r
238 fhDVMBtagCut2 = g.fhDVMBtagCut2;
\r
239 fhDVMBtagCut3 = g.fhDVMBtagCut3;
\r
240 fhDVMBtagQA1 = g.fhDVMBtagQA1;
\r
241 fhDVMBtagQA2 = g.fhDVMBtagQA2;
\r
242 fhDVMBtagQA3 = g.fhDVMBtagQA3;
\r
243 fhDVMBtagQA4 = g.fhDVMBtagQA4;
\r
244 fhDVMBtagQA5 = g.fhDVMBtagQA5;
\r
245 fhIPSigBtagQA1 = g.fhIPSigBtagQA1;
\r
246 fhIPSigBtagQA2 = g.fhIPSigBtagQA2;
\r
248 fhJetType = g.fhJetType;
\r
249 fhBJetXsiFF = g.fhBJetXsiFF;
\r
250 fhBJetPtFF = g.fhBJetPtFF;
\r
251 fhBJetEtaPhi = g.fhBJetEtaPhi;
\r
252 fhNonBJetXsiFF = g.fhNonBJetXsiFF;
\r
253 fhNonBJetPtFF = g.fhNonBJetPtFF;
\r
254 fhNonBJetEtaPhi = g.fhNonBJetEtaPhi;
\r
256 fMCEleNtuple = g.fMCEleNtuple;
\r
257 fhPtMCHadron = g.fhPtMCHadron;
\r
258 fhPtMCBottom = g.fhPtMCBottom;
\r
259 fhPtMCCharm = g.fhPtMCCharm;
\r
260 fhPtMCCFromB = g.fhPtMCCFromB;
\r
261 fhPtMCConversion = g.fhPtMCConversion;
\r
262 fhPtMCDalitz = g.fhPtMCDalitz;
\r
263 fhPtMCWDecay = g.fhPtMCWDecay;
\r
264 fhPtMCZDecay = g.fhPtMCZDecay;
\r
265 fhPtMCUnknown = g.fhPtMCUnknown;
\r
271 //____________________________________________________________________________
\r
272 AliAnaElectron::~AliAnaElectron()
\r
279 //________________________________________________________________________
\r
280 TList * AliAnaElectron::GetCreateOutputObjects()
\r
282 // Create histograms to be saved in output file and
\r
283 // store them in outputContainer
\r
284 TList * outputContainer = new TList() ;
\r
285 outputContainer->SetName("ElectronHistos") ;
\r
287 //created ele ntuple for further analysis
\r
289 fEleNtuple = new TNtuple("EleNtuple","Electron Ntuple","tmctag:cmctag:pt:phi:eta:p:E:deta:dphi:nCells:dEdx:pidProb:impXY:impZ");
\r
290 outputContainer->Add(fEleNtuple) ;
\r
293 Int_t nptbins = GetHistoNPtBins();
\r
294 Int_t nphibins = GetHistoNPhiBins();
\r
295 Int_t netabins = GetHistoNEtaBins();
\r
296 Float_t ptmax = GetHistoPtMax();
\r
297 Float_t phimax = GetHistoPhiMax();
\r
298 Float_t etamax = GetHistoEtaMax();
\r
299 Float_t ptmin = GetHistoPtMin();
\r
300 Float_t phimin = GetHistoPhiMin();
\r
301 Float_t etamin = GetHistoEtaMin();
\r
303 fh1pOverE = new TH1F("h1pOverE","EMCAL-TRACK matches p/E",100,0.,10.);
\r
304 fh1dR = new TH1F("h1dR","EMCAL-TRACK matches dR",300, 0.,TMath::Pi());
\r
305 fh2EledEdx = new TH2F("h2EledEdx","dE/dx vs. p for electrons",200,0.,50.,200,0.,400.);
\r
306 fh2MatchdEdx = new TH2F("h2MatchdEdx","dE/dx vs. p for all matches",200,0.,50.,200,0.,400.);
\r
307 fh2dEtadPhi = new TH2F("h2dEtadPhi","#Delta#eta vs. #Delta#phi for all track-cluster pairs",200,0.,1.4,300,0.,TMath::Pi());
\r
308 fh2dEtadPhiMatched = new TH2F("h2dEtadPhiMatched","#Delta#eta vs. #Delta#phi for matched track-cluster pairs",200,0.,1.4,300,0.,TMath::Pi());
\r
309 fh2dEtadPhiUnmatched = new TH2F("h2dEtadPhiUnmatched","#Delta#eta vs. #Delta#phi for unmatched track-cluster pairs",200,0.,1.4,300,0.,TMath::Pi());
\r
311 fh2TrackPVsClusterE = new TH2F("h2TrackPVsClusterE","h2TrackPVsClusterE",nptbins,ptmin,ptmax,nptbins,ptmin,ptmax);
\r
312 fh2TrackPtVsClusterE = new TH2F("h2TrackPtVsClusterE","h2TrackPtVsClusterE",nptbins,ptmin,ptmax,nptbins,ptmin,ptmax);
\r
313 fh2TrackPhiVsClusterPhi = new TH2F("h2TrackPhiVsClusterPhi","h2TrackPhiVsClusterPhi",nphibins,phimin,phimax,nphibins,phimin,phimax);
\r
314 fh2TrackEtaVsClusterEta = new TH2F("h2TrackEtaVsClusterEta","h2TrackEtaVsClusterEta",netabins,etamin,etamax,netabins,etamin,etamax);
\r
316 outputContainer->Add(fh1pOverE) ;
\r
317 outputContainer->Add(fh1dR) ;
\r
318 outputContainer->Add(fh2EledEdx) ;
\r
319 outputContainer->Add(fh2MatchdEdx) ;
\r
320 outputContainer->Add(fh2dEtadPhi) ;
\r
321 outputContainer->Add(fh2dEtadPhiMatched) ;
\r
322 outputContainer->Add(fh2dEtadPhiUnmatched) ;
\r
323 outputContainer->Add(fh2TrackPVsClusterE) ;
\r
324 outputContainer->Add(fh2TrackPtVsClusterE) ;
\r
325 outputContainer->Add(fh2TrackPhiVsClusterPhi) ;
\r
326 outputContainer->Add(fh2TrackEtaVsClusterEta) ;
\r
328 //photonic electron checks
\r
329 fh1OpeningAngle = new TH1F("hOpeningAngle","Opening angle between e+e- pairs",100,0.,TMath::Pi());
\r
330 fh1MinvPhoton = new TH1F("hMinvPhoton","Invariant mass of e+e- pairs",200,0.,2.);
\r
332 outputContainer->Add(fh1OpeningAngle);
\r
333 outputContainer->Add(fh1MinvPhoton);
\r
335 fhPtElectron = new TH1F("hPtElectron","Electron pT",nptbins,ptmin,ptmax);
\r
336 fhPhiElectron = new TH2F("hPhiElectron","Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
337 fhEtaElectron = new TH2F("hEtaElectron","Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
338 fhPtNPE = new TH1F("hPtNPE","Non-photonic Electron pT",nptbins,ptmin,ptmax);
\r
339 fhPhiNPE = new TH2F("hPhiNPE","Non-photonic Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
340 fhEtaNPE = new TH2F("hEtaNPE","Non-photonic Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
341 fhPtPE = new TH1F("hPtPE","Photonic Electron pT",nptbins,ptmin,ptmax);
\r
342 fhPhiPE = new TH2F("hPhiPE","Photonic Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
343 fhEtaPE = new TH2F("hEtaPE","Photonic Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
345 outputContainer->Add(fhPtElectron) ;
\r
346 outputContainer->Add(fhPhiElectron) ;
\r
347 outputContainer->Add(fhEtaElectron) ;
\r
348 outputContainer->Add(fhPtNPE) ;
\r
349 outputContainer->Add(fhPhiNPE) ;
\r
350 outputContainer->Add(fhEtaNPE) ;
\r
351 outputContainer->Add(fhPtPE) ;
\r
352 outputContainer->Add(fhPhiPE) ;
\r
353 outputContainer->Add(fhEtaPE) ;
\r
355 fhPtHadron = new TH1F("hPtHadron","Charged hadrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
356 fhPtEleTrkDet = new TH1F("hPtEleTrkDet","Electrons identified by tracking detectors w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
358 outputContainer->Add(fhPtHadron);
\r
359 outputContainer->Add(fhPtEleTrkDet);
\r
362 fhImpactXY = new TH1F("hImpactXY","Impact parameter for all tracks",200,-10,10.);
\r
363 fhRefMult = new TH1F("hRefMult" ,"refmult QA: " ,100,0,200);
\r
364 fhRefMult2 = new TH1F("hRefMult2" ,"refmult2 QA: " ,100,0,200);
\r
366 outputContainer->Add(fhImpactXY);
\r
367 outputContainer->Add(fhRefMult);
\r
368 outputContainer->Add(fhRefMult2);
\r
371 fhDVMBtagCut1 = new TH2F("hdvmbtag_cut1","DVM B-tag result cut1", 10,0,10 ,nptbins,ptmin,ptmax);
\r
372 fhDVMBtagCut2 = new TH2F("hdvmbtag_cut2","DVM B-tag result cut2", 10,0,10 ,nptbins,ptmin,ptmax);
\r
373 fhDVMBtagCut3 = new TH2F("hdvmbtag_cut3","DVM B-tag result cut3", 10,0,10 ,nptbins,ptmin,ptmax);
\r
374 fhDVMBtagQA1 = new TH2F("hdvmbtag_qa1" ,"DVM B-tag QA: pairDCA vs length", 100,0,0.2 ,100,0,1.0);
\r
375 fhDVMBtagQA2 = new TH2F("hdvmbtag_qa2" ,"DVM B-tag QA: signDCA vs mass" , 200,-0.5,0.5 ,100,0,10);
\r
376 fhDVMBtagQA3 = new TH1F("hdvmbtag_qa3" ,"DVM B-tag QA: ITS-Hits electron" ,7,0,7);
\r
377 fhDVMBtagQA4 = new TH1F("hdvmbtag_qa4" ,"DVM B-tag QA: IP d electron" ,200,-3,3);
\r
378 fhDVMBtagQA5 = new TH1F("hdvmbtag_qa5" ,"DVM B-tag QA: IP z electron" ,200,-3,3);
\r
379 fhIPSigBtagQA1 = new TH1F("hipsigbtag_qa1" ,"IPSig B-tag QA: # tag tracks", 20,0,20);
\r
380 fhIPSigBtagQA2 = new TH1F("hipsigbtag_qa2" ,"IPSig B-tag QA: IP significance", 200,-10.,10.);
\r
382 outputContainer->Add(fhDVMBtagCut1) ;
\r
383 outputContainer->Add(fhDVMBtagCut2) ;
\r
384 outputContainer->Add(fhDVMBtagCut3) ;
\r
385 outputContainer->Add(fhDVMBtagQA1) ;
\r
386 outputContainer->Add(fhDVMBtagQA2) ;
\r
387 outputContainer->Add(fhDVMBtagQA3) ;
\r
388 outputContainer->Add(fhDVMBtagQA4) ;
\r
389 outputContainer->Add(fhDVMBtagQA5) ;
\r
390 outputContainer->Add(fhIPSigBtagQA1) ;
\r
391 outputContainer->Add(fhIPSigBtagQA2) ;
\r
393 fhJetType = new TH2F("hJetType","# jets passing each tag method vs jet pt",10,0,10,300,0.,300.);
\r
394 fhBJetXsiFF = new TH2F("hBJetXsiFF","B-jet #Xsi Frag. Fn.",100,0.,10.,300,0.,300.);
\r
395 fhBJetPtFF = new TH2F("hBJetPtFF","B-jet p_{T} Frag. Fn.",nptbins,ptmin,ptmax,300,0.,300.);
\r
396 fhBJetEtaPhi = new TH2F("hBJetEtaPhi","B-jet eta-phi distribution",netabins,etamin,etamax,nphibins,phimin,phimax);
\r
397 fhNonBJetXsiFF = new TH2F("hNonBJetXsiFF","Non B-jet #Xsi Frag. Fn.",100,0.,10.,300,0.,300.);
\r
398 fhNonBJetPtFF = new TH2F("hNonBJetPtFF","Non B-jet p_{T} Frag. Fn.",nptbins,ptmin,ptmax,300,0.,300.);
\r
399 fhNonBJetEtaPhi = new TH2F("hNonBJetEtaPhi","Non B-jet eta-phi distribution",netabins,etamin,etamax,nphibins,phimin,phimax);
\r
401 outputContainer->Add(fhJetType);
\r
402 outputContainer->Add(fhBJetXsiFF);
\r
403 outputContainer->Add(fhBJetPtFF);
\r
404 outputContainer->Add(fhBJetEtaPhi);
\r
405 outputContainer->Add(fhNonBJetXsiFF);
\r
406 outputContainer->Add(fhNonBJetPtFF);
\r
407 outputContainer->Add(fhNonBJetEtaPhi);
\r
411 fhPtConversion = new TH1F("hPtConversion","Conversion electron pT",nptbins,ptmin,ptmax);
\r
412 fhPhiConversion = new TH2F("hPhiConversion","Conversion Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
413 fhEtaConversion = new TH2F("hEtaConversion","Conversion Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
414 fhPtBottom = new TH1F("hPtBottom","Bottom electron pT",nptbins,ptmin,ptmax);
\r
415 fhPhiBottom = new TH2F("hPhiBottom","Bottom Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
416 fhEtaBottom = new TH2F("hEtaBottom","Bottom Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
417 fhPtCharm = new TH1F("hPtCharm","Charm electron pT",nptbins,ptmin,ptmax);
\r
418 fhPhiCharm = new TH2F("hPhiCharm","Charm Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
419 fhEtaCharm = new TH2F("hEtaCharm","Charm Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
420 fhPtCFromB = new TH1F("hPtCFromB","Charm from Bottom electron pT",nptbins,ptmin,ptmax);
\r
421 fhPhiCFromB = new TH2F("hPhiCFromB","Charm from Bottom Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
422 fhEtaCFromB = new TH2F("hEtaCFromB","Charm from Bottom Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
423 fhPtDalitz = new TH1F("hPtDalitz","Dalitz electron pT",nptbins,ptmin,ptmax);
\r
424 fhPhiDalitz = new TH2F("hPhiDalitz","Dalitz Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
425 fhEtaDalitz = new TH2F("hEtaDalitz","Dalitz Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
426 fhPtWDecay = new TH1F("hPtWDecay","W-boson Electron pT",nptbins,ptmin,ptmax);
\r
427 fhPhiWDecay = new TH2F("hPhiWDecay","W-boson electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
428 fhEtaWDecay = new TH2F("hEtaWDecay","W-boson Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
429 fhPtZDecay = new TH1F("hPtZDecay","Z-boson electron pT",nptbins,ptmin,ptmax);
\r
430 fhPhiZDecay = new TH2F("hPhiZDecay","Z-boson Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
431 fhEtaZDecay = new TH2F("hEtaZDecay","Z-boson Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
432 fhPtAll = new TH1F("hPtAll","All electron pT",nptbins,ptmin,ptmax);
\r
433 fhPhiAll = new TH2F("hPhiAll","All Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
434 fhEtaAll = new TH2F("hEtaAll","All Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
435 fhPtUnknown = new TH1F("hPtUnknown","Unknown electron pT",nptbins,ptmin,ptmax);
\r
436 fhPhiUnknown = new TH2F("hPhiUnknown","Unknown Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
437 fhEtaUnknown = new TH2F("hEtaUnknown","Unknown Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
438 fhPtMisidentified = new TH1F("hPtMisidentified","Misidentified electron pT",nptbins,ptmin,ptmax);
\r
439 fhPhiMisidentified = new TH2F("hPhiMisidentified","Misidentified Electron phi vs pT",nptbins,ptmin,ptmax,nphibins,phimin,phimax);
\r
440 fhEtaMisidentified = new TH2F("hEtaMisidentified","Misidentified Electron eta vs. eta",nptbins,ptmin,ptmax,netabins,etamin,etamax);
\r
442 outputContainer->Add(fhPtConversion);
\r
443 outputContainer->Add(fhPhiConversion);
\r
444 outputContainer->Add(fhEtaConversion);
\r
445 outputContainer->Add(fhPtBottom);
\r
446 outputContainer->Add(fhPhiBottom);
\r
447 outputContainer->Add(fhEtaBottom);
\r
448 outputContainer->Add(fhPtCharm);
\r
449 outputContainer->Add(fhPhiCharm);
\r
450 outputContainer->Add(fhEtaCharm);
\r
451 outputContainer->Add(fhPtCFromB);
\r
452 outputContainer->Add(fhPhiCFromB);
\r
453 outputContainer->Add(fhEtaCFromB);
\r
454 outputContainer->Add(fhPtDalitz);
\r
455 outputContainer->Add(fhPhiDalitz);
\r
456 outputContainer->Add(fhEtaDalitz);
\r
457 outputContainer->Add(fhPtWDecay);
\r
458 outputContainer->Add(fhPhiWDecay);
\r
459 outputContainer->Add(fhEtaWDecay);
\r
460 outputContainer->Add(fhPtZDecay);
\r
461 outputContainer->Add(fhPhiZDecay);
\r
462 outputContainer->Add(fhEtaZDecay);
\r
463 outputContainer->Add(fhPtAll);
\r
464 outputContainer->Add(fhPhiAll);
\r
465 outputContainer->Add(fhEtaAll);
\r
466 outputContainer->Add(fhPtUnknown);
\r
467 outputContainer->Add(fhPhiUnknown);
\r
468 outputContainer->Add(fhEtaUnknown);
\r
469 outputContainer->Add(fhPtMisidentified);
\r
470 outputContainer->Add(fhPhiMisidentified);
\r
471 outputContainer->Add(fhEtaMisidentified);
\r
473 //created ele ntuple for further analysis
\r
475 fMCEleNtuple = new TNtuple("MCEleNtuple","MC Electron Ntuple","mctag:pt:phi:eta:x:y:z");
\r
476 outputContainer->Add(fMCEleNtuple) ;
\r
479 fhPtMCHadron = new TH1F("hPtMCHadron","MC Charged hadrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
480 fhPtMCBottom = new TH1F("hPtMCBottom","MC Bottom electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
481 fhPtMCCharm = new TH1F("hPtMCCharm","MC Charm electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
482 fhPtMCCFromB = new TH1F("hPtMCCFromB","MC Charm from Bottom electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
483 fhPtMCConversion = new TH1F("hPtMCConversion","MC Conversion electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
484 fhPtMCDalitz = new TH1F("hPtMCDalitz","MC Dalitz electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
485 fhPtMCWDecay = new TH1F("hPtMCWDecay","MC W Decay electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
486 fhPtMCZDecay = new TH1F("hPtMCZDecay","MC Z Decay electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
487 fhPtMCUnknown = new TH1F("hPtMCUnknown","MC Unknown electrons w/in EMCAL acceptance",nptbins,ptmin,ptmax);
\r
489 outputContainer->Add(fhPtMCHadron);
\r
490 outputContainer->Add(fhPtMCBottom);
\r
491 outputContainer->Add(fhPtMCCharm);
\r
492 outputContainer->Add(fhPtMCCFromB);
\r
493 outputContainer->Add(fhPtMCConversion);
\r
494 outputContainer->Add(fhPtMCDalitz);
\r
495 outputContainer->Add(fhPtMCWDecay);
\r
496 outputContainer->Add(fhPtMCZDecay);
\r
497 outputContainer->Add(fhPtMCUnknown);
\r
501 //Save parameters used for analysis
\r
502 TString parList ; //this will be list of parameters used for this analysis.
\r
505 sprintf(onePar,"--- AliAnaElectron ---\n") ;
\r
507 sprintf(onePar,"fCalorimeter: %s\n",fCalorimeter.Data()) ;
\r
509 sprintf(onePar,"fpOverEmin: %f\n",fpOverEmin) ;
\r
511 sprintf(onePar,"fpOverEmax: %f\n",fpOverEmax) ;
\r
513 sprintf(onePar,"fResidualCut: %f\n",fResidualCut) ;
\r
515 sprintf(onePar,"---DVM Btagging\n");
\r
517 sprintf(onePar,"max IP-cut (e,h): %f\n",fImpactCut);
\r
519 sprintf(onePar,"min ITS-hits: %d\n",fITSCut);
\r
521 sprintf(onePar,"max dR (e,h): %f\n",fDrCut);
\r
523 sprintf(onePar,"max pairDCA: %f\n",fPairDcaCut);
\r
525 sprintf(onePar,"max decaylength: %f\n",fDecayLenCut);
\r
527 sprintf(onePar,"min Associated Pt: %f\n",fAssocPtCut);
\r
529 sprintf(onePar,"---IPSig Btagging\n");
\r
531 sprintf(onePar,"min tag track: %d\n",fNTagTrkCut);
\r
533 sprintf(onePar,"min IP significance: %f\n",fIPSigCut);
\r
536 //Get parameters set in base class.
\r
537 parList += GetBaseParametersList() ;
\r
539 //Get parameters set in FidutialCut class (not available yet)
\r
540 //parlist += GetFidCut()->GetFidCutParametersList()
\r
542 TObjString *oString= new TObjString(parList) ;
\r
543 outputContainer->Add(oString);
\r
545 return outputContainer ;
\r
549 //____________________________________________________________________________
\r
550 void AliAnaElectron::Init()
\r
553 //do some initialization
\r
554 if(fCalorimeter == "PHOS") {
\r
555 printf("AliAnaElectron::Init() - !!STOP: You want to use PHOS in analysis but this is not (yet) supported!!\n!!Check the configuration file!!\n");
\r
556 fCalorimeter = "EMCAL";
\r
558 if(fCalorimeter == "EMCAL" && !GetReader()->IsEMCALSwitchedOn()){
\r
559 printf("AliAnaElectron::Init() - !!STOP: You want to use EMCAL in analysis but it is not read!!\n!!Check the configuration file!!\n");
\r
566 //____________________________________________________________________________
\r
567 void AliAnaElectron::InitParameters()
\r
570 //Initialize the parameters of the analysis.
\r
571 SetOutputAODClassName("AliAODPWG4Particle");
\r
572 SetOutputAODName("PWG4Particle");
\r
574 AddToHistogramsName("AnaElectron_");
\r
576 fCalorimeter = "EMCAL" ;
\r
579 fResidualCut = 0.02;
\r
582 fPairDcaCut = 0.02;
\r
583 fDecayLenCut = 1.0;
\r
594 //__________________________________________________________________
\r
595 void AliAnaElectron::MakeAnalysisFillAOD()
\r
598 // Do analysis and fill aods with electron candidates
\r
599 // These AODs will be used to do subsequent histogram filling
\r
601 // Also fill some QA histograms
\r
604 TObjArray *cl = new TObjArray();
\r
606 Double_t bfield = 0.;
\r
607 if(GetReader()->GetDataType() != AliCaloTrackReader::kMC) bfield = GetReader()->GetBField();
\r
609 //Select the calorimeter of the electron
\r
610 if(fCalorimeter != "EMCAL") {
\r
611 printf("This class not yet implemented for PHOS\n");
\r
614 cl = GetAODEMCAL();
\r
616 ////////////////////////////////////////////////
\r
617 //Start from tracks and get associated clusters
\r
618 ////////////////////////////////////////////////
\r
619 if(!GetAODCTS() || GetAODCTS()->GetEntriesFast() == 0) return ;
\r
620 Int_t ntracks = GetAODCTS()->GetEntriesFast();
\r
621 Int_t refmult = 0; Int_t refmult2 = 0;
\r
623 printf("AliAnaElectron::MakeAnalysisFillAOD() - In CTS aod entries %d\n", ntracks);
\r
625 //Unfortunately, AliAODTracks don't have associated EMCAL clusters.
\r
626 //we have to redo track-matching, I guess
\r
627 Int_t iCluster = -999;
\r
628 Int_t bt = 0; //counter for event b-tags
\r
630 for (Int_t itrk = 0; itrk < ntracks; itrk++) {////////////// track loop
\r
631 iCluster = -999; //start with no match
\r
632 AliAODTrack * track = (AliAODTrack*) (GetAODCTS()->At(itrk)) ;
\r
633 if (TMath::Abs(track->Eta())< 0.5) refmult++;
\r
634 Double_t imp[2] = {-999.,-999.}; Double_t cov[3] = {-999.,-999.,-999.};
\r
635 Bool_t dcaOkay = GetDCA(track,imp,cov); //homegrown dca calculation until AOD is fixed
\r
636 if(!dcaOkay) printf("AliAnaElectron::Problem computing DCA to primary vertex for track %d. Skipping it...\n",itrk);
\r
637 if(TMath::Abs(track->Eta())< 0.5 && TMath::Abs(imp[0])<1.0 && TMath::Abs(imp[1])<1.0) refmult2++;
\r
638 fhImpactXY->Fill(imp[0]);
\r
640 AliAODPid* pid = (AliAODPid*) track->GetDetPid();
\r
642 if(GetDebug() > 0) printf("AliAnaElectron::MakeAnalysisFillAOD() - No PID object - skipping track %d",itrk);
\r
645 Double_t emcpos[3];
\r
646 pid->GetEMCALPosition(emcpos);
\r
647 Double_t emcmom[3];
\r
648 pid->GetEMCALMomentum(emcmom);
\r
650 TVector3 pos(emcpos[0],emcpos[1],emcpos[2]);
\r
651 TVector3 mom(emcmom[0],emcmom[1],emcmom[2]);
\r
652 Double_t tphi = pos.Phi();
\r
653 Double_t teta = pos.Eta();
\r
654 Double_t tmom = mom.Mag();
\r
656 TLorentzVector mom2(mom,0.);
\r
657 Bool_t in = GetFidutialCut()->IsInFidutialCut(mom2,fCalorimeter) ;
\r
658 if(GetDebug() > 1) printf("AliAnaElectron::MakeAnalysisFillAOD() - Track pt %2.2f, phi %2.2f, eta %2.2f in fidutial cut %d\n",track->Pt(), track->Phi(), track->Eta(), in);
\r
659 if(mom.Pt() > GetMinPt() && in) {
\r
661 Double_t dEdx = pid->GetTPCsignal();
\r
663 Int_t ntot = cl->GetEntriesFast();
\r
664 Double_t res = 999.;
\r
665 Double_t pOverE = -999.;
\r
667 Int_t pidProb = track->GetMostProbablePID();
\r
668 if(pidProb == AliAODTrack::kPion || pidProb == AliAODTrack::kKaon || pidProb == AliAODTrack::kProton) fhPtHadron->Fill(track->Pt());
\r
669 if(pidProb == AliAODTrack::kElectron) fhPtEleTrkDet->Fill(track->Pt());
\r
671 Bool_t isElectron = kFALSE;
\r
672 //For tracks in EMCAL acceptance, pair them with all clusters
\r
673 //and fill the dEta vs dPhi for these pairs:
\r
674 for(Int_t iclus = 0; iclus < ntot; iclus++) {
\r
675 AliAODCaloCluster * clus = (AliAODCaloCluster*) (cl->At(iclus));
\r
676 if(!clus) continue;
\r
679 clus->GetPosition(x);
\r
680 TVector3 cluspos(x[0],x[1],x[2]);
\r
681 Double_t deta = teta - cluspos.Eta();
\r
682 Double_t dphi = tphi - cluspos.Phi();
\r
683 if(dphi > TMath::Pi()) dphi -= 2*TMath::Pi();
\r
684 if(dphi < -TMath::Pi()) dphi += 2*TMath::Pi();
\r
685 fh2dEtadPhi->Fill(deta,dphi);
\r
686 fh2TrackPVsClusterE->Fill(clus->E(),track->P());
\r
687 fh2TrackPtVsClusterE->Fill(clus->E(),track->Pt());
\r
688 fh2TrackPhiVsClusterPhi->Fill(cluspos.Phi(),mom.Phi());
\r
689 fh2TrackEtaVsClusterEta->Fill(cluspos.Eta(),mom.Eta());
\r
691 res = sqrt(dphi*dphi + deta*deta);
\r
694 /////////////////////////////////
\r
695 //Perform electron cut analysis//
\r
696 /////////////////////////////////
\r
698 if(res < fResidualCut) {
\r
699 fh2dEtadPhiMatched->Fill(deta,dphi);
\r
706 //Input from second AOD?
\r
708 if(GetReader()->GetAODCTSNormalInputEntries() <= itrk) input = 1;
\r
709 tmctag = GetMCAnalysisUtils()->CheckOrigin(track->GetLabel(),GetReader(),input);
\r
711 //Do you want the cluster or the track label?
\r
713 if(GetReader()->GetAODEMCALNormalInputEntries() <= iclus) input = 1;
\r
714 cmctag = GetMCAnalysisUtils()->CheckOrigin(clus->GetLabel(0),GetReader(),input);
\r
718 fEleNtuple->Fill(tmctag,cmctag,track->Pt(),track->Phi(),track->Eta(),track->P(),clus->E(),deta,dphi,clus->GetNCells(),dEdx,pidProb,imp[0],imp[1]);
\r
721 fh2MatchdEdx->Fill(track->P(),dEdx);
\r
723 Double_t energy = clus->E();
\r
724 if(energy > 0) pOverE = tmom/energy;
\r
725 fh1pOverE->Fill(pOverE);
\r
727 Int_t mult = clus->GetNCells();
\r
728 if(mult < 2 && GetDebug() > 0) printf("Single digit cluster.\n");
\r
730 //////////////////////////////
\r
731 //Electron cuts happen here!//
\r
732 //////////////////////////////
\r
733 if(pOverE > fpOverEmin && pOverE < fpOverEmax) isElectron = kTRUE;
\r
735 fh2dEtadPhiUnmatched->Fill(deta,dphi);
\r
738 } //calocluster loop
\r
740 ///////////////////////////
\r
741 //Fill AOD with electrons//
\r
742 ///////////////////////////
\r
746 if(GetDebug() > 1) printf("Found Electron - do b-tagging\n");
\r
747 Int_t dvmbtag = GetDVMBtag(track); bt += dvmbtag;
\r
749 fh2EledEdx->Fill(track->P(),dEdx);
\r
751 Double_t eMass = 0.511/1000; //mass in GeV
\r
752 Double_t eleE = sqrt(track->P()*track->P() + eMass*eMass);
\r
753 AliAODPWG4Particle tr = AliAODPWG4Particle(track->Px(),track->Py(),track->Pz(),eleE);
\r
754 tr.SetLabel(track->GetLabel());
\r
755 tr.SetCaloLabel(iCluster,-1); //sets the indices of the original caloclusters
\r
756 tr.SetTrackLabel(itrk,-1); //sets the indices of the original tracks
\r
757 tr.SetDetector(fCalorimeter);
\r
758 if(GetReader()->GetAODCTSNormalInputEntries() <= itrk) tr.SetInputFileIndex(1);
\r
759 //Make this preserve sign of particle
\r
760 if(track->Charge() < 0) tr.SetPdg(11); //electron is 11
\r
761 else tr.SetPdg(-11); //positron is -11
\r
763 if(dvmbtag > 0) tr.SetBTagBit(btag,tr.kDVMTag0);
\r
764 if(dvmbtag > 1) tr.SetBTagBit(btag,tr.kDVMTag1);
\r
765 if(dvmbtag > 2) tr.SetBTagBit(btag,tr.kDVMTag2);
\r
768 //Play with the MC stack if available
\r
769 //Check origin of the candidates
\r
772 //FIXME: Need to re-think this for track-oriented analysis
\r
773 //JLK DO WE WANT TRACK TAG OR CLUSTER TAG?
\r
774 tr.SetTag(GetMCAnalysisUtils()->CheckOrigin(tr.GetLabel(),GetReader(),tr.GetInputFileIndex()));
\r
776 if(GetDebug() > 0) printf("AliAnaElectron::MakeAnalysisFillAOD() - Origin of candidate %d\n",tr.GetTag());
\r
777 }//Work with stack also
\r
779 AddAODParticle(tr);
\r
781 if(GetDebug() > 1) printf("AliAnaElectron::MakeAnalysisFillAOD() - Electron selection cuts passed: pT %3.2f, pdg %d\n",tr.Pt(),tr.GetPdg());
\r
783 }//pt, fiducial selection
\r
787 //FIXME: Should we also check from the calocluster side, just in
\r
789 fhRefMult->Fill(refmult);
\r
790 fhRefMult2->Fill(refmult2);
\r
792 if(GetDebug() > 1 && bt > 0) printf("AliAnaElectron::MakeAnalysisFillAOD() *** Event Btagged *** \n");
\r
793 if(GetDebug() > 1) printf("AliAnaElectron::MakeAnalysisFillAOD() End fill AODs \n");
\r
797 //__________________________________________________________________
\r
798 void AliAnaElectron::MakeAnalysisFillHistograms()
\r
800 //Do analysis and fill histograms
\r
802 AliStack * stack = 0x0;
\r
803 TParticle * primary = 0x0;
\r
804 TClonesArray * mcparticles0 = 0x0;
\r
805 TClonesArray * mcparticles1 = 0x0;
\r
806 AliAODMCParticle * aodprimary = 0x0;
\r
808 Int_t ph1 = 0; //photonic 1 count
\r
809 Int_t ph2 = 0; //photonic 2 count
\r
810 Int_t phB = 0; //both count
\r
813 if(GetReader()->ReadStack()){
\r
814 stack = GetMCStack() ;
\r
817 printf("AliAnaElectron::MakeAnalysisFillHistograms() *** no stack ***: \n");
\r
820 else if(GetReader()->ReadAODMCParticles()){
\r
821 //Get the list of MC particles
\r
822 mcparticles0 = GetReader()->GetAODMCParticles(0);
\r
823 if(!mcparticles0 && GetDebug() > 0) {
\r
824 printf("AliAnaElectron::MakeAnalysisFillHistograms() - Standard MCParticles not available!\n");
\r
826 if(GetReader()->GetSecondInputAODTree()){
\r
827 mcparticles1 = GetReader()->GetAODMCParticles(1);
\r
828 if(!mcparticles1 && GetDebug() > 0) {
\r
829 printf("AliAnaElectron::MakeAnalysisFillHistograms() - Second input MCParticles not available!\n");
\r
836 ////////////////////////////////////
\r
837 //Loop over jets and check for b-tag
\r
838 ////////////////////////////////////
\r
839 Int_t njets = (GetReader()->GetOutputEvent())->GetNJets();
\r
841 if(GetDebug() > 0) printf("AliAnaElectron::MakeAnalysisFillHistograms() - Jet AOD branch has %d jets. Performing b-jet tag analysis",njets);
\r
843 for(Int_t ijet = 0; ijet < njets ; ijet++) {
\r
844 AliAODJet * jet = (AliAODJet*)(GetReader()->GetOutputEvent())->GetJet(ijet) ;
\r
845 if(GetDebug() > 3) {
\r
846 printf("AliAODJet ijet = %d\n",ijet);
\r
849 //To "tag" the jet, we will look for it to pass our various criteria
\r
850 //For e jet tag, we just look to see which ones have NPEs
\r
851 //For DVM jet tag, we will look for DVM electrons
\r
852 //For IPSig, we compute the IPSig for all tracks and if the
\r
853 //number passing is above the cut, it passes
\r
854 Bool_t eJet = kFALSE;
\r
855 Bool_t dvmJet = kFALSE;
\r
856 Bool_t ipsigJet = kFALSE;
\r
857 TRefArray* rt = jet->GetRefTracks();
\r
858 Int_t ntrk = rt->GetEntries();
\r
859 Int_t trackCounter = 0; //for ipsig
\r
860 for(Int_t itrk = 0; itrk < ntrk; itrk++) {
\r
861 AliAODTrack* jetTrack = (AliAODTrack*)jet->GetTrack(itrk);
\r
862 if( GetIPSignificance(jetTrack, jet->Phi()) > fIPSigCut) trackCounter++;
\r
863 Bool_t isNPE = CheckTrack(jetTrack,"NPE");
\r
864 if(isNPE) eJet = kTRUE;
\r
865 Bool_t isDVM = CheckTrack(jetTrack,"DVM");
\r
866 if(isDVM) dvmJet = kTRUE;
\r
868 fhIPSigBtagQA1->Fill(trackCounter);
\r
869 if(trackCounter > fNTagTrkCut) ipsigJet = kTRUE;
\r
871 //Fill bjet histograms here
\r
872 if(!(eJet || ipsigJet || dvmJet)) fhJetType->Fill(0.,jet->Pt()); //none
\r
873 if(eJet && !(ipsigJet || dvmJet)) fhJetType->Fill(1.,jet->Pt()); //only ejet
\r
874 if(dvmJet && !(eJet || ipsigJet)) fhJetType->Fill(2.,jet->Pt()); //only dvm
\r
875 if(ipsigJet && !(eJet || dvmJet)) fhJetType->Fill(3.,jet->Pt()); //only ipsig
\r
876 if(eJet && dvmJet && !ipsigJet) fhJetType->Fill(4.,jet->Pt()); //ejet & dvm
\r
877 if(eJet && ipsigJet && !dvmJet) fhJetType->Fill(5.,jet->Pt()); //ejet & ipsig
\r
878 if(dvmJet && ipsigJet && !eJet) fhJetType->Fill(6.,jet->Pt()); //dvm & ipsig
\r
879 if(dvmJet && ipsigJet && eJet) fhJetType->Fill(7.,jet->Pt()); //all
\r
881 for(Int_t itrk = 0; itrk < ntrk; itrk++) {
\r
882 AliAODTrack* jetTrack = (AliAODTrack*)jet->GetTrack(itrk);
\r
883 Double_t xsi = TMath::Log(jet->Pt()/jetTrack->Pt());
\r
884 if(eJet || ipsigJet || dvmJet) {
\r
885 if(GetDebug() > 0) printf("AliAnaElectron::MakeAnalysisFillHistograms - We have a bjet!\n");
\r
887 fhBJetXsiFF->Fill(xsi,jet->Pt());
\r
888 fhBJetPtFF->Fill(jetTrack->Pt(),jet->Pt());
\r
889 fhBJetEtaPhi->Fill(jet->Eta(),jet->Phi());
\r
891 //Fill non-bjet histograms here
\r
892 fhNonBJetXsiFF->Fill(xsi,jet->Pt());
\r
893 fhNonBJetPtFF->Fill(jetTrack->Pt(),jet->Pt());
\r
894 fhNonBJetEtaPhi->Fill(jet->Eta(),jet->Phi());
\r
900 //////////////////////////////
\r
901 //Loop on stored AOD electrons
\r
902 //////////////////////////////
\r
903 Int_t naod = GetOutputAODBranch()->GetEntriesFast();
\r
904 if(GetDebug() > 0) printf("AliAnaElectron::MakeAnalysisFillHistograms() - aod branch entries %d\n", naod);
\r
906 for(Int_t iaod = 0; iaod < naod ; iaod++){
\r
907 AliAODPWG4Particle* ele = (AliAODPWG4Particle*) (GetOutputAODBranch()->At(iaod));
\r
908 Int_t pdg = ele->GetPdg();
\r
910 if(GetDebug() > 3)
\r
911 printf("AliAnaElectron::MakeAnalysisFillHistograms() - PDG %d, MC TAG %d, Calorimeter %s\n", ele->GetPdg(),ele->GetTag(), (ele->GetDetector()).Data()) ;
\r
913 if(TMath::Abs(pdg) != AliCaloPID::kElectron) continue;
\r
914 if(ele->GetDetector() != fCalorimeter) continue;
\r
916 if(GetDebug() > 1)
\r
917 printf("AliAnaElectron::MakeAnalysisFillHistograms() - ID Electron: pt %f, phi %f, eta %f\n", ele->Pt(),ele->Phi(),ele->Eta()) ;
\r
919 //Filter for photonic electrons based on opening angle and Minv
\r
920 //cuts, also fill histograms
\r
921 Bool_t photonic = kFALSE;
\r
922 Bool_t photonic1 = kFALSE;
\r
923 photonic1 = IsItPhotonic(ele); //check against primaries
\r
924 if(photonic1) ph1++;
\r
925 Bool_t photonic2 = kFALSE;
\r
926 photonic2 = IsItPhotonic2(ele); //check against V0s
\r
927 if(photonic2) ph2++;
\r
928 if(photonic1 && photonic2) phB++;
\r
929 if(photonic1 || photonic2) photonic = kTRUE;
\r
931 //Fill electron histograms
\r
932 Float_t ptele = ele->Pt();
\r
933 Float_t phiele = ele->Phi();
\r
934 Float_t etaele = ele->Eta();
\r
936 fhPtElectron ->Fill(ptele);
\r
937 fhPhiElectron ->Fill(ptele,phiele);
\r
938 fhEtaElectron ->Fill(ptele,etaele);
\r
941 fhPtPE->Fill(ptele);
\r
942 fhPhiPE->Fill(ptele,phiele);
\r
943 fhEtaPE->Fill(ptele,etaele);
\r
945 fhPtNPE->Fill(ptele);
\r
946 fhPhiNPE->Fill(ptele,phiele);
\r
947 fhEtaNPE->Fill(ptele,etaele);
\r
951 Int_t tag = ele->GetTag();
\r
952 if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCElectron)) {
\r
953 fhPtAll ->Fill(ptele);
\r
954 fhPhiAll ->Fill(ptele,phiele);
\r
955 fhEtaAll ->Fill(ptele,etaele);
\r
957 if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCConversion)){
\r
958 fhPtConversion ->Fill(ptele);
\r
959 fhPhiConversion ->Fill(ptele,phiele);
\r
960 fhEtaConversion ->Fill(ptele,etaele);
\r
962 else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCEFromB)){
\r
963 fhPtBottom ->Fill(ptele);
\r
964 fhPhiBottom ->Fill(ptele,phiele);
\r
965 fhEtaBottom ->Fill(ptele,etaele);
\r
967 else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCEFromC) && !GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCEFromB)){
\r
968 fhPtCharm ->Fill(ptele);
\r
969 fhPhiCharm ->Fill(ptele,phiele);
\r
970 fhEtaCharm ->Fill(ptele,etaele);
\r
972 else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCEFromCFromB)){
\r
973 fhPtCFromB ->Fill(ptele);
\r
974 fhPhiCFromB ->Fill(ptele,phiele);
\r
975 fhEtaCFromB ->Fill(ptele,etaele);
\r
977 else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCPi0Decay) || GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCEtaDecay) || GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCOtherDecay)) {
\r
978 fhPtDalitz ->Fill(ptele);
\r
979 fhPhiDalitz ->Fill(ptele,phiele);
\r
980 fhEtaDalitz ->Fill(ptele,etaele);
\r
982 else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCWDecay)) {
\r
983 fhPtWDecay ->Fill(ptele);
\r
984 fhPhiWDecay ->Fill(ptele,phiele);
\r
985 fhEtaWDecay ->Fill(ptele,etaele);
\r
987 else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCZDecay)) {
\r
988 fhPtZDecay ->Fill(ptele);
\r
989 fhPhiZDecay ->Fill(ptele,phiele);
\r
990 fhEtaZDecay ->Fill(ptele,etaele);
\r
993 fhPtUnknown ->Fill(ptele);
\r
994 fhPhiUnknown ->Fill(ptele,phiele);
\r
995 fhEtaUnknown ->Fill(ptele,etaele);
\r
999 fhPtMisidentified ->Fill(ptele);
\r
1000 fhPhiMisidentified ->Fill(ptele,phiele);
\r
1001 fhEtaMisidentified ->Fill(ptele,etaele);
\r
1003 }//Histograms with MC
\r
1007 ////////////////////////////////////////////////////////
\r
1008 //Fill histograms of pure MC kinematics from the stack//
\r
1009 ////////////////////////////////////////////////////////
\r
1011 if(GetReader()->ReadStack()) {
\r
1012 for(Int_t ipart = 0; ipart < stack->GetNtrack(); ipart++) {
\r
1013 primary = stack->Particle(ipart);
\r
1014 TLorentzVector mom;
\r
1015 primary->Momentum(mom);
\r
1016 Bool_t in = GetFidutialCut()->IsInFidutialCut(mom,fCalorimeter);
\r
1017 if(primary->Pt() < GetMinPt()) continue;
\r
1020 Int_t pdgcode = primary->GetPdgCode();
\r
1021 if(TMath::Abs(pdgcode) == 211 || TMath::Abs(pdgcode) == 321 || TMath::Abs(pdgcode) == 2212)
\r
1022 fhPtMCHadron->Fill(primary->Pt());
\r
1024 //we only care about electrons
\r
1025 if(TMath::Abs(pdgcode) != 11) continue;
\r
1026 //we only want TRACKABLE electrons (TPC 85-250cm)
\r
1027 if(primary->R() > 200.) continue;
\r
1028 //Ignore low pt electrons
\r
1029 if(primary->Pt() < 0.2) continue;
\r
1031 //find out what the ancestry of this electron is
\r
1034 mctag = GetMCAnalysisUtils()->CheckOrigin(ipart,GetReader(),input);
\r
1037 if(fWriteNtuple) {
\r
1038 fMCEleNtuple->Fill(mctag,primary->Pt(),primary->Phi(),primary->Eta(),primary->Vx(),primary->Vy(),primary->Vz());
\r
1040 if(!GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCConversion)) {
\r
1041 if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEFromB))
\r
1042 fhPtMCBottom->Fill(primary->Pt());
\r
1043 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEFromC))
\r
1044 fhPtMCCharm->Fill(primary->Pt());
\r
1045 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEFromCFromB))
\r
1046 fhPtMCCFromB->Fill(primary->Pt());
\r
1047 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCWDecay))
\r
1048 fhPtMCWDecay->Fill(primary->Pt());
\r
1049 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCZDecay))
\r
1050 fhPtMCZDecay->Fill(primary->Pt());
\r
1051 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCPi0Decay)
\r
1052 || GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEtaDecay)
\r
1053 || GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCOtherDecay))
\r
1054 fhPtMCDalitz->Fill(primary->Pt());
\r
1056 fhPtMCUnknown->Fill(primary->Pt());
\r
1057 } else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCConversion)) {
\r
1058 fhPtMCConversion->Fill(primary->Pt());
\r
1061 } else if(GetReader()->ReadAODMCParticles()) {
\r
1062 Int_t npart0 = mcparticles0->GetEntriesFast();
\r
1064 if(mcparticles1) npart1 = mcparticles1->GetEntriesFast();
\r
1065 Int_t npart = npart0+npart1;
\r
1066 for(Int_t ipart = 0; ipart < npart; ipart++) {
\r
1067 if(ipart < npart0) aodprimary = (AliAODMCParticle*)mcparticles0->At(ipart);
\r
1068 else aodprimary = (AliAODMCParticle*)mcparticles1->At(ipart-npart0);
\r
1070 printf("AliAnaElectron::MakeAnalysisFillHistograms() *** no primary ***: label %d \n", ipart);
\r
1074 Double_t mom[3] = {0.,0.,0.};
\r
1075 aodprimary->PxPyPz(mom);
\r
1076 TLorentzVector mom2(mom,0.);
\r
1077 Bool_t in = GetFidutialCut()->IsInFidutialCut(mom2,fCalorimeter);
\r
1078 if(aodprimary->Pt() < GetMinPt()) continue;
\r
1081 Int_t pdgcode = aodprimary->GetPdgCode();
\r
1082 if(TMath::Abs(pdgcode) == 211 || TMath::Abs(pdgcode) == 321 || TMath::Abs(pdgcode) == 2212)
\r
1083 fhPtMCHadron->Fill(aodprimary->Pt());
\r
1085 //we only care about electrons
\r
1086 if(TMath::Abs(pdgcode) != 11) continue;
\r
1087 //we only want TRACKABLE electrons (TPC 85-250cm)
\r
1088 Double_t radius = TMath::Sqrt(aodprimary->Xv()*aodprimary->Xv() + aodprimary->Yv()*aodprimary->Yv());
\r
1089 if(radius > 200.) continue;
\r
1091 //find out what the ancestry of this electron is
\r
1094 Int_t ival = ipart;
\r
1095 if(ipart > npart0) { ival -= npart0; input = 1;}
\r
1096 mctag = GetMCAnalysisUtils()->CheckOrigin(ival,GetReader(),input);
\r
1099 if(fWriteNtuple) {
\r
1100 fMCEleNtuple->Fill(mctag,aodprimary->Pt(),aodprimary->Phi(),aodprimary->Eta(),aodprimary->Xv(),aodprimary->Yv(),aodprimary->Zv());
\r
1102 if(!GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCConversion)) {
\r
1103 if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEFromB))
\r
1104 fhPtMCBottom->Fill(aodprimary->Pt());
\r
1105 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEFromC))
\r
1106 fhPtMCCharm->Fill(aodprimary->Pt());
\r
1107 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEFromCFromB))
\r
1108 fhPtMCCFromB->Fill(aodprimary->Pt());
\r
1109 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCWDecay))
\r
1110 fhPtMCWDecay->Fill(aodprimary->Pt());
\r
1111 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCZDecay))
\r
1112 fhPtMCZDecay->Fill(aodprimary->Pt());
\r
1113 else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCPi0Decay)
\r
1114 || GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCEtaDecay)
\r
1115 || GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCOtherDecay))
\r
1116 fhPtMCDalitz->Fill(aodprimary->Pt());
\r
1118 fhPtMCUnknown->Fill(aodprimary->Pt());
\r
1119 } else if(GetMCAnalysisUtils()->CheckTagBit(mctag,AliMCAnalysisUtils::kMCConversion)) {
\r
1120 fhPtMCConversion->Fill(aodprimary->Pt());
\r
1124 } //pure MC kine histos
\r
1126 //if(GetDebug() > 0)
\r
1127 printf("\tAliAnaElectron::Photonic electron counts: ph1 %d, ph2 %d, Both %d\n",ph1,ph2,phB);
\r
1130 //__________________________________________________________________
\r
1131 Int_t AliAnaElectron::GetDVMBtag(AliAODTrack * tr )
\r
1133 //This method uses the Displaced Vertex between electron-hadron
\r
1134 //pairs and the primary vertex to determine whether an electron is
\r
1135 //likely from a B hadron.
\r
1138 for(Int_t l = 0; l < 6; l++) if(TESTBIT(tr->GetITSClusterMap(),l)) ncls1++;
\r
1140 fhDVMBtagQA3->Fill(ncls1);
\r
1141 if (ncls1 < fITSCut) return 0;
\r
1143 Double_t imp[2] = {-999.,-999.}; Double_t cov[3] = {-999.,-999.,-999.};
\r
1144 Bool_t dcaOkay = GetDCA(tr,imp,cov); //homegrown dca calculation until AOD is fixed
\r
1146 printf("AliAnaElectron::Problem computing DCA to primary vertex for track %d",tr->GetID());
\r
1150 fhDVMBtagQA4->Fill(imp[0]);
\r
1151 if (TMath::Abs(imp[0]) > fImpactCut ) return 0;
\r
1152 fhDVMBtagQA5->Fill(imp[1]);
\r
1153 if (TMath::Abs(imp[1]) > fImpactCut ) return 0;
\r
1159 for (Int_t k2 =0; k2 < GetAODCTS()->GetEntriesFast() ; k2++) {
\r
1161 AliAODTrack* track2 = (AliAODTrack*) (GetAODCTS()->At(k2));
\r
1162 Int_t id1 = tr->GetID();
\r
1163 Int_t id2 = track2->GetID();
\r
1164 if(id1 == id2) continue;
\r
1167 for(Int_t l = 0; l < 6; l++) if(TESTBIT(track2->GetITSClusterMap(),l)) ncls2++;
\r
1168 if (ncls2 < fITSCut) continue;
\r
1170 if(track2->Pt() < fAssocPtCut) continue;
\r
1172 Double_t dphi = tr->Phi() - track2->Phi();
\r
1173 if(dphi > TMath::Pi()) dphi -= 2*TMath::Pi();
\r
1174 if(dphi < -TMath::Pi()) dphi += 2*TMath::Pi();
\r
1175 Double_t deta = tr->Eta() - track2->Eta();
\r
1176 Double_t dr = sqrt(deta*deta + dphi*dphi);
\r
1178 if(dr > fDrCut) continue;
\r
1180 Double_t sDca1 = ComputeSignDca(tr, track2, 1.0);
\r
1181 if (sDca1 > fSdcaCut) nvtx1++;
\r
1182 Double_t sDca2 = ComputeSignDca(tr, track2, 1.5);
\r
1183 if (sDca2 > fSdcaCut) nvtx2++;
\r
1184 Double_t sDca3 = ComputeSignDca(tr, track2, 1.8);
\r
1185 if (sDca3 > fSdcaCut) nvtx3++;
\r
1187 } //loop over hadrons
\r
1189 if(GetDebug() > 0) {
\r
1190 if (nvtx1>0) printf("result1 of btagging: %d \n",nvtx1);
\r
1191 if (nvtx2>0) printf("result2 of btagging: %d \n",nvtx2);
\r
1192 if (nvtx3>0) printf("result3 of btagging: %d \n",nvtx3);
\r
1195 //fill QA histograms
\r
1196 fhDVMBtagCut1->Fill(nvtx1,tr->Pt());
\r
1197 fhDVMBtagCut2->Fill(nvtx2,tr->Pt());
\r
1198 fhDVMBtagCut3->Fill(nvtx3,tr->Pt());
\r
1204 //__________________________________________________________________
\r
1205 Double_t AliAnaElectron::ComputeSignDca(AliAODTrack *tr, AliAODTrack *tr2 , float masscut)
\r
1207 //Compute the signed dca between two tracks
\r
1208 //and return the result
\r
1210 Double_t signDca=-999.;
\r
1211 if(GetDebug() > 2 ) printf(">>ComputeSdca:: track1 %d, track2 %d, masscut %f \n", tr->GetLabel(), tr2->GetLabel(), masscut);
\r
1213 //=====Now calculate DCA between both tracks=======
\r
1214 Double_t massE = 0.000511;
\r
1215 Double_t massK = 0.493677;
\r
1217 Double_t bfield = 5.; //kG
\r
1218 if(GetReader()->GetDataType() != AliCaloTrackReader::kMC) bfield = GetReader()->GetBField();
\r
1220 Double_t vertex[3] = {-999.,-999.,-999}; //vertex
\r
1221 if(GetReader()->GetDataType() != AliCaloTrackReader::kMC) {
\r
1222 GetReader()->GetVertex(vertex); //If only one file, get the vertex from there
\r
1223 //FIXME: Add a check for whether file 2 is PYTHIA or HIJING
\r
1224 //If PYTHIA, then set the vertex from file 2, if not, use the
\r
1225 //vertex from file 1
\r
1226 if(GetReader()->GetSecondInputAODTree()) GetReader()->GetSecondInputAODVertex(vertex);
\r
1229 TVector3 primV(vertex[0],vertex[1],vertex[2]) ;
\r
1231 if(GetDebug() > 5) printf(">>ComputeSdca:: primary vertex = %2.2f,%2.2f,%2.2f \n",vertex[0],vertex[1],vertex[2]) ;
\r
1233 AliExternalTrackParam *param1 = new AliExternalTrackParam(tr);
\r
1234 AliExternalTrackParam *param2 = new AliExternalTrackParam(tr2);
\r
1236 Double_t xplane1 = 0.; Double_t xplane2 = 0.;
\r
1237 Double_t pairdca = param1->GetDCA(param2,bfield,xplane1,xplane2);
\r
1239 Int_t id1 = 0, id2 = 0;
\r
1240 AliESDv0 bvertex(*param1,id1,*param2,id2);
\r
1241 Double_t vx,vy,vz;
\r
1242 bvertex.GetXYZ(vx,vy,vz);
\r
1246 param1->PxPyPz(emom);
\r
1247 param2->PxPyPz(hmom);
\r
1248 TVector3 emomAtB(emom[0],emom[1],emom[2]);
\r
1249 TVector3 hmomAtB(hmom[0],hmom[1],hmom[2]);
\r
1250 TVector3 secvtxpt(vx,vy,vz);
\r
1251 TVector3 decayvector(0,0,0);
\r
1252 decayvector = secvtxpt - primV; //decay vector from PrimVtx
\r
1253 Double_t decaylength = decayvector.Mag();
\r
1255 if(GetDebug() > 0) {
\r
1256 printf(">>ComputeSdca:: mom1=%f, mom2=%f \n", emomAtB.Perp(), hmomAtB.Perp() );
\r
1257 printf(">>ComputeSdca:: pairDCA=%f, length=%f \n", pairdca,decaylength );
\r
1260 if (masscut<1.1) fhDVMBtagQA1->Fill(pairdca,decaylength);
\r
1262 if (emomAtB.Mag()>0 && pairdca < fPairDcaCut && decaylength < fDecayLenCut ) {
\r
1263 TVector3 sumMom = emomAtB+hmomAtB;
\r
1264 Double_t ener1 = sqrt(pow(emomAtB.Mag(),2) + massE*massE);
\r
1265 Double_t ener2 = sqrt(pow(hmomAtB.Mag(),2) + massK*massK);
\r
1266 Double_t ener3 = sqrt(pow(hmomAtB.Mag(),2) + massE*massE);
\r
1267 Double_t mass = sqrt(pow((ener1+ener2),2) - pow(sumMom.Mag(),2));
\r
1268 Double_t massPhot = sqrt(pow((ener1+ener3),2) - pow(sumMom.Mag(),2));
\r
1269 Double_t sDca = decayvector.Dot(emomAtB)/emomAtB.Mag();
\r
1271 if (masscut<1.1) fhDVMBtagQA2->Fill(sDca, mass);
\r
1273 if (mass > masscut && massPhot > 0.1) signDca = sDca;
\r
1275 if(GetDebug() > 0) printf("\t>>ComputeSdca:: mass=%f \n", mass);
\r
1276 if(GetDebug() > 0) printf("\t>>ComputeSdca:: sec vtx-signdca :%f\n",signDca);
\r
1286 //__________________________________________________________________
\r
1287 Double_t AliAnaElectron::GetIPSignificance(AliAODTrack *tr, Double_t jetPhi)
\r
1289 //get signed impact parameter significance of the given AOD track
\r
1290 //for the given jet
\r
1291 Int_t trackIndex = 0;
\r
1292 for (int k2 =0; k2 < GetAODCTS()->GetEntriesFast() ; k2++) {
\r
1294 AliAODTrack* track2 = (AliAODTrack*) (GetAODCTS()->At(k2));
\r
1295 int id1 = tr->GetID();
\r
1296 int id2 = track2->GetID();
\r
1298 trackIndex = k2;//FIXME: check if GetAODCTS stores tracks in the
\r
1299 //same order of the event
\r
1304 Double_t significance=0;
\r
1305 Double_t magField = 0;
\r
1306 Double_t maxD = 10000.;
\r
1307 Double_t impPar[] = {0,0};
\r
1308 Double_t ipCov[]={0,0,0};
\r
1309 Double_t ipVec2D[] = {0,0};
\r
1311 AliVEvent* vEvent = (AliVEvent*)GetReader()->GetInputEvent();
\r
1312 if(!vEvent) return -97;
\r
1313 AliVVertex* vv = (AliVVertex*)vEvent->GetPrimaryVertex();
\r
1314 if(!vv) return -98;
\r
1315 AliVTrack* vTrack = (AliVTrack*)vEvent->GetTrack(trackIndex);
\r
1316 if(!vTrack) return -99;
\r
1317 AliESDtrack esdTrack(vTrack);
\r
1318 if(!esdTrack.PropagateToDCA(vv, magField, maxD, impPar, ipCov)) return -100;
\r
1319 if(ipCov[0]<0) return -101;
\r
1321 Double_t Pxy[] = {esdTrack.Px(), esdTrack.Py()};
\r
1322 Double_t Txy[] = {esdTrack.Xv(), esdTrack.Yv()};
\r
1323 Double_t Vxy[] = {vv->GetX(), vv->GetY()};
\r
1324 GetImpactParamVect(Pxy, Txy, Vxy, ipVec2D);
\r
1325 Double_t phiIP = TMath::ATan2(ipVec2D[1], ipVec2D[0]) + (fabs(ipVec2D[1])-ipVec2D[1])/fabs(ipVec2D[1])*TMath::Pi();
\r
1326 Double_t cosTheta = TMath::Cos(jetPhi - phiIP);
\r
1327 Double_t sign = cosTheta/TMath::Abs(cosTheta);
\r
1328 significance = TMath::Abs(impPar[0])/TMath::Sqrt(ipCov[0])*sign;
\r
1329 //ip = fabs(impPar[0]);
\r
1330 fhIPSigBtagQA2->Fill(significance);
\r
1331 return significance;
\r
1334 //__________________________________________________________________
\r
1335 void AliAnaElectron::GetImpactParamVect(Double_t Pxy[2], Double_t Txy[2], Double_t Vxy[2], Double_t IPxy[2])
\r
1337 //px,py: momentum components at the origin of the track; tx, ty:
\r
1338 //origin (x,y) of track; vx, vy: coordinates of primary vertex
\r
1339 // analytical geometry auxiliary variables
\r
1340 Double_t mr = Pxy[1]/Pxy[0]; //angular coeficient of the straight
\r
1341 //line that lies on top of track
\r
1343 Double_t br = Txy[1] - mr*Txy[0]; //linear coeficient of the straight
\r
1344 //line that lies on top of track
\r
1346 Double_t ms = -1./mr; //angular coeficient of the straight line that
\r
1347 //lies on top of the impact parameter line
\r
1348 // Double_t bs = Vxy[1] - ms*Vxy[0]; //linear coeficient of the straight
\r
1349 //line that lies on top of the
\r
1350 //impact parameter line
\r
1351 Double_t xIntersection = (mr*Txy[0] - ms*Vxy[0] + Vxy[1] - Txy[1])/(mr - ms);
\r
1352 Double_t yIntersection = mr*xIntersection + br;
\r
1353 //if(ceil(10000*yIntersection) - ceil(10000*(ms*xIntersection + bs))
\r
1354 //!= 0 )cout<<yIntersection<<", "<<ms*xIntersection + bs<<endl;
\r
1355 IPxy[0] = xIntersection - Vxy[0];
\r
1356 IPxy[1] = yIntersection - Vxy[1];
\r
1360 //__________________________________________________________________
\r
1361 Bool_t AliAnaElectron::IsItPhotonic(const AliAODPWG4Particle* part)
\r
1363 //This method checks the opening angle and invariant mass of
\r
1364 //electron pairs within the AliAODPWG4Particle list to see if
\r
1365 //they are likely to be photonic electrons
\r
1367 Bool_t itIS = kFALSE;
\r
1369 Double_t massE = 0.000511;
\r
1370 Double_t bfield = 5.; //kG
\r
1371 if(GetReader()->GetDataType() != AliCaloTrackReader::kMC) bfield = GetReader()->GetBField();
\r
1373 Int_t pdg1 = part->GetPdg();
\r
1374 Int_t trackId = part->GetTrackLabel(0);
\r
1375 AliAODTrack* track = (AliAODTrack*)GetAODCTS()->At(trackId);
\r
1377 if(GetDebug() > 0) printf("AliAnaElectron::IsItPhotonic - can't get the AOD Track from the particle! Skipping the photonic check");
\r
1378 return kFALSE; //Don't proceed because we can't get the track
\r
1381 AliExternalTrackParam *param1 = new AliExternalTrackParam(track);
\r
1383 //Loop on stored AOD electrons and compute the angle differences and Minv
\r
1384 for (Int_t k2 =0; k2 < GetOutputAODBranch()->GetEntriesFast() ; k2++) {
\r
1385 AliAODPWG4Particle* part2 = (AliAODPWG4Particle*) GetOutputAODBranch()->At(k2);
\r
1386 Int_t track2Id = part2->GetTrackLabel(0);
\r
1387 if(trackId == track2Id) continue;
\r
1388 Int_t pdg2 = part2->GetPdg();
\r
1389 if(TMath::Abs(pdg2) != AliCaloPID::kElectron) continue;
\r
1390 if(part2->GetDetector() != fCalorimeter) continue;
\r
1392 //JLK: Check opp. sign pairs only
\r
1393 if(pdg1*pdg2 > 0) continue; //skip same-sign pairs
\r
1395 //propagate to common vertex and check opening angle
\r
1396 AliAODTrack* track2 = (AliAODTrack*)GetAODCTS()->At(track2Id);
\r
1398 if(GetDebug() >0) printf("AliAnaElectron::IsItPhotonic - problem getting the partner track. Continuing on to the next one");
\r
1401 AliExternalTrackParam *param2 = new AliExternalTrackParam(track2);
\r
1402 Int_t id1 = 0, id2 = 0;
\r
1403 AliESDv0 photonVtx(*param1,id1,*param2,id2);
\r
1404 Double_t vx,vy,vz;
\r
1405 photonVtx.GetXYZ(vx,vy,vz);
\r
1407 Double_t p1mom[3];
\r
1408 Double_t p2mom[3];
\r
1409 param1->PxPyPz(p1mom);
\r
1410 param2->PxPyPz(p2mom);
\r
1412 TVector3 p1momAtB(p1mom[0],p1mom[1],p1mom[2]);
\r
1413 TVector3 p2momAtB(p2mom[0],p2mom[1],p2mom[2]);
\r
1414 TVector3 sumMom = p1momAtB+p2momAtB;
\r
1416 Double_t ener1 = sqrt(pow(p1momAtB.Mag(),2) + massE*massE);
\r
1417 Double_t ener2 = sqrt(pow(p2momAtB.Mag(),2) + massE*massE);
\r
1418 Double_t mass = sqrt(pow((ener1+ener2),2) - pow(sumMom.Mag(),2));
\r
1420 Double_t dphi = p1momAtB.DeltaPhi(p2momAtB);
\r
1421 fh1OpeningAngle->Fill(dphi);
\r
1422 fh1MinvPhoton->Fill(mass);
\r
1425 if(GetDebug() > 0) printf("######PROBABLY A PHOTON\n");
\r
1439 //__________________________________________________________________
\r
1440 Bool_t AliAnaElectron::IsItPhotonic2(const AliAODPWG4Particle* part)
\r
1442 //This method checks to see whether a track that has been flagged as
\r
1443 //an electron was determined to match to a V0 candidate with
\r
1444 //invariant mass consistent with photon conversion
\r
1446 Bool_t itIS = kFALSE;
\r
1447 Int_t id = part->GetTrackLabel(0);
\r
1450 AliAODEvent *aod = (AliAODEvent*) GetReader()->GetInputEvent();
\r
1451 int nv0s = aod->GetNumberOfV0s();
\r
1452 for (Int_t iV0 = 0; iV0 < nv0s; iV0++) {
\r
1453 AliAODv0 *v0 = aod->GetV0(iV0);
\r
1454 if (!v0) continue;
\r
1455 double radius = v0->RadiusV0();
\r
1456 double mass = v0->InvMass2Prongs(0,1,11,11);
\r
1457 if(GetDebug() > 0) {
\r
1458 printf("## IsItPhotonic2() :: v0: %d, radius: %f \n", iV0 , radius );
\r
1459 printf("## IsItPhotonic2() :: neg-id: %d, pos-id: %d \n", v0->GetNegID(), v0->GetPosID() );
\r
1460 printf("## IsItPhotonic2() :: Minv(e,e): %f \n", v0->InvMass2Prongs(0,1,11,11) );
\r
1462 if (mass < 0.100) {
\r
1463 if ( id == v0->GetNegID() || id == v0->GetPosID()) {
\r
1465 printf("## IsItPhotonic2() :: It's a conversion electron!!! \n" );
\r
1472 //__________________________________________________________________
\r
1473 Bool_t AliAnaElectron::GetDCA(const AliAODTrack* track,Double_t impPar[2], Double_t cov[3])
\r
1475 //Use the Event vertex and AOD track information to get
\r
1476 //a real impact parameter for the track
\r
1477 //Once alice-off gets its act together and fixes the AOD, this
\r
1478 //should become obsolete.
\r
1480 Double_t bfield = 5.; //kG
\r
1481 Double_t maxD = 100000.; //max transverse IP
\r
1482 if(GetReader()->GetDataType() != AliCaloTrackReader::kMC) {
\r
1483 bfield = GetReader()->GetBField();
\r
1484 AliVEvent* ve = (AliVEvent*)GetReader()->GetInputEvent();
\r
1485 AliVVertex *vv = (AliVVertex*)ve->GetPrimaryVertex();
\r
1486 AliESDtrack esdTrack(track);
\r
1487 Bool_t gotit = esdTrack.PropagateToDCA(vv,bfield,maxD,impPar,cov);
\r
1496 //__________________________________________________________________
\r
1497 Bool_t AliAnaElectron::CheckTrack(const AliAODTrack* track, const char* type)
\r
1499 //Check this track to see if it is also tagged as an electron in the
\r
1500 //AliAODPWG4Particle list and if it is non-photonic
\r
1502 Bool_t pass = kFALSE;
\r
1504 Int_t trackId = track->GetID(); //get the index in the reader
\r
1506 Int_t naod = GetOutputAODBranch()->GetEntriesFast();
\r
1507 if(GetDebug() > 3) printf("AliAnaElectron::CheckTrack() - aod branch entries %d\n", naod);
\r
1508 for(Int_t iaod = 0; iaod < naod ; iaod++){
\r
1509 AliAODPWG4Particle* ele = (AliAODPWG4Particle*) (GetOutputAODBranch()->At(iaod));
\r
1510 Int_t label = ele->GetTrackLabel(0);
\r
1511 if(label != trackId) continue; //skip to the next one if they don't match
\r
1513 if(type=="DVM") {
\r
1514 if(ele->CheckBTagBit(ele->GetBtag(),AliAODPWG4Particle::kDVMTag0) ||
\r
1515 ele->CheckBTagBit(ele->GetBtag(),AliAODPWG4Particle::kDVMTag1) ||
\r
1516 ele->CheckBTagBit(ele->GetBtag(),AliAODPWG4Particle::kDVMTag2))
\r
1519 } else if (type=="NPE") {
\r
1521 Bool_t photonic = kFALSE;
\r
1522 Bool_t photonic1 = kFALSE;
\r
1523 photonic1 = IsItPhotonic(ele); //check against primaries
\r
1524 Bool_t photonic2 = kFALSE;
\r
1525 photonic2 = IsItPhotonic2(ele); //check against V0s
\r
1526 if(photonic1 || photonic2) photonic = kTRUE;
\r
1528 if(!photonic) pass = kTRUE;
\r
1539 //__________________________________________________________________
\r
1540 void AliAnaElectron::Print(const Option_t * opt) const
\r
1542 //Print some relevant parameters set for the analysis
\r
1547 printf("**** Print %s %s ****\n", GetName(), GetTitle() ) ;
\r
1548 AliAnaPartCorrBaseClass::Print(" ");
\r
1550 printf("Calorimeter = %s\n", fCalorimeter.Data()) ;
\r
1551 printf("pOverE range = %f - %f\n",fpOverEmin,fpOverEmax);
\r
1552 printf("residual cut = %f\n",fResidualCut);
\r
1553 printf("---DVM Btagging\n");
\r
1554 printf("max IP-cut (e,h) = %f\n",fImpactCut);
\r
1555 printf("min ITS-hits = %d\n",fITSCut);
\r
1556 printf("max dR (e,h) = %f\n",fDrCut);
\r
1557 printf("max pairDCA = %f\n",fPairDcaCut);
\r
1558 printf("max decaylength = %f\n",fDecayLenCut);
\r
1559 printf("min Associated Pt = %f\n",fAssocPtCut);
\r
1560 printf("---IPSig Btagging\n");
\r
1561 printf("min tag track = %d\n",fNTagTrkCut);
\r
1562 printf("min IP significance = %f\n",fIPSigCut);
\r
1567 //________________________________________________________________________
\r
1568 void AliAnaElectron::ReadHistograms(TList* outputList)
\r
1570 // Needed when Terminate is executed in distributed environment
\r
1571 // Refill analysis histograms of this class with corresponding
\r
1572 // histograms in output list.
\r
1574 // Histograms of this analsys are kept in the same list as other
\r
1575 // analysis, recover the position of
\r
1576 // the first one and then add the next
\r
1577 Int_t index = outputList->IndexOf(outputList->FindObject(GetAddedHistogramsStringToName()+"fh1pOverE"));
\r
1579 //Read histograms, must be in the same order as in
\r
1580 //GetCreateOutputObject.
\r
1581 fh1pOverE = (TH1F *) outputList->At(index);
\r
1582 fh1dR = (TH1F *) outputList->At(index++);
\r
1583 fh2EledEdx = (TH2F *) outputList->At(index++);
\r
1584 fh2MatchdEdx = (TH2F *) outputList->At(index++);
\r
1588 //__________________________________________________________________
\r
1589 void AliAnaElectron::Terminate(TList* outputList)
\r
1592 //Do some plots to end
\r
1593 //Recover histograms from output histograms list, needed for
\r
1594 //distributed analysis.
\r
1595 //ReadHistograms(outputList);
\r
1597 printf(" AliAnaElectron::Terminate() *** %s Report: %d outputs\n", GetName(), outputList->GetEntries()) ;
\r