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"
26 #include "AliHeader.h"
27 #include "AliGenCocktailEventHeader.h"
30 ClassImp(AliAnalysisTaskSOH)
32 //________________________________________________________________________
33 AliAnalysisTaskSOH::AliAnalysisTaskSOH() :
38 fHybridTrackCuts1(0x0),
39 fHybridTrackCuts2(0x0),
45 fHTrkEffParGenPtEtaPhi(0),
46 fHTrkEffDetGenPtEtaPhi(0),
47 fHTrkEffDetRecPtEtaPhi(0),
48 fHTrkEffDetRecFakePtEtaPhi(0),
49 fHTrkEffParGenPt_rmInj(0),
50 fHTrkEffDetGenPt_rmInj(0),
51 fHTrkEffParGenPt_PiRmInj(0),
52 fHTrkEffDetGenPt_PiRmInj(0),
53 fHTrkEffParGenPt_all(0),
54 fHTrkEffDetGenPt_all(0),
55 fHTrkEffParGenPt_Dch(0),
56 fHTrkEffDetGenPt_Dch(0),
57 fHTrkEffParGenPt_Dn(0),
58 fHTrkEffDetGenPt_Dn(0),
59 fHTrkEffParGenPt_Ds(0),
60 fHTrkEffDetGenPt_Ds(0),
61 fHTrkEffParGenPt_cL(0),
62 fHTrkEffDetGenPt_cL(0),
63 fHTrkEffParGenPt_JPsi(0),
64 fHTrkEffDetGenPt_JPsi(0),
66 fHScaleFactor100HC(0),
68 fHEMCalResponsePion(0x0),
69 fHEMCalResponseElec(0x0),
70 fHEMCalResponseProton(0x0),
71 fHEMCalRecdPhidEta(0x0),
72 fHEMCalRecdPhidEtaP(0x0),
73 fHEMCalRecdPhidEtaM(0x0),
74 fHEMCalRecdPhidEta_Truth(0x0),
75 fHEMCalRecdPhidEtaP_Truth(0x0),
76 fHEMCalRecdPhidEtaM_Truth(0x0),
77 fHEMCalRecdPhidEtaposEta(0x0),
78 fHEMCalRecdPhidEtanegEta(0x0),
79 fHPhotonEdiff100HC(0x0),
82 fHPhotonEdiff0HC(0x0),
86 fHistEsub1PchRat(0x0),
87 fHistEsub2PchRat(0x0),
88 fHClsEoverMcE_All(0x0),
89 fHClsEoverMcE_Photon(0x0),
90 fHClsEoverMcE_Elec(0x0),
91 fHClsEoverMcE_Pion(0x0)
98 //________________________________________________________________________
99 AliAnalysisTaskSOH::AliAnalysisTaskSOH(const char *name) :
100 AliAnalysisTaskSE(name),
104 fHybridTrackCuts1(0x0),
105 fHybridTrackCuts2(0x0),
107 fClusterIndices(0x0),
111 fHTrkEffParGenPtEtaPhi(0),
112 fHTrkEffDetGenPtEtaPhi(0),
113 fHTrkEffDetRecPtEtaPhi(0),
114 fHTrkEffDetRecFakePtEtaPhi(0),
115 fHTrkEffParGenPt_rmInj(0),
116 fHTrkEffDetGenPt_rmInj(0),
117 fHTrkEffParGenPt_PiRmInj(0),
118 fHTrkEffDetGenPt_PiRmInj(0),
119 fHTrkEffParGenPt_all(0),
120 fHTrkEffDetGenPt_all(0),
121 fHTrkEffParGenPt_Dch(0),
122 fHTrkEffDetGenPt_Dch(0),
123 fHTrkEffParGenPt_Dn(0),
124 fHTrkEffDetGenPt_Dn(0),
125 fHTrkEffParGenPt_Ds(0),
126 fHTrkEffDetGenPt_Ds(0),
127 fHTrkEffParGenPt_cL(0),
128 fHTrkEffDetGenPt_cL(0),
129 fHTrkEffParGenPt_JPsi(0),
130 fHTrkEffDetGenPt_JPsi(0),
132 fHScaleFactor100HC(0),
134 fHEMCalResponsePion(0x0),
135 fHEMCalResponseElec(0x0),
136 fHEMCalResponseProton(0x0),
137 fHEMCalRecdPhidEta(0x0),
138 fHEMCalRecdPhidEtaP(0x0),
139 fHEMCalRecdPhidEtaM(0x0),
140 fHEMCalRecdPhidEta_Truth(0x0),
141 fHEMCalRecdPhidEtaP_Truth(0x0),
142 fHEMCalRecdPhidEtaM_Truth(0x0),
143 fHEMCalRecdPhidEtaposEta(0x0),
144 fHEMCalRecdPhidEtanegEta(0x0),
145 fHPhotonEdiff100HC(0x0),
146 fHPhotonEdiff70HC(0),
147 fHPhotonEdiff30HC(0),
148 fHPhotonEdiff0HC(0x0),
149 fHPhotonEVsClsE(0x0),
152 fHistEsub1PchRat(0x0),
153 fHistEsub2PchRat(0x0),
154 fHClsEoverMcE_All(0x0),
155 fHClsEoverMcE_Photon(0x0),
156 fHClsEoverMcE_Elec(0x0),
157 fHClsEoverMcE_Pion(0x0)
161 // Output slot #1 writes into a TH1 container
162 DefineOutput(1, TList::Class());
166 //________________________________________________________________________
167 AliAnalysisTaskSOH::~AliAnalysisTaskSOH()
171 delete fEsdTrackCuts;
172 delete fHybridTrackCuts1;
173 delete fHybridTrackCuts2;
174 delete fTrackIndices;
175 delete fClusterIndices;
176 delete fClusterArray;
180 //________________________________________________________________________
181 void AliAnalysisTaskSOH::UserCreateOutputObjects()
183 // Create histograms, called once.
187 fOutputList = new TList();
188 fOutputList->SetOwner(1);
190 fHEventStat = new TH1F("fHEventStat","Event statistics for analysis",8,0,8);
191 fHEventStat->GetXaxis()->SetBinLabel(1,"Event");
192 fHEventStat->GetXaxis()->SetBinLabel(2,"cluster");
193 fHEventStat->GetXaxis()->SetBinLabel(3,"good cluster");
194 fHEventStat->GetXaxis()->SetBinLabel(4,"cls/0-truth");
195 fHEventStat->GetXaxis()->SetBinLabel(5,"cls/1-truth");
196 fHEventStat->GetXaxis()->SetBinLabel(6,"cls/2-truth");
197 fHEventStat->GetXaxis()->SetBinLabel(7,"cls/2-goodtruth");
198 fHEventStat->GetXaxis()->SetBinLabel(8,"cls/>3-truth");
199 fOutputList->Add(fHEventStat);
201 fHTrkEffParGenPtEtaPhi = new TH3F("fHTrkEffParGenPtEtaPhi","Particle level truth Phi-Eta-p_{T} distribution of primary charged pions", 500, 0, 100, 60, -1.5, 1.5, 128, 0, 6.4);
202 fHTrkEffParGenPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
203 fHTrkEffParGenPtEtaPhi->GetYaxis()->SetTitle("#eta");
204 fHTrkEffParGenPtEtaPhi->GetZaxis()->SetTitle("#phi");
205 fOutputList->Add(fHTrkEffParGenPtEtaPhi);
207 fHTrkEffDetGenPtEtaPhi = new TH3F("fHTrkEffDetGenPtEtaPhi","Detector level truth Phi-Eta-p_{T} distribution of primary charged pions", 500, 0, 100, 60, -1.5, 1.5, 128, 0, 6.4);
208 fHTrkEffDetGenPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
209 fHTrkEffDetGenPtEtaPhi->GetYaxis()->SetTitle("#eta");
210 fHTrkEffDetGenPtEtaPhi->GetZaxis()->SetTitle("#phi");
211 fOutputList->Add(fHTrkEffDetGenPtEtaPhi);
213 fHTrkEffDetRecPtEtaPhi = new TH3F("fHTrkEffDetRecPtEtaPhi","Reconstructed track Phi-Eta-p_{T} distribution of primary charged pions", 500, 0, 100, 60, -1.5, 1.5, 128, 0, 6.4);
214 fHTrkEffDetRecPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
215 fHTrkEffDetRecPtEtaPhi->GetYaxis()->SetTitle("#eta");
216 fHTrkEffDetRecPtEtaPhi->GetZaxis()->SetTitle("#phi");
217 fOutputList->Add(fHTrkEffDetRecPtEtaPhi);
219 fHTrkEffDetRecFakePtEtaPhi = new TH3F("fHTrkEffDetRecFakePtEtaPhi","Reconstructed fake track Phi-Eta-p_{T} distribution of pions", 500, 0, 100, 60, -1.5, 1.5, 128, 0, 6.4);
220 fHTrkEffDetRecFakePtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
221 fHTrkEffDetRecFakePtEtaPhi->GetYaxis()->SetTitle("#eta");
222 fHTrkEffDetRecFakePtEtaPhi->GetZaxis()->SetTitle("#phi");
223 fOutputList->Add(fHTrkEffDetRecFakePtEtaPhi);
225 fHTrkEffParGenPt_rmInj = new TH1F("fHTrkEffParGenPt_rmInj", "Truth w/o injected signal p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
226 fOutputList->Add(fHTrkEffParGenPt_rmInj);
228 fHTrkEffDetGenPt_rmInj = new TH1F("fHTrkEffDetGenPt_rmInj", "generated detector level w/o injected signal track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
229 fOutputList->Add(fHTrkEffDetGenPt_rmInj);
231 fHTrkEffParGenPt_PiRmInj = new TH1F("fHTrkEffParGenPt_PiRmInj", "Truth pion w/o injected signal p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
232 fOutputList->Add(fHTrkEffParGenPt_PiRmInj);
234 fHTrkEffDetGenPt_PiRmInj = new TH1F("fHTrkEffDetGenPt_PiRmInj", "generated detector level pion w/o injected signal track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
235 fOutputList->Add(fHTrkEffDetGenPt_PiRmInj);
237 fHTrkEffParGenPt_all = new TH1F("fHTrkEffParGenPt_all", "Truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
238 fOutputList->Add(fHTrkEffParGenPt_all);
240 fHTrkEffDetGenPt_all = new TH1F("fHTrkEffDetGenPt_all", "generated detector level track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
241 fOutputList->Add(fHTrkEffDetGenPt_all);
243 fHTrkEffParGenPt_Dch = new TH1F("fHTrkEffParGenPt_Dch", "Charged D meson truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
244 fOutputList->Add(fHTrkEffParGenPt_Dch);
246 fHTrkEffDetGenPt_Dch = new TH1F("fHTrkEffDetGenPt_Dch", "Charged D meson generated detector level track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
247 fOutputList->Add(fHTrkEffDetGenPt_Dch);
249 fHTrkEffParGenPt_Dn = new TH1F("fHTrkEffParGenPt_Dn", "Neutral D meson truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
250 fOutputList->Add(fHTrkEffParGenPt_Dn);
252 fHTrkEffDetGenPt_Dn = new TH1F("fHTrkEffDetGenPt_Dn", "Neutral D meson generated detector level track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
253 fOutputList->Add(fHTrkEffDetGenPt_Dn);
255 fHTrkEffParGenPt_Ds = new TH1F("fHTrkEffParGenPt_Ds", "D_{s} truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
256 fOutputList->Add(fHTrkEffParGenPt_Ds);
258 fHTrkEffDetGenPt_Ds = new TH1F("fHTrkEffDetGenPt_Ds", "D_{s} generated detector level track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
259 fOutputList->Add(fHTrkEffDetGenPt_Ds);
261 fHTrkEffParGenPt_cL = new TH1F("fHTrkEffParGenPt_cL", "#Lambda_{c} truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
262 fOutputList->Add(fHTrkEffParGenPt_cL);
264 fHTrkEffDetGenPt_cL = new TH1F("fHTrkEffDetGenPt_cL", "#Lambda_{c} generated detector level track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
265 fOutputList->Add(fHTrkEffDetGenPt_cL);
267 fHTrkEffParGenPt_JPsi = new TH1F("fHTrkEffParGenPt_JPsi", "J/#Psi truth p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
268 fOutputList->Add(fHTrkEffParGenPt_JPsi);
270 fHTrkEffDetGenPt_JPsi = new TH1F("fHTrkEffDetGenPt_JPsi", "J/#Psi generated detector level track p_{T} distribution;p_{T}^{rec} (GeV/c)",500,0.0,100);
271 fOutputList->Add(fHTrkEffDetGenPt_JPsi);
273 fHScaleFactor = new TH1F("fHScaleFactor", "Scale factor distribution without hadronic correction;Scale factor",100,0,10);
274 fOutputList->Add(fHScaleFactor);
276 fHScaleFactor100HC = new TH1F("fHScaleFactor100HC", "Scale factor distribution with 100% hadronic correction;Scale factor",100,0,10);
277 fOutputList->Add(fHScaleFactor100HC);
279 fHEOverPVsPt = new TH2F("fHEOverPVsPt", "E/P vs track p_{T}; p_{T} (GeV/c); E/P", 200 , 0, 4, 200, 0, 3.2);
280 fOutputList->Add(fHEOverPVsPt);
282 fHEMCalResponsePion = new TH2F("fHEMCalResponsePion", "Pion E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
283 fOutputList->Add(fHEMCalResponsePion);
285 fHEMCalResponseElec = new TH2F("fHEMCalResponseElec", "Electron E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
286 fOutputList->Add(fHEMCalResponseElec);
288 fHEMCalResponseProton = new TH2F("fHEMCalResponseProton", "Proton E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
289 fOutputList->Add(fHEMCalResponseProton);
291 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);
292 fOutputList->Add(fHEMCalRecdPhidEta);
294 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);
295 fOutputList->Add(fHEMCalRecdPhidEtaP);
297 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);
298 fOutputList->Add(fHEMCalRecdPhidEtaM);
300 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);
301 fOutputList->Add(fHEMCalRecdPhidEta_Truth);
303 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);
304 fOutputList->Add(fHEMCalRecdPhidEtaP_Truth);
306 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);
307 fOutputList->Add(fHEMCalRecdPhidEtaM_Truth);
309 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);
310 fOutputList->Add(fHEMCalRecdPhidEtaposEta);
312 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);
313 fOutputList->Add(fHEMCalRecdPhidEtanegEta);
315 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);
316 fOutputList->Add(fHPhotonEdiff100HC);
318 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);
319 fOutputList->Add(fHPhotonEdiff70HC);
321 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);
322 fOutputList->Add(fHPhotonEdiff30HC);
324 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);
325 fOutputList->Add(fHPhotonEdiff0HC);
327 fHPhotonEVsClsE = new TH2F("fHPhotonEVsClsE","Cluster E vs. photon E_{Truth}; photon E_{Truth} (GeV); Cluster E (GeV)",500,0,5,500,0,5);
328 fOutputList->Add(fHPhotonEVsClsE);
330 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.);
331 fOutputList->Add(fHistEsub1Pch);
333 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.);
334 fOutputList->Add(fHistEsub2Pch);
336 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);
337 fOutputList->Add(fHistEsub1PchRat);
339 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);
340 fOutputList->Add(fHistEsub2PchRat);
342 Int_t bins[4] = {150, 150, 100, 200};
343 Double_t xmin[4] = {1.3, -0.8, 0, 0};
344 Double_t xmax[4] = {3.2, 0.8, 10, 2};
346 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);
347 fOutputList->Add(fHClsEoverMcE_All);
349 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);
350 fOutputList->Add(fHClsEoverMcE_Photon);
352 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);
353 fOutputList->Add(fHClsEoverMcE_Elec);
355 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);
356 fOutputList->Add(fHClsEoverMcE_Pion);
358 fTrackIndices = new TArrayI();
359 fClusterIndices = new TArrayI();
361 fClusterArray = new TObjArray();
362 fClusterArray->SetOwner(1);
364 PostData(1, fOutputList);
367 //________________________________________________________________________
368 void AliAnalysisTaskSOH::UserExec(Option_t *)
370 // Main loop, called for each event.
373 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
375 printf("ERROR: fESD not available\n");
381 printf("ERROR: fMC not available\n");
385 fHEventStat->Fill(0.5);
388 fTrackIndices->Reset();
390 fClusterIndices->Reset();
392 fClusterArray->Delete();
397 ProcessScaleFactor();
399 PostData(1, fOutputList);
402 //________________________________________________________________________
403 void AliAnalysisTaskSOH::ProcessTrack()
407 fTrackIndices->Set(fESD->GetNumberOfTracks());
408 AliDebug(3,Form("%s:%d Selecting tracks",(char*)__FILE__,__LINE__));
413 Float_t ClsPos[3] = {-999,-999,-999};
414 Double_t emcTrkpos[3] = {-999,-999,-999};
416 for(Int_t itr=0; itr<fESD->GetNumberOfTracks(); itr++)
418 AliESDtrack *esdtrack = fESD->GetTrack(itr);
419 if(!esdtrack)continue;
420 AliESDtrack *newTrack = GetAcceptTrack(esdtrack);
421 if(!newTrack) continue;
424 Int_t clsIndex = newTrack->GetEMCALcluster();
425 if(newTrack->GetEMCALcluster()>-1)
427 AliESDCaloCluster *cluster = fESD->GetCaloCluster(clsIndex);
428 if(IsGoodCluster(cluster))
432 cluster->GetPosition(ClsPos);
433 TVector3 VClsPos(ClsPos[0], ClsPos[1], ClsPos[2]);
435 AliEMCALTrack EMCTrk(*newTrack);
436 if(!EMCTrk.PropagateToGlobal(ClsPos[0], ClsPos[1], ClsPos[2], 0.0, 0.0)) {
439 EMCTrk.GetXYZ(emcTrkpos);
440 TVector3 VemcTrkPos(emcTrkpos[0],emcTrkpos[1],emcTrkpos[2]);
442 Double_t dPhi = VClsPos.Phi() - VemcTrkPos.Phi();
443 if (dPhi < -1*TMath::Pi()) dPhi += (2*TMath::Pi());
444 else if (dPhi > TMath::Pi()) dPhi -= (2*TMath::Pi());
446 Double_t dEta = VClsPos.Eta() - VemcTrkPos.Eta();
448 fHEMCalRecdPhidEta->Fill(dEta, dPhi);
450 if((newTrack->GetLabel())>-1 && (newTrack->GetLabel()) < fMC->GetNumberOfTracks())
452 AliVParticle *vParticle = fMC->GetTrack(newTrack->GetLabel());
453 if(IsGoodMcParticle(vParticle, newTrack->GetLabel()))
455 fHEMCalRecdPhidEta_Truth->Fill(dEta, dPhi);
456 if(vParticle->Charge() > 0) fHEMCalRecdPhidEtaP_Truth->Fill(dEta, dPhi);
457 if(vParticle->Charge() < 0) fHEMCalRecdPhidEtaM_Truth->Fill(dEta, dPhi);
461 if(esdtrack->Charge() > 0) {fHEMCalRecdPhidEtaP->Fill(dEta, dPhi);}
462 if(esdtrack->Charge() < 0) {fHEMCalRecdPhidEtaM->Fill(dEta, dPhi);}
464 if(VemcTrkPos.Eta() > 0) fHEMCalRecdPhidEtaposEta->Fill(dEta, dPhi);
465 if(VemcTrkPos.Eta() < 0) fHEMCalRecdPhidEtanegEta->Fill(dEta, dPhi);
468 if(newTrack->P()>0) fHEOverPVsPt->Fill(newTrack->Pt(),clsE/newTrack->P());
471 Int_t ipart = newTrack->GetLabel();
472 if(ipart>-1 && ipart<fMC->GetNumberOfTracks())
474 AliVParticle* vParticle = fMC->GetTrack(ipart);
475 if(isMth && vParticle)
477 if(TMath::Abs(vParticle->PdgCode())==211)
479 fHEMCalResponsePion->Fill(newTrack->Pt(),clsE/newTrack->P());
481 if(TMath::Abs(vParticle->PdgCode())==11)
483 fHEMCalResponseElec->Fill(newTrack->Pt(),clsE/newTrack->P());
485 if(TMath::Abs(vParticle->PdgCode())==2212)
487 fHEMCalResponseProton->Fill(newTrack->Pt(),clsE/newTrack->P());
492 if(newTrack->GetLabel()<0 && newTrack->GetPID()==2) fHTrkEffDetRecFakePtEtaPhi->Fill(esdtrack->Pt(), esdtrack->Eta(), esdtrack->Phi());
495 fTrackIndices->AddAt(itr,nTracks);
499 fTrackIndices->Set(nTracks);
502 //________________________________________________________________________
503 void AliAnalysisTaskSOH::ProcessCluster()
508 TLorentzVector gamma;
509 Double_t vertex[3] = {0, 0, 0};
510 fESD->GetVertex()->GetXYZ(vertex);
511 const Int_t nCaloClusters = fESD->GetNumberOfCaloClusters();
512 fClusterIndices->Set(nCaloClusters);
513 Float_t ClsPos[3] = {-999,-999,-999};
515 for(Int_t itr=0; itr<nCaloClusters; itr++)
517 fHEventStat->Fill(1.5);
518 AliESDCaloCluster *cluster = fESD->GetCaloCluster(itr);
519 if(!IsGoodCluster(cluster)) continue;
520 cluster->GetMomentum(gamma, vertex);
521 if (gamma.Pt() < 0.15) continue;
522 fHEventStat->Fill(2.5);
524 cluster->GetPosition(ClsPos);
525 TVector3 VClsPos(ClsPos[0], ClsPos[1], ClsPos[2]);
527 TArrayI *TrackLabels = cluster->GetTracksMatched();
529 if(TrackLabels->GetSize() == 1)
531 AliESDtrack *esdtrack = fESD->GetTrack(TrackLabels->GetAt(0));
532 AliESDtrack *newTrack = GetAcceptTrack(esdtrack);
533 if(newTrack && TMath::Abs(newTrack->Eta())<0.7)
535 Double_t Esub = newTrack->P();
536 if (Esub > cluster->E()) Esub = cluster->E();
537 fHistEsub1Pch->Fill(newTrack->P(), Esub);
538 fHistEsub1PchRat->Fill(newTrack->P(), Esub/newTrack->P());
542 if(TrackLabels->GetSize() == 2)
544 AliESDtrack *esdtrack1 = fESD->GetTrack(TrackLabels->GetAt(0));
545 AliESDtrack *esdtrack2 = fESD->GetTrack(TrackLabels->GetAt(1));
546 AliESDtrack *newTrack1 = GetAcceptTrack(esdtrack1);
547 AliESDtrack *newTrack2 = GetAcceptTrack(esdtrack2);
548 if(newTrack1 && newTrack2 && TMath::Abs(newTrack1->Eta())<0.7 && TMath::Abs(newTrack2->Eta())<0.7)
550 Double_t Esub = newTrack1->P() + newTrack2->P();
551 if (Esub > cluster->E()) Esub = cluster->E();
552 fHistEsub2Pch->Fill(newTrack1->P() + newTrack2->P(), Esub);
553 fHistEsub2PchRat->Fill(newTrack1->P() + newTrack2->P(), Esub/(newTrack1->P() + newTrack2->P()));
555 else if(newTrack1 && !(newTrack2) && TMath::Abs(newTrack1->Eta())<0.7)
557 Double_t Esub = newTrack1->P();
558 if (Esub > cluster->E()) Esub = cluster->E();
559 fHistEsub1Pch->Fill(newTrack1->P(), Esub);
560 fHistEsub1PchRat->Fill(newTrack1->P(), Esub/newTrack1->P());
562 else if (!(newTrack1) && newTrack2 && TMath::Abs(newTrack2->Eta())<0.7)
564 Double_t Esub = newTrack2->P();
565 if (Esub > cluster->E()) Esub = cluster->E();
566 fHistEsub1Pch->Fill(newTrack2->P(), Esub);
567 fHistEsub1PchRat->Fill(newTrack2->P(), Esub/newTrack2->P());
572 TArrayI *MCLabels = cluster->GetLabelsArray();
574 if(MCLabels->GetSize() == 0) fHEventStat->Fill(3.5);
575 if(MCLabels->GetSize() == 1)
577 fHEventStat->Fill(4.5);
578 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
579 if(IsGoodMcParticle(vParticle1, MCLabels->GetAt(0)))
581 Double_t Entries[4] = {VClsPos.Phi(), VClsPos.Eta(), vParticle1->E(), cluster->E()/vParticle1->E()};
582 fHClsEoverMcE_All->Fill(Entries);
583 if(vParticle1->PdgCode() == 22)
585 fHClsEoverMcE_Photon->Fill(Entries);
587 if(TMath::Abs(vParticle1->PdgCode()) == 11)
589 fHClsEoverMcE_Elec->Fill(Entries);
591 if(TMath::Abs(vParticle1->PdgCode()) == 211)
593 fHClsEoverMcE_Pion->Fill(Entries);
597 if(MCLabels->GetSize() == 2)
599 fHEventStat->Fill(5.5);
600 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
601 AliVParticle* vParticle2 = fMC->GetTrack(MCLabels->GetAt(1));
602 if(IsGoodMcParticle(vParticle1, MCLabels->GetAt(0)) && IsGoodMcParticle(vParticle2, MCLabels->GetAt(1)))
604 fHEventStat->Fill(6.5);
605 if((vParticle1->PdgCode()==22) && (vParticle2->PdgCode()==22)) {;}
606 else if((vParticle1->PdgCode()!=22) && (vParticle2->PdgCode()!=22)) {;}
609 fClusterIndices->AddAt(itr,nCluster);
614 if(MCLabels->GetSize() > 2) fHEventStat->Fill(7.5);
616 AliESDCaloCluster *newCluster = new AliESDCaloCluster(*cluster);
619 TArrayI arrayTrackMatched(fTrackIndices->GetSize());
620 Int_t nGoodMatch = 0;
622 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
624 AliESDtrack *trk = fESD->GetTrack(fTrackIndices->At(j));
625 if(itr==trk->GetEMCALcluster())
627 arrayTrackMatched[nGoodMatch] = j;
633 arrayTrackMatched.Set(nGoodMatch);
634 newCluster->AddTracksMatched(arrayTrackMatched);
636 Double_t clsE = newCluster->E();
637 Double_t newE = clsE-subE;
639 newCluster->SetDispersion(newE);
640 fClusterArray->Add(newCluster);
643 fClusterIndices->Set(nCluster);
645 //________________________________________________________________________
646 void AliAnalysisTaskSOH::ProcessMc()
650 for(Int_t i=0; i<fTrackIndices->GetSize(); i++)
652 AliESDtrack *esdtrack = fESD->GetTrack(fTrackIndices->At(i));
653 Int_t index = esdtrack->GetLabel();
654 if(index < 0 || index > fESD->GetNumberOfTracks()) continue;
655 AliVParticle* vParticle = fMC->GetTrack(index);
656 if(!IsGoodMcParticle(vParticle, index) && esdtrack->GetPID() == 2) fHTrkEffDetRecFakePtEtaPhi->Fill(esdtrack->Pt(), esdtrack->Eta(), esdtrack->Phi());
660 AliHeader* header = (AliHeader*) fMC->Header();
661 if (!header) AliFatal("fInjectedSignals set but no MC header found");
663 AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
667 AliFatal("fInjectedSignals set but no MC cocktail header found");
670 AliGenEventHeader* eventHeader = 0;
671 eventHeader = dynamic_cast<AliGenEventHeader*> (cocktailHeader->GetHeaders()->First());
672 if (!eventHeader) AliFatal("First event header not found");
674 for(Int_t ipart=0; ipart<fMC->GetNumberOfTracks(); ipart++)
676 AliVParticle* vParticle = fMC->GetTrack(ipart);
677 Int_t pdgCode = vParticle->PdgCode();
678 AliMCParticle *McParticle = (AliMCParticle*)fMC->GetTrack(ipart);
679 if(!IsGoodMcParticle(vParticle, ipart)) continue;
681 if((McParticle->GetMother() > eventHeader->NProduced()-1) && TMath::Abs(vParticle->Eta())<0.9 && TMath::Abs(pdgCode)==211)
683 AliMCParticle *McMother = (AliMCParticle*)fMC->GetTrack(McParticle->GetMother());
684 if(TMath::Abs(McMother->PdgCode()) == 411) fHTrkEffParGenPt_Dch->Fill(vParticle->Pt());
685 else if(TMath::Abs(McMother->PdgCode()) == 421) fHTrkEffParGenPt_Dn->Fill(vParticle->Pt());
686 else if(TMath::Abs(McMother->PdgCode()) == 431) fHTrkEffParGenPt_Ds->Fill(vParticle->Pt());
687 else if(TMath::Abs(McMother->PdgCode()) == 4122) fHTrkEffParGenPt_cL->Fill(vParticle->Pt());
688 else if(TMath::Abs(McMother->PdgCode()) == 443) fHTrkEffParGenPt_JPsi->Fill(vParticle->Pt());
692 if((McParticle->GetMother() < eventHeader->NProduced()) && TMath::Abs(vParticle->Eta())<0.9)
694 fHTrkEffParGenPt_rmInj->Fill(vParticle->Pt());
695 if(TMath::Abs(pdgCode)==211) fHTrkEffParGenPt_PiRmInj->Fill(vParticle->Pt());
698 if(TMath::Abs(vParticle->Eta())<0.9)
700 fHTrkEffParGenPt_all->Fill(vParticle->Pt());
701 if(TMath::Abs(pdgCode)==211) fHTrkEffParGenPtEtaPhi->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
703 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
705 AliESDtrack *esdtrack = fESD->GetTrack(fTrackIndices->At(j));
706 if(esdtrack && (TMath::Abs(esdtrack->GetLabel())==ipart))
708 fHTrkEffDetGenPt_all->Fill(vParticle->Pt());
709 if(TMath::Abs(pdgCode)==211)
711 fHTrkEffDetGenPtEtaPhi->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
712 fHTrkEffDetRecPtEtaPhi->Fill(esdtrack->Pt(), esdtrack->Eta(), esdtrack->Phi());
714 if((McParticle->GetMother() > eventHeader->NProduced()-1) && TMath::Abs(pdgCode) == 211)
716 AliMCParticle *McMother = (AliMCParticle*)fMC->GetTrack(McParticle->GetMother());
717 if(TMath::Abs(McMother->PdgCode()) == 411) fHTrkEffDetGenPt_Dch->Fill(vParticle->Pt());
718 else if(TMath::Abs(McMother->PdgCode()) == 421) fHTrkEffDetGenPt_Dn->Fill(vParticle->Pt());
719 else if(TMath::Abs(McMother->PdgCode()) == 431) fHTrkEffDetGenPt_Ds->Fill(vParticle->Pt());
720 else if(TMath::Abs(McMother->PdgCode()) == 4122) fHTrkEffDetGenPt_cL->Fill(vParticle->Pt());
721 else if(TMath::Abs(McMother->PdgCode()) == 443) fHTrkEffDetGenPt_JPsi->Fill(vParticle->Pt());
724 if(McParticle->GetMother() < eventHeader->NProduced())
726 fHTrkEffDetGenPt_rmInj->Fill(vParticle->Pt());
727 if(TMath::Abs(pdgCode)==211) fHTrkEffDetGenPt_PiRmInj->Fill(vParticle->Pt());
730 //cluster E vs. truth photon energy
731 for(Int_t k=0; k<fClusterIndices->GetSize(); k++)
733 AliESDCaloCluster *cluster = fESD->GetCaloCluster(fClusterIndices->At(k));
734 Double_t clsE = cluster->E();
735 TArrayI *MCLabels = cluster->GetLabelsArray();
736 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
737 AliVParticle* vParticle2 = fMC->GetTrack(MCLabels->GetAt(1));
739 if(vParticle1->PdgCode()==22 && vParticle2 == vParticle)
741 fHPhotonEdiff0HC->Fill(vParticle1->E(), (vParticle1->E() - clsE)/vParticle1->E());
742 fHPhotonEVsClsE->Fill(vParticle1->E(), clsE);
744 if((clsE - 0.3*esdtrack->E())<0) fHPhotonEdiff30HC->Fill(vParticle1->E(), 1);
745 else fHPhotonEdiff30HC->Fill(vParticle1->E(), (vParticle1->E() + 0.3*esdtrack->E() - clsE)/vParticle1->E());
747 if((clsE - 0.7*esdtrack->E())<0) fHPhotonEdiff70HC->Fill(vParticle1->E(), 1);
748 else fHPhotonEdiff70HC->Fill(vParticle1->E(), (vParticle1->E() + 0.7*esdtrack->E() - clsE)/vParticle1->E());
750 if((clsE - esdtrack->E())<0) fHPhotonEdiff100HC->Fill(vParticle1->E(), 1);
751 else fHPhotonEdiff100HC->Fill(vParticle1->E(), (vParticle1->E() + esdtrack->E() - clsE)/vParticle1->E());
754 if(vParticle2->PdgCode()==22 && vParticle1 == vParticle)
756 fHPhotonEdiff0HC->Fill(vParticle2->E(), (vParticle2->E() - clsE)/vParticle2->E());
757 fHPhotonEVsClsE->Fill(vParticle2->E(), clsE);
759 if((clsE - 0.3*esdtrack->E())<0) fHPhotonEdiff30HC->Fill(vParticle2->E(), 1);
760 else fHPhotonEdiff30HC->Fill(vParticle2->E(), (vParticle2->E() + 0.3*esdtrack->E() - clsE)/vParticle2->E());
762 if((clsE - 0.7*esdtrack->E())<0) fHPhotonEdiff70HC->Fill(vParticle2->E(), 1);
763 else fHPhotonEdiff70HC->Fill(vParticle2->E(), (vParticle2->E() + 0.7*esdtrack->E() - clsE)/vParticle2->E());
765 if((clsE-esdtrack->E())<0) fHPhotonEdiff100HC->Fill(vParticle2->E(), 1);
766 else fHPhotonEdiff100HC->Fill(vParticle2->E(), (vParticle2->E() + esdtrack->E() - clsE)/vParticle2->E());
776 //________________________________________________________________________
777 void AliAnalysisTaskSOH::ProcessScaleFactor()
781 const Double_t phiMax = 180 * TMath::DegToRad();
782 const Double_t phiMin = 80 * TMath::DegToRad();
783 const Double_t TPCArea= 2*TMath::Pi()*1.8;
784 const Double_t EMCArea = (phiMax-phiMin)*1.4;
789 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
791 AliESDtrack *trk = fESD->GetTrack(fTrackIndices->At(j));
792 Double_t eta = trk->Eta();
793 Double_t phi = trk->Phi();
794 if(TMath::Abs(eta)<0.9) PtTPC += trk->Pt();
795 if(TMath::Abs(eta)<0.7 && phi > phiMin && phi < phiMax ) PtEMC += trk->Pt();
798 Double_t EtWithHadCorr = 0;
799 Double_t EtWithoutHadCorr = 0;
800 Double_t vertex[3] = {0, 0, 0};
801 fESD->GetVertex()->GetXYZ(vertex);
802 TLorentzVector gamma;
804 for(Int_t i=0; i<fClusterArray->GetEntriesFast(); i++)
806 AliESDCaloCluster *cluster = (AliESDCaloCluster*)fClusterArray->At(i);
807 cluster->GetMomentum(gamma, vertex);
808 Double_t sinTheta = TMath::Sqrt(1-TMath::Power(gamma.CosTheta(),2));
809 EtWithoutHadCorr += cluster->E() * sinTheta;
810 EtWithHadCorr += cluster->GetDispersion() * sinTheta;
815 fHScaleFactor->Fill((PtEMC+EtWithoutHadCorr)/EMCArea * TPCArea/PtTPC);
816 fHScaleFactor100HC->Fill((PtEMC+EtWithHadCorr)/EMCArea * TPCArea/PtTPC);
820 //________________________________________________________________________
821 AliESDtrack *AliAnalysisTaskSOH::GetAcceptTrack(AliESDtrack *esdtrack)
823 // Get accepted track.
825 static AliESDtrack newTrack;
826 if(fEsdTrackCuts->AcceptTrack(esdtrack))
828 esdtrack->Copy(newTrack);
829 newTrack.SetTRDQuality(0);
831 else if(fHybridTrackCuts1->AcceptTrack(esdtrack))
833 if(esdtrack->GetConstrainedParam())
835 esdtrack->Copy(newTrack);
836 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
837 newTrack.Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
838 newTrack.SetTRDQuality(1);
843 else if(fHybridTrackCuts2->AcceptTrack(esdtrack))
845 if(esdtrack->GetConstrainedParam())
847 esdtrack->Copy(newTrack);
848 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
849 newTrack.Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
850 newTrack.SetTRDQuality(2);
863 //________________________________________________________________________
864 Bool_t AliAnalysisTaskSOH::IsGoodMcParticle(AliVParticle* vParticle, Int_t ipart)
866 // Return true if good MC particle.
868 if(!vParticle) return kFALSE;
869 if(!fMC->IsPhysicalPrimary(ipart)) return kFALSE;
870 if (TMath::Abs(vParticle->Eta())>2) return kFALSE;
871 if(vParticle->Pt()<0.15) return kFALSE;
875 //________________________________________________________________________
876 Bool_t AliAnalysisTaskSOH::IsGoodCluster(AliESDCaloCluster *cluster)
878 // Return true if good cluster.
880 if(!cluster) return kFALSE;
881 if (!cluster->IsEMCAL()) return kFALSE;
885 //________________________________________________________________________
886 void AliAnalysisTaskSOH::Terminate(Option_t *)
888 // Terminate analysis.