12 #include <THnSparse.h>
15 #include "AliAnalysisManager.h"
16 #include "AliAnalysisTask.h"
17 #include "AliEMCALRecoUtils.h"
18 #include "AliEMCALTrack.h"
19 #include "AliESDCaloCluster.h"
20 #include "AliESDEvent.h"
21 #include "AliESDInputHandler.h"
22 #include "AliESDtrack.h"
23 #include "AliESDtrackCuts.h"
24 #include "AliExternalTrackParam.h"
26 #include "AliMCEvent.h"
27 #include "AliHeader.h"
28 #include "AliGenCocktailEventHeader.h"
40 fHybridTrackCuts1(0x0),
41 fHybridTrackCuts2(0x0),
48 fClusterProcess(kFALSE),
52 fHScaleFactor100HC(0),
54 fHEMCalResponsePion(0x0),
55 fHEMCalResponseElec(0x0),
56 fHEMCalResponseProton(0x0),
57 fHEMCalRecdPhidEta(0x0),
58 fHEMCalRecdPhidEtaP(0x0),
59 fHEMCalRecdPhidEtaM(0x0),
60 fHEMCalRecdPhidEta_Truth(0x0),
61 fHEMCalRecdPhidEtaP_Truth(0x0),
62 fHEMCalRecdPhidEtaM_Truth(0x0),
63 fHEMCalRecdPhidEtaposEta(0x0),
64 fHEMCalRecdPhidEtanegEta(0x0),
65 fHPhotonEdiff100HC(0x0),
68 fHPhotonEdiff0HC(0x0),
72 fHistEsub1PchRat(0x0),
73 fHistEsub2PchRat(0x0),
74 fHClsEoverMcE_All(0x0),
75 fHClsEoverMcE_Photon(0x0),
76 fHClsEoverMcE_Elec(0x0),
77 fHClsEoverMcE_Pion(0x0),
80 fHParGenPion_rmInj_p(0x0),
81 fHParGenPion_rmInj_m(0x0),
82 fHDetGenFakePion(0x0),
83 fHDetRecFakePion(0x0),
87 for(Int_t i=0; i<3; i++)
89 fHDetGenPion_p[i] = 0x0;
90 fHDetRecPion_p[i] = 0x0;
91 fHDetGenPion_m[i] = 0x0;
92 fHDetRecPion_m[i] = 0x0;
93 fHDetGenPion_rmInj_p[i] = 0x0;
94 fHDetRecPion_rmInj_p[i] = 0x0;
95 fHDetGenPion_rmInj_m[i] = 0x0;
96 fHDetRecPion_rmInj_m[i] = 0x0;
98 DefineInput (0, TChain::Class());
99 DefineOutput(1, TList::Class());
106 AliAnalysisTaskSE(name),
111 fHybridTrackCuts1(0x0),
112 fHybridTrackCuts2(0x0),
114 fClusterIndices(0x0),
117 fTrackProcess(kTRUE),
119 fClusterProcess(kFALSE),
123 fHScaleFactor100HC(0),
125 fHEMCalResponsePion(0x0),
126 fHEMCalResponseElec(0x0),
127 fHEMCalResponseProton(0x0),
128 fHEMCalRecdPhidEta(0x0),
129 fHEMCalRecdPhidEtaP(0x0),
130 fHEMCalRecdPhidEtaM(0x0),
131 fHEMCalRecdPhidEta_Truth(0x0),
132 fHEMCalRecdPhidEtaP_Truth(0x0),
133 fHEMCalRecdPhidEtaM_Truth(0x0),
134 fHEMCalRecdPhidEtaposEta(0x0),
135 fHEMCalRecdPhidEtanegEta(0x0),
136 fHPhotonEdiff100HC(0x0),
137 fHPhotonEdiff70HC(0),
138 fHPhotonEdiff30HC(0),
139 fHPhotonEdiff0HC(0x0),
140 fHPhotonEVsClsE(0x0),
143 fHistEsub1PchRat(0x0),
144 fHistEsub2PchRat(0x0),
145 fHClsEoverMcE_All(0x0),
146 fHClsEoverMcE_Photon(0x0),
147 fHClsEoverMcE_Elec(0x0),
148 fHClsEoverMcE_Pion(0x0),
151 fHParGenPion_rmInj_p(0x0),
152 fHParGenPion_rmInj_m(0x0),
153 fHDetGenFakePion(0x0),
154 fHDetRecFakePion(0x0),
155 fHDetGenSecPion(0x0),
158 for(Int_t i=0; i<3; i++)
172 DefineOutput(1, TList::Class());
200 fHEventStat =
new TH1F(
"fHEventStat",
"Event statistics for analysis",8,0,8);
203 fHEventStat->GetXaxis()->SetBinLabel(3,
"good cluster");
204 fHEventStat->GetXaxis()->SetBinLabel(4,
"cls/0-truth");
205 fHEventStat->GetXaxis()->SetBinLabel(5,
"cls/1-truth");
206 fHEventStat->GetXaxis()->SetBinLabel(6,
"cls/2-truth");
207 fHEventStat->GetXaxis()->SetBinLabel(7,
"cls/2-goodtruth");
208 fHEventStat->GetXaxis()->SetBinLabel(8,
"cls/>3-truth");
214 fHScaleFactor =
new TH1F(
"fHScaleFactor",
"Scale factor distribution without hadronic correction;Scale factor",100,0,10);
217 fHScaleFactor100HC =
new TH1F(
"fHScaleFactor100HC",
"Scale factor distribution with 100% hadronic correction;Scale factor",100,0,10);
223 fHEOverPVsPt =
new TH2F(
"fHEOverPVsPt",
"E/P vs track p_{T}; p_{T} (GeV/c); E/P", 200 , 0, 4, 200, 0, 3.2);
226 fHEMCalResponsePion =
new TH2F(
"fHEMCalResponsePion",
"Pion E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
229 fHEMCalResponseElec =
new TH2F(
"fHEMCalResponseElec",
"Electron E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
232 fHEMCalResponseProton =
new TH2F(
"fHEMCalResponseProton",
"Proton E/P vs track p_{T}; p_{T} (GeV/c); E/P", 100 , 0, 4, 100, 0, 3.2);
235 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);
238 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);
241 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);
244 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);
247 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);
250 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);
253 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);
256 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);
259 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);
262 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);
265 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);
268 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);
271 fHPhotonEVsClsE =
new TH2F(
"fHPhotonEVsClsE",
"Cluster E vs. photon E_{Truth}; photon E_{Truth} (GeV); Cluster E (GeV)",500,0,5,500,0,5);
274 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.);
277 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.);
280 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);
283 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);
286 Int_t bins[4] = {150, 150, 100, 200};
287 Double_t xmin[4] = {1.3, -0.8, 0, 0};
288 Double_t xmax[4] = {3.2, 0.8, 10, 2};
290 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);
293 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);
296 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);
299 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);
303 fHParGenPion_p =
new TH3F(
"fHParGenPion_p",
"Particle level truth Phi-Eta-p_{T} distribution of #pi+", 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
309 fHParGenPion_m =
new TH3F(
"fHParGenPion_m",
"Particle level truth Phi-Eta-p_{T} distribution of all #pi-", 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
315 fHParGenPion_rmInj_p =
new TH3F(
"fHParGenPion_rmInj_p",
"Particle level truth Phi-Eta-p_{T} distribution of all #pi+ without injected signal", 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
321 fHParGenPion_rmInj_m =
new TH3F(
"fHParGenPion_rmInj_m",
"Particle level truth Phi-Eta-p_{T} distribution of #pi- without injected signal", 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
329 const char* trackCut[3] = {
"cut1",
"cut2",
"cut3"};
333 fHDetGenFakePion =
new TH3F(
"fHDetGenFakePion",
"fake charged pion track Phi-Eta-p_{T} distribution",500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
339 fHDetRecFakePion =
new TH3F(
"fHDetRecFakePion",
"fake charged pion track Phi-Eta-p_{T} distribution", 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
346 fHDetGenSecPion =
new TH3F(
"fHDetGenSecPion",
"secondary charged pion charged pion track Phi-Eta-p_{T} distribution", 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
352 fHDetRecSecPion =
new TH3F(
"fHDetRecSecPion",
"secondary charged pion charged pion track Phi-Eta-p_{T} distribution", 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
358 for(Int_t i=0; i<3; i++)
361 fHDetGenPion_p[i] =
new TH3F(Form(
"fHDetGenPion_p_%s", trackCut[i]), Form(
"%s: Detector level truth Phi-Eta-p_{T} distribution of #pi+", trackCut[i]), 500, 0, 100, 60, -1.2, 1.2, 128, 0, 6.4);
367 fHDetRecPion_p[i] =
new TH3F(Form(
"fHDetRecPion_p_%s", trackCut[i]), Form(
"%s: Reconstructed track Phi-Eta-p_{T} distribution of all #pi+", trackCut[i]), 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
374 fHDetGenPion_m[i] =
new TH3F(Form(
"fHDetGenPion_m_%s", trackCut[i]), Form(
"%s: Detector level truth Phi-Eta-p_{T} distribution of #pi-", trackCut[i]), 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
380 fHDetRecPion_m[i] =
new TH3F(Form(
"fHDetRecPion_m_%s", trackCut[i]), Form(
"%s: Reconstructed track Phi-Eta-p_{T} distribution of #pi-", trackCut[i]), 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
387 fHDetGenPion_rmInj_p[i] =
new TH3F(Form(
"fHDetGenPion_rmInj_p_%s", trackCut[i]), Form(
"%s: Detector level truth Phi-Eta-p_{T} distribution of #pi+ without injected signal", trackCut[i]), 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
393 fHDetRecPion_rmInj_p[i] =
new TH3F(Form(
"fHDetRecPion_rmInj_p_%s", trackCut[i]), Form(
"%s: Reconstructed track Phi-Eta-p_{T} distribution of #pi+ without injected signal", trackCut[i]), 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
400 fHDetGenPion_rmInj_m[i] =
new TH3F(Form(
"fHDetGenPion_rmInj_m_%s", trackCut[i]), Form(
"%s: Detector level truth Phi-Eta-p_{T} distribution of #pi- without injected signal", trackCut[i]), 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
406 fHDetRecPion_rmInj_m[i] =
new TH3F(Form(
"fHDetRecPion_rmInj_m_%s", trackCut[i]), Form(
"%s: Reconstructed track Phi-Eta-p_{T} distribution of #pi- without injected signal", trackCut[i]), 500, 0, 100, 100, -1.0, 1.0, 120, 0.0,2.*TMath::Pi());
429 fESD =
dynamic_cast<AliESDEvent*
>(InputEvent());
431 printf(
"ERROR: fESD not available\n");
438 printf(
"ERROR: fMC not available\n");
469 AliDebug(3,Form(
"%s:%d Selecting tracks",(
char*)__FILE__,__LINE__));
474 Float_t ClsPos[3] = {-999,-999,-999};
475 Double_t emcTrkpos[3] = {-999,-999,-999};
477 for(Int_t itr=0; itr<
fESD->GetNumberOfTracks(); itr++)
479 AliESDtrack *esdtrack =
fESD->GetTrack(itr);
480 if(!esdtrack)
continue;
482 if(!newTrack)
continue;
483 if(newTrack->Pt()<0.15 || TMath::Abs(newTrack->Eta())>0.9) {
delete newTrack;
continue;}
488 Int_t clsIndex = newTrack->GetEMCALcluster();
489 if(newTrack->GetEMCALcluster()>-1)
491 AliESDCaloCluster *cluster =
fESD->GetCaloCluster(clsIndex);
496 cluster->GetPosition(ClsPos);
497 TVector3 VClsPos(ClsPos[0], ClsPos[1], ClsPos[2]);
499 AliEMCALTrack EMCTrk(*newTrack);
500 if(!EMCTrk.PropagateToGlobal(ClsPos[0], ClsPos[1], ClsPos[2], 0.0, 0.0)) {
continue;}
501 EMCTrk.GetXYZ(emcTrkpos);
502 TVector3 VemcTrkPos(emcTrkpos[0],emcTrkpos[1],emcTrkpos[2]);
504 Double_t dPhi = VClsPos.Phi() - VemcTrkPos.Phi();
505 if (dPhi < -1*TMath::Pi()) dPhi += (2*TMath::Pi());
506 else if (dPhi > TMath::Pi()) dPhi -= (2*TMath::Pi());
508 Double_t dEta = VClsPos.Eta() - VemcTrkPos.Eta();
512 if((newTrack->GetLabel())>-1 && (newTrack->GetLabel()) <
fMC->GetNumberOfTracks())
514 AliVParticle *vParticle =
fMC->GetTrack(newTrack->GetLabel());
530 if(newTrack->P()>0)
fHEOverPVsPt->Fill(newTrack->Pt(),clsE/newTrack->P());
533 Int_t ipart = newTrack->GetLabel();
534 if(ipart>-1 && ipart<fMC->GetNumberOfTracks())
536 AliVParticle* vParticle =
fMC->GetTrack(ipart);
537 if(isMth && vParticle)
539 if(TMath::Abs(vParticle->PdgCode())==211)
543 if(TMath::Abs(vParticle->PdgCode())==11)
547 if(TMath::Abs(vParticle->PdgCode())==2212)
555 if(newTrack)
delete newTrack;
571 TLorentzVector gamma;
572 Double_t vertex[3] = {0, 0, 0};
573 fESD->GetVertex()->GetXYZ(vertex);
574 const Int_t nCaloClusters =
fESD->GetNumberOfCaloClusters();
576 Float_t ClsPos[3] = {-999,-999,-999};
578 for(Int_t itr=0; itr<nCaloClusters; itr++)
581 AliESDCaloCluster *cluster =
fESD->GetCaloCluster(itr);
583 cluster->GetMomentum(gamma, vertex);
584 if (gamma.Pt() < 0.15)
continue;
587 cluster->GetPosition(ClsPos);
588 TVector3 VClsPos(ClsPos[0], ClsPos[1], ClsPos[2]);
590 TArrayI *TrackLabels = cluster->GetTracksMatched();
592 if(TrackLabels->GetSize() == 1)
594 AliESDtrack *esdtrack =
fESD->GetTrack(TrackLabels->operator[](0));
596 if(newTrack && TMath::Abs(newTrack->Eta())<0.7)
598 Double_t Esub = newTrack->P();
599 if (Esub > cluster->E()) Esub = cluster->E();
605 if(TrackLabels->GetSize() == 2)
607 AliESDtrack *esdtrack1 =
fESD->GetTrack(TrackLabels->operator[](0));
608 AliESDtrack *esdtrack2 =
fESD->GetTrack(TrackLabels->operator[](1));
611 if(newTrack1 && newTrack2 && TMath::Abs(newTrack1->Eta())<0.7 && TMath::Abs(newTrack2->Eta())<0.7)
613 Double_t Esub = newTrack1->P() + newTrack2->P();
614 if (Esub > cluster->E()) Esub = cluster->E();
616 fHistEsub2PchRat->Fill(newTrack1->P() + newTrack2->P(), Esub/(newTrack1->P() + newTrack2->P()));
618 else if(newTrack1 && !(newTrack2) && TMath::Abs(newTrack1->Eta())<0.7)
620 Double_t Esub = newTrack1->P();
621 if (Esub > cluster->E()) Esub = cluster->E();
625 else if (!(newTrack1) && newTrack2 && TMath::Abs(newTrack2->Eta())<0.7)
627 Double_t Esub = newTrack2->P();
628 if (Esub > cluster->E()) Esub = cluster->E();
635 TArrayI *MCLabels = cluster->GetLabelsArray();
637 if(MCLabels->GetSize() == 0)
fHEventStat->Fill(3.5);
638 if(MCLabels->GetSize() == 1)
641 AliVParticle* vParticle1 =
fMC->GetTrack(MCLabels->operator[](0));
644 Double_t Entries[4] = {VClsPos.Phi(), VClsPos.Eta(), vParticle1->E(), cluster->E()/vParticle1->E()};
646 if(vParticle1->PdgCode() == 22)
650 if(TMath::Abs(vParticle1->PdgCode()) == 11)
654 if(TMath::Abs(vParticle1->PdgCode()) == 211)
660 if(MCLabels->GetSize() == 2)
663 AliVParticle* vParticle1 =
fMC->GetTrack(MCLabels->operator[](0));
664 AliVParticle* vParticle2 =
fMC->GetTrack(MCLabels->operator[](1));
668 if((vParticle1->PdgCode()==22) && (vParticle2->PdgCode()==22)) {;}
669 else if((vParticle1->PdgCode()!=22) && (vParticle2->PdgCode()!=22)) {;}
677 if(MCLabels->GetSize() > 2)
fHEventStat->Fill(7.5);
679 AliESDCaloCluster *newCluster =
new AliESDCaloCluster(*cluster);
683 Int_t nGoodMatch = 0;
688 if(itr==trk->GetEMCALcluster())
690 arrayTrackMatched[nGoodMatch] = j;
696 arrayTrackMatched.Set(nGoodMatch);
697 newCluster->AddTracksMatched(arrayTrackMatched);
699 Double_t clsE = newCluster->E();
700 Double_t newE = clsE-subE;
702 newCluster->SetDispersion(newE);
715 if(!esdtrack)
continue;
717 if(!newTrack)
continue;
718 if(newTrack->Pt()<0.15 || TMath::Abs(newTrack->Eta())>0.9) {
delete newTrack;
continue;}
720 Int_t index = esdtrack->GetLabel();
723 AliVParticle *vParticle1 = (AliVParticle*)
fMC->GetTrack(-1*index);
724 if((TMath::Abs(vParticle1->PdgCode())==211) &&
IsGoodMcParticle(vParticle1, -1*index))
727 fHDetGenFakePion->Fill(vParticle1->Pt(), vParticle1->Eta(), vParticle1->Phi());
731 AliVParticle* vParticle2 =
fMC->GetTrack(TMath::Abs(index));
732 if(!
IsGoodMcParticle(vParticle2, TMath::Abs(index)) && (TMath::Abs(vParticle2->PdgCode())==211))
734 fHDetRecSecPion->Fill(newTrack->Pt(), newTrack->Eta(), newTrack->Phi());
735 fHDetGenSecPion->Fill(vParticle2->Pt(), vParticle2->Eta(), vParticle2->Phi());
738 if(newTrack)
delete newTrack;
742 AliHeader* header = (AliHeader*)
fMC->Header();
743 if (!header) AliFatal(
"fInjectedSignals set but no MC header found");
745 AliGenCocktailEventHeader* cocktailHeader =
dynamic_cast<AliGenCocktailEventHeader*
> (header->GenEventHeader());
749 AliFatal(
"fInjectedSignals set but no MC cocktail header found");
752 AliGenEventHeader* eventHeader = 0;
753 eventHeader =
dynamic_cast<AliGenEventHeader*
> (cocktailHeader->GetHeaders()->First());
754 if (!eventHeader) AliFatal(
"First event header not found");
756 for(Int_t ipart=0; ipart<
fMC->GetNumberOfTracks(); ipart++)
758 AliVParticle* vParticle =
fMC->GetTrack(ipart);
759 Int_t pdgCode = vParticle->PdgCode();
760 AliMCParticle *McParticle = (AliMCParticle*)
fMC->GetTrack(ipart);
763 if(TMath::Abs(vParticle->Eta())<0.9)
767 fHParGenPion_p->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
768 if(McParticle->GetMother() < eventHeader->NProduced())
fHParGenPion_rmInj_p->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
771 else if(pdgCode==-211)
773 fHParGenPion_m->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
774 if(McParticle->GetMother() < eventHeader->NProduced())
fHParGenPion_rmInj_m->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
781 if(!esdtrack)
continue;
783 if(!newTrack)
continue;
784 if(newTrack->Pt()<0.15 || TMath::Abs(newTrack->Eta())>0.9) {
delete newTrack;
continue;}
786 Int_t cutType = (Int_t)newTrack->GetTRDQuality();
788 if(newTrack->GetLabel()==ipart && TMath::Abs(vParticle->Eta())<0.9)
792 fHDetGenPion_p[cutType]->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
793 fHDetRecPion_p[cutType]->Fill(newTrack->Pt(), newTrack->Eta(), newTrack->Phi());
794 if(McParticle->GetMother() < eventHeader->NProduced())
800 else if(pdgCode==-211)
802 fHDetGenPion_m[cutType]->Fill(vParticle->Pt(), vParticle->Eta(), vParticle->Phi());
803 fHDetRecPion_m[cutType]->Fill(newTrack->Pt(), newTrack->Eta(), newTrack->Phi());
804 if(McParticle->GetMother() < eventHeader->NProduced())
818 Double_t clsE = cluster->E();
819 TArrayI *MCLabels = cluster->GetLabelsArray();
820 AliVParticle* vParticle1 =
fMC->GetTrack(MCLabels->operator[](0));
821 AliVParticle* vParticle2 =
fMC->GetTrack(MCLabels->operator[](1));
823 if(vParticle1->PdgCode()==22 && vParticle2 == vParticle)
825 fHPhotonEdiff0HC->Fill(vParticle1->E(), (vParticle1->E() - clsE)/vParticle1->E());
829 else fHPhotonEdiff30HC->Fill(vParticle1->E(), (vParticle1->E() + 0.3*esdtrack->E() - clsE)/vParticle1->E());
832 else fHPhotonEdiff70HC->Fill(vParticle1->E(), (vParticle1->E() + 0.7*esdtrack->E() - clsE)/vParticle1->E());
835 else fHPhotonEdiff100HC->Fill(vParticle1->E(), (vParticle1->E() + esdtrack->E() - clsE)/vParticle1->E());
838 if(vParticle2->PdgCode()==22 && vParticle1 == vParticle)
840 fHPhotonEdiff0HC->Fill(vParticle2->E(), (vParticle2->E() - clsE)/vParticle2->E());
844 else fHPhotonEdiff30HC->Fill(vParticle2->E(), (vParticle2->E() + 0.3*esdtrack->E() - clsE)/vParticle2->E());
847 else fHPhotonEdiff70HC->Fill(vParticle2->E(), (vParticle2->E() + 0.7*esdtrack->E() - clsE)/vParticle2->E());
850 else fHPhotonEdiff100HC->Fill(vParticle2->E(), (vParticle2->E() + esdtrack->E() - clsE)/vParticle2->E());
854 if(newTrack)
delete newTrack;
857 if(newTrack)
delete newTrack;
868 const Double_t phiMax = 180 * TMath::DegToRad();
869 const Double_t phiMin = 80 * TMath::DegToRad();
870 const Double_t TPCArea= 2*TMath::Pi()*1.8;
871 const Double_t EMCArea = (phiMax-phiMin)*1.4;
879 Double_t eta = trk->Eta();
880 Double_t phi = trk->Phi();
881 if(TMath::Abs(eta)<0.9) PtTPC += trk->Pt();
882 if(TMath::Abs(eta)<0.7 && phi > phiMin && phi < phiMax ) PtEMC += trk->Pt();
885 Double_t EtWithHadCorr = 0;
886 Double_t EtWithoutHadCorr = 0;
887 Double_t vertex[3] = {0, 0, 0};
888 fESD->GetVertex()->GetXYZ(vertex);
889 TLorentzVector gamma;
893 AliESDCaloCluster *cluster = (AliESDCaloCluster*)
fClusterArray->At(i);
894 cluster->GetMomentum(gamma, vertex);
895 Double_t sinTheta = TMath::Sqrt(1-TMath::Power(gamma.CosTheta(),2));
896 EtWithoutHadCorr += cluster->E() * sinTheta;
897 EtWithHadCorr += cluster->GetDispersion() * sinTheta;
902 fHScaleFactor->Fill((PtEMC+EtWithoutHadCorr)/EMCArea * TPCArea/PtTPC);
911 AliESDtrack *newTrack = 0x0;
914 newTrack =
new AliESDtrack(*esdtrack);
915 newTrack->SetTRDQuality(0);
919 if(esdtrack->GetConstrainedParam())
921 newTrack =
new AliESDtrack(*esdtrack);
922 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
923 newTrack->Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
924 newTrack->SetTRDQuality(1);
931 if(esdtrack->GetConstrainedParam())
933 newTrack =
new AliESDtrack(*esdtrack);
934 const AliExternalTrackParam* constrainParam = esdtrack->GetConstrainedParam();
935 newTrack->Set(constrainParam->GetX(),constrainParam->GetAlpha(),constrainParam->GetParameter(),constrainParam->GetCovariance());
936 newTrack->SetTRDQuality(2);
954 if(!vParticle)
return kFALSE;
955 if(!
fMC->IsPhysicalPrimary(ipart))
return kFALSE;
956 if (TMath::Abs(vParticle->Eta())>2)
return kFALSE;
957 if(vParticle->Pt()<0.15)
return kFALSE;
966 if(!cluster)
return kFALSE;
967 if (!cluster->IsEMCAL())
return kFALSE;
982 const AliESDVertex* vtx =
fESD->GetPrimaryVertex();
983 if (!vtx)
return kFALSE;
984 Int_t nContributors = vtx->GetNContributors();
985 Double_t zVertex = vtx->GetZ();
986 if( nContributors < 1 || TMath::Abs(zVertex) >
fZVtxMax )
return kFALSE;
TArrayI * fClusterIndices
selected track index
void ProcessScaleFactor()
Bool_t EsdVertexOk() const
TH2F * fHistEsub1Pch
cluster E vs. truth photon E
void Terminate(Option_t *)
TH2F * fHEMCalResponseElec
same as above for pions
TH2F * fHistEsub1PchRat
(subtracted E in 100% HC) vs. total track P, clusters with 2 matching tracks
TH2F * fHEMCalRecdPhidEtaposEta
same as above with negative truth charge matching
AliESDtrackCuts * fEsdTrackCuts
TObjArray * fClusterArray
cluster with two matched MC track index
AliESDtrackCuts * fHybridTrackCuts1
TH2F * fHPhotonEdiff70HC
(truth E - calculated E in 100% HC)/truth E vs. truth E with photon
TH3F * fHDetGenPion_p[3]
secondary pion tracks pt, phi, eta spectrum
TH3F * fHDetRecPion_rmInj_m[3]
minus charged generated detector level particle(pion) without injected signal pt, phi...
TH2F * fHPhotonEdiff30HC
(truth E - calculated E in 70% HC)/truth E vs. truth E with photon
TH2F * fHPhotonEdiff0HC
(truth E - calculated E in 30% HC)/truth E vs. truth E with photon
TH1F * fHScaleFactor
statistics histo
TH2F * fHEMCalResponseProton
same as above for electrons
Bool_t IsGoodMcParticle(AliVParticle *vParticle, Int_t ipart)
TH2F * fHPhotonEVsClsE
(truth E - cluster E)/truth E vs. truth E with photon
TH2F * fHPhotonEdiff100HC
same as above for negative eta
TH3F * fHDetRecPion_m[3]
minus pion mc detector level pt, phi, eta spectrum
TH3F * fHDetRecSecPion
secondary pion tracks pt, phi, eta spectrum
virtual ~AliAnalysisTaskSOH()
TH3F * fHDetRecFakePion
fake pion tracks pt, phi, eta spectrum
Bool_t fMcProcess
selected cluster array
Double_t fZVtxMax
mv event
ClassImp(AliAnalysisTaskSOH) AliAnalysisTaskSOH
THnSparse * fHClsEoverMcE_Pion
above for electron
THnSparse * fHClsEoverMcE_Elec
above for photon
TH2F * fHEMCalRecdPhidEtanegEta
same as above for positive eta
AliESDtrack * GetAcceptTrack(AliESDtrack *esdtrack)
TH2F * fHEMCalResponsePion
(cluster energy over reconstructed track p) vs. track pt
TH2F * fHEMCalRecdPhidEtaM_Truth
same as above with positive truth charge matching
TH3F * fHParGenPion_rmInj_p
minus pion mc truth pt, phi, eta spectrum
TH3F * fHDetGenSecPion
fake pion tracks pt, phi, eta spectrum
TH2F * fHEMCalRecdPhidEta_Truth
same as above for negative charge tracks
TH3F * fHParGenPion_rmInj_m
plus charged mc truth(pion) without injected signal pt, phi, eta spectrum
TH2F * fHEOverPVsPt
scale factor with 100% HC spectrum
TH1F * fHEventStat
output list
TH2F * fHEMCalRecdPhidEtaP
(EMCal cluster phi - track phi) vs. (EMCal cluster eta - track eta)
TH3F * fHParGenPion_m
plus pion mc truth pt, phi, eta spectrum
TH3F * fHDetRecPion_rmInj_p[3]
plus charged generated detector level particle(pion) without injected signal pt, phi, eta spectrum
void UserExec(Option_t *option)
TH3F * fHDetGenPion_rmInj_m[3]
plus charged reconstructed detector level pion+ track without injected signal pt, phi...
TH3F * fHDetGenPion_m[3]
plus pion reconstructed detector level pt, phi, eta spectrum
TH3F * fHDetGenPion_rmInj_p[3]
minus pion reconstructed detector level pt, phi, eta spectrum
TH2F * fHEMCalRecdPhidEtaM
same as above for positive charge tracks
Bool_t IsGoodCluster(AliESDCaloCluster *cluster)
TH3F * fHDetGenFakePion
minus charged mc truth(pion) without injected signal pt, phi, eta spectrum
TH1F * fHScaleFactor100HC
scale factor spectrum
TH2F * fHEMCalRecdPhidEta
same as above for protons
TH3F * fHDetRecPion_p[3]
plus pion mc detector level pt, phi, eta spectrum
TH2F * fHEMCalRecdPhidEtaP_Truth
same as above with mc truth matching
AliESDtrackCuts * fHybridTrackCuts2
void UserCreateOutputObjects()
THnSparse * fHClsEoverMcE_All
(subtracted E in 100% HC)/total track P vs. total track P, clusters with 2 matching tracks ...
THnSparse * fHClsEoverMcE_Photon
cluster E/MC particle E, cluster with only one matching particle
TH3F * fHParGenPion_p
above for pion
TH2F * fHistEsub2PchRat
(subtracted E in 100% HC)/total track P vs. total track P, clusters with 1 matching track ...
TH2F * fHistEsub2Pch
(subtracted E in 100% HC) vs. total track P, clusters with 1 matching track
AliMCEvent * fMC
esd event