3 // Simulation EMCal task.
5 // Author: Saehanseul Oh
7 #include "AliAnalysisTaskSOH.h"
13 #include "AliAnalysisManager.h"
14 #include "AliAnalysisTask.h"
15 #include "AliEMCALRecoUtils.h"
16 #include "AliEMCALTrack.h"
17 #include "AliESDCaloCluster.h"
18 #include "AliESDEvent.h"
19 #include "AliESDInputHandler.h"
20 #include "AliESDtrack.h"
21 #include "AliESDtrackCuts.h"
22 #include "AliExternalTrackParam.h"
24 #include "AliMCEvent.h"
26 ClassImp(AliAnalysisTaskSOH)
28 //________________________________________________________________________
29 AliAnalysisTaskSOH::AliAnalysisTaskSOH() :
34 fHybridTrackCuts1(0x0),
35 fHybridTrackCuts2(0x0),
41 fHTrkEffParGenPtEtaPhi(0),
42 fHTrkEffDetGenPtEtaPhi(0),
43 fHTrkEffDetRecPtEtaPhi(0),
44 fHTrkEffDetRecFakePtEtaPhi(0),
46 fHScaleFactor100HC(0),
48 fHEMCalResponsePion(0x0),
49 fHEMCalResponseElec(0x0),
50 fHEMCalResponseProton(0x0),
51 fHEMCalRecdPhidEta(0x0),
52 fHEMCalRecdPhidEtaP(0x0),
53 fHEMCalRecdPhidEtaM(0x0),
54 fHEMCalRecdPhidEta_Truth(0x0),
55 fHEMCalRecdPhidEtaP_Truth(0x0),
56 fHEMCalRecdPhidEtaM_Truth(0x0),
57 fHEMCalRecdPhidEtaposEta(0x0),
58 fHEMCalRecdPhidEtanegEta(0x0),
59 fHPhotonEdiff100HC(0x0),
62 fHPhotonEdiff0HC(0x0),
66 fHistEsub1PchRat(0x0),
74 //________________________________________________________________________
75 AliAnalysisTaskSOH::AliAnalysisTaskSOH(const char *name) :
76 AliAnalysisTaskSE(name),
80 fHybridTrackCuts1(0x0),
81 fHybridTrackCuts2(0x0),
87 fHTrkEffParGenPtEtaPhi(0),
88 fHTrkEffDetGenPtEtaPhi(0),
89 fHTrkEffDetRecPtEtaPhi(0),
90 fHTrkEffDetRecFakePtEtaPhi(0),
92 fHScaleFactor100HC(0),
94 fHEMCalResponsePion(0x0),
95 fHEMCalResponseElec(0x0),
96 fHEMCalResponseProton(0x0),
97 fHEMCalRecdPhidEta(0x0),
98 fHEMCalRecdPhidEtaP(0x0),
99 fHEMCalRecdPhidEtaM(0x0),
100 fHEMCalRecdPhidEta_Truth(0x0),
101 fHEMCalRecdPhidEtaP_Truth(0x0),
102 fHEMCalRecdPhidEtaM_Truth(0x0),
103 fHEMCalRecdPhidEtaposEta(0x0),
104 fHEMCalRecdPhidEtanegEta(0x0),
105 fHPhotonEdiff100HC(0x0),
106 fHPhotonEdiff70HC(0),
107 fHPhotonEdiff30HC(0),
108 fHPhotonEdiff0HC(0x0),
109 fHPhotonEVsClsE(0x0),
112 fHistEsub1PchRat(0x0),
113 fHistEsub2PchRat(0x0)
117 // Output slot #1 writes into a TH1 container
118 DefineOutput(1, TList::Class());
122 //________________________________________________________________________
123 AliAnalysisTaskSOH::~AliAnalysisTaskSOH()
127 delete fEsdTrackCuts;
128 delete fHybridTrackCuts1;
129 delete fHybridTrackCuts2;
130 delete fTrackIndices;
131 delete fClusterIndices;
132 delete fClusterArray;
136 //________________________________________________________________________
137 void AliAnalysisTaskSOH::UserCreateOutputObjects()
139 // Create histograms, called once.
143 fOutputList = new TList();
144 fOutputList->SetOwner(1);
146 fHEventStat = new TH1F("fHEventStat","Event statistics for analysis",8,0,8);
147 fHEventStat->GetXaxis()->SetBinLabel(1,"Event");
148 fHEventStat->GetXaxis()->SetBinLabel(2,"cluster");
149 fHEventStat->GetXaxis()->SetBinLabel(3,"good cluster");
150 fHEventStat->GetXaxis()->SetBinLabel(4,"cls/0-truth");
151 fHEventStat->GetXaxis()->SetBinLabel(5,"cls/1-truth");
152 fHEventStat->GetXaxis()->SetBinLabel(6,"cls/2-truth");
153 fHEventStat->GetXaxis()->SetBinLabel(7,"cls/2-goodtruth");
154 fHEventStat->GetXaxis()->SetBinLabel(8,"cls/>3-truth");
155 fOutputList->Add(fHEventStat);
157 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);
158 fHTrkEffParGenPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
159 fHTrkEffParGenPtEtaPhi->GetYaxis()->SetTitle("#eta");
160 fHTrkEffParGenPtEtaPhi->GetZaxis()->SetTitle("#phi");
161 fOutputList->Add(fHTrkEffParGenPtEtaPhi);
163 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);
164 fHTrkEffDetGenPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
165 fHTrkEffDetGenPtEtaPhi->GetYaxis()->SetTitle("#eta");
166 fHTrkEffDetGenPtEtaPhi->GetZaxis()->SetTitle("#phi");
167 fOutputList->Add(fHTrkEffDetGenPtEtaPhi);
169 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);
170 fHTrkEffDetRecPtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
171 fHTrkEffDetRecPtEtaPhi->GetYaxis()->SetTitle("#eta");
172 fHTrkEffDetRecPtEtaPhi->GetZaxis()->SetTitle("#phi");
173 fOutputList->Add(fHTrkEffDetRecPtEtaPhi);
175 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);
176 fHTrkEffDetRecFakePtEtaPhi->GetXaxis()->SetTitle("p_{T}^{gen} (GeV/c)");
177 fHTrkEffDetRecFakePtEtaPhi->GetYaxis()->SetTitle("#eta");
178 fHTrkEffDetRecFakePtEtaPhi->GetZaxis()->SetTitle("#phi");
179 fOutputList->Add(fHTrkEffDetRecFakePtEtaPhi);
181 fHScaleFactor = new TH1F("fHScaleFactor", "Scale factor distribution without hadronic correction;Scale factor",100,0,10);
182 fOutputList->Add(fHScaleFactor);
184 fHScaleFactor100HC = new TH1F("fHScaleFactor100HC", "Scale factor distribution with 100% hadronic correction;Scale factor",100,0,10);
185 fOutputList->Add(fHScaleFactor100HC);
187 fHEOverPVsPt = new TH2F("fHEOverPVsPt", "E/P vs track p_{T}; p_{T} (GeV/c); E/P", 200 , 0, 4, 200, 0, 3.2);
188 fOutputList->Add(fHEOverPVsPt);
190 fHEMCalResponsePion = new TH2F("fHEMCalResponsePion", "Pion E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
191 fOutputList->Add(fHEMCalResponsePion);
193 fHEMCalResponseElec = new TH2F("fHEMCalResponseElec", "Electron E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
194 fOutputList->Add(fHEMCalResponseElec);
196 fHEMCalResponseProton = new TH2F("fHEMCalResponseProton", "Proton E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
197 fOutputList->Add(fHEMCalResponseProton);
199 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);
200 fOutputList->Add(fHEMCalRecdPhidEta);
202 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);
203 fOutputList->Add(fHEMCalRecdPhidEtaP);
205 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);
206 fOutputList->Add(fHEMCalRecdPhidEtaM);
208 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);
209 fOutputList->Add(fHEMCalRecdPhidEta_Truth);
211 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);
212 fOutputList->Add(fHEMCalRecdPhidEtaP_Truth);
214 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);
215 fOutputList->Add(fHEMCalRecdPhidEtaM_Truth);
217 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);
218 fOutputList->Add(fHEMCalRecdPhidEtaposEta);
220 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);
221 fOutputList->Add(fHEMCalRecdPhidEtanegEta);
223 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);
224 fOutputList->Add(fHPhotonEdiff100HC);
226 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);
227 fOutputList->Add(fHPhotonEdiff70HC);
229 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);
230 fOutputList->Add(fHPhotonEdiff30HC);
232 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);
233 fOutputList->Add(fHPhotonEdiff0HC);
235 fHPhotonEVsClsE = new TH2F("fHPhotonEVsClsE","Cluster E vs. photon E_{Truth}; photon E_{Truth} (GeV); Cluster E (GeV)",500,0,5,500,0,5);
236 fOutputList->Add(fHPhotonEVsClsE);
238 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.);
239 fOutputList->Add(fHistEsub1Pch);
241 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.);
242 fOutputList->Add(fHistEsub2Pch);
244 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);
245 fOutputList->Add(fHistEsub1PchRat);
247 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);
248 fOutputList->Add(fHistEsub2PchRat);
250 fTrackIndices = new TArrayI();
251 fClusterIndices = new TArrayI();
253 fClusterArray = new TObjArray();
254 fClusterArray->SetOwner(1);
256 PostData(1, fOutputList);
259 //________________________________________________________________________
260 void AliAnalysisTaskSOH::UserExec(Option_t *)
262 // Main loop, called for each event.
265 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
267 printf("ERROR: fESD not available\n");
273 printf("ERROR: fMC not available\n");
277 fHEventStat->Fill(0.5);
280 fTrackIndices->Reset();
282 fClusterIndices->Reset();
284 fClusterArray->Delete();
289 ProcessScaleFactor();
291 PostData(1, fOutputList);
294 //________________________________________________________________________
295 void AliAnalysisTaskSOH::ProcessTrack()
299 fTrackIndices->Set(fESD->GetNumberOfTracks());
300 AliDebug(3,Form("%s:%d Selecting tracks",(char*)__FILE__,__LINE__));
305 Float_t ClsPos[3] = {-999,-999,-999};
306 Double_t emcTrkpos[3] = {-999,-999,-999};
308 for(Int_t itr=0; itr<fESD->GetNumberOfTracks(); itr++)
310 AliESDtrack *esdtrack = fESD->GetTrack(itr);
311 if(!esdtrack)continue;
312 AliESDtrack *newTrack = GetAcceptTrack(esdtrack);
313 if(!newTrack) continue;
316 Int_t clsIndex = newTrack->GetEMCALcluster();
317 if(newTrack->GetEMCALcluster()>-1)
319 AliESDCaloCluster *cluster = fESD->GetCaloCluster(clsIndex);
320 if(IsGoodCluster(cluster))
324 cluster->GetPosition(ClsPos);
325 TVector3 VClsPos(ClsPos[0], ClsPos[1], ClsPos[2]);
327 AliEMCALTrack EMCTrk(*newTrack);
328 if(!EMCTrk.PropagateToGlobal(ClsPos[0], ClsPos[1], ClsPos[2], 0.0, 0.0)) {
331 EMCTrk.GetXYZ(emcTrkpos);
332 TVector3 VemcTrkPos(emcTrkpos[0],emcTrkpos[1],emcTrkpos[2]);
334 Double_t dPhi = VClsPos.Phi() - VemcTrkPos.Phi();
335 if (dPhi < -1*TMath::Pi()) dPhi += (2*TMath::Pi());
336 else if (dPhi > TMath::Pi()) dPhi -= (2*TMath::Pi());
338 Double_t dEta = VClsPos.Eta() - VemcTrkPos.Eta();
340 fHEMCalRecdPhidEta->Fill(dEta, dPhi);
342 if((newTrack->GetLabel())>-1 && (newTrack->GetLabel()) < fMC->GetNumberOfTracks())
344 AliVParticle *vParticle = fMC->GetTrack(newTrack->GetLabel());
345 if(IsGoodMcParticle(vParticle, newTrack->GetLabel()))
347 fHEMCalRecdPhidEta_Truth->Fill(dEta, dPhi);
348 if(vParticle->Charge() > 0) fHEMCalRecdPhidEtaP_Truth->Fill(dEta, dPhi);
349 if(vParticle->Charge() < 0) fHEMCalRecdPhidEtaM_Truth->Fill(dEta, dPhi);
353 if(esdtrack->Charge() > 0) {fHEMCalRecdPhidEtaP->Fill(dEta, dPhi);}
354 if(esdtrack->Charge() < 0) {fHEMCalRecdPhidEtaM->Fill(dEta, dPhi);}
356 if(VemcTrkPos.Eta() > 0) fHEMCalRecdPhidEtaposEta->Fill(dEta, dPhi);
357 if(VemcTrkPos.Eta() < 0) fHEMCalRecdPhidEtanegEta->Fill(dEta, dPhi);
360 if(newTrack->P()>0) fHEOverPVsPt->Fill(newTrack->Pt(),clsE/newTrack->P());
363 Int_t ipart = newTrack->GetLabel();
364 if(ipart>-1 && ipart<fMC->GetNumberOfTracks())
366 AliVParticle* vParticle = fMC->GetTrack(ipart);
367 if(isMth && vParticle)
369 if(TMath::Abs(vParticle->PdgCode())==211)
371 fHEMCalResponsePion->Fill(newTrack->Pt(),clsE/newTrack->P());
373 if(TMath::Abs(vParticle->PdgCode())==11)
375 fHEMCalResponseElec->Fill(newTrack->Pt(),clsE/newTrack->P());
377 if(TMath::Abs(vParticle->PdgCode())==2212)
379 fHEMCalResponseProton->Fill(newTrack->Pt(),clsE/newTrack->P());
385 // fake and secondary tracks
386 if(newTrack->GetLabel()<0 && newTrack->GetPID()==2) fHTrkEffDetRecFakePtEtaPhi->Fill(newTrack->Pt(), newTrack->Eta(), newTrack->Phi());
389 fTrackIndices->AddAt(itr,nTracks);
393 fTrackIndices->Set(nTracks);
396 //________________________________________________________________________
397 void AliAnalysisTaskSOH::ProcessCluster()
402 TLorentzVector gamma;
403 Double_t vertex[3] = {0, 0, 0};
404 fESD->GetVertex()->GetXYZ(vertex);
405 const Int_t nCaloClusters = fESD->GetNumberOfCaloClusters();
406 fClusterIndices->Set(nCaloClusters);
408 for(Int_t itr=0; itr<nCaloClusters; itr++)
410 fHEventStat->Fill(1.5);
411 AliESDCaloCluster *cluster = fESD->GetCaloCluster(itr);
412 if(!IsGoodCluster(cluster)) continue;
413 cluster->GetMomentum(gamma, vertex);
414 if (gamma.Pt() < 0.15) continue;
415 fHEventStat->Fill(2.5);
417 TArrayI *TrackLabels = cluster->GetTracksMatched();
419 if(TrackLabels->GetSize() == 1)
421 AliESDtrack *esdtrack = fESD->GetTrack(TrackLabels->GetAt(0));
422 AliESDtrack *newTrack = GetAcceptTrack(esdtrack);
423 if(newTrack && TMath::Abs(newTrack->Eta())<0.7)
425 Double_t Esub = newTrack->P();
426 if (Esub > cluster->E()) Esub = cluster->E();
427 fHistEsub1Pch->Fill(newTrack->P(), Esub);
428 fHistEsub1PchRat->Fill(newTrack->P(), Esub/newTrack->P());
432 if(TrackLabels->GetSize() == 2)
434 AliESDtrack *esdtrack1 = fESD->GetTrack(TrackLabels->GetAt(0));
435 AliESDtrack *esdtrack2 = fESD->GetTrack(TrackLabels->GetAt(1));
436 AliESDtrack *newTrack1 = GetAcceptTrack(esdtrack1);
437 AliESDtrack *newTrack2 = GetAcceptTrack(esdtrack2);
438 if(newTrack1 && newTrack2 && TMath::Abs(newTrack1->Eta())<0.7 && TMath::Abs(newTrack2->Eta())<0.7)
440 Double_t Esub = newTrack1->P() + newTrack2->P();
441 if (Esub > cluster->E()) Esub = cluster->E();
442 fHistEsub2Pch->Fill(newTrack1->P() + newTrack2->P(), Esub);
443 fHistEsub2PchRat->Fill(newTrack1->P() + newTrack2->P(), Esub/(newTrack1->P() + newTrack2->P()));
445 else if(newTrack1 && !(newTrack2) && TMath::Abs(newTrack1->Eta())<0.7)
447 Double_t Esub = newTrack1->P();
448 if (Esub > cluster->E()) Esub = cluster->E();
449 fHistEsub1Pch->Fill(newTrack1->P(), Esub);
450 fHistEsub1PchRat->Fill(newTrack1->P(), Esub/newTrack1->P());
452 else if (!(newTrack1) && newTrack2 && TMath::Abs(newTrack2->Eta())<0.7)
454 Double_t Esub = newTrack2->P();
455 if (Esub > cluster->E()) Esub = cluster->E();
456 fHistEsub1Pch->Fill(newTrack2->P(), Esub);
457 fHistEsub1PchRat->Fill(newTrack2->P(), Esub/newTrack2->P());
462 TArrayI *MCLabels = cluster->GetLabelsArray();
464 if(MCLabels->GetSize() == 0) fHEventStat->Fill(3.5);
465 if(MCLabels->GetSize() == 1) fHEventStat->Fill(4.5);
466 if(MCLabels->GetSize() == 2)
468 fHEventStat->Fill(5.5);
469 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
470 AliVParticle* vParticle2 = fMC->GetTrack(MCLabels->GetAt(1));
471 if(IsGoodMcParticle(vParticle1, MCLabels->GetAt(0)) && IsGoodMcParticle(vParticle2, MCLabels->GetAt(1)))
473 fHEventStat->Fill(6.5);
474 if((vParticle1->PdgCode()==22) && (vParticle2->PdgCode()==22)) {;}
475 else if((vParticle1->PdgCode()!=22) && (vParticle2->PdgCode()!=22)) {;}
478 fClusterIndices->AddAt(itr,nCluster);
483 if(MCLabels->GetSize() > 2) fHEventStat->Fill(7.5);
485 AliESDCaloCluster *newCluster = new AliESDCaloCluster(*cluster);
488 TArrayI arrayTrackMatched(fTrackIndices->GetSize());
489 Int_t nGoodMatch = 0;
491 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
493 AliESDtrack *trk = fESD->GetTrack(fTrackIndices->At(j));
494 if(itr==trk->GetEMCALcluster())
496 arrayTrackMatched[nGoodMatch] = j;
502 arrayTrackMatched.Set(nGoodMatch);
503 newCluster->AddTracksMatched(arrayTrackMatched);
505 Double_t clsE = newCluster->E();
506 Double_t newE = clsE-subE;
508 newCluster->SetDispersion(newE);
509 fClusterArray->Add(newCluster);
512 fClusterIndices->Set(nCluster);
514 //________________________________________________________________________
515 void AliAnalysisTaskSOH::ProcessMc()
519 for(Int_t ipart=0; ipart<fMC->GetNumberOfTracks(); ipart++)
521 AliVParticle* vParticle = fMC->GetTrack(ipart);
522 if(!IsGoodMcParticle(vParticle, ipart)) continue;
523 Int_t pdgCode = vParticle->PdgCode();
526 if(TMath::Abs(vParticle->Eta())<0.9)
528 if(TMath::Abs(pdgCode==211)) fHTrkEffParGenPtEtaPhi->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
529 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
531 AliESDtrack *esdtrack = fESD->GetTrack(fTrackIndices->At(j));
532 if(esdtrack && esdtrack->GetLabel()==ipart)
534 if(TMath::Abs(pdgCode==211))
536 fHTrkEffDetGenPtEtaPhi->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
537 fHTrkEffDetRecPtEtaPhi->Fill(esdtrack->Pt(), esdtrack->Eta(), esdtrack->Phi());
540 //cluster E vs. truth photon energy
541 for(Int_t k=0; k<fClusterIndices->GetSize(); k++)
543 AliESDCaloCluster *cluster = fESD->GetCaloCluster(fClusterIndices->At(k));
544 Double_t clsE = cluster->E();
545 TArrayI *MCLabels = cluster->GetLabelsArray();
546 AliVParticle* vParticle1 = fMC->GetTrack(MCLabels->GetAt(0));
547 AliVParticle* vParticle2 = fMC->GetTrack(MCLabels->GetAt(1));
549 if(vParticle1->PdgCode()==22 && vParticle2 == vParticle)
551 fHPhotonEdiff0HC->Fill(vParticle1->E(), (vParticle1->E() - clsE)/vParticle1->E());
552 fHPhotonEVsClsE->Fill(vParticle1->E(), clsE);
554 if((clsE - 0.3*esdtrack->E())<0) fHPhotonEdiff30HC->Fill(vParticle1->E(), 1);
555 else fHPhotonEdiff30HC->Fill(vParticle1->E(), (vParticle1->E() + 0.3*esdtrack->E() - clsE)/vParticle1->E());
557 if((clsE - 0.7*esdtrack->E())<0) fHPhotonEdiff70HC->Fill(vParticle1->E(), 1);
558 else fHPhotonEdiff70HC->Fill(vParticle1->E(), (vParticle1->E() + 0.7*esdtrack->E() - clsE)/vParticle1->E());
560 if((clsE - esdtrack->E())<0) fHPhotonEdiff100HC->Fill(vParticle1->E(), 1);
561 else fHPhotonEdiff100HC->Fill(vParticle1->E(), (vParticle1->E() + esdtrack->E() - clsE)/vParticle1->E());
564 if(vParticle2->PdgCode()==22 && vParticle1 == vParticle)
566 fHPhotonEdiff0HC->Fill(vParticle2->E(), (vParticle2->E() - clsE)/vParticle2->E());
567 fHPhotonEVsClsE->Fill(vParticle2->E(), clsE);
569 if((clsE - 0.3*esdtrack->E())<0) fHPhotonEdiff30HC->Fill(vParticle2->E(), 1);
570 else fHPhotonEdiff30HC->Fill(vParticle2->E(), (vParticle2->E() + 0.3*esdtrack->E() - clsE)/vParticle2->E());
572 if((clsE - 0.7*esdtrack->E())<0) fHPhotonEdiff70HC->Fill(vParticle2->E(), 1);
573 else fHPhotonEdiff70HC->Fill(vParticle2->E(), (vParticle2->E() + 0.7*esdtrack->E() - clsE)/vParticle2->E());
575 if((clsE-esdtrack->E())<0) fHPhotonEdiff100HC->Fill(vParticle2->E(), 1);
576 else fHPhotonEdiff100HC->Fill(vParticle2->E(), (vParticle2->E() + esdtrack->E() - clsE)/vParticle2->E());
586 //________________________________________________________________________
587 void AliAnalysisTaskSOH::ProcessScaleFactor()
591 const Double_t phiMax = 180 * TMath::DegToRad();
592 const Double_t phiMin = 80 * TMath::DegToRad();
593 const Double_t TPCArea= 2*TMath::Pi()*1.8;
594 const Double_t EMCArea = (phiMax-phiMin)*1.4;
599 for(Int_t j=0; j<fTrackIndices->GetSize(); j++)
601 AliESDtrack *trk = fESD->GetTrack(fTrackIndices->At(j));
602 Double_t eta = trk->Eta();
603 Double_t phi = trk->Phi();
604 if(TMath::Abs(eta)<0.9) PtTPC += trk->Pt();
605 if(TMath::Abs(eta)<0.7 && phi > phiMin && phi < phiMax ) PtEMC += trk->Pt();
608 Double_t EtWithHadCorr = 0;
609 Double_t EtWithoutHadCorr = 0;
610 Double_t vertex[3] = {0, 0, 0};
611 fESD->GetVertex()->GetXYZ(vertex);
612 TLorentzVector gamma;
614 for(Int_t i=0; i<fClusterArray->GetEntriesFast(); i++)
616 AliESDCaloCluster *cluster = (AliESDCaloCluster*)fClusterArray->At(i);
617 cluster->GetMomentum(gamma, vertex);
618 Double_t sinTheta = TMath::Sqrt(1-TMath::Power(gamma.CosTheta(),2));
619 EtWithoutHadCorr += cluster->E() * sinTheta;
620 EtWithHadCorr += cluster->GetDispersion() * sinTheta;
625 fHScaleFactor->Fill((PtEMC+EtWithoutHadCorr)/EMCArea * TPCArea/PtTPC);
626 fHScaleFactor100HC->Fill((PtEMC+EtWithHadCorr)/EMCArea * TPCArea/PtTPC);
630 //________________________________________________________________________
631 AliESDtrack *AliAnalysisTaskSOH::GetAcceptTrack(AliESDtrack *esdtrack)
633 // Get accepted track.
635 static AliESDtrack newTrack;
636 if(fEsdTrackCuts->AcceptTrack(esdtrack))
638 esdtrack->Copy(newTrack);
639 newTrack.SetTRDQuality(0);
641 else if(fHybridTrackCuts1->AcceptTrack(esdtrack))
643 if(esdtrack->GetConstrainedParam())
645 esdtrack->Copy(newTrack);
646 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
647 newTrack.Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
648 newTrack.SetTRDQuality(1);
653 else if(fHybridTrackCuts2->AcceptTrack(esdtrack))
655 if(esdtrack->GetConstrainedParam())
657 esdtrack->Copy(newTrack);
658 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
659 newTrack.Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
660 newTrack.SetTRDQuality(2);
673 //________________________________________________________________________
674 Bool_t AliAnalysisTaskSOH::IsGoodMcParticle(AliVParticle* vParticle, Int_t ipart)
676 // Return true if good MC particle.
678 if(!vParticle) return kFALSE;
679 if(!fMC->IsPhysicalPrimary(ipart)) return kFALSE;
680 if (TMath::Abs(vParticle->Eta())>2) return kFALSE;
681 if(vParticle->Pt()<0.15) return kFALSE;
685 //________________________________________________________________________
686 Bool_t AliAnalysisTaskSOH::IsGoodCluster(AliESDCaloCluster *cluster)
688 // Return true if good cluster.
690 if(!cluster) return kFALSE;
691 if (!cluster->IsEMCAL()) return kFALSE;
695 //________________________________________________________________________
696 void AliAnalysisTaskSOH::Terminate(Option_t *)
698 // Terminate analysis.