]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGGA/EMCALTasks/AliAnalysisTaskEMCALIsoPhoton.cxx
including a histo to make the variation of isolation @ MC level locally
[u/mrichter/AliRoot.git] / PWGGA / EMCALTasks / AliAnalysisTaskEMCALIsoPhoton.cxx
CommitLineData
bd092f0f 1// $Id$
30159e6f 2
bd092f0f 3#include "AliAnalysisTaskEMCALIsoPhoton.h"
30159e6f 4
bd092f0f 5#include <TCanvas.h>
6#include <TChain.h>
7#include <TFile.h>
8#include <TH1F.h>
9#include <TH2F.h>
caaf99d3 10#include <TH3F.h>
965c985f 11#include <THnSparse.h>
bd092f0f 12#include <TLorentzVector.h>
a62631a9 13#include <TList.h>
bd092f0f 14
15#include "AliAnalysisManager.h"
16#include "AliAnalysisTask.h"
17#include "AliEMCALGeometry.h"
18#include "AliEMCALRecoUtils.h"
19#include "AliESDCaloCells.h"
20#include "AliESDCaloCluster.h"
30159e6f 21#include "AliESDEvent.h"
22#include "AliESDHeader.h"
30159e6f 23#include "AliESDInputHandler.h"
bd092f0f 24#include "AliESDUtils.h"
30159e6f 25#include "AliESDtrack.h"
26#include "AliESDtrackCuts.h"
2e20efe5 27#include "AliAODEvent.h"
28#include "AliAODTrack.h"
bd092f0f 29#include "AliMCEvent.h"
30#include "AliMCEventHandler.h"
31#include "AliStack.h"
2e20efe5 32#include "AliVEvent.h"
33#include "AliVTrack.h"
30159e6f 34#include "AliV0vertexer.h"
30159e6f 35#include "AliVCluster.h"
822c9944 36#include "AliOADBContainer.h"
30159e6f 37
c2aad3ae 38#include <iostream>
39using std::cout;
40using std::endl;
41
30159e6f 42ClassImp(AliAnalysisTaskEMCALIsoPhoton)
43
44//________________________________________________________________________
bd092f0f 45AliAnalysisTaskEMCALIsoPhoton::AliAnalysisTaskEMCALIsoPhoton() :
46 AliAnalysisTaskSE(),
2e20efe5 47 fESDClusters(0),
48 fAODClusters(0),
bd092f0f 49 fSelPrimTracks(0),
3f4073ba 50 fTracks(0),
2e20efe5 51 fESDCells(0),
52 fAODCells(0),
bd092f0f 53 fPrTrCuts(0),
54 fGeom(0x0),
9148fa89 55 fGeoName("EMCAL_COMPLETEV1"),
4d4ce2d2 56 fOADBContainer(0),
9148fa89 57 fPeriod("LHC11c"),
58 fTrigBit("kEMC7"),
59 fIsTrain(0),
c7bb0b43 60 fIsMc(0),
ecd47673 61 fDebug(0),
f3843637 62 fPathStrOpt("/"),
9148fa89 63 fExoticCut(0.97),
64 fIsoConeR(0.4),
965c985f 65 fNDimensions(7),
66 fECut(3.),
16a4050e 67 fTrackMult(0),
f507c09b 68 fMcIdFamily(""),
69 fNClusForDirPho(0),
70 fDirPhoPt(0),
f9e2362a 71 fHigherPtCone(0),
26a8db0f 72 fImportGeometryFromFile(0),
73 fImportGeometryFilePath(""),
2b7205ad 74 fMaxPtTrack(0),
75 fMaxEClus(0),
112eb594 76 fNCells50(0),
48aab590 77 fFilterBit(0),
98a8397b 78 fSelHybrid(kFALSE),
fe617021 79 fFillQA(kFALSE),
ed39f27f 80 fClusIdFromTracks(""),
1c764315 81 fCpvFromTrack(kFALSE),
12387380 82 fNBinsPt(200),
83 fPtBinLowEdge(-0.25),
84 fPtBinHighEdge(99.75),
bd092f0f 85 fESD(0),
2e20efe5 86 fAOD(0),
85b52a52 87 fVEvent(0),
c7bb0b43 88 fMCEvent(0),
89 fStack(0),
bd092f0f 90 fOutputList(0),
91 fEvtSel(0),
0b21f686 92 fNClusEt10(0),
cc57d293 93 fRecoPV(0),
f507c09b 94 fPVtxZ(0),
95 fTrMultDist(0),
caaf99d3 96 fMCDirPhotonPtEtaPhi(0),
e53ab710 97 fMCIsoDirPhotonPtEtaPhi(0),
dce6be79 98 fMCDirPhotonPtEtIso(0),
c7bb0b43 99 fDecayPhotonPtMC(0),
bd092f0f 100 fCellAbsIdVsAmpl(0),
16a4050e 101 fNClusHighClusE(0),
f9e2362a 102 fHigherPtConeM02(0),
f507c09b 103 fClusEtMcPt(0),
104 fClusMcDetaDphi(0),
105 fNClusPerPho(0),
f912f9a9 106 fMcPtInConeBG(0),
107 fMcPtInConeSBG(0),
108 fMcPtInConeBGnoUE(0),
109 fMcPtInConeSBGnoUE(0),
81f2660f 110 fAllIsoEtMcGamma(0),
111 fAllIsoNoUeEtMcGamma(0),
092ceec8 112 fMCDirPhotonPtEtaPhiNoClus(0),
2b7205ad 113 fHnOutput(0),
114 fQAList(0),
115 fNTracks(0),
116 fEmcNCells(0),
117 fEmcNClus(0),
118 fEmcNClusCut(0),
119 fNTracksECut(0),
120 fEmcNCellsCut(0),
ed39f27f 121 fEmcClusETM1(0),
122 fEmcClusETM2(0),
34393c41 123 fEmcClusNotExo(0),
e4ba80ad 124 fEmcClusEPhi(0),
125 fEmcClusEPhiCut(0),
126 fEmcClusEEta(0),
127 fEmcClusEEtaCut(0),
128 fTrackPtPhi(0),
129 fTrackPtPhiCut(0),
130 fTrackPtEta(0),
3ae97198 131 fTrackPtEtaCut(0),
132 fMaxCellEPhi(0)
bd092f0f 133{
134 // Default constructor.
26a8db0f 135 for(Int_t i = 0; i < 12; i++) fGeomMatrix[i] = 0;
bd092f0f 136}
137
138//________________________________________________________________________
139AliAnalysisTaskEMCALIsoPhoton::AliAnalysisTaskEMCALIsoPhoton(const char *name) :
140 AliAnalysisTaskSE(name),
2e20efe5 141 fESDClusters(0),
142 fAODClusters(0),
30159e6f 143 fSelPrimTracks(0),
3f4073ba 144 fTracks(0),
2e20efe5 145 fESDCells(0),
146 fAODCells(0),
30159e6f 147 fPrTrCuts(0),
148 fGeom(0x0),
149 fGeoName("EMCAL_COMPLETEV1"),
4d4ce2d2 150 fOADBContainer(0),
30159e6f 151 fPeriod("LHC11c"),
751194e8 152 fTrigBit("kEMC7"),
30159e6f 153 fIsTrain(0),
c7bb0b43 154 fIsMc(0),
ecd47673 155 fDebug(0),
f3843637 156 fPathStrOpt("/"),
30159e6f 157 fExoticCut(0.97),
158 fIsoConeR(0.4),
965c985f 159 fNDimensions(7),
160 fECut(3.),
16a4050e 161 fTrackMult(0),
f507c09b 162 fMcIdFamily(""),
163 fNClusForDirPho(0),
164 fDirPhoPt(0),
f9e2362a 165 fHigherPtCone(0),
26a8db0f 166 fImportGeometryFromFile(0),
167 fImportGeometryFilePath(""),
2b7205ad 168 fMaxPtTrack(0),
169 fMaxEClus(0),
112eb594 170 fNCells50(0),
48aab590 171 fFilterBit(0),
98a8397b 172 fSelHybrid(kFALSE),
fe617021 173 fFillQA(kFALSE),
ed39f27f 174 fClusIdFromTracks(""),
1c764315 175 fCpvFromTrack(kFALSE),
12387380 176 fNBinsPt(200),
177 fPtBinLowEdge(-0.25),
178 fPtBinHighEdge(99.75),
30159e6f 179 fESD(0),
2e20efe5 180 fAOD(0),
85b52a52 181 fVEvent(0),
c7bb0b43 182 fMCEvent(0),
183 fStack(0),
30159e6f 184 fOutputList(0),
30159e6f 185 fEvtSel(0),
0b21f686 186 fNClusEt10(0),
cc57d293 187 fRecoPV(0),
bd092f0f 188 fPVtxZ(0),
f507c09b 189 fTrMultDist(0),
caaf99d3 190 fMCDirPhotonPtEtaPhi(0),
e53ab710 191 fMCIsoDirPhotonPtEtaPhi(0),
dce6be79 192 fMCDirPhotonPtEtIso(0),
c7bb0b43 193 fDecayPhotonPtMC(0),
194 fCellAbsIdVsAmpl(0),
bd092f0f 195 fNClusHighClusE(0),
f9e2362a 196 fHigherPtConeM02(0),
f507c09b 197 fClusEtMcPt(0),
198 fClusMcDetaDphi(0),
199 fNClusPerPho(0),
f912f9a9 200 fMcPtInConeBG(0),
201 fMcPtInConeSBG(0),
202 fMcPtInConeBGnoUE(0),
203 fMcPtInConeSBGnoUE(0),
81f2660f 204 fAllIsoEtMcGamma(0),
205 fAllIsoNoUeEtMcGamma(0),
092ceec8 206 fMCDirPhotonPtEtaPhiNoClus(0),
2b7205ad 207 fHnOutput(0),
208 fQAList(0),
209 fNTracks(0),
210 fEmcNCells(0),
211 fEmcNClus(0),
212 fEmcNClusCut(0),
213 fNTracksECut(0),
214 fEmcNCellsCut(0),
ed39f27f 215 fEmcClusETM1(0),
216 fEmcClusETM2(0),
34393c41 217 fEmcClusNotExo(0),
e4ba80ad 218 fEmcClusEPhi(0),
219 fEmcClusEPhiCut(0),
220 fEmcClusEEta(0),
221 fEmcClusEEtaCut(0),
222 fTrackPtPhi(0),
223 fTrackPtPhiCut(0),
224 fTrackPtEta(0),
3ae97198 225 fTrackPtEtaCut(0),
226 fMaxCellEPhi(0)
30159e6f 227{
228 // Constructor
229
230 // Define input and output slots here
231 // Input slot #0 works with a TChain
232 DefineInput(0, TChain::Class());
233 // Output slot #0 id reserved by the base class for AOD
234 // Output slot #1 writes into a TH1 container
235 DefineOutput(1, TList::Class());
2b7205ad 236 DefineOutput(2, TList::Class());
30159e6f 237}
bd092f0f 238
30159e6f 239//________________________________________________________________________
240void AliAnalysisTaskEMCALIsoPhoton::UserCreateOutputObjects()
241{
bd092f0f 242 // Create histograms, called once.
30159e6f 243
2e20efe5 244 fESDClusters = new TObjArray();
30159e6f 245 fSelPrimTracks = new TObjArray();
246
247
248 fOutputList = new TList();
a62631a9 249 fOutputList->SetOwner();// Container cleans up all histos (avoids leaks in merging)
30159e6f 250
f507c09b 251 fGeom = AliEMCALGeometry::GetInstance(fGeoName.Data());
4d4ce2d2 252 fOADBContainer = new AliOADBContainer("AliEMCALgeo");
253 fOADBContainer->InitFromFile(Form("$ALICE_ROOT/OADB/EMCAL/EMCALlocal2master.root"),"AliEMCALgeo");
254
30159e6f 255 fEvtSel = new TH1F("hEvtSel","Event selection counter (0=all trg, 1=pvz cut) ;evt cut ;dN/dcut}",2,0,2);
256 fOutputList->Add(fEvtSel);
0b21f686 257
258 fNClusEt10 = new TH1F("hNClusEt10","# of cluster with E_{T}>10 per event;E;",101,-0.5,100.5);
259 fOutputList->Add(fNClusEt10);
30159e6f 260
cc57d293 261 fRecoPV = new TH1F("hRecoPV","Prim. vert. reconstruction (yes or no);reco (0=no, 1=yes) ;",2,-0.5,1.5);
262 fOutputList->Add(fRecoPV);
263
30159e6f 264 fPVtxZ = new TH1F("hPVtxZ","primary vertex Z before cut;prim-vz(cm) ;",200,-100,100);
265 fOutputList->Add(fPVtxZ);
c7bb0b43 266
f507c09b 267 fTrMultDist = new TH1F("fTrMultDist","track multiplicity;tracks/event;#events",200,0.5,200.5);
268 fOutputList->Add(fTrMultDist);
269
12fbd6e8 270 fMCDirPhotonPtEtaPhi = new TH3F("hMCDirPhotonPtEtaPhi","photon (gq->#gammaq) p_{T}, #eta, #phi;GeV/c;#eta;#phi",100,-0.5,99.5,154,-0.77,0.77,130,1.38,3.20);
caaf99d3 271 fMCDirPhotonPtEtaPhi->Sumw2();
272 fOutputList->Add(fMCDirPhotonPtEtaPhi);
c7bb0b43 273
12fbd6e8 274 fMCIsoDirPhotonPtEtaPhi = new TH3F("hMCIsoDirPhotonPtEtaPhi","photon (gq->#gammaq, isolated@MC) p_{T}, #eta, #phi;GeV/c;#eta;#phi",100,-0.5,99.5,154,-0.77,0.77,130,1.38,3.20);
e53ab710 275 fMCIsoDirPhotonPtEtaPhi->Sumw2();
276 fOutputList->Add(fMCIsoDirPhotonPtEtaPhi);
277
dce6be79 278 fMCDirPhotonPtEtIso = new TH2F("hMCDirPhotonPtEtIso",Form("photon (gq->#gammaq @MC) p_{T}, E_{T}^{ISO} (R=%1.1f);GeV/c;E_{T}^{ISO} GeV/c",fIsoConeR),100,-0.5,99.5,20,-0.25,9.75);
279 fMCDirPhotonPtEtIso->Sumw2();
280 fOutputList->Add(fMCDirPhotonPtEtIso);
281
282
12387380 283 fDecayPhotonPtMC = new TH1F("hDecayPhotonPtMC","decay photon p_{T};GeV/c;dN/dp_{T} (c GeV^{-1})",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge);
c7bb0b43 284 fDecayPhotonPtMC->Sumw2();
285 fOutputList->Add(fDecayPhotonPtMC);
286
30159e6f 287 fCellAbsIdVsAmpl = new TH2F("hCellAbsIdVsAmpl","cell abs id vs cell amplitude (energy);E (GeV);ID",200,0,100,24*48*10,-0.5,24*48*10-0.5);
a62631a9 288 fOutputList->Add(fCellAbsIdVsAmpl);
30159e6f 289
290 fNClusHighClusE = new TH2F("hNClusHighClusE","total number of clusters vs. highest clus energy in the event;E (GeV);NClus",200,0,100,301,-0.5,300.5);
291 fOutputList->Add(fNClusHighClusE);
292
12387380 293 fHigherPtConeM02 = new TH2F("hHigherPtConeM02","#lambda_{0}^{2} vs. in-cone-p_{T}^{max};p_{T}^{max} (GeV/c, in the cone);#lambda_{0}^{2}",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,400,0,4);
f9e2362a 294 fOutputList->Add(fHigherPtConeM02);
295
f507c09b 296 fClusEtMcPt = new TH2F("hClusEtMcPt","E_{T}^{clus} vs. p_{T}^{mc}; p_{T}^{mc};E_{T}^{clus}",500,0,100,500,0,100);
297 fOutputList->Add(fClusEtMcPt);
298
299 fClusMcDetaDphi = new TH2F("hClusMcDetaDphi","#Delta#phi vs. #Delta#eta (reco-mc);#Delta#eta;#Delta#phi",100,-.7,.7,100,-.7,.7);
300 fOutputList->Add(fClusMcDetaDphi);
301
302 fNClusPerPho = new TH2F("hNClusPerPho","Number of clusters per prompt photon;p_{T}^{MC};N_{clus}",500,0,100,11,-0.5,10.5);
303 fOutputList->Add(fNClusPerPho);
304
d4f449df 305 fMcPtInConeBG = new TH2F("hMcPtInConeBG","#sum_{in-cone}p_{T}^{mc-primaries} vs. ISO^{TRK+EMC} (BG template);ISO^{TRK+EMC} (GeV);#sum_{in-cone}p_{T}^{mc-primaries}",600,-10,50,1000,0,100);
f912f9a9 306 fOutputList->Add(fMcPtInConeBG);
307
d4f449df 308 fMcPtInConeSBG = new TH2F("hMcPtInConeSBG","#sum_{in-cone}p_{T}^{mc-primaries} vs. ISO^{TRK+EMC} (SBG range);ISO^{TRK+EMC} (GeV);#sum_{in-cone}p_{T}^{mc-primaries}",600,-10,50,1000,0,100);
f912f9a9 309 fOutputList->Add(fMcPtInConeSBG);
310
d4f449df 311 fMcPtInConeBGnoUE = new TH2F("hMcPtInConeBGnoUE","#sum_{in-cone}p_{T}^{mc-primaries} vs. ISO^{TRK+EMC} (BG template);ISO^{TRK+EMC} (GeV);#sum_{in-cone}p_{T}^{mc-primaries}",600,-10,50,1000,0,100);
f912f9a9 312 fOutputList->Add(fMcPtInConeBGnoUE);
313
d4f449df 314 fMcPtInConeSBGnoUE = new TH2F("hMcPtInConeSBGnoUE","#sum_{in-cone}p_{T}^{mc-primaries} vs. ISO^{TRK+EMC} (SBG range);ISO^{TRK+EMC} (GeV);#sum_{in-cone}p_{T}^{mc-primaries}",600,-10,50,1000,0,100);
f912f9a9 315 fOutputList->Add(fMcPtInConeSBGnoUE);
316
12387380 317 fAllIsoEtMcGamma = new TH2F("hAllIsoEtMcGammaE","ISO^{TRK+EMC} vs. E_{T}^{clus} for clusters comming from a MC prompt #gamma; E_{T}^{clus} (GeV);ISO^{TRK+EMC} (GeV);",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,600,-10,50);
81f2660f 318 fOutputList->Add(fAllIsoEtMcGamma);
319
12387380 320 fAllIsoNoUeEtMcGamma = new TH2F("hAllIsoNoUeEtMcGammaE","ISO^{TRK+EMC}_{noue} vs. E_{T}^{clus} for clusters comming from a MC prompt #gamma; E_{T}^{clus} (GeV);ISO^{TRK+EMC}_{noue} (GeV);",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,600,-10,50);
81f2660f 321 fOutputList->Add(fAllIsoNoUeEtMcGamma);
322
f912f9a9 323
12387380 324 fMCDirPhotonPtEtaPhiNoClus = new TH3F("hMCDirPhotonPhiEtaNoClus","p_{T}, #eta and #phi of prompt photons with no reco clusters;p_{T};#eta;#phi",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,154,-0.77,0.77,130,1.38,3.20);
092ceec8 325 fOutputList->Add(fMCDirPhotonPtEtaPhiNoClus);
f507c09b 326
12387380 327 Int_t nEt=fNBinsPt, nM02=400, nCeIso=1000, nTrIso=1000, nAllIso=1000, nCeIsoNoUE=1000, nAllIsoNoUE=1000, nTrClDphi=200, nTrClDeta=100, nClEta=140, nClPhi=128, nTime=60, nMult=100, nPhoMcPt=100;
f507c09b 328 Int_t bins[] = {nEt, nM02, nCeIso, nTrIso, nAllIso, nCeIsoNoUE, nAllIsoNoUE, nTrClDphi, nTrClDeta,nClEta,nClPhi,nTime,nMult,nPhoMcPt};
c1f18270 329 fNDimensions = sizeof(bins)/sizeof(Int_t);
330 const Int_t ndims = fNDimensions;
12387380 331 Double_t xmin[] = { fPtBinLowEdge, 0., -10., -10., -10., -10., -10., -0.1,-0.05, -0.7, 1.4,-0.15e-06,-0.5,-0.5};
332 Double_t xmax[] = { fPtBinHighEdge, 4., 190., 190., 190., 190., 190., 0.1, 0.05, 0.7, 3.192, 0.15e-06,99.5,99.5};
80c98845 333 if(fPeriod.Contains("11h")){
334 xmax[12]=3999.5;
335 }
f507c09b 336 fHnOutput = new THnSparseF("fHnOutput","Output matrix: E_{T},M02,CeIso,TrIso,AllIso, CeIsoNoUESub, AllIsoNoUESub, d#phi_{trk},d#eta_{trk},#eta_{clus},#phi_{clus},T_{max},mult,mc-p_{T}^{#gamma}", ndims, bins, xmin, xmax);
965c985f 337 fOutputList->Add(fHnOutput);
338
2b7205ad 339 //QA outputs
340 fQAList = new TList();
341 fQAList->SetOwner();// Container cleans up all histos (avoids leaks in merging)
965c985f 342
2b7205ad 343 fNTracks = new TH1F("hNTracks","# of selected tracks;n-tracks;counts",120,-0.5,119.5);
344 fNTracks->Sumw2();
345 fQAList->Add(fNTracks);
346
347 fEmcNCells = new TH1F("fEmcNCells",";n/event;count",120,-0.5,119.5);
348 fEmcNCells->Sumw2();
349 fQAList->Add(fEmcNCells);
350 fEmcNClus = new TH1F("fEmcNClus",";n/event;count",120,-0.5,119.5);
351 fEmcNClus->Sumw2();
352 fQAList->Add(fEmcNClus);
353 fEmcNClusCut = new TH1F("fEmcNClusCut",";n/event;count",120,-0.5,119.5);
354 fEmcNClusCut->Sumw2();
355 fQAList->Add(fEmcNClusCut);
356 fNTracksECut = new TH1F("fNTracksECut",";n/event;count",120,-0.5,119.5);
357 fNTracksECut->Sumw2();
358 fQAList->Add(fNTracksECut);
359 fEmcNCellsCut = new TH1F("fEmcNCellsCut",";n/event;count",120,-0.5,119.5);
360 fEmcNCellsCut->Sumw2();
361 fQAList->Add(fEmcNCellsCut);
12387380 362 fEmcClusETM1 = new TH1F("fEmcClusETM1","(method clus->GetTrackDx,z);GeV;counts",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge);
ed39f27f 363 fEmcClusETM1->Sumw2();
364 fQAList->Add(fEmcClusETM1);
12387380 365 fEmcClusETM2 = new TH1F("fEmcClusETM2","(method track->GetEMCALcluster());GeV;counts",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge);
ed39f27f 366 fEmcClusETM2->Sumw2();
367 fQAList->Add(fEmcClusETM2);
34393c41 368 fEmcClusNotExo = new TH1F("fEmcClusNotExo","exotics removed;GeV;counts",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge);
369 fEmcClusNotExo->Sumw2();
370 fQAList->Add(fEmcClusNotExo);
12387380 371 fEmcClusEPhi = new TH2F("fEmcClusEPhi",";GeV;#phi",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,63,0,6.3);
e4ba80ad 372 fEmcClusEPhi->Sumw2();
373 fQAList->Add(fEmcClusEPhi);
12387380 374 fEmcClusEPhiCut = new TH2F("fEmcClusEPhiCut",";GeV;#phi",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,63,0,6.3);
e4ba80ad 375 fEmcClusEPhiCut->Sumw2();
376 fQAList->Add(fEmcClusEPhiCut);
12387380 377 fEmcClusEEta = new TH2F("fEmcClusEEta",";GeV;#eta",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,19,-0.9,0.9);
e4ba80ad 378 fEmcClusEEta->Sumw2();
379 fQAList->Add(fEmcClusEEta);
12387380 380 fEmcClusEEtaCut = new TH2F("fEmcClusEEtaCut",";GeV;#eta",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,18,-0.9,0.9);
e4ba80ad 381 fEmcClusEEtaCut->Sumw2();
382 fQAList->Add(fEmcClusEEtaCut);
12387380 383 fTrackPtPhi = new TH2F("fTrackPtPhi",";p_{T} [GeV/c];#phi",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,63,0,6.3);
e4ba80ad 384 fTrackPtPhi->Sumw2();
385 fQAList->Add(fTrackPtPhi);
12387380 386 fTrackPtPhiCut = new TH2F("fTrackPtPhiCut",";p_{T} [GeV/c];#phi",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,63,0,6.3);
e4ba80ad 387 fTrackPtPhiCut->Sumw2();
388 fQAList->Add(fTrackPtPhiCut);
12387380 389 fTrackPtEta = new TH2F("fTrackPtEta",";p_{T} [GeV/c];#eta",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,18,-0.9,0.9);
e4ba80ad 390 fTrackPtEta->Sumw2();
391 fQAList->Add(fTrackPtEta);
12387380 392 fTrackPtEtaCut = new TH2F("fTrackPtEtaCut",";p_{T} [GeV/c];#eta",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,18,-0.9,0.9);
e4ba80ad 393 fTrackPtEtaCut->Sumw2();
394 fQAList->Add(fTrackPtEtaCut);
965c985f 395
3ae97198 396
12387380 397 fMaxCellEPhi = new TH2F("fMaxCellEPhi","Most energetic cell in event; GeV;#phi",fNBinsPt, fPtBinLowEdge,fPtBinHighEdge,63,0,6.3);
3ae97198 398 fMaxCellEPhi->Sumw2();
399 fQAList->Add(fMaxCellEPhi);
400
30159e6f 401 PostData(1, fOutputList);
2b7205ad 402 PostData(2, fQAList);
30159e6f 403}
404
405//________________________________________________________________________
406void AliAnalysisTaskEMCALIsoPhoton::UserExec(Option_t *)
407{
bd092f0f 408 // Main loop, called for each event.
2e20efe5 409 fESDClusters = 0;
410 fESDCells = 0;
411 fAODClusters = 0;
412 fAODCells = 0;
bd092f0f 413 // event trigger selection
30159e6f 414 Bool_t isSelected = 0;
751194e8 415 if(fPeriod.Contains("11a")){
416 if(fTrigBit.Contains("kEMC"))
417 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC1);
418 else
419 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
420 }
421 else{
422 if(fTrigBit.Contains("kEMC"))
423 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC7);
424 else
f507c09b 425 if(fTrigBit.Contains("kMB"))
426 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
427 else
428 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
751194e8 429 }
80c98845 430 if(fPeriod.Contains("11h")){
431 if(fTrigBit.Contains("kAny"))
432 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kAny);
433 if(fTrigBit.Contains("kAnyINT"))
434 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kAnyINT);
435 }
c7bb0b43 436 if(fIsMc)
437 isSelected = kTRUE;
ecd47673 438 if(fDebug)
439 printf("isSelected = %d, fIsMC=%d\n", isSelected, fIsMc);
30159e6f 440 if(!isSelected )
441 return;
f3843637 442 if(fIsMc){
443 TTree *tree = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetTree();
444 TFile *file = (TFile*)tree->GetCurrentFile();
445 TString filename = file->GetName();
446 if(!filename.Contains(fPathStrOpt.Data()))
447 return;
448 }
85b52a52 449 fVEvent = (AliVEvent*)InputEvent();
450 if (!fVEvent) {
2e20efe5 451 printf("ERROR: event not available\n");
30159e6f 452 return;
453 }
822c9944 454 Int_t runnumber = InputEvent()->GetRunNumber() ;
7a7744db 455 if(fDebug)
456 printf("run number = %d\n",runnumber);
457
85b52a52 458 fESD = dynamic_cast<AliESDEvent*>(fVEvent);
7a7744db 459 if(!fESD){
85b52a52 460 fAOD = dynamic_cast<AliAODEvent*>(fVEvent);
7a7744db 461 if(!fAOD){
462 printf("ERROR: Invalid type of event!!!\n");
463 return;
464 }
465 else if(fDebug)
466 printf("AOD EVENT!\n");
467 }
30159e6f 468
469 fEvtSel->Fill(0);
ecd47673 470 if(fDebug)
26a8db0f 471 printf("event is ok,\n run number=%d\n",runnumber);
472
30159e6f 473
85b52a52 474 AliVVertex *pv = (AliVVertex*)fVEvent->GetPrimaryVertex();
2e20efe5 475 Bool_t pvStatus = kTRUE;
476 if(fESD){
477 AliESDVertex *esdv = (AliESDVertex*)fESD->GetPrimaryVertex();
478 pvStatus = esdv->GetStatus();
479 }
425adc2f 480 /*if(fAOD){
481 AliAODVertex *aodv = (AliAODVertex*)fAOD->GetPrimaryVertex();
482 pvStatus = aodv->GetStatus();
483 }*/
d1582697 484 if(!pv)
30159e6f 485 return;
2e20efe5 486 if(!pvStatus)
d1582697 487 fRecoPV->Fill(0);
cc57d293 488 else
489 fRecoPV->Fill(1);
30159e6f 490 fPVtxZ->Fill(pv->GetZ());
425adc2f 491 if(TMath::Abs(pv->GetZ())>10)
30159e6f 492 return;
ecd47673 493 if(fDebug)
494 printf("passed vertex cut\n");
30159e6f 495
496 fEvtSel->Fill(1);
2e20efe5 497 if(fESD)
498 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("Tracks"));
499 if(fAOD)
500 fTracks = dynamic_cast<TClonesArray*>(fAOD->GetTracks());
bd092f0f 501
06a28959 502 if(!fTracks){
503 AliError("Track array in event is NULL!");
2e20efe5 504 if(fDebug)
505 printf("returning due to not finding tracks!\n");
06a28959 506 return;
507 }
30159e6f 508 // Track loop to fill a pT spectrum
3f4073ba 509 const Int_t Ntracks = fTracks->GetEntriesFast();
510 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
511 // for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
512 //AliESDtrack* track = (AliESDtrack*)fESD->GetTrack(iTracks);
2e20efe5 513 AliVTrack *track = (AliVTrack*)fTracks->At(iTracks);
30159e6f 514 if (!track)
515 continue;
2e20efe5 516 AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(track);
517 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
ed39f27f 518 if(esdTrack){
519 if(esdTrack->GetEMCALcluster()>0)
520 fClusIdFromTracks.Append(Form("%d ",esdTrack->GetEMCALcluster()));
521 if (fPrTrCuts && fPrTrCuts->IsSelected(track)){
522 fSelPrimTracks->Add(track);
523 }
30159e6f 524 }
2b7205ad 525 else if(aodTrack){
98a8397b 526 if (fSelHybrid && !aodTrack->IsHybridGlobalConstrainedGlobal())
dcd3dca1 527 continue ;
98a8397b 528 if(!fSelHybrid && !aodTrack->TestFilterBit(fFilterBit))
529 continue;
2e20efe5 530 fSelPrimTracks->Add(track);
2b7205ad 531 /*if(fTrackMaxPt<track->Pt())
532 fTrackMaxPt = track->Pt();*/
533 }
bd092f0f 534 }
535
4d4ce2d2 536 TObjArray *matEMCAL=(TObjArray*)fOADBContainer->GetObject(runnumber,"EmcalMatrices");
822c9944 537 for(Int_t mod=0; mod < (fGeom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
538 if(fGeoName=="EMCAL_FIRSTYEARV1" && mod>3)
539 break;
540 /*if(fESD)
541 fGeom->SetMisalMatrix(fESD->GetEMCALMatrix(mod), mod);
542 else*/
85b52a52 543 // if(fVEvent->GetEMCALMatrix(mod))
822c9944 544 fGeomMatrix[mod] = (TGeoHMatrix*) matEMCAL->At(mod);
545 fGeom->SetMisalMatrix(fGeomMatrix[mod] , mod);
30159e6f 546 }
4d4ce2d2 547
2e20efe5 548 if(fESD){
549 AliESDtrackCuts *fTrackCuts = new AliESDtrackCuts();
550 fTrackMult = fTrackCuts->GetReferenceMultiplicity(fESD);//kTrackletsITSTPC ,0.5);
551 if(fDebug)
552 printf("ESD Track mult= %d\n",fTrackMult);
553 }
554 else if(fAOD){
555 fTrackMult = Ntracks;
556 if(fDebug)
557 printf("AOD Track mult= %d\n",fTrackMult);
558 }
f507c09b 559 fTrMultDist->Fill(fTrackMult);
16a4050e 560
2e20efe5 561 if(fESD){
562 TList *l = fESD->GetList();
563 fESDClusters = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
564 fESDCells = fESD->GetEMCALCells();
565 if(fDebug)
566 printf("ESD cluster mult= %d\n",fESDClusters->GetEntriesFast());
567 }
568 else if(fAOD){
569 fAODClusters = dynamic_cast<TClonesArray*>(fAOD->GetCaloClusters());
570 fAODCells = fAOD->GetEMCALCells();
571 if(fDebug)
572 printf("AOD cluster mult= %d\n",fAODClusters->GetEntriesFast());
573 }
30159e6f 574
c7bb0b43 575
576 fMCEvent = MCEvent();
ecd47673 577 if(fMCEvent){
578 if(fDebug)
ec9ab86b 579 std::cout<<"MCevent exists\n";
c7bb0b43 580 fStack = (AliStack*)fMCEvent->Stack();
ecd47673 581 }
582 else{
583 if(fDebug)
ec9ab86b 584 std::cout<<"ERROR: NO MC EVENT!!!!!!\n";
ecd47673 585 }
112eb594 586 LoopOnCells();
f507c09b 587 FollowGamma();
588 if(fDebug)
589 printf("passed calling of FollowGamma\n");
590 FillClusHists();
591 if(fDebug)
592 printf("passed calling of FillClusHists\n");
63e40cb8 593 FillMcHists();
ecd47673 594 if(fDebug)
595 printf("passed calling of FillMcHists\n");
fe617021 596 if(fFillQA)
ab031886 597 FillQA();
2b7205ad 598 if(fDebug)
599 printf("passed calling of FillQA\n");
2e20efe5 600 /*if(fESD)
601 fESDClusters->Clear();*/
f507c09b 602 fSelPrimTracks->Clear();
603 fNClusForDirPho = 0;
112eb594 604 fNCells50 = 0;
ed39f27f 605 fClusIdFromTracks = "";
c7bb0b43 606
30159e6f 607 PostData(1, fOutputList);
2b7205ad 608 PostData(2, fQAList);
30159e6f 609}
bd092f0f 610
30159e6f 611//________________________________________________________________________
612void AliAnalysisTaskEMCALIsoPhoton::FillClusHists()
613{
2e20efe5 614 if(fDebug)
615 printf("Inside FillClusHists()....\n");
bd092f0f 616 // Fill cluster histograms.
2e20efe5 617 TObjArray *clusters = fESDClusters;
bd092f0f 618
2e20efe5 619 if (!clusters){
620 clusters = fAODClusters;
621 if(fDebug)
622 printf("ESD clusters empty...");
623 }
624 if (!clusters){
625 if(fDebug)
626 printf(" and AOD clusters as well!!!\n");
30159e6f 627 return;
2e20efe5 628 }
629 if(fDebug)
630 printf("\n");
631
632 const Int_t nclus = clusters->GetEntries();
30159e6f 633 if(nclus==0)
634 return;
ecd47673 635 if(fDebug)
636 printf("Inside FillClusHists and there are %d clusters\n",nclus);
e681d9ce 637 Double_t maxE = 0;
0b21f686 638 Int_t nclus10 = 0;
f507c09b 639 Double_t ptmc=-1;
30159e6f 640 for(Int_t ic=0;ic<nclus;ic++){
641 maxE=0;
2e20efe5 642 AliVCluster *c = static_cast<AliVCluster*>(clusters->At(ic));
30159e6f 643 if(!c)
644 continue;
645 if(!c->IsEMCAL())
646 continue;
965c985f 647 if(c->E()<fECut)
648 continue;
1c764315 649 if(fCpvFromTrack && fClusIdFromTracks.Contains(Form("%d",ic)))
650 continue;
34393c41 651 if(IsExotic(c))
652 continue;
30159e6f 653 Short_t id;
654 Double_t Emax = GetMaxCellEnergy( c, id);
9045b7cc 655 if(fDebug)
656 printf("cluster max cell E=%1.1f",Emax);
30159e6f 657 Float_t clsPos[3] = {0,0,0};
658 c->GetPosition(clsPos);
659 TVector3 clsVec(clsPos);
3dc2825e 660 Double_t Et = c->E()*TMath::Sin(clsVec.Theta());
f507c09b 661 if(fDebug)
662 printf("\tcluster eta=%1.1f,phi=%1.1f,E=%1.1f\n",clsVec.Eta(),clsVec.Phi(),c->E());
0b21f686 663 if(Et>10)
664 nclus10++;
30159e6f 665 Float_t ceiso, cephiband, cecore;
666 Float_t triso, trphiband, trcore;
667 Float_t alliso, allphiband, allcore;
668 Float_t phibandArea = (1.4 - 2*fIsoConeR)*2*fIsoConeR;
669 Float_t netConeArea = TMath::Pi()*(fIsoConeR*fIsoConeR - 0.04*0.04);
f224025f 670 GetCeIso(clsVec, id, ceiso, cephiband, cecore);
30159e6f 671 GetTrIso(clsVec, triso, trphiband, trcore);
f9e2362a 672 Double_t dr = TMath::Sqrt(c->GetTrackDx()*c->GetTrackDx() + c->GetTrackDz()*c->GetTrackDz());
673 if(Et>10 && Et<15 && dr>0.025){
674 fHigherPtConeM02->Fill(fHigherPtCone,c->GetM02());
675 if(fDebug)
676 printf("\t\tHigher track pt inside the cone: %1.1f GeV/c; M02=%1.2f\n",fHigherPtCone,c->GetM02());
677 }
30159e6f 678 alliso = ceiso + triso;
679 allphiband = cephiband + trphiband;
680 allcore = cecore + trcore;
681 Float_t ceisoue = cephiband/phibandArea*netConeArea;
682 Float_t trisoue = trphiband/phibandArea*netConeArea;
683 Float_t allisoue = allphiband/phibandArea*netConeArea;
f912f9a9 684 Float_t mcptsum = GetMcPtSumInCone(clsVec.Eta(), clsVec.Phi(),fIsoConeR);
685 if(fDebug && Et>10)
686 printf("\t alliso=%1.1f, Et=%1.1f=-=-=-=-=\n",alliso,Et);
687 if(c->GetM02()>0.5 && c->GetM02()<2.0){
688 fMcPtInConeBG->Fill(alliso-Et-allisoue, mcptsum);
689 fMcPtInConeBGnoUE->Fill(alliso-Et, mcptsum);
690 }
b16ded35 691 if(c->GetM02()>0.1 && c->GetM02()<0.3 && dr>0.03){
f912f9a9 692 fMcPtInConeSBG->Fill(alliso-Et-allisoue, mcptsum);
693 fMcPtInConeSBGnoUE->Fill(alliso-Et, mcptsum);
81f2660f 694 if(fMcIdFamily.Contains((Form("%d",c->GetLabel())))){
672df96f 695 fAllIsoEtMcGamma->Fill(Et, alliso-/*Et*/cecore-allisoue);
696 fAllIsoNoUeEtMcGamma->Fill(Et, alliso-/*Et*/cecore);
81f2660f 697 }
f912f9a9 698 }
965c985f 699 const Int_t ndims = fNDimensions;
700 Double_t outputValues[ndims];
e53ab710 701 if(mcptsum<2)
702 ptmc = GetClusSource(c);
703 else
704 ptmc = -0.1;
965c985f 705 outputValues[0] = Et;
706 outputValues[1] = c->GetM02();
1c86c72c 707 outputValues[2] = ceiso/*cecore*/-ceisoue;
965c985f 708 outputValues[3] = triso-trisoue;
1c86c72c 709 outputValues[4] = alliso/*cecore*/-allisoue - trcore;
710 outputValues[5] = ceiso;
711 outputValues[6] = alliso - trcore;
717bb45b 712 outputValues[7] = c->GetTrackDx();
713 outputValues[8] = c->GetTrackDz();
714 outputValues[9] = clsVec.Eta();
715 outputValues[10] = clsVec.Phi();
2e20efe5 716 if(fESDCells)
717 outputValues[11] = fESDCells->GetCellTime(id);
718 else if(fAODCells)
719 outputValues[11] = fAODCells->GetCellTime(id);
16a4050e 720 outputValues[12] = fTrackMult;
f507c09b 721 outputValues[13] = ptmc;
965c985f 722 fHnOutput->Fill(outputValues);
30159e6f 723 if(c->E()>maxE)
724 maxE = c->E();
725 }
726 fNClusHighClusE->Fill(maxE,nclus);
ee3d9c10 727 fMaxEClus = maxE;
0b21f686 728 fNClusEt10->Fill(nclus10);
f507c09b 729 fNClusPerPho->Fill(fDirPhoPt,fNClusForDirPho);
30159e6f 730}
bd092f0f 731
30159e6f 732//________________________________________________________________________
f224025f 733void AliAnalysisTaskEMCALIsoPhoton::GetCeIso(TVector3 vec, Int_t maxid, Float_t &iso, Float_t &phiband, Float_t &core)
30159e6f 734{
bd092f0f 735 // Get cell isolation.
2e20efe5 736 AliVCaloCells *cells = fESDCells;
1c86c72c 737 if (!cells){
2e20efe5 738 cells = fAODCells;
1c86c72c 739 if(fDebug)
740 printf("ESD cells empty...");
741 }
742 if (!cells){
743 if(fDebug)
744 printf(" and AOD cells are empty as well!!!\n");
30159e6f 745 return;
1c86c72c 746 }
2e20efe5 747
1c86c72c 748 TObjArray *clusters = fESDClusters;
749 if (!clusters)
750 clusters = fAODClusters;
751 if (!clusters)
752 return;
753
754
755 const Int_t nclus = clusters->GetEntries();
756 //const Int_t ncells = cells->GetNumberOfCells();
30159e6f 757 Float_t totiso=0;
758 Float_t totband=0;
759 Float_t totcore=0;
760 Float_t etacl = vec.Eta();
761 Float_t phicl = vec.Phi();
2e20efe5 762 Float_t maxtcl = cells->GetCellTime(maxid);
30159e6f 763 if(phicl<0)
764 phicl+=TMath::TwoPi();
1c86c72c 765 /*Int_t absid = -1;
30159e6f 766 Float_t eta=-1, phi=-1;
767 for(int icell=0;icell<ncells;icell++){
2e20efe5 768 absid = TMath::Abs(cells->GetCellNumber(icell));
769 Float_t celltime = cells->GetCellTime(absid);
f224025f 770 //if(TMath::Abs(celltime)>2e-8 && (!fIsMc))
771 if(TMath::Abs(celltime-maxtcl)>2e-8 )
c3f33463 772 continue;
30159e6f 773 if(!fGeom)
774 return;
775 fGeom->EtaPhiFromIndex(absid,eta,phi);
776 Float_t dphi = TMath::Abs(phi-phicl);
777 Float_t deta = TMath::Abs(eta-etacl);
1c86c72c 778 Float_t R = TMath::Sqrt(deta*deta + dphi*dphi);*/
779 for(int ic=0;ic<nclus;ic++){
780 AliVCluster *c = static_cast<AliVCluster*>(clusters->At(ic));
781 if(!c)
782 continue;
783 if(!c->IsEMCAL())
784 continue;
785 Short_t id;
2280356c 786 GetMaxCellEnergy( c, id);
1c86c72c 787 Double_t maxct = cells->GetCellTime(id);
788 if(TMath::Abs(maxtcl-maxct)>2.5e-9)
789 continue;
790 Float_t clsPos[3] = {0,0,0};
791 c->GetPosition(clsPos);
792 TVector3 cv(clsPos);
793 Double_t Et = c->E()*TMath::Sin(cv.Theta());
794 Float_t dphi = TMath::Abs(cv.Phi()-phicl);
795 Float_t deta = TMath::Abs(cv.Eta()-etacl);
30159e6f 796 Float_t R = TMath::Sqrt(deta*deta + dphi*dphi);
1c86c72c 797 if(R<0.007)
798 continue;
22814624 799 if(maxid==id)
800 continue;
1c86c72c 801 Double_t matchedpt = GetTrackMatchedPt(c->GetTrackMatchedIndex());
802 Double_t nEt = TMath::Max(Et-matchedpt, 0.0);
803 if(nEt<0)
804 printf("nEt=%1.1f\n",nEt);
30159e6f 805 if(R<fIsoConeR){
1c86c72c 806 totiso += nEt;
30159e6f 807 if(R<0.04)
1c86c72c 808 totcore += nEt;
30159e6f 809 }
810 else{
811 if(dphi>fIsoConeR)
812 continue;
813 if(deta<fIsoConeR)
814 continue;
1c86c72c 815 totband += nEt;
30159e6f 816 }
817 }
818 iso = totiso;
819 phiband = totband;
820 core = totcore;
821}
822//________________________________________________________________________
823void AliAnalysisTaskEMCALIsoPhoton::GetTrIso(TVector3 vec, Float_t &iso, Float_t &phiband, Float_t &core)
824{
bd092f0f 825 // Get track isolation.
826
30159e6f 827 if(!fSelPrimTracks)
828 return;
f9e2362a 829 fHigherPtCone = 0;
30159e6f 830 const Int_t ntracks = fSelPrimTracks->GetEntries();
831 Double_t totiso=0;
832 Double_t totband=0;
833 Double_t totcore=0;
834 Double_t etacl = vec.Eta();
835 Double_t phicl = vec.Phi();
836 if(phicl<0)
837 phicl+=TMath::TwoPi();
838 for(int itrack=0;itrack<ntracks;itrack++){
3f4073ba 839 AliVTrack *track = static_cast<AliVTrack*> (fSelPrimTracks->At(itrack));
30159e6f 840 if(!track)
841 continue;
842 Double_t dphi = TMath::Abs(track->Phi()-phicl);
843 Double_t deta = TMath::Abs(track->Eta()-etacl);
844 Double_t R = TMath::Sqrt(deta*deta + dphi*dphi);
845 Double_t pt = track->Pt();
f9e2362a 846 if(pt>fHigherPtCone)
847 fHigherPtCone = pt;
30159e6f 848 if(R<fIsoConeR){
849 totiso += track->Pt();
850 if(R<0.04)
851 totcore += pt;
852 }
853 else{
854 if(dphi>fIsoConeR)
855 continue;
856 if(deta<fIsoConeR)
857 continue;
858 totband += track->Pt();
859 }
860 }
861 iso = totiso;
862 phiband = totband;
863 core = totcore;
864}
bd092f0f 865
30159e6f 866//________________________________________________________________________
867Double_t AliAnalysisTaskEMCALIsoPhoton::GetCrossEnergy(const AliVCluster *cluster, Short_t &idmax)
868{
869 // Calculate the energy of cross cells around the leading cell.
870
871 AliVCaloCells *cells = 0;
2e20efe5 872 cells = fESDCells;
873 if (!cells)
874 cells = fAODCells;
30159e6f 875 if (!cells)
876 return 0;
877
30159e6f 878 if (!fGeom)
879 return 0;
880
881 Int_t iSupMod = -1;
882 Int_t iTower = -1;
883 Int_t iIphi = -1;
884 Int_t iIeta = -1;
885 Int_t iphi = -1;
886 Int_t ieta = -1;
887 Int_t iphis = -1;
888 Int_t ietas = -1;
889
890 Double_t crossEnergy = 0;
891
892 fGeom->GetCellIndex(idmax,iSupMod,iTower,iIphi,iIeta);
893 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphis,ietas);
894
895 Int_t ncells = cluster->GetNCells();
896 for (Int_t i=0; i<ncells; i++) {
897 Int_t cellAbsId = cluster->GetCellAbsId(i);
898 fGeom->GetCellIndex(cellAbsId,iSupMod,iTower,iIphi,iIeta);
899 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphi,ieta);
900 Int_t aphidiff = TMath::Abs(iphi-iphis);
901 if (aphidiff>1)
902 continue;
903 Int_t aetadiff = TMath::Abs(ieta-ietas);
904 if (aetadiff>1)
905 continue;
906 if ( (aphidiff==1 && aetadiff==0) ||
907 (aphidiff==0 && aetadiff==1) ) {
908 crossEnergy += cells->GetCellAmplitude(cellAbsId);
909 }
910 }
911
912 return crossEnergy;
913}
914
30159e6f 915//________________________________________________________________________
916Double_t AliAnalysisTaskEMCALIsoPhoton ::GetMaxCellEnergy(const AliVCluster *cluster, Short_t &id) const
917{
918 // Get maximum energy of attached cell.
919
920 id = -1;
921
922 AliVCaloCells *cells = 0;
2e20efe5 923 cells = fESDCells;
30159e6f 924 if (!cells)
2e20efe5 925 cells = fAODCells;
926 if(!cells)
30159e6f 927 return 0;
928
929 Double_t maxe = 0;
930 Int_t ncells = cluster->GetNCells();
931 for (Int_t i=0; i<ncells; i++) {
932 Double_t e = cells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
933 if (e>maxe) {
934 maxe = e;
935 id = cluster->GetCellAbsId(i);
936 }
937 }
938 return maxe;
939}
bd092f0f 940
c7bb0b43 941//________________________________________________________________________
942void AliAnalysisTaskEMCALIsoPhoton ::FillMcHists()
943{
944 if(!fStack)
945 return;
946 Int_t nTracks = fStack->GetNtrack();
ecd47673 947 if(fDebug)
948 printf("Inside FillMcHists and there are %d mcparts\n",nTracks);
c7bb0b43 949 for(Int_t iTrack=0;iTrack<nTracks;iTrack++){
950 TParticle *mcp = static_cast<TParticle*>(fStack->Particle(iTrack));
951 if(!mcp)
952 continue;
953 Int_t pdg = mcp->GetPdgCode();
954 if(pdg!=22)
955 continue;
f2acdbe9 956 if(TMath::Abs(mcp->Eta())>0.7 ||mcp->Phi()<1.4 || mcp->Phi()>3.2)
957 continue;
c7bb0b43 958 Int_t imom = mcp->GetMother(0);
959 if(imom<0 || imom>nTracks)
960 continue;
961 TParticle *mcmom = static_cast<TParticle*>(fStack->Particle(imom));
962 if(!mcmom)
963 continue;
964 Int_t pdgMom = mcmom->GetPdgCode();
dce6be79 965 Double_t mcphi = mcp->Phi();
966 Double_t mceta = mcp->Eta();
ec9ab86b 967 if((imom==6 || imom==7) && pdgMom==22) {
caaf99d3 968 fMCDirPhotonPtEtaPhi->Fill(mcp->Pt(),mcp->Eta(),mcp->Phi());
ca03dc51 969 Float_t ptsum = GetMcPtSumInCone(mcp->Eta(), mcp->Phi(), fIsoConeR);
e53ab710 970 if(ptsum<2)
971 fMCIsoDirPhotonPtEtaPhi->Fill(mcp->Pt(),mcp->Eta(),mcp->Phi());
dce6be79 972 if(mcphi<(3.14-fIsoConeR) && mcphi>(1.4+fIsoConeR) && TMath::Abs(mceta)<(0.7-fIsoConeR))
973 fMCDirPhotonPtEtIso->Fill(mcp->Pt(),ptsum);
f507c09b 974 if(fNClusForDirPho==0)
092ceec8 975 fMCDirPhotonPtEtaPhiNoClus->Fill(mcp->Pt(),mcp->Eta(),mcp->Phi());
40c4f1bf 976 if(fDebug){
f2acdbe9 977 printf("Found \"photonic\" parton at position %d, with pt=%1.1f, eta=%1.1f and phi=%1.1f, and status=%d,\n",imom,mcmom->Pt(), mcmom->Eta(), mcmom->Phi(), mcmom->GetStatusCode());
40c4f1bf 978 printf("with a final photon at position %d, with pt=%1.1f, eta=%1.1f and phi=%1.1f, and status=%d\n",iTrack,mcp->Pt(), mcp->Eta(), mcp->Phi(),mcp->GetStatusCode());
979 }
f2acdbe9 980 }
c7bb0b43 981 else{
982 if(TMath::Abs(pdgMom)>100 && TMath::Abs(pdgMom)<1000)
983 fDecayPhotonPtMC->Fill(mcp->Pt());
984 }
985 }
986}
30159e6f 987//________________________________________________________________________
f507c09b 988Float_t AliAnalysisTaskEMCALIsoPhoton::GetClusSource(const AliVCluster *c)
989{
990 if(!c)
84898d7b 991 return -0.1;
f507c09b 992 if(!fStack)
84898d7b 993 return -0.1;
f507c09b 994 Int_t nmcp = fStack->GetNtrack();
995 Int_t clabel = c->GetLabel();
996 if(fDebug && fMcIdFamily.Contains(Form("%d",clabel)))
997 printf("\n\t ==== Label %d is a descendent of the prompt photon ====\n\n",clabel);
998 if(!fMcIdFamily.Contains(Form("%d",clabel)))
84898d7b 999 return -0.1;
f507c09b 1000 fNClusForDirPho++;
1001 TString partonposstr = (TSubString)fMcIdFamily.operator()(0,1);
1002 Int_t partonpos = partonposstr.Atoi();
1003 if(fDebug)
1004 printf("\t^^^^ parton position = %d ^^^^\n",partonpos);
1005 if(clabel<0 || clabel>nmcp)
2cd24808 1006 return -0.1;
f507c09b 1007 Float_t clsPos[3] = {0,0,0};
1008 c->GetPosition(clsPos);
1009 TVector3 clsVec(clsPos);
1010 Double_t Et = c->E()*TMath::Sin(clsVec.Theta());
1011 TParticle *mcp = static_cast<TParticle*>(fStack->Particle(partonpos));
1012 if(!mcp)
84898d7b 1013 return -0.1;
f507c09b 1014 if(fDebug){
1015 printf("\tclus mc truth eta=%1.1f,phi=%1.1f,E=%1.1f, pdgcode=%d, stackpos=%d\n",mcp->Eta(),mcp->Phi(),mcp->Energy(),mcp->GetPdgCode(),clabel);
1016 }
1017 Int_t lab1 = mcp->GetFirstDaughter();
1018 if(lab1<0 || lab1>nmcp)
84898d7b 1019 return -0.1;
f507c09b 1020 TParticle *mcd = static_cast<TParticle*>(fStack->Particle(lab1));
1021 if(!mcd)
84898d7b 1022 return -0.1;
f507c09b 1023 if(fDebug)
1024 printf("\t\tmom mc truth eta=%1.1f,phi=%1.1f,E=%1.1f, pdgcode=%d, stackpos=%d\n",mcd->Eta(),mcd->Phi(),mcd->Energy(),mcd->GetPdgCode(),lab1);
1025 if(mcd->GetPdgCode()==22){
1026 fClusEtMcPt->Fill(mcd->Pt(), Et);
1027 fClusMcDetaDphi->Fill(clsVec.Eta() - mcd->Eta(), clsVec.Phi() - mcd->Phi());
1028 }
1029 else{
1030 printf("Warning: daughter of photon parton is not a photon\n");
84898d7b 1031 return -0.1;
f507c09b 1032 }
1033 return fDirPhoPt;
1034}
1035//________________________________________________________________________
1036void AliAnalysisTaskEMCALIsoPhoton::FollowGamma()
1037{
1038 if(!fStack)
1039 return;
1040 Int_t selfid = 6;
1041 TParticle *mcp = static_cast<TParticle*>(fStack->Particle(selfid));
1042 if(!mcp)
1043 return;
1044 if(mcp->GetPdgCode()!=22){
1045 mcp = static_cast<TParticle*>(fStack->Particle(++selfid));
1046 if(!mcp)
1047 return;
1048 }
1049 Int_t daug0f = mcp->GetFirstDaughter();
1050 Int_t daug0l = mcp->GetLastDaughter();
1051 Int_t nd0 = daug0l - daug0f;
1052 if(fDebug)
1053 printf("\n\tGenerated gamma (%d) eta=%1.1f,phi=%1.1f,E=%1.1f, pdgcode=%d, n-daug=%d\n",selfid,mcp->Eta(),mcp->Phi(),mcp->Energy(),mcp->GetPdgCode(),nd0+1);
1054 fMcIdFamily = Form("%d,",selfid);
1055 GetDaughtersInfo(daug0f,daug0l, selfid,"");
1056 if(fDebug){
1057 printf("\t---- end of the prompt gamma's family tree ----\n\n");
1058 printf("Family id string = %s,\n\n",fMcIdFamily.Data());
1059 }
1060 TParticle *md = static_cast<TParticle*>(fStack->Particle(daug0f));
1061 if(!md)
1062 return;
1063 fDirPhoPt = md->Pt();
1064}
1065//________________________________________________________________________
22ad7981 1066void AliAnalysisTaskEMCALIsoPhoton::GetDaughtersInfo(int firstd, int lastd, int selfid, const char *inputind)
f507c09b 1067{
1068 int nmcp = fStack->GetNtrack();
1069 if(firstd<0 || firstd>nmcp)
1070 return;
1071 if(lastd<0 || lastd>nmcp)
1072 return;
1073 if(firstd>lastd){
1074 printf("WARNING: First daughter > last (%d,%d)\n",firstd,lastd);
1075 return;
1076 }
1077 TString indenter = Form("\t%s",inputind);
1078 TParticle *dp = 0x0;
1079 if(fDebug)
1080 printf("\t%s--- Daughters of particle %d ---\n", indenter.Data(), selfid);
1081 for(int id=firstd; id<lastd+1; id++){
1082 dp = static_cast<TParticle*>(fStack->Particle(id));
1083 if(!dp)
1084 continue;
1085 Int_t dfd = dp->GetFirstDaughter();
1086 Int_t dld = dp->GetLastDaughter();
1087 Int_t dnd = dld - dfd + 1;
1088 Float_t vr = TMath::Sqrt(dp->Vx()*dp->Vx()+dp->Vy()*dp->Vy());
1089 if(fDebug)
1090 printf("\t%sParticle daughter(%d) eta=%1.1f,phi=%1.1f,E=%1.1f, vR=%1.1f, pdgcode=%d, n-daug=%d(%d,%d)\n", indenter.Data(),id, dp->Eta(), dp->Phi(), dp->Energy(), vr, dp->GetPdgCode(), dnd, dfd, dld);
1091 fMcIdFamily += Form("%d,",id);
1092 GetDaughtersInfo(dfd,dld,id,indenter.Data());
1093 }
1094}
f912f9a9 1095
1096//________________________________________________________________________
1097Float_t AliAnalysisTaskEMCALIsoPhoton::GetMcPtSumInCone(Float_t etaclus, Float_t phiclus, Float_t R)
1098{
1099 if(!fStack)
1100 return 0;
1101 if(fDebug)
1102 printf("Inside GetMcPtSumInCone!!\n");
1103 Int_t nTracks = fStack->GetNtrack();
1104 Float_t ptsum = 0;
672df96f 1105 TString addpartlabels = "";
e53ab710 1106 for(Int_t iTrack=8;iTrack<nTracks;iTrack++){
f912f9a9 1107 TParticle *mcp = static_cast<TParticle*>(fStack->Particle(iTrack));
1108 if(!mcp)
1109 continue;
e53ab710 1110 Int_t status = mcp->GetStatusCode();
1111 if(status!=1)
1112 continue;
1113 Float_t mcvr = TMath::Sqrt(mcp->Vx()*mcp->Vx()+ mcp->Vy()* mcp->Vy() + mcp->Vz()*mcp->Vz());
1114 if(mcvr>1)
f912f9a9 1115 continue;
1116 else {
1117 if(fDebug)
1118 printf(" >>>> mcp Rho, Vx, Vy, Vz = %1.1f,%1.1f,%1.1f,%1.1f.......\n",mcp->Rho(),mcp->Vx(), mcp->Vy(),mcp->Vz());
1119 }
1120 Float_t dphi = mcp->Phi() - phiclus;
1121 Float_t deta = mcp->Eta() - etaclus;
1122 if(fDebug)
1123 printf(" >>>> mcphi = %1.1f, mceta = %1.1f\n>>>> dphi = %1.1f, deta = %1.1f\n", mcp->Phi(), mcp->Eta(),dphi,deta);
e53ab710 1124 if(deta>R || dphi>R)
f912f9a9 1125 continue;
1126 Float_t dR = TMath::Sqrt(dphi*dphi + deta*deta);
1127 if(dR>R)
1128 continue;
672df96f 1129 addpartlabels += Form("%d,",iTrack);
e53ab710 1130 if(mcp->Pt()<0.2)
1131 continue;
f912f9a9 1132 ptsum += mcp->Pt();
1133 }
1134 return ptsum;
1135}
f507c09b 1136//________________________________________________________________________
2b7205ad 1137void AliAnalysisTaskEMCALIsoPhoton::FillQA()
1138{
85b52a52 1139
1140 TObjArray *clusters = fESDClusters;
1141
1142 if (!clusters){
1143 clusters = fAODClusters;
1144 if(fDebug)
1145 printf("ESD clusters empty...");
1146 }
1147 if (!clusters){
1148 if(fDebug)
1149 printf(" and AOD clusters as well!!!\n");
1150 return;
1151 }
2b7205ad 1152 if(!fSelPrimTracks)
1153 return;
1154 const int ntracks = fSelPrimTracks->GetEntriesFast();
112eb594 1155 const int ncells = fNCells50;//fESDCells->GetNumberOfCells();
85b52a52 1156 const Int_t nclus = clusters->GetEntries();
2b7205ad 1157
1158 fNTracks->Fill(ntracks);
1159 fEmcNCells->Fill(ncells);
1160 fEmcNClus->Fill(nclus);
1161 if(fMaxEClus>fECut){
1162 fNTracksECut->Fill(ntracks);
1163 fEmcNCellsCut->Fill(ncells);
1164 fEmcNClusCut->Fill(nclus);
1165 }
1166 for(int it=0;it<ntracks;it++){
1167 AliVTrack *t = (AliVTrack*)fSelPrimTracks->At(it);
1168 if(!t)
1169 continue;
e4ba80ad 1170 fTrackPtPhi->Fill(t->Pt(),t->Phi());
1171 fTrackPtEta->Fill(t->Pt(),t->Eta());
1172 if(fMaxEClus>fECut){
1173 fTrackPtPhiCut->Fill(t->Pt(), t->Phi());
1174 fTrackPtEtaCut->Fill(t->Pt(), t->Eta());
1175 }
2b7205ad 1176 }
1177 for(int ic=0;ic<nclus;ic++){
85b52a52 1178 AliVCluster *c = dynamic_cast<AliVCluster*>(clusters->At(ic));
1179 //AliESDCaloCluster *c = (AliESDCaloCluster*)clusters->At(ic);
2b7205ad 1180 if(!c)
1181 continue;
3ae97198 1182 if(!c->IsEMCAL())
1183 continue;
e4ba80ad 1184 Float_t clsPos[3] = {0,0,0};
1185 c->GetPosition(clsPos);
1186 TVector3 clsVec(clsPos);
1187 Double_t cphi = clsVec.Phi();
1188 Double_t ceta = clsVec.Eta();
ed39f27f 1189 if(TMath::Abs(c->GetTrackDx())<0.03 && TMath::Abs(c->GetTrackDz())<0.02)
1190 fEmcClusETM1->Fill(c->E());
1191 if(fClusIdFromTracks.Contains(Form("%d",ic)))
1192 fEmcClusETM2->Fill(c->E());
34393c41 1193 if(!IsExotic(c))
1194 fEmcClusNotExo->Fill(c->E());
e4ba80ad 1195 fEmcClusEPhi->Fill(c->E(), cphi);
1196 fEmcClusEEta->Fill(c->E(), ceta);
1197 if(fMaxEClus>fECut){
1198 fEmcClusEPhiCut->Fill(c->E(), cphi);
1199 fEmcClusEEtaCut->Fill(c->E(), ceta);
1200 }
2b7205ad 1201 }
1202}
1203//________________________________________________________________________
1c86c72c 1204Double_t AliAnalysisTaskEMCALIsoPhoton::GetTrackMatchedPt(Int_t matchIndex)
1205{
1206 Double_t pt = 0;
1207 if(!fTracks)
1208 return pt;
1209 if(matchIndex<0 || matchIndex>fTracks->GetEntries()){
1210 if(fDebug)
1211 printf("track-matched index out of track array range!!!\n");
1212 return pt;
1213 }
1214 AliVTrack* track = static_cast<AliVTrack*>(fTracks->At(matchIndex));
1215 if(!track){
1216 if(fDebug)
1217 printf("track-matched pointer does not exist!!!\n");
1218 return pt;
1219 }
1220 if(fESD){
1221 if(!fPrTrCuts)
1222 return pt;
1223 if(!fPrTrCuts->IsSelected(track))
1224 return pt;
1225 pt = track->Pt();
1226 }
1227 return pt;
1228}
1229//________________________________________________________________________
112eb594 1230void AliAnalysisTaskEMCALIsoPhoton::LoopOnCells()
1231{
1232 AliVCaloCells *cells = 0;
1233 cells = fESDCells;
1234 if (!cells)
1235 cells = fAODCells;
1236 if(!cells)
1237 return;
3ae97198 1238 Double_t maxe = 0;
1239 Double_t maxphi = -10;
112eb594 1240 Int_t ncells = cells->GetNumberOfCells();
3ae97198 1241 Double_t eta,phi;
112eb594 1242 for (Int_t i=0; i<ncells; i++) {
1243 Short_t absid = TMath::Abs(cells->GetCellNumber(i));
1244 Double_t e = cells->GetCellAmplitude(absid);
1245 if(e>0.05)
1246 fNCells50++;
3ae97198 1247 else
1248 continue;
1249 fGeom->EtaPhiFromIndex(absid,eta,phi);
1250 if(maxe<e){
1251 maxe = e;
1252 maxphi = phi;
1253 }
112eb594 1254 }
3ae97198 1255 fMaxCellEPhi->Fill(maxe,maxphi);
112eb594 1256
1257}
1258//________________________________________________________________________
34393c41 1259bool AliAnalysisTaskEMCALIsoPhoton::IsExotic(AliVCluster *c)
1260{
1261 bool isExo = 0;
1262 Short_t id;
1263 Double_t Emax = GetMaxCellEnergy( c, id);
1264 Double_t Ecross = GetCrossEnergy( c, id);
1265 if((1-Ecross/Emax)>fExoticCut)
1266 isExo = 1;
1267 return isExo;
1268}
1269//________________________________________________________________________
30159e6f 1270void AliAnalysisTaskEMCALIsoPhoton::Terminate(Option_t *)
1271{
bd092f0f 1272 // Called once at the end of the query.
30159e6f 1273}