3 // Simulation EMCal task.
5 // Author: Saehanseul Oh
7 #include "AliAnalysisTaskSOH.h"
12 #include <THnSparse.h>
14 #include "AliAnalysisManager.h"
15 #include "AliAnalysisTask.h"
16 #include "AliEMCALRecoUtils.h"
17 #include "AliEMCALTrack.h"
18 #include "AliESDCaloCluster.h"
19 #include "AliESDEvent.h"
20 #include "AliESDInputHandler.h"
21 #include "AliESDtrack.h"
22 #include "AliESDtrackCuts.h"
23 #include "AliExternalTrackParam.h"
25 #include "AliMCEvent.h"
27 ClassImp(AliAnalysisTaskSOH)
29 //________________________________________________________________________
30 AliAnalysisTaskSOH::AliAnalysisTaskSOH() :
35 fHybridTrackCuts1(0x0),
36 fHybridTrackCuts2(0x0),
42 fHTrkEffParGenPtEtaPhi(0),
43 fHTrkEffDetGenPtEtaPhi(0),
44 fHTrkEffDetRecPtEtaPhi(0),
45 fHTrkEffDetRecFakePtEtaPhi(0),
46 fHTrkEffParGenPt_all(0),
47 fHTrkEffDetRecPt_all(0),
48 fHTrkEffParGenPt_Dch(0),
49 fHTrkEffDetRecPt_Dch(0),
50 fHTrkEffParGenPt_Dn(0),
51 fHTrkEffDetRecPt_Dn(0),
52 fHTrkEffParGenPt_Ds(0),
53 fHTrkEffDetRecPt_Ds(0),
54 fHTrkEffParGenPt_cL(0),
55 fHTrkEffDetRecPt_cL(0),
56 fHTrkEffParGenPt_JPsi(0),
57 fHTrkEffDetRecPt_JPsi(0),
59 fHScaleFactor100HC(0),
61 fHEMCalResponsePion(0x0),
62 fHEMCalResponseElec(0x0),
63 fHEMCalResponseProton(0x0),
64 fHEMCalRecdPhidEta(0x0),
65 fHEMCalRecdPhidEtaP(0x0),
66 fHEMCalRecdPhidEtaM(0x0),
67 fHEMCalRecdPhidEta_Truth(0x0),
68 fHEMCalRecdPhidEtaP_Truth(0x0),
69 fHEMCalRecdPhidEtaM_Truth(0x0),
70 fHEMCalRecdPhidEtaposEta(0x0),
71 fHEMCalRecdPhidEtanegEta(0x0),
72 fHPhotonEdiff100HC(0x0),
75 fHPhotonEdiff0HC(0x0),
79 fHistEsub1PchRat(0x0),
80 fHistEsub2PchRat(0x0),
81 fHClsEoverMcE_All(0x0),
82 fHClsEoverMcE_Photon(0x0),
83 fHClsEoverMcE_Elec(0x0),
84 fHClsEoverMcE_Pion(0x0)
91 //________________________________________________________________________
92 AliAnalysisTaskSOH::AliAnalysisTaskSOH(const char *name) :
93 AliAnalysisTaskSE(name),
97 fHybridTrackCuts1(0x0),
98 fHybridTrackCuts2(0x0),
100 fClusterIndices(0x0),
104 fHTrkEffParGenPtEtaPhi(0),
105 fHTrkEffDetGenPtEtaPhi(0),
106 fHTrkEffDetRecPtEtaPhi(0),
107 fHTrkEffDetRecFakePtEtaPhi(0),
108 fHTrkEffParGenPt_all(0),
109 fHTrkEffDetRecPt_all(0),
110 fHTrkEffParGenPt_Dch(0),
111 fHTrkEffDetRecPt_Dch(0),
112 fHTrkEffParGenPt_Dn(0),
113 fHTrkEffDetRecPt_Dn(0),
114 fHTrkEffParGenPt_Ds(0),
115 fHTrkEffDetRecPt_Ds(0),
116 fHTrkEffParGenPt_cL(0),
117 fHTrkEffDetRecPt_cL(0),
118 fHTrkEffParGenPt_JPsi(0),
119 fHTrkEffDetRecPt_JPsi(0),
121 fHScaleFactor100HC(0),
123 fHEMCalResponsePion(0x0),
124 fHEMCalResponseElec(0x0),
125 fHEMCalResponseProton(0x0),
126 fHEMCalRecdPhidEta(0x0),
127 fHEMCalRecdPhidEtaP(0x0),
128 fHEMCalRecdPhidEtaM(0x0),
129 fHEMCalRecdPhidEta_Truth(0x0),
130 fHEMCalRecdPhidEtaP_Truth(0x0),
131 fHEMCalRecdPhidEtaM_Truth(0x0),
132 fHEMCalRecdPhidEtaposEta(0x0),
133 fHEMCalRecdPhidEtanegEta(0x0),
134 fHPhotonEdiff100HC(0x0),
135 fHPhotonEdiff70HC(0),
136 fHPhotonEdiff30HC(0),
137 fHPhotonEdiff0HC(0x0),
138 fHPhotonEVsClsE(0x0),
141 fHistEsub1PchRat(0x0),
142 fHistEsub2PchRat(0x0),
143 fHClsEoverMcE_All(0x0),
144 fHClsEoverMcE_Photon(0x0),
145 fHClsEoverMcE_Elec(0x0),
146 fHClsEoverMcE_Pion(0x0)
150 // Output slot #1 writes into a TH1 container
151 DefineOutput(1, TList::Class());
155 //________________________________________________________________________
156 AliAnalysisTaskSOH::~AliAnalysisTaskSOH()
160 delete fEsdTrackCuts;
161 delete fHybridTrackCuts1;
162 delete fHybridTrackCuts2;
163 delete fTrackIndices;
164 delete fClusterIndices;
165 delete fClusterArray;
169 //________________________________________________________________________
170 void AliAnalysisTaskSOH::UserCreateOutputObjects()
172 // Create histograms, called once.
176 fOutputList = new TList();
177 fOutputList->SetOwner(1);
179 fHEventStat = new TH1F("fHEventStat","Event statistics for analysis",8,0,8);
180 fHEventStat->GetXaxis()->SetBinLabel(1,"Event");
181 fHEventStat->GetXaxis()->SetBinLabel(2,"cluster");
182 fHEventStat->GetXaxis()->SetBinLabel(3,"good cluster");
183 fHEventStat->GetXaxis()->SetBinLabel(4,"cls/0-truth");
184 fHEventStat->GetXaxis()->SetBinLabel(5,"cls/1-truth");
185 fHEventStat->GetXaxis()->SetBinLabel(6,"cls/2-truth");
186 fHEventStat->GetXaxis()->SetBinLabel(7,"cls/2-goodtruth");
187 fHEventStat->GetXaxis()->SetBinLabel(8,"cls/>3-truth");
188 fOutputList->Add(fHEventStat);
190 fHTrkEffParGenPtEtaPhi = new TH3F("fHTrkEffParGenPtEtaPhi","Particle level truth Phi-Eta-p_{T} distribution of primary charged pions", 500, 0, 50, 60, -1.5, 1.5, 128, 0, 6.4);
191 fHTrkEffParGenPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
192 fHTrkEffParGenPtEtaPhi->GetYaxis()->SetTitle("#eta");
193 fHTrkEffParGenPtEtaPhi->GetZaxis()->SetTitle("#phi");
194 fOutputList->Add(fHTrkEffParGenPtEtaPhi);
196 fHTrkEffDetGenPtEtaPhi = new TH3F("fHTrkEffDetGenPtEtaPhi","Detector level truth Phi-Eta-p_{T} distribution of primary charged pions", 500, 0, 50, 60, -1.5, 1.5, 128, 0, 6.4);
197 fHTrkEffDetGenPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
198 fHTrkEffDetGenPtEtaPhi->GetYaxis()->SetTitle("#eta");
199 fHTrkEffDetGenPtEtaPhi->GetZaxis()->SetTitle("#phi");
200 fOutputList->Add(fHTrkEffDetGenPtEtaPhi);
202 fHTrkEffDetRecPtEtaPhi = new TH3F("fHTrkEffDetRecPtEtaPhi","Reconstructed track Phi-Eta-p_{T} distribution of primary charged pions", 500, 0, 50, 60, -1.5, 1.5, 128, 0, 6.4);
203 fHTrkEffDetRecPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
204 fHTrkEffDetRecPtEtaPhi->GetYaxis()->SetTitle("#eta");
205 fHTrkEffDetRecPtEtaPhi->GetZaxis()->SetTitle("#phi");
206 fOutputList->Add(fHTrkEffDetRecPtEtaPhi);
208 fHTrkEffDetRecFakePtEtaPhi = new TH3F("fHTrkEffDetRecFakePtEtaPhi","Reconstructed fake track Phi-Eta-p_{T} distribution of pions", 500, 0, 50, 60, -1.5, 1.5, 128, 0, 6.4);
209 fHTrkEffDetRecFakePtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
210 fHTrkEffDetRecFakePtEtaPhi->GetYaxis()->SetTitle("#eta");
211 fHTrkEffDetRecFakePtEtaPhi->GetZaxis()->SetTitle("#phi");
212 fOutputList->Add(fHTrkEffDetRecFakePtEtaPhi);
214 fHTrkEffParGenPt_all = new TH1F("fHTrkEffParGenPt_all", "Truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
215 fOutputList->Add(fHTrkEffParGenPt_all);
217 fHTrkEffDetRecPt_all = new TH1F("fHTrkEffDetRecPt_all", "Reconstructed track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
218 fOutputList->Add(fHTrkEffDetRecPt_all);
220 fHTrkEffParGenPt_Dch = new TH1F("fHTrkEffParGenPt_Dch", "Charged D meson truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
221 fOutputList->Add(fHTrkEffParGenPt_Dch);
223 fHTrkEffDetRecPt_Dch = new TH1F("fHTrkEffDetRecPt_Dch", "Charged D meson reconstructed track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
224 fOutputList->Add(fHTrkEffDetRecPt_Dch);
226 fHTrkEffParGenPt_Dn = new TH1F("fHTrkEffParGenPt_Dn", "Neutral D meson truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
227 fOutputList->Add(fHTrkEffParGenPt_Dn);
229 fHTrkEffDetRecPt_Dn = new TH1F("fHTrkEffDetRecPt_Dn", "Neutral D meson reconstructed track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
230 fOutputList->Add(fHTrkEffDetRecPt_Dn);
232 fHTrkEffParGenPt_Ds = new TH1F("fHTrkEffParGenPt_Ds", "D_{s} truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
233 fOutputList->Add(fHTrkEffParGenPt_Ds);
235 fHTrkEffDetRecPt_Ds = new TH1F("fHTrkEffDetRecPt_Ds", "D_{s} reconstructed track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
236 fOutputList->Add(fHTrkEffDetRecPt_Ds);
238 fHTrkEffParGenPt_cL = new TH1F("fHTrkEffParGenPt_cL", "#Lambda_{c} truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
239 fOutputList->Add(fHTrkEffParGenPt_cL);
241 fHTrkEffDetRecPt_cL = new TH1F("fHTrkEffDetRecPt_cL", "#Lambda_{c} reconstructed track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
242 fOutputList->Add(fHTrkEffDetRecPt_cL);
244 fHTrkEffParGenPt_JPsi = new TH1F("fHTrkEffParGenPt_JPsi", "J/#Psi truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
245 fOutputList->Add(fHTrkEffParGenPt_JPsi);
247 fHTrkEffDetRecPt_JPsi = new TH1F("fHTrkEffDetRecPt_JPsi", "J/#Psi Reconstructed track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,50);
248 fOutputList->Add(fHTrkEffDetRecPt_JPsi);
250 fHScaleFactor = new TH1F("fHScaleFactor", "Scale factor distribution without hadronic correction;Scale factor",100,0,10);
251 fOutputList->Add(fHScaleFactor);
253 fHScaleFactor100HC = new TH1F("fHScaleFactor100HC", "Scale factor distribution with 100% hadronic correction;Scale factor",100,0,10);
254 fOutputList->Add(fHScaleFactor100HC);
256 fHEOverPVsPt = new TH2F("fHEOverPVsPt", "E/P vs track p_{T}; p_{T} (GeV/c); E/P", 200 , 0, 4, 200, 0, 3.2);
257 fOutputList->Add(fHEOverPVsPt);
259 fHEMCalResponsePion = new TH2F("fHEMCalResponsePion", "Pion E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
260 fOutputList->Add(fHEMCalResponsePion);
262 fHEMCalResponseElec = new TH2F("fHEMCalResponseElec", "Electron E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
263 fOutputList->Add(fHEMCalResponseElec);
265 fHEMCalResponseProton = new TH2F("fHEMCalResponseProton", "Proton E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
266 fOutputList->Add(fHEMCalResponseProton);
268 fHEMCalRecdPhidEta = new TH2F("fHEMCalRecdPhidEta","EMCAL Cluster-Track #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
269 fOutputList->Add(fHEMCalRecdPhidEta);
271 fHEMCalRecdPhidEtaP = new TH2F("fHEMCalRecdPhidEtaP","EMCAL Charge+ Cluster-Track #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
272 fOutputList->Add(fHEMCalRecdPhidEtaP);
274 fHEMCalRecdPhidEtaM = new TH2F("fHEMCalRecdPhidEtaM","EMCAL Charge- Cluster-Track #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
275 fOutputList->Add(fHEMCalRecdPhidEtaM);
277 fHEMCalRecdPhidEta_Truth = new TH2F("fHEMCalRecdPhidEta_Truth","EMCAL Cluster-Track(Truth matched) #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
278 fOutputList->Add(fHEMCalRecdPhidEta_Truth);
280 fHEMCalRecdPhidEtaP_Truth = new TH2F("fHEMCalRecdPhidEtaP_Truth","EMCAL Charge+ Cluster-Track(Truth matched) #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
281 fOutputList->Add(fHEMCalRecdPhidEtaP_Truth);
283 fHEMCalRecdPhidEtaM_Truth = new TH2F("fHEMCalRecdPhidEtaM_Truth","EMCAL Charge- Cluster-Track(Truth matched) #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
284 fOutputList->Add(fHEMCalRecdPhidEtaM_Truth);
286 fHEMCalRecdPhidEtaposEta = new TH2F("fHEMCalRecdPhidEtaposEta","(+eta track) EMCAL Cluster-Track #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
287 fOutputList->Add(fHEMCalRecdPhidEtaposEta);
289 fHEMCalRecdPhidEtanegEta = new TH2F("fHEMCalRecdPhidEtanegEta","(-eta track) EMCAL Cluster-Track #Delta#phi-#Delta#eta; #Delta#eta; #Delta#phi",1000,-0.1,0.1,1000,-0.5,0.5);
290 fOutputList->Add(fHEMCalRecdPhidEtanegEta);
292 fHPhotonEdiff100HC = new TH2F("fHPhotonEdiff100HC","Photon (E_{Truth}- E_{calc,100% HC})/E_{Truth} vs. E_{Truth}; E_{Truth} (GeV); (E_{Truth}- E_{calc,100% HC})/E_{Truth}",1000,0,10,600,-4.9,1.1);
293 fOutputList->Add(fHPhotonEdiff100HC);
295 fHPhotonEdiff70HC = new TH2F("fHPhotonEdiff70HC","Photon (E_{Truth}- E_{calc,70% HC})/E_{Truth} vs. E_{Truth}; E_{Truth} (GeV); (E_{Truth}- E_{calc,30% HC})/E_{Truth}",1000,0,10,600,-4.9,1.1);
296 fOutputList->Add(fHPhotonEdiff70HC);
298 fHPhotonEdiff30HC = new TH2F("fHPhotonEdiff30HC","Photon (E_{Truth}- E_{calc,30% HC})/E_{Truth} vs. E_{Truth}; E_{Truth} (GeV); (E_{Truth}- E_{calc,30% HC})/E_{Truth}",1000,0,10,600,-4.9,1.1);
299 fOutputList->Add(fHPhotonEdiff30HC);
301 fHPhotonEdiff0HC = new TH2F("fHPhotonEdiff0HC","Photon (E_{Truth}- E_{calc,0% HC})/E_{Truth} vs. E_{Truth}; E_{Truth} (GeV); (E_{Truth}- E_{cls})/E_{Truth}",1000,0,10,600,-4.9,1.1);
302 fOutputList->Add(fHPhotonEdiff0HC);
304 fHPhotonEVsClsE = new TH2F("fHPhotonEVsClsE","Cluster E vs. photon E_{Truth}; photon E_{Truth} (GeV); Cluster E (GeV)",500,0,5,500,0,5);
305 fOutputList->Add(fHPhotonEVsClsE);
307 fHistEsub1Pch =new TH2F("fHistEsub1Pch", "(subtracted E in 100% HC) vs. total track P, clusters with 1 matching track; total track P (GeV/c); E_{sub}(GeV)" , 1000, 0., 10, 1000, 0., 10.);
308 fOutputList->Add(fHistEsub1Pch);
310 fHistEsub2Pch =new TH2F("fHistEsub2Pch", "(subtracted E in 100% HC) vs. total track P, clusters with 2 matching tracks; total track P (GeV/c); E_{sub}(GeV)" , 1000, 0., 10, 1000, 0., 10.);
311 fOutputList->Add(fHistEsub2Pch);
313 fHistEsub1PchRat =new TH2F("fHistEsub1PchRat", "(subtracted E in 100% HC)/total track P vs. total track P, clusters with 1 matching track; total track P (GeV/c); E_{sub}/P_{tot}" , 1000, 0., 10, 1100, 0., 1.1);
314 fOutputList->Add(fHistEsub1PchRat);
316 fHistEsub2PchRat =new TH2F("fHistEsub2PchRat", "(subtracted E in 100% HC)/total track P vs. total track P, clusters with 2 matching tracks; total track P (GeV/c); E_{sub}/P_{tot}" , 1000, 0., 10, 1100, 0., 1.1);
317 fOutputList->Add(fHistEsub2PchRat);
319 Int_t bins[4] = {150, 150, 100, 200};
320 Double_t xmin[4] = {1.3, -0.8, 0, 0};
321 Double_t xmax[4] = {3.2, 0.8, 10, 2};
323 fHClsEoverMcE_All = new THnSparseF("fHClsEoverMcE_All", "Cluster E/MC E, clusters with 1 matching particle; #phi; #eta; E (GeV); ClsE/McE", 4, bins, xmin, xmax);
324 fOutputList->Add(fHClsEoverMcE_All);
326 fHClsEoverMcE_Photon = new THnSparseF("fHClsEoverMcE_Photon", "Cluster E/MC E, clusters with 1 matching photon; #phi; #eta; E (GeV); ClsE/McE", 4, bins, xmin, xmax);
327 fOutputList->Add(fHClsEoverMcE_Photon);
329 fHClsEoverMcE_Elec = new THnSparseF("fHClsEoverMcE_Elec", "Cluster E/MC E, clusters with 1 matching electron; #phi; #eta; E (GeV); ClsE/McE", 4, bins, xmin, xmax);
330 fOutputList->Add(fHClsEoverMcE_Elec);
332 fHClsEoverMcE_Pion = new THnSparseF("fHClsEoverMcE_Pion", "Cluster E/MC E, clusters with 1 matching pion; #phi; #eta; E (GeV); ClsE/McE",4, bins, xmin, xmax);
333 fOutputList->Add(fHClsEoverMcE_Pion);
335 fTrackIndices = new TArrayI();
336 fClusterIndices = new TArrayI();
338 fClusterArray = new TObjArray();
339 fClusterArray->SetOwner(1);
341 PostData(1, fOutputList);
344 //________________________________________________________________________
345 void AliAnalysisTaskSOH::UserExec(Option_t *)
347 // Main loop, called for each event.
350 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
352 printf("ERROR: fESD not available\n");
358 printf("ERROR: fMC not available\n");
362 fHEventStat->Fill(0.5);
365 fTrackIndices->Reset();
367 fClusterIndices->Reset();
369 fClusterArray->Delete();
374 ProcessScaleFactor();
376 PostData(1, fOutputList);
379 //________________________________________________________________________
380 void AliAnalysisTaskSOH::ProcessTrack()
384 fTrackIndices->Set(fESD->GetNumberOfTracks());
385 AliDebug(3,Form("%s:%d Selecting tracks",(char*)__FILE__,__LINE__));
390 Float_t ClsPos[3] = {-999,-999,-999};
391 Double_t emcTrkpos[3] = {-999,-999,-999};
393 for(Int_t itr=0; itr<fESD->GetNumberOfTracks(); itr++)
395 AliESDtrack *esdtrack = fESD->GetTrack(itr);
396 if(!esdtrack)continue;
397 AliESDtrack *newTrack = GetAcceptTrack(esdtrack);
398 if(!newTrack) continue;
401 Int_t clsIndex = newTrack->GetEMCALcluster();
402 if(newTrack->GetEMCALcluster()>-1)
404 AliESDCaloCluster *cluster = fESD->GetCaloCluster(clsIndex);
405 if(IsGoodCluster(cluster))
409 cluster->GetPosition(ClsPos);
410 TVector3 VClsPos(ClsPos[0], ClsPos[1], ClsPos[2]);
412 AliEMCALTrack EMCTrk(*newTrack);
413 if(!EMCTrk.PropagateToGlobal(ClsPos[0], ClsPos[1], ClsPos[2], 0.0, 0.0)) {
416 EMCTrk.GetXYZ(emcTrkpos);
417 TVector3 VemcTrkPos(emcTrkpos[0],emcTrkpos[1],emcTrkpos[2]);
419 Double_t dPhi = VClsPos.Phi() - VemcTrkPos.Phi();
420 if (dPhi < -1*TMath::Pi()) dPhi += (2*TMath::Pi());
421 else if (dPhi > TMath::Pi()) dPhi -= (2*TMath::Pi());
423 Double_t dEta = VClsPos.Eta() - VemcTrkPos.Eta();
425 fHEMCalRecdPhidEta->Fill(dEta, dPhi);
427 if((newTrack->GetLabel())>-1 && (newTrack->GetLabel()) < fMC->GetNumberOfTracks())
429 AliVParticle *vParticle = fMC->GetTrack(newTrack->GetLabel());
430 if(IsGoodMcParticle(vParticle, newTrack->GetLabel()))
432 fHEMCalRecdPhidEta_Truth->Fill(dEta, dPhi);
433 if(vParticle->Charge() > 0) fHEMCalRecdPhidEtaP_Truth->Fill(dEta, dPhi);
434 if(vParticle->Charge() < 0) fHEMCalRecdPhidEtaM_Truth->Fill(dEta, dPhi);
438 if(esdtrack->Charge() > 0) {fHEMCalRecdPhidEtaP->Fill(dEta, dPhi);}
439 if(esdtrack->Charge() < 0) {fHEMCalRecdPhidEtaM->Fill(dEta, dPhi);}
441 if(VemcTrkPos.Eta() > 0) fHEMCalRecdPhidEtaposEta->Fill(dEta, dPhi);
442 if(VemcTrkPos.Eta() < 0) fHEMCalRecdPhidEtanegEta->Fill(dEta, dPhi);
445 if(newTrack->P()>0) fHEOverPVsPt->Fill(newTrack->Pt(),clsE/newTrack->P());
448 Int_t ipart = newTrack->GetLabel();
449 if(ipart>-1 && ipart<fMC->GetNumberOfTracks())
451 AliVParticle* vParticle = fMC->GetTrack(ipart);
452 if(isMth && vParticle)
454 if(TMath::Abs(vParticle->PdgCode())==211)
456 fHEMCalResponsePion->Fill(newTrack->Pt(),clsE/newTrack->P());
458 if(TMath::Abs(vParticle->PdgCode())==11)
460 fHEMCalResponseElec->Fill(newTrack->Pt(),clsE/newTrack->P());
462 if(TMath::Abs(vParticle->PdgCode())==2212)
464 fHEMCalResponseProton->Fill(newTrack->Pt(),clsE/newTrack->P());
469 if(newTrack->GetLabel()<0 && newTrack->GetPID()==2) fHTrkEffDetRecFakePtEtaPhi->Fill(esdtrack->Pt(), esdtrack->Eta(), esdtrack->Phi());
472 fTrackIndices->AddAt(itr,nTracks);
476 fTrackIndices->Set(nTracks);
479 //________________________________________________________________________
480 void AliAnalysisTaskSOH::ProcessCluster()
485 TLorentzVector gamma;
486 Double_t vertex[3] = {0, 0, 0};
487 fESD->GetVertex()->GetXYZ(vertex);
488 const Int_t nCaloClusters = fESD->GetNumberOfCaloClusters();
489 fClusterIndices->Set(nCaloClusters);
490 Float_t ClsPos[3] = {-999,-999,-999};
492 for(Int_t itr=0; itr<nCaloClusters; itr++)
494 fHEventStat->Fill(1.5);
495 AliESDCaloCluster *cluster = fESD->GetCaloCluster(itr);
496 if(!IsGoodCluster(cluster)) continue;
497 cluster->GetMomentum(gamma, vertex);
498 if (gamma.Pt() < 0.15) continue;
499 fHEventStat->Fill(2.5);
501 cluster->GetPosition(ClsPos);
502 TVector3 VClsPos(ClsPos[0], ClsPos[1], ClsPos[2]);
504 TArrayI *TrackLabels = cluster->GetTracksMatched();
506 if(TrackLabels->GetSize() == 1)
508 AliESDtrack *esdtrack = fESD->GetTrack(TrackLabels->GetAt(0));
509 AliESDtrack *newTrack = GetAcceptTrack(esdtrack);
510 if(newTrack && TMath::Abs(newTrack->Eta())<0.7)
512 Double_t Esub = newTrack->P();
513 if (Esub > cluster->E()) Esub = cluster->E();
514 fHistEsub1Pch->Fill(newTrack->P(), Esub);
515 fHistEsub1PchRat->Fill(newTrack->P(), Esub/newTrack->P());
519 if(TrackLabels->GetSize() == 2)
521 AliESDtrack *esdtrack1 = fESD->GetTrack(TrackLabels->GetAt(0));
522 AliESDtrack *esdtrack2 = fESD->GetTrack(TrackLabels->GetAt(1));
523 AliESDtrack *newTrack1 = GetAcceptTrack(esdtrack1);
524 AliESDtrack *newTrack2 = GetAcceptTrack(esdtrack2);
525 if(newTrack1 && newTrack2 && TMath::Abs(newTrack1->Eta())<0.7 && TMath::Abs(newTrack2->Eta())<0.7)
527 Double_t Esub = newTrack1->P() + newTrack2->P();
528 if (Esub > cluster->E()) Esub = cluster->E();
529 fHistEsub2Pch->Fill(newTrack1->P() + newTrack2->P(), Esub);
530 fHistEsub2PchRat->Fill(newTrack1->P() + newTrack2->P(), Esub/(newTrack1->P() + newTrack2->P()));
532 else if(newTrack1 && !(newTrack2) && TMath::Abs(newTrack1->Eta())<0.7)
534 Double_t Esub = newTrack1->P();
535 if (Esub > cluster->E()) Esub = cluster->E();
536 fHistEsub1Pch->Fill(newTrack1->P(), Esub);
537 fHistEsub1PchRat->Fill(newTrack1->P(), Esub/newTrack1->P());
539 else if (!(newTrack1) && newTrack2 && TMath::Abs(newTrack2->Eta())<0.7)
541 Double_t Esub = newTrack2->P();
542 if (Esub > cluster->E()) Esub = cluster->E();
543 fHistEsub1Pch->Fill(newTrack2->P(), Esub);
544 fHistEsub1PchRat->Fill(newTrack2->P(), Esub/newTrack2->P());
549 TArrayI *MCLabels = cluster->GetLabelsArray();
551 if(MCLabels->GetSize() == 0) fHEventStat->Fill(3.5);
552 if(MCLabels->GetSize() == 1)
554 fHEventStat->Fill(4.5);
555 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
556 if(IsGoodMcParticle(vParticle1, MCLabels->GetAt(0)))
558 Double_t Entries[4] = {VClsPos.Phi(), VClsPos.Eta(), vParticle1->E(), cluster->E()/vParticle1->E()};
559 fHClsEoverMcE_All->Fill(Entries);
560 if(vParticle1->PdgCode() == 22)
562 fHClsEoverMcE_Photon->Fill(Entries);
564 if(TMath::Abs(vParticle1->PdgCode()) == 11)
566 fHClsEoverMcE_Elec->Fill(Entries);
568 if(TMath::Abs(vParticle1->PdgCode()) == 211)
570 fHClsEoverMcE_Pion->Fill(Entries);
574 if(MCLabels->GetSize() == 2)
576 fHEventStat->Fill(5.5);
577 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
578 AliVParticle* vParticle2 = fMC->GetTrack(MCLabels->GetAt(1));
579 if(IsGoodMcParticle(vParticle1, MCLabels->GetAt(0)) && IsGoodMcParticle(vParticle2, MCLabels->GetAt(1)))
581 fHEventStat->Fill(6.5);
582 if((vParticle1->PdgCode()==22) && (vParticle2->PdgCode()==22)) {;}
583 else if((vParticle1->PdgCode()!=22) && (vParticle2->PdgCode()!=22)) {;}
586 fClusterIndices->AddAt(itr,nCluster);
591 if(MCLabels->GetSize() > 2) fHEventStat->Fill(7.5);
593 AliESDCaloCluster *newCluster = new AliESDCaloCluster(*cluster);
596 TArrayI arrayTrackMatched(fTrackIndices->GetSize());
597 Int_t nGoodMatch = 0;
599 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
601 AliESDtrack *trk = fESD->GetTrack(fTrackIndices->At(j));
602 if(itr==trk->GetEMCALcluster())
604 arrayTrackMatched[nGoodMatch] = j;
610 arrayTrackMatched.Set(nGoodMatch);
611 newCluster->AddTracksMatched(arrayTrackMatched);
613 Double_t clsE = newCluster->E();
614 Double_t newE = clsE-subE;
616 newCluster->SetDispersion(newE);
617 fClusterArray->Add(newCluster);
620 fClusterIndices->Set(nCluster);
622 //________________________________________________________________________
623 void AliAnalysisTaskSOH::ProcessMc()
627 for(Int_t i=0; i<fTrackIndices->GetSize(); i++)
629 AliESDtrack *esdtrack = fESD->GetTrack(fTrackIndices->At(i));
630 Int_t index = esdtrack->GetLabel();
631 if(index < 0 || index > fESD->GetNumberOfTracks()) continue;
632 AliVParticle* vParticle = fMC->GetTrack(index);
633 if(!IsGoodMcParticle(vParticle, index) && esdtrack->GetPID() == 2) fHTrkEffDetRecFakePtEtaPhi->Fill(esdtrack->Pt(), esdtrack->Eta(), esdtrack->Phi());
637 for(Int_t ipart=0; ipart<fMC->GetNumberOfTracks(); ipart++)
639 AliVParticle* vParticle = fMC->GetTrack(ipart);
640 Int_t pdgCode = vParticle->PdgCode();
641 AliMCParticle *McParticle = (AliMCParticle*)fMC->GetTrack(ipart);
642 if(!IsGoodMcParticle(vParticle, ipart)) continue;
644 if(McParticle->GetMother() > 0 && TMath::Abs(vParticle->Eta())<0.9 && TMath::Abs(pdgCode)==211)
646 AliMCParticle *McMother = (AliMCParticle*)fMC->GetTrack(McParticle->GetMother());
647 if(TMath::Abs(McMother->PdgCode()) == 411) fHTrkEffParGenPt_Dch->Fill(vParticle->Pt());
648 else if(TMath::Abs(McMother->PdgCode()) == 421) fHTrkEffParGenPt_Dn->Fill(vParticle->Pt());
649 else if(TMath::Abs(McMother->PdgCode()) == 431) fHTrkEffParGenPt_Ds->Fill(vParticle->Pt());
650 else if(TMath::Abs(McMother->PdgCode()) == 4122) fHTrkEffParGenPt_cL->Fill(vParticle->Pt());
651 else if(TMath::Abs(McMother->PdgCode()) == 443) fHTrkEffParGenPt_JPsi->Fill(vParticle->Pt());
655 if(TMath::Abs(vParticle->Eta())<0.9)
657 fHTrkEffParGenPt_all->Fill(vParticle->Pt());
658 if(TMath::Abs(pdgCode==211)) fHTrkEffParGenPtEtaPhi->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
660 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
662 AliESDtrack *esdtrack = fESD->GetTrack(fTrackIndices->At(j));
663 if(esdtrack && esdtrack->GetLabel()==ipart)
665 fHTrkEffDetRecPt_all->Fill(esdtrack->Pt());
666 if(TMath::Abs(pdgCode==211))
668 fHTrkEffDetGenPtEtaPhi->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
669 fHTrkEffDetRecPtEtaPhi->Fill(esdtrack->Pt(), esdtrack->Eta(), esdtrack->Phi());
671 if(McParticle->GetMother() > 0 && TMath::Abs(pdgCode) == 211)
673 AliMCParticle *McMother = (AliMCParticle*)fMC->GetTrack(McParticle->GetMother());
674 if(TMath::Abs(McMother->PdgCode()) == 411) fHTrkEffDetRecPt_Dch->Fill(esdtrack->Pt());
675 else if(TMath::Abs(McMother->PdgCode()) == 421) fHTrkEffDetRecPt_Dn->Fill(esdtrack->Pt());
676 else if(TMath::Abs(McMother->PdgCode()) == 431) fHTrkEffDetRecPt_Ds->Fill(esdtrack->Pt());
677 else if(TMath::Abs(McMother->PdgCode()) == 4122) fHTrkEffDetRecPt_cL->Fill(esdtrack->Pt());
678 else if(TMath::Abs(McMother->PdgCode()) == 443) fHTrkEffDetRecPt_JPsi->Fill(esdtrack->Pt());
681 //cluster E vs. truth photon energy
682 for(Int_t k=0; k<fClusterIndices->GetSize(); k++)
684 AliESDCaloCluster *cluster = fESD->GetCaloCluster(fClusterIndices->At(k));
685 Double_t clsE = cluster->E();
686 TArrayI *MCLabels = cluster->GetLabelsArray();
687 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
688 AliVParticle* vParticle2 = fMC->GetTrack(MCLabels->GetAt(1));
690 if(vParticle1->PdgCode()==22 && vParticle2 == vParticle)
692 fHPhotonEdiff0HC->Fill(vParticle1->E(), (vParticle1->E() - clsE)/vParticle1->E());
693 fHPhotonEVsClsE->Fill(vParticle1->E(), clsE);
695 if((clsE - 0.3*esdtrack->E())<0) fHPhotonEdiff30HC->Fill(vParticle1->E(), 1);
696 else fHPhotonEdiff30HC->Fill(vParticle1->E(), (vParticle1->E() + 0.3*esdtrack->E() - clsE)/vParticle1->E());
698 if((clsE - 0.7*esdtrack->E())<0) fHPhotonEdiff70HC->Fill(vParticle1->E(), 1);
699 else fHPhotonEdiff70HC->Fill(vParticle1->E(), (vParticle1->E() + 0.7*esdtrack->E() - clsE)/vParticle1->E());
701 if((clsE - esdtrack->E())<0) fHPhotonEdiff100HC->Fill(vParticle1->E(), 1);
702 else fHPhotonEdiff100HC->Fill(vParticle1->E(), (vParticle1->E() + esdtrack->E() - clsE)/vParticle1->E());
705 if(vParticle2->PdgCode()==22 && vParticle1 == vParticle)
707 fHPhotonEdiff0HC->Fill(vParticle2->E(), (vParticle2->E() - clsE)/vParticle2->E());
708 fHPhotonEVsClsE->Fill(vParticle2->E(), clsE);
710 if((clsE - 0.3*esdtrack->E())<0) fHPhotonEdiff30HC->Fill(vParticle2->E(), 1);
711 else fHPhotonEdiff30HC->Fill(vParticle2->E(), (vParticle2->E() + 0.3*esdtrack->E() - clsE)/vParticle2->E());
713 if((clsE - 0.7*esdtrack->E())<0) fHPhotonEdiff70HC->Fill(vParticle2->E(), 1);
714 else fHPhotonEdiff70HC->Fill(vParticle2->E(), (vParticle2->E() + 0.7*esdtrack->E() - clsE)/vParticle2->E());
716 if((clsE-esdtrack->E())<0) fHPhotonEdiff100HC->Fill(vParticle2->E(), 1);
717 else fHPhotonEdiff100HC->Fill(vParticle2->E(), (vParticle2->E() + esdtrack->E() - clsE)/vParticle2->E());
727 //________________________________________________________________________
728 void AliAnalysisTaskSOH::ProcessScaleFactor()
732 const Double_t phiMax = 180 * TMath::DegToRad();
733 const Double_t phiMin = 80 * TMath::DegToRad();
734 const Double_t TPCArea= 2*TMath::Pi()*1.8;
735 const Double_t EMCArea = (phiMax-phiMin)*1.4;
740 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
742 AliESDtrack *trk = fESD->GetTrack(fTrackIndices->At(j));
743 Double_t eta = trk->Eta();
744 Double_t phi = trk->Phi();
745 if(TMath::Abs(eta)<0.9) PtTPC += trk->Pt();
746 if(TMath::Abs(eta)<0.7 && phi > phiMin && phi < phiMax ) PtEMC += trk->Pt();
749 Double_t EtWithHadCorr = 0;
750 Double_t EtWithoutHadCorr = 0;
751 Double_t vertex[3] = {0, 0, 0};
752 fESD->GetVertex()->GetXYZ(vertex);
753 TLorentzVector gamma;
755 for(Int_t i=0; i<fClusterArray->GetEntriesFast(); i++)
757 AliESDCaloCluster *cluster = (AliESDCaloCluster*)fClusterArray->At(i);
758 cluster->GetMomentum(gamma, vertex);
759 Double_t sinTheta = TMath::Sqrt(1-TMath::Power(gamma.CosTheta(),2));
760 EtWithoutHadCorr += cluster->E() * sinTheta;
761 EtWithHadCorr += cluster->GetDispersion() * sinTheta;
766 fHScaleFactor->Fill((PtEMC+EtWithoutHadCorr)/EMCArea * TPCArea/PtTPC);
767 fHScaleFactor100HC->Fill((PtEMC+EtWithHadCorr)/EMCArea * TPCArea/PtTPC);
771 //________________________________________________________________________
772 AliESDtrack *AliAnalysisTaskSOH::GetAcceptTrack(AliESDtrack *esdtrack)
774 // Get accepted track.
776 static AliESDtrack newTrack;
777 if(fEsdTrackCuts->AcceptTrack(esdtrack))
779 esdtrack->Copy(newTrack);
780 newTrack.SetTRDQuality(0);
782 else if(fHybridTrackCuts1->AcceptTrack(esdtrack))
784 if(esdtrack->GetConstrainedParam())
786 esdtrack->Copy(newTrack);
787 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
788 newTrack.Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
789 newTrack.SetTRDQuality(1);
794 else if(fHybridTrackCuts2->AcceptTrack(esdtrack))
796 if(esdtrack->GetConstrainedParam())
798 esdtrack->Copy(newTrack);
799 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
800 newTrack.Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
801 newTrack.SetTRDQuality(2);
814 //________________________________________________________________________
815 Bool_t AliAnalysisTaskSOH::IsGoodMcParticle(AliVParticle* vParticle, Int_t ipart)
817 // Return true if good MC particle.
819 if(!vParticle) return kFALSE;
820 if(!fMC->IsPhysicalPrimary(ipart)) return kFALSE;
821 if (TMath::Abs(vParticle->Eta())>2) return kFALSE;
822 if(vParticle->Pt()<0.15) return kFALSE;
826 //________________________________________________________________________
827 Bool_t AliAnalysisTaskSOH::IsGoodCluster(AliESDCaloCluster *cluster)
829 // Return true if good cluster.
831 if(!cluster) return kFALSE;
832 if (!cluster->IsEMCAL()) return kFALSE;
836 //________________________________________________________________________
837 void AliAnalysisTaskSOH::Terminate(Option_t *)
839 // Terminate analysis.