20 #include <TClonesArray.h>
22 #include <THashList.h>
34 #include "AliAnalysisManager.h"
35 #include "AliAnalysisUtils.h"
36 #include "AliAODMCHeader.h"
37 #include "AliAODInputHandler.h"
38 #include "AliAODMCParticle.h"
39 #include "AliAODTrack.h"
43 #include "AliEMCALTriggerPatchInfo.h"
44 #include "AliEMCALGeometry.h"
45 #include "AliEMCALRecoUtils.h"
46 #include "AliESDEvent.h"
47 #include "AliESDtrack.h"
48 #include "AliGenPythiaEventHeader.h"
49 #include "AliInputEventHandler.h"
50 #include "AliMCEvent.h"
51 #include "AliVVertex.h"
60 namespace EMCalTriggerPtAnalysis {
65 AliAnalysisTaskChargedParticlesRefMC::AliAnalysisTaskChargedParticlesRefMC():
75 fEtaLabCut(-0.6, 0.6),
76 fEtaCmsCut(-0.13, 0.13),
97 fEtaLabCut(-0.6, 0.6),
98 fEtaCmsCut(-0.13, 0.13),
125 TString triggers[7] = {
"True",
"MB",
"EMC7",
"EJ1",
"EJ2",
"EG1",
"EG2"};
126 Double_t ptcuts[5] = {1., 2., 5., 10., 20.};
127 TString species[6] = {
"El",
"Mu",
"Pi",
"Ka",
"Pr",
"Ot"};
128 for(
TString *trg = triggers; trg < triggers +
sizeof(triggers)/
sizeof(
TString); trg++){
129 fHistos->
CreateTH1(Form(
"hEventCount%s", trg->Data()), Form(
"Event Counter for trigger class %s", trg->Data()), 1, 0.5, 1.5);
130 fHistos->
CreateTH1(Form(
"hVertexBefore%s", trg->Data()), Form(
"Vertex distribution before z-cut for trigger class %s", trg->Data()), 500, -50, 50);
131 fHistos->
CreateTH1(Form(
"hVertexAfter%s", trg->Data()), Form(
"Vertex distribution after z-cut for trigger class %s", trg->Data()), 100, -10, 10);
132 fHistos->
CreateTH1(Form(
"hPtEtaAll%s", trg->Data()), Form(
"Charged particle pt distribution all eta trigger %s", trg->Data()), newbinning);
133 fHistos->
CreateTH1(Form(
"hPtEtaCent%s", trg->Data()), Form(
"Charged particle pt distribution central eta trigger %s", trg->Data()), newbinning);
134 fHistos->
CreateTH1(Form(
"hPtEMCALEtaAll%s", trg->Data()), Form(
"Charged particle in EMCAL pt distribution all eta trigger %s", trg->Data()), newbinning);
135 fHistos->
CreateTH1(Form(
"hPtEMCALEtaCent%s", trg->Data()), Form(
"Charged particle in EMCAL pt distribution central eta trigger %s", trg->Data()), newbinning);
136 fHistos->
CreateTH1(Form(
"hPtEMCALNoTRDEtaAll%s", trg->Data()), Form(
"Charged particle in EMCAL (no TRD in front) pt distribution all eta trigger %s", trg->Data()), newbinning);
137 fHistos->
CreateTH1(Form(
"hPtEMCALNoTRDEtaCent%s", trg->Data()), Form(
"Charged particle in EMCAL (no TRD in front) pt distribution central eta trigger %s", trg->Data()), newbinning);
138 fHistos->
CreateTH1(Form(
"hPtEMCALWithTRDEtaAll%s", trg->Data()), Form(
"Charged particle in EMCAL (with TRD in front) pt distribution all eta trigger %s", trg->Data()), newbinning);
139 fHistos->
CreateTH1(Form(
"hPtEMCALWithTRDEtaCent%s", trg->Data()), Form(
"Charged particle in EMCAL (with TRD in front) pt distribution central eta trigger %s", trg->Data()), newbinning);
140 for(
TString *piditer = species; piditer < species +
sizeof(species)/
sizeof(
TString); ++piditer){
141 fHistos->
CreateTH1(Form(
"hPtEtaAll%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s pt distribution all eta trigger %s", piditer->Data(), trg->Data()), newbinning);
142 fHistos->
CreateTH1(Form(
"hPtEtaCent%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s pt distribution central eta trigger %s", piditer->Data(), trg->Data()), newbinning);
143 fHistos->
CreateTH1(Form(
"hPtEMCALEtaAll%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s in EMCAL pt distribution all eta trigger %s", piditer->Data(), trg->Data()), newbinning);
144 fHistos->
CreateTH1(Form(
"hPtEMCALEtaCent%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s in EMCAL pt distribution central eta trigger %s", piditer->Data(), trg->Data()), newbinning);
145 fHistos->
CreateTH1(Form(
"hPtEMCALNoTRDEtaAll%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s in EMCAL (no TRD in front) pt distribution all eta trigger %s", piditer->Data(), trg->Data()), newbinning);
146 fHistos->
CreateTH1(Form(
"hPtEMCALNoTRDEtaCent%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s in EMCAL (no TRD in front) pt distribution central eta trigger %s", piditer->Data(), trg->Data()), newbinning);
147 fHistos->
CreateTH1(Form(
"hPtEMCALWithTRDEtaAll%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s in EMCAL (with TRD in front) pt distribution all eta trigger %s", piditer->Data(), trg->Data()), newbinning);
148 fHistos->
CreateTH1(Form(
"hPtEMCALWithTRDEtaCent%s%s", piditer->Data(), trg->Data()), Form(
"Charged %s in EMCAL (with TRD in front) pt distribution central eta trigger %s", piditer->Data(), trg->Data()), newbinning);
150 for(
int ipt = 0; ipt < 5; ipt++){
152 Form(
"hEtaLabDistAllPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
153 Form(
"Eta (lab) distribution without etacut for tracks with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
159 Form(
"hEtaLabDistCutPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
160 Form(
"Eta (lab) distribution with etacut for tracks with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
166 Form(
"hEtaCentDistAllPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
167 Form(
"Eta (cent) distribution without etacut for tracks with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
173 Form(
"hEtaCentDistCutPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
174 Form(
"Eta (cent) distribution with etacut for tracks with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
180 Form(
"hEtaLabDistAllEMCALPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
181 Form(
"Eta (lab) distribution without etacut for tracks in EMCAL with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
187 Form(
"hEtaLabDistCutEMCALPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
188 Form(
"Eta (lab) distribution with etacut for tracks in EMCAL with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
194 Form(
"hEtaCentDistAllEMCALPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
195 Form(
"Eta (cent) distribution without etacut for tracks in EMCAL with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
201 Form(
"hEtaCentDistCutEMCALPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
202 Form(
"Eta (cent) distribution with etacut for tracks in EMCAL with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
208 Form(
"hPhiDistAllPt%d%s", static_cast<Int_t>(ptcuts[ipt]), trg->Data()),
209 Form(
"#phi distribution of particles with Pt above %.1f GeV/c trigger %s", ptcuts[ipt], trg->Data()),
223 AliDebugStream(1) << GetName() <<
": Using custom event selection" << std::endl;
224 if(!MCEvent())
return false;
237 if((isMinBias = fInputHandler->IsEventSelected() & AliVEvent::kINT7))
fEventTriggers.push_back(
"MB");
252 AliDebugStream(1) << GetName() <<
": No trigger selected" << std::endl;
255 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
256 if(vtx->GetNContributors() < 1)
return false;
263 if(vtx->GetZ() < -10. || vtx->GetZ() > 10.)
return false;
269 for(
const auto &trg : fEventTriggers){
286 AliVParticle *truepart = NULL;
288 for(
int ipart = 0; ipart < fMCEvent->GetNumberOfTracks(); ipart++){
289 truepart = fMCEvent->GetTrack(ipart);
293 if(TMath::Abs(truepart->Pt()) < 0.1)
continue;
294 if(!truepart->Charge())
continue;
297 isEMCAL = (truepart->Phi() > 1.5 && truepart->Phi() < 3.1) ? kTRUE : kFALSE;
309 switch(TMath::Abs(truepart->PdgCode())){
310 case kPiPlus: pid =
"Pi";
break;
311 case kMuonMinus: pid =
"Mu";
break;
312 case kElectron: pid =
"El";
break;
313 case kKPlus: pid =
"Ka";
break;
314 case kProton: pid =
"Pr";
break;
315 default: pid =
"Ot";
break;
329 AliVTrack *checktrack(NULL);
330 AliVParticle *assocMC(NULL);
331 double ptparticle(-1.), etaparticle(-100.), etaEMCAL(0.), phiEMCAL(0.);
333 for(
int itrk = 0; itrk < fInputEvent->GetNumberOfTracks(); ++itrk){
334 checktrack =
dynamic_cast<AliVTrack *
>(fInputEvent->GetTrack(itrk));
335 if(!checktrack)
continue;
337 assocMC = fMCEvent->GetTrack(TMath::Abs(checktrack->GetLabel()));
338 if(!assocMC)
continue;
343 if(TMath::Abs(checktrack->Pt()) < 0.1)
continue;
344 if(checktrack->IsA() == AliESDtrack::Class()){
345 AliESDtrack copytrack(*(static_cast<AliESDtrack *>(checktrack)));
346 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
347 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
348 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
350 AliAODTrack copytrack(*(static_cast<AliAODTrack *>(checktrack)));
351 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
352 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
353 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
355 Int_t supermoduleID = -1;
356 isEMCAL =
fGeom->SuperModuleNumberFromEtaPhi(etaEMCAL, phiEMCAL, supermoduleID);
358 isEMCAL = isEMCAL && supermoduleID < 10;
359 hasTRD = isEMCAL && supermoduleID >= 4;
363 ptparticle = TMath::Abs(assocMC->Pt());
364 etaparticle = assocMC->Eta();
376 switch(TMath::Abs(assocMC->PdgCode())){
377 case kPiPlus: assocpid =
"Pi";
break;
378 case kMuonMinus: assocpid =
"Mu";
break;
379 case kElectron: assocpid =
"El";
break;
380 case kKPlus: assocpid =
"Ka";
break;
381 case kProton: assocpid =
"Pr";
break;
382 default: assocpid =
"Ot";
break;
402 const char *eventclass,
414 fHistos->
FillTH1(Form(
"hPtEtaAll%s", eventclass), TMath::Abs(pt), weight);
415 fHistos->
FillTH1(Form(
"hPtEtaAll%s%s", pid, eventclass), TMath::Abs(pt), weight);
417 fHistos->
FillTH1(Form(
"hPtEMCALEtaAll%s", eventclass), TMath::Abs(pt), weight);
418 fHistos->
FillTH1(Form(
"hPtEMCALEtaAll%s%s", pid, eventclass), TMath::Abs(pt), weight);
420 fHistos->
FillTH1(Form(
"hPtEMCALWithTRDEtaAll%s", eventclass), TMath::Abs(pt), weight);
421 fHistos->
FillTH1(Form(
"hPtEMCALWithTRDEtaAll%s%s", pid, eventclass), TMath::Abs(pt), weight);
423 fHistos->
FillTH1(Form(
"hPtEMCALNoTRDEtaAll%s", eventclass), TMath::Abs(pt), weight);
424 fHistos->
FillTH1(Form(
"hPtEMCALNoTRDEtaAll%s%s", pid, eventclass), TMath::Abs(pt), weight);
428 int ptmin[5] = {1,2,5,10,20};
429 for(
int icut = 0; icut < 5; icut++){
430 if(TMath::Abs(pt) > static_cast<double>(ptmin[icut])){
431 fHistos->
FillTH1(Form(
"hPhiDistAllPt%d%s", ptmin[icut], eventclass), phi, weight);
432 fHistos->
FillTH1(Form(
"hEtaLabDistAllPt%d%s", ptmin[icut], eventclass), etalab, weight);
433 fHistos->
FillTH1(Form(
"hEtaCentDistAllPt%d%s", ptmin[icut], eventclass), etacent, weight);
435 fHistos->
FillTH1(Form(
"hEtaLabDistAllEMCALPt%d%s", ptmin[icut], eventclass), etalab, weight);
436 fHistos->
FillTH1(Form(
"hEtaCentDistAllEMCALPt%d%s", ptmin[icut], eventclass), etacent, weight);
442 fHistos->
FillTH1(Form(
"hPtEtaCent%s", eventclass), TMath::Abs(pt), weight);
443 fHistos->
FillTH1(Form(
"hPtEtaCent%s%s", pid, eventclass), TMath::Abs(pt), weight);
445 fHistos->
FillTH1(Form(
"hPtEMCALEtaCent%s", eventclass), TMath::Abs(pt), weight);
446 fHistos->
FillTH1(Form(
"hPtEMCALEtaCent%s%s", pid, eventclass), TMath::Abs(pt), weight);
448 fHistos->
FillTH1(Form(
"hPtEMCALWithTRDEtaCent%s", eventclass), TMath::Abs(pt), weight);
449 fHistos->
FillTH1(Form(
"hPtEMCALWithTRDEtaCent%s%s", pid, eventclass), TMath::Abs(pt), weight);
451 fHistos->
FillTH1(Form(
"hPtEMCALNoTRDEtaCent%s", eventclass), TMath::Abs(pt), weight);
452 fHistos->
FillTH1(Form(
"hPtEMCALNoTRDEtaCent%s%s", pid, eventclass), TMath::Abs(pt), weight);
455 for(
int icut = 0; icut < 5; icut++){
456 if(TMath::Abs(pt) > static_cast<double>(ptmin[icut])){
457 fHistos->
FillTH1(Form(
"hEtaLabDistCutPt%d%s", ptmin[icut], eventclass), etalab, weight);
458 fHistos->
FillTH1(Form(
"hEtaCentDistCutPt%d%s", ptmin[icut], eventclass), etacent, weight);
460 fHistos->
FillTH1(Form(
"hEtaLabDistCutEMCALPt%d%s", ptmin[icut], eventclass), etalab, weight);
461 fHistos->
FillTH1(Form(
"hEtaCentDistCutEMCALPt%d%s", ptmin[icut], eventclass), etacent, weight);
487 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0;
488 double minADC_EJ1 = 260.,
492 for(TIter patchIter = TIter(triggerpatches).Begin(); patchIter != TIter::End(); ++patchIter){
493 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(*patchIter);
494 if(!patch->IsOfflineSimple())
continue;
495 if(patch->IsJetHighSimple() && patch->GetADCOfflineAmp() > minADC_EJ1) nEJ1++;
496 if(patch->IsJetLowSimple() && patch->GetADCOfflineAmp() > minADC_EJ2) nEJ2++;
497 if(patch->IsGammaHighSimple() && patch->GetADCOfflineAmp() > minADC_EG1) nEG1++;
498 if(patch->IsGammaLowSimple() && patch->GetADCOfflineAmp() > minADC_EG2) nEG2++;
500 if(nEJ1) triggerstring +=
"EJ1";
502 if(triggerstring.Length()) triggerstring +=
",";
503 triggerstring +=
"EJ2";
506 if(triggerstring.Length()) triggerstring +=
",";
507 triggerstring +=
"EG1";
510 if(triggerstring.Length()) triggerstring +=
",";
511 triggerstring +=
"EG2";
513 return triggerstring;
526 const AliAODMCParticle *aodmc =
dynamic_cast<const AliAODMCParticle *
>(part);
528 physprim = aodmc->IsPhysicalPrimary();
530 physprim = mcevent->IsPhysicalPrimary(part->GetLabel());
const AliEMCalTriggerWeightHandler * fWeightHandler
Weight handler (optional)
Bool_t fIsPythia
trigger, if it is a PYTHIA production
AliAnalysisTaskChargedParticlesRefMC()
std::vector< std::string > fEventTriggers
! Temporary container for selected triggers
AliCutValueRange< double > fEtaLabCut
Cut applied in Eta Lab frame.
static AliEmcalTrackSelection * TrackCutsFactory(TString name, Bool_t isAOD)
Base task in the EMCAL framework.
void AddStep(Double_t max, Double_t binwidth)
Double_t fYshift
Rapidity shift.
virtual bool IsEventSelected()
void SetCaloTriggerPatchInfoName(const char *n)
AliCutValueRange< double > fEtaCmsCut
Cut applied in Eta centre-of-mass frame.
AliEmcalTriggerOfflineSelection * fTriggerSelection
Offline trigger selection.
THashList * GetListOfHistograms() const
AliEMCALGeometry * fGeom
!emcal geometry
THistManager * fHistos
Histogram manager.
Bool_t IsPhysicalPrimary(const AliVParticle *const part, AliMCEvent *const mcevent)
AliGenPythiaEventHeader * fPythiaHeader
!event Pythia header
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
AliAnalysisUtils * fAliAnalysisUtils
!vertex selection (optional)
Helper class creating user defined custom binning.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
virtual ~AliAnalysisTaskChargedParticlesRefMC()
Bool_t IsOfflineSelected(EmcalTriggerClass trgcls, const TClonesArray *const triggerpatches) const
Unit test class for charged particle distributions (MC case)
double GetEventWeight(const AliMCEvent *const event) const
AliEmcalList * fOutput
!output list
void FillTrackHistos(const char *eventclass, Double_t weight, Double_t pt, Double_t eta, Double_t etacent, Double_t phi, Bool_t etacut, Bool_t inEmcal, Bool_t hasTRD, const char *pid)
AliEmcalTrackSelection * fTrackCuts
Standard track selection.
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
TString GetFiredTriggerClasses(const TClonesArray *triggerpatches)
TClonesArray * fTriggerPatchInfo
!trigger patch info array
void SetNeedEmcalGeom(Bool_t n)
Double_t fEtaSign
Sign of the eta distribution (swaps when beam directions swap): p-Pb: +1, Pb-p: -1.
Container class for histograms for the high- charged particle analysis.
Double_t fEventWeight
Event weight.
virtual void UserCreateOutputObjects()
void InitializeTrackCuts(TString cutname, bool isAOD)
void SetTrackSelection(AliEmcalTrackSelection *sel)
virtual bool IsTrackAccepted(AliVTrack *const trk)=0
bool IsInRange(t value) const
void SetMinimum(Double_t min)