20 #include <TClonesArray.h>
23 #include <THashList.h>
25 #include <TObjArray.h>
26 #include <TParameter.h>
28 #include "AliAnalysisUtils.h"
29 #include "AliESDEvent.h"
30 #include "AliEMCALTriggerPatchInfo.h"
32 #include "AliInputEventHandler.h"
34 #include "AliMultSelection.h"
35 #include "AliMultEstimator.h"
36 #include "AliOADBContainer.h"
44 namespace EMCalTriggerPtAnalysis {
49 AliAnalysisTaskEmcalPatchesRef::AliAnalysisTaskEmcalPatchesRef() :
54 fRequestAnalysisUtil(kTRUE),
55 fTriggerStringFromPatches(kFALSE),
56 fCentralityRange(-999., 999.),
57 fVertexRange(-999., 999.),
58 fRequestCentrality(false),
59 fNameDownscaleOADB(
""),
75 fRequestAnalysisUtil(kTRUE),
76 fTriggerStringFromPatches(kFALSE),
77 fCentralityRange(-999., 999.),
78 fVertexRange(-999., 999.),
79 fRequestCentrality(false),
80 fNameDownscaleOADB(
""),
99 AliInfoStream() <<
"Creating histograms for task " << GetName() << std::endl;
106 std::array<TString, 21> triggers = {
"MB",
"EMC7",
"DMC7",
107 "EJ1",
"EJ2",
"EG1",
"EG2",
"DJ1",
"DJ2",
"DG1",
"DG2",
108 "EMC7excl",
"DMC7excl",
"EG2excl",
"EJ2excl",
"DG2excl",
"DJ2excl",
109 "EG1excl",
"EJ1excl",
"DG1excl",
"DJ1excl"
111 std::array<TString, 10> patchtypes = {
"EG1",
"EG2",
"EJ1",
"EJ2",
"EMC7",
"DG1",
"DG2",
"DJ1",
"DJ2",
"DMC7"};
112 Double_t encuts[5] = {1., 2., 5., 10., 20.};
113 for(
auto trg : triggers){
114 fHistos->
CreateTH1(Form(
"hEventCount%s", trg.Data()), Form(
"Event count for trigger class %s", trg.Data()), 1, 0.5, 1.5);
115 fHistos->
CreateTH1(Form(
"hEventCentrality%s", trg.Data()), Form(
"Event centrality for trigger class %s", trg.Data()), 103, -2., 101.);
116 fHistos->
CreateTH1(Form(
"hVertexZ%s", trg.Data()), Form(
"z-position of the primary vertex for trigger class %s", trg.Data()), 200, -40., 40.);
117 for(
auto patch : patchtypes){
118 fHistos->
CreateTH1(Form(
"h%sPatchEnergy%s", patch.Data(), trg.Data()), Form(
"%s-patch energy for trigger class %s", patch.Data(), trg.Data()), energybinning);
119 fHistos->
CreateTH1(Form(
"h%sPatchET%s", patch.Data(), trg.Data()), Form(
"%s-patch transverse energy for trigger class %s", patch.Data(), trg.Data()), energybinning);
120 fHistos->
CreateTH2(Form(
"h%sPatchEnergyEta%s", patch.Data(), trg.Data()), Form(
"%s-patch energy for trigger class %s", patch.Data(), trg.Data()), energybinning, etabinning);
121 fHistos->
CreateTH2(Form(
"h%sPatchETEta%s", patch.Data(), trg.Data()), Form(
"%s-patch transverse energy for trigger class %s", patch.Data(), trg.Data()), energybinning, etabinning);
122 for(
int ien = 0; ien < 5; ien++){
123 fHistos->
CreateTH2(Form(
"h%sEtaPhi%dG%s", patch.Data(),
static_cast<int>(encuts[ien]), trg.Data()), Form(
"%s-patch #eta-#phi map for patches with energy larger than %f GeV/c for trigger class %s", patch.Data(), encuts[ien], trg.Data()), 100, -0.7, 0.7, 200, 0, TMath::TwoPi());
124 fHistos->
CreateTH2(Form(
"h%sColRow%dG%s", patch.Data(),
static_cast<int>(encuts[ien]), trg.Data()), Form(
"%s-patch col-row map for patches with energy larger than %f GeV/c for trigger class %s", patch.Data(), encuts[ien], trg.Data()), 48, -0.5, 47.5, 104, -0.5, 103.5);
130 AliDebugStream(1) <<
"Histograms done" << std::endl;
139 triggerstring = fInputEvent->GetFiredTriggerClasses();
141 UInt_t selectionstatus = fInputHandler->IsEventSelected();
142 Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
143 isEMC7 = (selectionstatus & AliVEvent::kEMC7) && triggerstring.Contains(
"EMC7"),
144 isEJ1 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"EJ1"),
145 isEJ2 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"EJ2"),
146 isEG1 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"EG1"),
147 isEG2 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"EG2"),
148 isDMC7 = (selectionstatus & AliVEvent::kEMC7) && triggerstring.Contains(
"DMC7"),
149 isDJ1 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"DJ1"),
150 isDJ2 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"DJ2"),
151 isDG1 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"DG1"),
152 isDG2 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"DG2");
166 if(!(isMinBias || isEMC7 || isEG1 || isEG2 || isEJ1 || isEJ2 || isDMC7 || isDG1 || isDG2 || isDJ1 || isDJ2)){
167 AliDebugStream(1) << GetName() <<
": Reject trigger" << std::endl;
170 AliDebugStream(1) <<
"Trigger selected" << std::endl;
175 AliMultSelection *mult =
dynamic_cast<AliMultSelection *
>(InputEvent()->FindListObject(
"MultSelection"));
177 AliErrorStream() << GetName() <<
": Centrality selection enabled but no centrality estimator available" << std::endl;
180 if(!mult->IsEventSelected())
return false;
181 centrality = mult->GetEstimator(
"V0M")->GetPercentile();
182 AliDebugStream(1) << GetName() <<
": Centrality " << centrality << std::endl;
184 AliDebugStream(1) << GetName() <<
": reject centrality: " << centrality << std::endl;
187 AliDebugStream(1) << GetName() <<
": select centrality " << centrality << std::endl;
190 AliDebugStream(1) << GetName() <<
": No centrality selection required" << std::endl;
192 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
193 if(!vtx) vtx = fInputEvent->GetPrimaryVertexSPD();
195 if(vtx->GetNContributors() < 1){
196 AliDebug(1, Form(
"%s: Reject contributor\n", GetName()));
201 AliDebugStream(1) << GetName() <<
": Reject analysis util" << std::endl;
202 if(fInputEvent->IsA() == AliESDEvent::Class() &&
fAliAnalysisUtils->IsFirstEventInChunk(fInputEvent))
return false;
208 AliDebugStream(1) << GetName() <<
": Reject Z(" << vtx->GetZ() <<
")" << std::endl;
211 AliDebugStream(1) << GetName() <<
": Event Selected" << std::endl;
229 if(!(isMinBias || isEMC7 || isEG2))
fAcceptTriggers.push_back(
"EG1excl");
237 if(!(isMinBias || isDMC7 || isDG2))
fAcceptTriggers.push_back(
"DG1excl");
245 if(!(isMinBias || isEMC7 || isEJ2))
fAcceptTriggers.push_back(
"EJ1excl");
253 if(!(isMinBias || isDMC7 || isDJ2))
fAcceptTriggers.push_back(
"DJ1excl");
264 AliDebugStream(1) << GetName() <<
": Start function" << std::endl;
267 AliMultSelection *mult =
dynamic_cast<AliMultSelection *
>(InputEvent()->FindListObject(
"MultSelection"));
268 if(mult && mult->IsEventSelected()) centrality = mult->GetEstimator(
"V0M")->GetPercentile();
275 AliErrorStream() << GetName() <<
": Trigger patch container not available" << std::endl;
279 AliDebugStream(1) << GetName() <<
": Number of trigger patches " <<
fTriggerPatchInfo->GetEntries() << std::endl;
282 fInputEvent->GetPrimaryVertex()->GetXYZ(vertexpos);
288 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(patchIter);
294 std::vector<TString> patchnames;
297 patchnames.push_back(
"DJ1");
298 patchnames.push_back(
"DJ2");
300 patchnames.push_back(
"EJ1");
301 patchnames.push_back(
"EJ2");
306 patchnames.push_back(
"DMC7");
307 patchnames.push_back(
"DG1");
308 patchnames.push_back(
"DG2");
310 patchnames.push_back(
"EMC7");
311 patchnames.push_back(
"EG1");
312 patchnames.push_back(
"EG2");
315 if(!patchnames.size()){
320 TLorentzVector posvec;
321 energy = patch->GetPatchE();
322 eta = patch->GetEtaGeo();
323 phi = patch->GetPhiGeo();
324 col = patch->GetColStart();
325 row = patch->GetRowStart();
326 et = patch->GetLorentzVectorCenterGeo().Et();
329 for(
const auto &nameit : patchnames){
330 for(
const auto &trg : fAcceptTriggers){
344 fDownscaleOADB =
new AliOADBContainer(
"AliEmcalDownscaleFactors");
371 if(result)
return 1./result->GetVal();
388 AliDebugStream(1) << GetName() <<
": Using weight " << weight <<
" for trigger " << triggerclass <<
" in patch histograms." << std::endl;
389 fHistos->
FillTH1(Form(
"h%sPatchEnergy%s", patchname.Data(), triggerclass.Data()), energy, weight);
390 fHistos->
FillTH1(Form(
"h%sPatchET%s", patchname.Data(), triggerclass.Data()), transverseenergy, weight);
391 fHistos->
FillTH2(Form(
"h%sPatchEnergyEta%s", patchname.Data(), triggerclass.Data()), energy, eta, weight);
392 fHistos->
FillTH2(Form(
"h%sPatchETEta%s", patchname.Data(), triggerclass.Data()), transverseenergy, eta, weight);
393 Double_t encuts[5] = {1., 2., 5., 10., 20.};
394 for(
int ien = 0; ien < 5; ien++){
395 if(energy > encuts[ien]){
396 fHistos->
FillTH2(Form(
"h%sEtaPhi%dG%s", patchname.Data(),
static_cast<int>(encuts[ien]), triggerclass.Data()), eta, phi, weight);
397 fHistos->
FillTH2(Form(
"h%sColRow%dG%s", patchname.Data(),
static_cast<int>(encuts[ien]), triggerclass.Data()), col, row, weight);
415 AliDebugStream(1) << GetName() <<
": Using weight " << weight <<
" for trigger " << triggerclass <<
" in event histograms." << std::endl;
416 fHistos->
FillTH1(Form(
"hEventCount%s", triggerclass.Data()), 1, weight);
417 fHistos->
FillTH1(Form(
"hEventCentrality%s", triggerclass.Data()), centrality, weight);
418 fHistos->
FillTH1(Form(
"hVertexZ%s", triggerclass.Data()), vertexz, weight);
428 if(!triggerpatches)
return triggerstring;
429 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0, nDJ1 = 0, nDJ2 = 0, nDG1 = 0, nDG2 = 0;
430 double minADC_J1 = 260.,
434 for(TIter patchIter = TIter(triggerpatches).Begin(); patchIter != TIter::End(); ++patchIter){
435 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(*patchIter);
436 if(!patch->IsOfflineSimple())
continue;
437 if(patch->IsJetHighSimple() && patch->GetADCOfflineAmp() > minADC_J1){
438 if(patch->IsDCalPHOS()) nDJ1++;
441 if(patch->IsJetLowSimple() && patch->GetADCOfflineAmp() > minADC_J2){
442 if(patch->IsDCalPHOS()) nDJ2++;
445 if(patch->IsGammaHighSimple() && patch->GetADCOfflineAmp() > minADC_G1){
446 if(patch->IsDCalPHOS()) nDG1++;
449 if(patch->IsGammaLowSimple() && patch->GetADCOfflineAmp() > minADC_G2){
450 if(patch->IsDCalPHOS()) nDG2++;
454 if(nEJ1) triggerstring +=
"EJ1";
456 if(triggerstring.Length()) triggerstring +=
",";
457 triggerstring +=
"EJ2";
460 if(triggerstring.Length()) triggerstring +=
",";
461 triggerstring +=
"EG1";
464 if(triggerstring.Length()) triggerstring +=
",";
465 triggerstring +=
"EG2";
468 if(triggerstring.Length()) triggerstring +=
",";
469 triggerstring +=
"DJ1";
472 if(triggerstring.Length()) triggerstring +=
",";
473 triggerstring +=
"DJ2";
476 if(triggerstring.Length()) triggerstring +=
",";
477 triggerstring +=
"DG1";
480 if(triggerstring.Length()) triggerstring +=
",";
481 triggerstring +=
"DG2";
483 return triggerstring;
487 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
488 boundaries[0] = patch->GetEtaMin();
489 boundaries[1] = patch->GetEtaMax();
490 boundaries[2] = patch->GetPhiMin();
491 boundaries[3] = patch->GetPhiMax();
495 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
496 return patch->IsOfflineSimple();
500 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
501 return patch->GetRowStart() >= 64;
505 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
506 if(!patch->IsOfflineSimple())
return false;
507 return patch->IsGammaLowSimple();
511 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
512 if(!patch->IsOfflineSimple())
return false;
513 return patch->IsJetLowSimple();
518 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
519 energy = patch->GetPatchE();
void FillPatchHistograms(TString triggerclass, TString patchname, double energy, double transverseenergy, double eta, double phi, int col, int row)
std::vector< std::string > fAcceptTriggers
! Temporary container of selected triggers
Class creating a linear binning, used in the histogram manager.
virtual void RunChanged(Int_t runnumber)
Base task in the EMCAL framework.
Bool_t fLocalInitialized
whether or not the task has been already initialized
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Bool_t fTriggerStringFromPatches
Switch on building a trigger string based on available trigger patches.
AliAnalysisTaskEmcalPatchesRef()
void AddStep(Double_t max, Double_t binwidth)
double GetPatchEnergy(TObject *o) const
AliCutValueRange< double > fVertexRange
Range of the z-position in order to accept a primary vertex.
void SetCaloTriggerPatchInfoName(const char *n)
Double_t GetTriggerWeight(const TString &triggerclass) const
Bool_t fRequestCentrality
Switch for request of centrality selection.
AliEmcalTriggerOfflineSelection * fTriggerSelection
Offline trigger selection tool.
THistManager * fHistos
! Histogram handler
void FillEventHistograms(const TString &triggerclass, double centrality, double vertexz)
Bool_t fRequestAnalysisUtil
Switch on request for analysis util.
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
void GetPatchBoundaries(TObject *o, Double_t *boundaries) const
THashList * GetListOfHistograms() const
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.
TObjArray * fDownscaleFactors
! Downscalefactors for given run
virtual void UserCreateOutputObjects()
TString fNameDownscaleOADB
Name of the downscale OADB container.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
bool IsOfflineSimplePatch(TObject *o) const
Bool_t IsOfflineSelected(EmcalTriggerClass trgcls, const TClonesArray *const triggerpatches) const
virtual ~AliAnalysisTaskEmcalPatchesRef()
AliEmcalList * fOutput
!output list
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
Double_t fVertex[3]
!event vertex
AliOADBContainer * fDownscaleOADB
! Container with downscale factors for different triggers
AliCutValueRange< double > fCentralityRange
Range of accepted event centralities.
TClonesArray * fTriggerPatchInfo
!trigger patch info array
Container class for histograms for the high- charged particle analysis.
bool SelectDCALPatch(TObject *o) const
TString GetFiredTriggerClassesFromPatches(const TClonesArray *triggerpatches) const
bool SelectJetPatch(TObject *o) const
bool SelectSingleShowerPatch(TObject *o) const
bool IsInRange(t value) const
void SetMinimum(Double_t min)
virtual bool IsEventSelected()