19 #include <TClonesArray.h>
20 #include <THashList.h>
29 #include "AliAnalysisDataContainer.h"
30 #include "AliAnalysisManager.h"
31 #include "AliAnalysisUtils.h"
32 #include "AliAODMCHeader.h"
33 #include "AliAODInputHandler.h"
34 #include "AliAODMCParticle.h"
35 #include "AliAODTrack.h"
40 #include "AliEMCALTriggerPatchInfo.h"
41 #include "AliEMCALGeometry.h"
42 #include "AliEMCALRecoUtils.h"
43 #include "AliESDEvent.h"
44 #include "AliESDtrack.h"
45 #include "AliGenPythiaEventHeader.h"
46 #include "AliInputEventHandler.h"
47 #include "AliMCEvent.h"
48 #include "AliOADBContainer.h"
49 #include "AliVEvent.h"
50 #include "AliVEventHandler.h"
51 #include "AliVVertex.h"
60 namespace EMCalTriggerPtAnalysis {
62 AliAnalysisTaskChargedParticlesRefMC::AliAnalysisTaskChargedParticlesRefMC():
72 fEtaLabCut(-0.5, 0.5),
74 fPhiCut(0., TMath::TwoPi()),
95 fEtaLabCut(-0.5, 0.5),
97 fPhiCut(0., TMath::TwoPi()),
101 fNameAcceptanceOADB()
110 if(fTriggerSelection)
delete fTriggerSelection;
111 if(fHistos)
delete fHistos;
120 if(!fTrackCuts)
InitializeTrackCuts(
"standard",fInputHandler->IsA() == AliAODInputHandler::Class());
122 PtBinning newbinning;
123 TString optionstring = fEnableSumw2 ?
"s" :
"";
125 fHistos->CreateTH1(
"hPtHard",
"Pt of the hard interaction", 1000, 0., 500);
126 const std::array<TString,7> triggers = {
"True",
"MB",
"EMC7",
"EJ1",
"EJ2",
"EG1",
"EG2"};
127 const std::array<TString,6> species = {
"El",
"Mu",
"Pi",
"Ka",
"Pr",
"Ot"};
128 for(
const auto &trg : triggers){
129 fHistos->CreateTH1(Form(
"hEventCount%s", trg.Data()), Form(
"Event Counter for trigger class %s", trg.Data()), 1, 0.5, 1.5, optionstring);
130 fHistos->CreateTH1(Form(
"hVertexBefore%s", trg.Data()), Form(
"Vertex distribution before z-cut for trigger class %s", trg.Data()), 500, -50, 50, optionstring);
131 fHistos->CreateTH1(Form(
"hVertexAfter%s", trg.Data()), Form(
"Vertex distribution after z-cut for trigger class %s", trg.Data()), 100, -10, 10, optionstring);
133 fHistos->CreateTH3(Form(
"hPtEtaPhiAll%s", trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted tracks for trigger %s; p_{t} (GeV/c); #eta; #phi", trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
134 fHistos->CreateTH3(Form(
"hPtEtaPhiEMCALAll%s", trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted tracks pointing to the EMCAL for trigger %s; p_{t} (GeV/c); #eta; #phi", trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
135 fHistos->CreateTH3(Form(
"hPtEtaPhiCent%s", trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted tracks for trigger %s; p_{t} (GeV/c); #eta; #phi", trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
136 fHistos->CreateTH3(Form(
"hPtEtaPhiEMCALCent%s", trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted tracks pointing to the EMCAL for trigger %s; p_{t} (GeV/c); #eta; #phi", trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
139 for(
const auto &pid : species){
140 fHistos->CreateTH3(Form(
"hPtEtaPhiAll%s%s", pid.Data(), trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted %s for trigger %s; p_{t} (GeV/c); #eta; #phi", pid.Data(), trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
141 fHistos->CreateTH3(Form(
"hPtEtaPhiEMCALAll%s%s", pid.Data(), trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted %s pointing to the EMCAL for trigger %s; p_{t} (GeV/c); #eta; #phi", pid.Data(), trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
142 fHistos->CreateTH3(Form(
"hPtEtaPhiCent%s%s", pid.Data(), trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted %s for trigger %s; p_{t} (GeV/c); #eta; #phi", pid.Data(), trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
143 fHistos->CreateTH3(Form(
"hPtEtaPhiEMCALCent%s%s", pid.Data(), trg.Data()), Form(
"p_{t}-#eta-#phi distribution of all accepted %s pointing to the EMCAL for trigger %s; p_{t} (GeV/c); #eta; #phi", pid.Data(), trg.Data()), newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
148 for(
auto hist : *(fHistos->GetListOfHistograms())){
156 fEventTriggers.clear();
157 AliDebugStream(1) << GetName() <<
": Using custom event selection" << std::endl;
158 if(!MCEvent())
return false;
160 fEventWeight = fWeightHandler ? fWeightHandler->GetEventWeight(
fPythiaHeader) : 1.;
170 if((isMinBias = fInputHandler->IsEventSelected() & AliVEvent::kINT7)) fEventTriggers.push_back(
"MB");
174 fEventTriggers.push_back(
"EMC7");
176 fEventTriggers.push_back(
"EJ1");
178 fEventTriggers.push_back(
"EJ2");
180 fEventTriggers.push_back(
"EG1");
182 fEventTriggers.push_back(
"EG2");
184 if(!fEventTriggers.size()){
185 AliDebugStream(1) << GetName() <<
": No trigger selected" << std::endl;
188 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
189 if(vtx->GetNContributors() < 1)
return false;
193 fHistos->FillTH1(
"hVertexBeforeTrue", vtx->GetZ(), fEventWeight);
194 for(
const auto &trg : fEventTriggers) fHistos->FillTH1(Form(
"hVertexBefore%s", trg.Data()), vtx->GetZ(), fEventWeight);
196 if(vtx->GetZ() < -10. || vtx->GetZ() > 10.)
return false;
200 fHistos->FillTH1(
"hEventCountTrue", 1, fEventWeight);
201 fHistos->FillTH1(
"hVertexAfterTrue", vtx->GetZ(), fEventWeight);
202 for(
const auto &trg : fEventTriggers){
203 fHistos->FillTH1(Form(
"hEventCount%s", trg.Data()), 1, fEventWeight);
204 fHistos->FillTH1(Form(
"hVertexAfter%s", trg.Data()), vtx->GetZ(), fEventWeight);
214 AliErrorStream() << GetName() <<
": Failed initializing AliAnalysisTaskEmcal" << std::endl;
219 if(fNameAcceptanceOADB.Length() && fTriggerSelection){
220 AliDebugStream(1) << GetName() <<
": Loading acceptance map from OADB file " << fNameAcceptanceOADB << std::endl;
221 AliOADBContainer acceptanceCont(
"AliEmcalTriggerAcceptance");
222 acceptanceCont.InitFromFile(fNameAcceptanceOADB.Data(),
"AliEmcalTriggerAcceptance");
223 TObjArray *acceptanceMaps =
dynamic_cast<TObjArray *
>(acceptanceCont.GetObject(fInputEvent->GetRunNumber()));
225 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG1")))){
226 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG1" << std::endl;
227 map->SetDirectory(
nullptr);
230 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG2")))){
231 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG2" << std::endl;
232 map->SetDirectory(
nullptr);
235 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG1")))){
236 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG1" << std::endl;
237 map->SetDirectory(
nullptr);
240 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG2")))){
241 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG2" << std::endl;
242 map->SetDirectory(
nullptr);
245 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ1")))){
246 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ1" << std::endl;
247 map->SetDirectory(
nullptr);
250 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ2")))){
251 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ2" << std::endl;
252 map->SetDirectory(
nullptr);
255 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ1")))){
256 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ1" << std::endl;
257 map->SetDirectory(
nullptr);
260 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ2")))){
261 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ2" << std::endl;
262 map->SetDirectory(
nullptr);
276 AliVParticle *truepart = NULL;
278 for(
int ipart = 0; ipart < fMCEvent->GetNumberOfTracks(); ipart++){
279 truepart = fMCEvent->GetTrack(ipart);
282 if(!fEtaLabCut.IsInRange(truepart->Eta()))
continue;
283 if(!fPhiCut.IsInRange(truepart->Phi()))
continue;
284 if(TMath::Abs(truepart->Pt()) < 0.1)
continue;
285 if(!truepart->Charge())
continue;
287 if(!IsPhysicalPrimary(truepart, fMCEvent))
continue;
288 isEMCAL = (truepart->Phi() > 1.5 && truepart->Phi() < 3.1) ? kTRUE : kFALSE;
293 Double_t etacent = -1. * truepart->Eta() - TMath::Abs(fYshift);
296 if(!fEtaCmsCut.IsInRange(etacent))
continue;
301 switch(TMath::Abs(truepart->PdgCode())){
302 case kPiPlus: pid =
"Pi";
break;
303 case kMuonMinus: pid =
"Mu";
break;
304 case kElectron: pid =
"El";
break;
305 case kKPlus: pid =
"Ka";
break;
306 case kProton: pid =
"Pr";
break;
307 default: pid =
"Ot";
break;
312 FillTrackHistos(
"True", fEventWeight, truepart->Pt(), truepart->Eta() * fEtaSign, etacent, truepart->Phi(), isEMCAL, pid);
322 AliVTrack *checktrack(NULL);
323 AliVParticle *assocMC(NULL);
324 double ptparticle(-1.), etaparticle(-100.), etaEMCAL(0.), phiEMCAL(0.);
326 for(
int itrk = 0; itrk < fInputEvent->GetNumberOfTracks(); ++itrk){
327 checktrack =
dynamic_cast<AliVTrack *
>(fInputEvent->GetTrack(itrk));
328 if(!checktrack)
continue;
330 assocMC = fMCEvent->GetTrack(TMath::Abs(checktrack->GetLabel()));
331 if(!assocMC)
continue;
332 if(!IsPhysicalPrimary(assocMC, fMCEvent))
continue;
335 if(!fEtaLabCut.IsInRange(checktrack->Eta()))
continue;
336 if(!fPhiCut.IsInRange(checktrack->Phi()))
continue;
337 if(TMath::Abs(checktrack->Pt()) < 0.1)
continue;
338 if(checktrack->IsA() == AliESDtrack::Class()){
339 AliESDtrack copytrack(*(static_cast<AliESDtrack *>(checktrack)));
340 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
341 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
342 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
344 AliAODTrack copytrack(*(static_cast<AliAODTrack *>(checktrack)));
345 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
346 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
347 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
349 Int_t supermoduleID = -1;
350 isEMCAL =
fGeom->SuperModuleNumberFromEtaPhi(etaEMCAL, phiEMCAL, supermoduleID);
352 isEMCAL = isEMCAL && supermoduleID < 10;
353 hasTRD = isEMCAL && supermoduleID >= 4;
355 if(!fTrackCuts->IsTrackAccepted(checktrack))
continue;
357 ptparticle = TMath::Abs(assocMC->Pt());
358 etaparticle = assocMC->Eta();
363 Double_t etacent = -1. * checktrack->Eta() - TMath::Abs(fYshift);
366 if(!fEtaCmsCut.IsInRange(etacent))
continue;
371 switch(TMath::Abs(assocMC->PdgCode())){
372 case kPiPlus: assocpid =
"Pi";
break;
373 case kMuonMinus: assocpid =
"Mu";
break;
374 case kElectron: assocpid =
"El";
break;
375 case kKPlus: assocpid =
"Ka";
break;
376 case kProton: assocpid =
"Pr";
break;
377 default: assocpid =
"Ot";
break;
380 for(
const auto &trg : fEventTriggers)
381 FillTrackHistos(trg, fEventWeight, ptparticle, checktrack->Eta() * fEtaSign, etacent, checktrack->Phi(), isEMCAL, assocpid);
386 void AliAnalysisTaskChargedParticlesRefMC::FillTrackHistos(
398 double kinepointall[3] = {TMath::Abs(pt), etalab, phi}, kinepointcent[3] = {TMath::Abs(pt), etacent, phi};
399 fHistos->FillTH3(Form(
"hPtEtaPhiAll%s", eventclass.Data()), kinepointall, weight);
400 fHistos->FillTH3(Form(
"hPtEtaPhiCent%s", eventclass.Data()), kinepointcent, weight);
401 fHistos->FillTH3(Form(
"hPtEtaPhiAll%s%s", pid.Data(), eventclass.Data()), kinepointall, weight);
402 fHistos->FillTH3(Form(
"hPtEtaPhiCent%s%s", pid.Data(), eventclass.Data()), kinepointcent, weight);
405 fHistos->FillTH3(Form(
"hPtEtaPhiEMCALAll%s", eventclass.Data()), kinepointall, weight);
406 fHistos->FillTH3(Form(
"hPtEtaPhiEMCALCent%s", eventclass.Data()), kinepointall, weight);
407 fHistos->FillTH3(Form(
"hPtEtaPhiEMCALAll%s%s", pid.Data(), eventclass.Data()), kinepointall, weight);
408 fHistos->FillTH3(Form(
"hPtEtaPhiEMCALCent%s%s", pid.Data(), eventclass.Data()), kinepointall, weight);
419 TString AliAnalysisTaskChargedParticlesRefMC::GetFiredTriggerClasses(
const TClonesArray* triggerpatches) {
421 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0;
422 double minADC_EJ1 = 260.,
426 for(TIter patchIter = TIter(triggerpatches).Begin(); patchIter != TIter::End(); ++patchIter){
427 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(*patchIter);
428 if(!patch->IsOfflineSimple())
continue;
429 if(patch->IsJetHighSimple() && patch->GetADCOfflineAmp() > minADC_EJ1) nEJ1++;
430 if(patch->IsJetLowSimple() && patch->GetADCOfflineAmp() > minADC_EJ2) nEJ2++;
431 if(patch->IsGammaHighSimple() && patch->GetADCOfflineAmp() > minADC_EG1) nEG1++;
432 if(patch->IsGammaLowSimple() && patch->GetADCOfflineAmp() > minADC_EG2) nEG2++;
434 if(nEJ1) triggerstring +=
"EJ1";
436 if(triggerstring.Length()) triggerstring +=
",";
437 triggerstring +=
"EJ2";
440 if(triggerstring.Length()) triggerstring +=
",";
441 triggerstring +=
"EG1";
444 if(triggerstring.Length()) triggerstring +=
",";
445 triggerstring +=
"EG2";
447 return triggerstring;
450 Bool_t AliAnalysisTaskChargedParticlesRefMC::IsPhysicalPrimary(
const AliVParticle*
const part, AliMCEvent*
const mcevent) {
452 const AliAODMCParticle *aodmc =
dynamic_cast<const AliAODMCParticle *
>(part);
454 physprim = aodmc->IsPhysicalPrimary();
456 physprim = mcevent->IsPhysicalPrimary(part->GetLabel());
464 TString taskname =
"chargedParticleMCQA_" + name;
471 TString outfile(mgr->GetCommonFileName());
472 outfile +=
":ChargedParticleQA_" + name;
474 task->ConnectInput(0, mgr->GetCommonInputContainer());
475 mgr->ConnectOutput(task, 1, mgr->CreateContainer(Form(
"TrackResults_%s", name.Data()), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
501 mgr->GetInputEventHandler()->IsA() == AliAODInputHandler::Class()
505 TString outfile(mgr->GetCommonFileName());
506 outfile +=
":ChargedParticleQA" + cutname;
508 task->ConnectInput(0, mgr->GetCommonInputContainer());
509 mgr->ConnectOutput(task, 1, mgr->CreateContainer(Form(
"TrackResults_%s", cutname.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
517 AliAnalysisTaskChargedParticlesRefMC::PtBinning::PtBinning() :
520 this->SetMinimum(0.);
521 this->AddStep(1, 0.05);
522 this->AddStep(2, 0.1);
523 this->AddStep(4, 0.2);
524 this->AddStep(7, 0.5);
525 this->AddStep(16, 1);
526 this->AddStep(36, 2);
527 this->AddStep(40, 4);
528 this->AddStep(50, 5);
529 this->AddStep(100, 10);
530 this->AddStep(200, 20);
EMCAL L1 Jet trigger, low threshold.
void SetJetPtFactor(Float_t f)
void SetTrackPtFactor(Float_t f)
Bool_t fIsPythia
trigger, if it is a PYTHIA production
void SetOfflineTriggerSelection(AliEmcalTriggerOfflineSelection *sel)
AliAnalysisTaskChargedParticlesRefMC()
Class creating a linear binning, used in the histogram manager.
static AliEmcalTrackSelection * TrackCutsFactory(TString name, Bool_t isAOD)
Base task in the EMCAL framework.
Bool_t fLocalInitialized
whether or not the task has been already initialized
DCAL L1 Jet trigger, high threshold.
EMCAL L1 Gamma trigger, high threshold.
void SetCaloTriggerPatchInfoName(const char *n)
EMCAL L1 Jet trigger, high threshold.
AliEMCALGeometry * fGeom
!emcal geometry
static AliAnalysisTaskChargedParticlesRefMC * AddTaskChargedParticlesRefMCDefault(const TString &cutname="standard")
AliGenPythiaEventHeader * fPythiaHeader
!event Pythia header
AliAnalysisUtils * fAliAnalysisUtils
!vertex selection (optional)
Helper class creating user defined custom binning.
DCAL L1 Gamma trigger, high threshold.
EMCAL L1 Gamma trigger, low threshold.
virtual ~AliAnalysisTaskChargedParticlesRefMC()
Test class for charged particle distributions (MC case)
virtual Bool_t IsEventSelected()
AliEmcalList * fOutput
!output list
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
void SetMakeGeneralHistograms(Bool_t g)
TClonesArray * fTriggerPatchInfo
!trigger patch info array
void SetNeedEmcalGeom(Bool_t n)
Container class for histograms.
void UserCreateOutputObjects()
virtual void UserCreateOutputObjects()
static AliEmcalTriggerOfflineSelection * TriggerSelectionFactory(Double_t el0, Double_t eg1, Double_t eg2, Double_t ej1, Double_t ej2)
static AliAnalysisTaskChargedParticlesRefMC * AddTaskChargedParticlesRefMC(const TString &suffix)
void InitializeTrackCuts(TString cutname, bool isAOD)
void SetTrackSelection(AliEmcalTrackSelection *sel)