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() :
55 fRequestAnalysisUtil(kTRUE),
56 fTriggerStringFromPatches(kFALSE),
57 fCentralityRange(-999., 999.),
58 fVertexRange(-999., 999.),
59 fRequestCentrality(false),
60 fNameDownscaleOADB(
""),
73 AliAnalysisTaskSE(name),
78 fRequestAnalysisUtil(kTRUE),
79 fTriggerStringFromPatches(kFALSE),
80 fCentralityRange(-999., 999.),
81 fVertexRange(-999., 999.),
82 fRequestCentrality(false),
83 fNameDownscaleOADB(
""),
89 DefineOutput(1, TList::Class());
104 AliInfoStream() <<
"Creating histograms for task " << GetName() << std::endl;
110 std::array<TString, 21> triggers = {
"MB",
"EMC7",
"DMC7",
111 "EJ1",
"EJ2",
"EG1",
"EG2",
"DJ1",
"DJ2",
"DG1",
"DG2",
112 "EMC7excl",
"DMC7excl",
"EG2excl",
"EJ2excl",
"DG2excl",
"DJ2excl",
113 "EG1excl",
"EJ1excl",
"DG1excl",
"DJ1excl"
115 std::array<TString, 10> patchtypes = {
"EG1",
"EG2",
"EJ1",
"EJ2",
"EMC7",
"DG1",
"DG2",
"DJ1",
"DJ2",
"DMC7"};
116 Double_t encuts[5] = {1., 2., 5., 10., 20.};
117 for(
auto trg : triggers){
118 fHistos->
CreateTH1(Form(
"hEventCount%s", trg.Data()), Form(
"Event count for trigger class %s", trg.Data()), 1, 0.5, 1.5);
119 fHistos->
CreateTH1(Form(
"hEventCentrality%s", trg.Data()), Form(
"Event centrality for trigger class %s", trg.Data()), 103, -2., 101.);
120 fHistos->
CreateTH1(Form(
"hVertexZ%s", trg.Data()), Form(
"z-position of the primary vertex for trigger class %s", trg.Data()), 200, -40., 40.);
121 for(
auto patch : patchtypes){
122 fHistos->
CreateTH1(Form(
"h%sPatchEnergy%s", patch.Data(), trg.Data()), Form(
"%s-patch energy for trigger class %s", patch.Data(), trg.Data()), energybinning);
123 fHistos->
CreateTH1(Form(
"h%sPatchET%s", patch.Data(), trg.Data()), Form(
"%s-patch transverse energy for trigger class %s", patch.Data(), trg.Data()), energybinning);
124 fHistos->
CreateTH2(Form(
"h%sPatchEnergyEta%s", patch.Data(), trg.Data()), Form(
"%s-patch energy for trigger class %s", patch.Data(), trg.Data()), energybinning, etabinning);
125 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);
126 for(
int ien = 0; ien < 5; ien++){
127 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());
128 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);
133 AliDebugStream(1) <<
"Histograms done" << std::endl;
141 AliDebugStream(1) << GetName() <<
": Start function" << std::endl;
143 AliInfoStream() << GetName() <<
": Initializing ..." << std::endl;
148 AliDebugStream(1) << GetName() <<
": Changing run from " <<
fCurrentRun <<
" to " << InputEvent()->GetRunNumber() << std::endl;
152 TString triggerstring =
"";
156 triggerstring = fInputEvent->GetFiredTriggerClasses();
158 UInt_t selectionstatus = fInputHandler->IsEventSelected();
159 Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
160 isEMC7 = (selectionstatus & AliVEvent::kEMC7) && triggerstring.Contains(
"EMC7"),
161 isEJ1 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"EJ1"),
162 isEJ2 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"EJ2"),
163 isEG1 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"EG1"),
164 isEG2 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"EG2"),
165 isDMC7 = (selectionstatus & AliVEvent::kEMC7) && triggerstring.Contains(
"DMC7"),
166 isDJ1 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"DJ1"),
167 isDJ2 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"DJ2"),
168 isDG1 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"DG1"),
169 isDG2 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"DG2");
183 if(!(isMinBias || isEMC7 || isEG1 || isEG2 || isEJ1 || isEJ2 || isDMC7 || isDG1 || isDG2 || isDJ1 || isDJ2)){
184 AliDebugStream(1) << GetName() <<
": Reject trigger" << std::endl;
187 AliDebugStream(1) <<
"Trigger selected" << std::endl;
192 AliMultSelection *mult =
dynamic_cast<AliMultSelection *
>(InputEvent()->FindListObject(
"MultSelection"));
194 AliErrorStream() << GetName() <<
": Centrality selection enabled but no centrality estimator available" << std::endl;
197 if(!mult->IsEventSelected())
return;
198 centrality = mult->GetEstimator(
"V0M")->GetPercentile();
199 AliDebugStream(1) << GetName() <<
": Centrality " << centrality << std::endl;
201 AliDebugStream(1) << GetName() <<
": reject centrality: " << centrality << std::endl;
204 AliDebugStream(1) << GetName() <<
": select centrality " << centrality << std::endl;
207 AliDebugStream(1) << GetName() <<
": No centrality selection required" << std::endl;
209 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
210 if(!vtx) vtx = fInputEvent->GetPrimaryVertexSPD();
212 if(vtx->GetNContributors() < 1){
213 AliDebug(1, Form(
"%s: Reject contributor\n", GetName()));
218 AliDebugStream(1) << GetName() <<
": Reject analysis util" << std::endl;
219 if(fInputEvent->IsA() == AliESDEvent::Class() &&
fAnalysisUtil->IsFirstEventInChunk(fInputEvent))
return;
220 if(!
fAnalysisUtil->IsVertexSelected2013pA(fInputEvent))
return;
225 AliDebugStream(1) << GetName() <<
": Reject Z(" << vtx->GetZ() <<
")" << std::endl;
228 AliDebugStream(1) << GetName() <<
": Event Selected" << std::endl;
249 if(!(isMinBias || isEMC7 || isEJ2))
FillEventHistograms(
"EJ1excl", centrality, vtx->GetZ());
254 if(!(isMinBias || isDMC7 || isDJ2))
FillEventHistograms(
"DJ1excl", centrality, vtx->GetZ());
272 if(!(isMinBias || isEMC7 || isEG2))
FillEventHistograms(
"EG1excl", centrality, vtx->GetZ());
277 if(!(isMinBias || isDMC7 || isDG2))
FillEventHistograms(
"DG1excl", centrality, vtx->GetZ());
291 AliErrorStream() << GetName() <<
": Trigger patch container not available" << std::endl;
295 AliDebugStream(1) << GetName() <<
": Number of trigger patches " <<
fTriggerPatches->GetEntries() << std::endl;
297 Double_t vertexpos[3];
298 fInputEvent->GetPrimaryVertex()->GetXYZ(vertexpos);
300 Double_t
energy, eta, phi, et;
302 for(TIter patchIter = TIter(
fTriggerPatches).Begin(); patchIter != TIter::End(); ++patchIter){
304 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(*patchIter);
310 std::vector<TString> patchnames;
313 patchnames.push_back(
"DJ1");
314 patchnames.push_back(
"DJ2");
316 patchnames.push_back(
"EJ1");
317 patchnames.push_back(
"EJ2");
322 patchnames.push_back(
"DMC7");
323 patchnames.push_back(
"DG1");
324 patchnames.push_back(
"DG2");
326 patchnames.push_back(
"EMC7");
327 patchnames.push_back(
"EG1");
328 patchnames.push_back(
"EG2");
331 if(!patchnames.size()){
336 TLorentzVector posvec;
337 energy = patch->GetPatchE();
338 eta = patch->GetEtaGeo();
339 phi = patch->GetPhiGeo();
340 col = patch->GetColStart();
341 row = patch->GetRowStart();
342 et = patch->GetLorentzVectorCenterGeo().Et();
345 for(std::vector<TString>::iterator nameit = patchnames.begin(); nameit != patchnames.end(); ++nameit){
364 if(!(isMinBias || isEMC7 || isEJ2))
370 if(!(isMinBias || isDMC7 || isDJ2))
377 if(!(isMinBias || isEMC7))
FillPatchHistograms(
"EJ2excl", *nameit, energy, et, eta, phi, col, row);
382 if(!(isMinBias || isDMC7))
FillPatchHistograms(
"DJ2excl", *nameit, energy, et, eta, phi, col, row);
388 if(!(isMinBias || isEMC7 || isEG2))
FillPatchHistograms(
"EG1excl", *nameit, energy, et, eta, phi, col, row);
393 if(!(isMinBias || isEMC7 || isDG2))
FillPatchHistograms(
"DG1excl", *nameit, energy, et, eta, phi, col, row);
399 if(!(isMinBias || isEMC7))
FillPatchHistograms(
"EG2excl", *nameit, energy, et, eta, phi, col, row);
404 if(!(isMinBias || isDMC7))
FillPatchHistograms(
"DG2excl", *nameit, energy, et, eta, phi, col, row);
412 fTriggerPatches =
dynamic_cast<TClonesArray *
>(fInputEvent->FindListObject(
"EmcalTriggers"));
416 fDownscaleOADB =
new AliOADBContainer(
"AliEmcalDownscaleFactors");
443 if(result)
return 1./result->GetVal();
460 AliDebugStream(1) << GetName() <<
": Using weight " << weight <<
" for trigger " << triggerclass <<
" in patch histograms." << std::endl;
461 fHistos->
FillTH1(Form(
"h%sPatchEnergy%s", patchname.Data(), triggerclass.Data()), energy, weight);
462 fHistos->
FillTH1(Form(
"h%sPatchET%s", patchname.Data(), triggerclass.Data()), transverseenergy, weight);
463 fHistos->
FillTH2(Form(
"h%sPatchEnergyEta%s", patchname.Data(), triggerclass.Data()), energy, eta, weight);
464 fHistos->
FillTH2(Form(
"h%sPatchETEta%s", patchname.Data(), triggerclass.Data()), transverseenergy, eta, weight);
465 Double_t encuts[5] = {1., 2., 5., 10., 20.};
466 for(
int ien = 0; ien < 5; ien++){
467 if(energy > encuts[ien]){
468 fHistos->
FillTH2(Form(
"h%sEtaPhi%dG%s", patchname.Data(),
static_cast<int>(encuts[ien]), triggerclass.Data()), eta, phi, weight);
469 fHistos->
FillTH2(Form(
"h%sColRow%dG%s", patchname.Data(),
static_cast<int>(encuts[ien]), triggerclass.Data()), col, row, weight);
487 AliDebugStream(1) << GetName() <<
": Using weight " << weight <<
" for trigger " << triggerclass <<
" in event histograms." << std::endl;
488 fHistos->
FillTH1(Form(
"hEventCount%s", triggerclass.Data()), 1, weight);
489 fHistos->
FillTH1(Form(
"hEventCentrality%s", triggerclass.Data()), centrality, weight);
490 fHistos->
FillTH1(Form(
"hVertexZ%s", triggerclass.Data()), vertexz, weight);
499 TString triggerstring =
"";
500 if(!triggerpatches)
return triggerstring;
501 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0, nDJ1 = 0, nDJ2 = 0, nDG1 = 0, nDG2 = 0;
502 double minADC_J1 = 260.,
506 for(TIter patchIter = TIter(triggerpatches).Begin(); patchIter != TIter::End(); ++patchIter){
507 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(*patchIter);
508 if(!patch->IsOfflineSimple())
continue;
509 if(patch->IsJetHighSimple() && patch->GetADCOfflineAmp() > minADC_J1){
510 if(patch->IsDCalPHOS()) nDJ1++;
513 if(patch->IsJetLowSimple() && patch->GetADCOfflineAmp() > minADC_J2){
514 if(patch->IsDCalPHOS()) nDJ2++;
517 if(patch->IsGammaHighSimple() && patch->GetADCOfflineAmp() > minADC_G1){
518 if(patch->IsDCalPHOS()) nDG1++;
521 if(patch->IsGammaLowSimple() && patch->GetADCOfflineAmp() > minADC_G2){
522 if(patch->IsDCalPHOS()) nDG2++;
526 if(nEJ1) triggerstring +=
"EJ1";
528 if(triggerstring.Length()) triggerstring +=
",";
529 triggerstring +=
"EJ2";
532 if(triggerstring.Length()) triggerstring +=
",";
533 triggerstring +=
"EG1";
536 if(triggerstring.Length()) triggerstring +=
",";
537 triggerstring +=
"EG2";
540 if(triggerstring.Length()) triggerstring +=
",";
541 triggerstring +=
"DJ1";
544 if(triggerstring.Length()) triggerstring +=
",";
545 triggerstring +=
"DJ2";
548 if(triggerstring.Length()) triggerstring +=
",";
549 triggerstring +=
"DG1";
552 if(triggerstring.Length()) triggerstring +=
",";
553 triggerstring +=
"DG2";
555 return triggerstring;
559 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
560 boundaries[0] = patch->GetEtaMin();
561 boundaries[1] = patch->GetEtaMax();
562 boundaries[2] = patch->GetPhiMin();
563 boundaries[3] = patch->GetPhiMax();
567 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
568 return patch->IsOfflineSimple();
572 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
573 return patch->GetRowStart() >= 64;
577 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
578 if(!patch->IsOfflineSimple())
return false;
579 return patch->IsGammaLowSimple();
583 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
584 if(!patch->IsOfflineSimple())
return false;
585 return patch->IsJetLowSimple();
590 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
591 energy = patch->GetPatchE();
void FillPatchHistograms(TString triggerclass, TString patchname, double energy, double transverseenergy, double eta, double phi, int col, int row)
Class creating a linear binning, used in the histogram manager.
virtual void RunChanged(Int_t runnumber)
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.
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="")
Helper class creating user defined custom binning.
TObjArray * fDownscaleFactors
! Downscalefactors for given run
Int_t fCurrentRun
Current run number (for RunChange method)
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()
void UserExec(Option_t *)
Bool_t fInitialized
Check for initialized.
AliAnalysisUtils * fAnalysisUtil
Analysis utils for event selection.
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
AliOADBContainer * fDownscaleOADB
! Container with downscale factors for different triggers
AliCutValueRange< double > fCentralityRange
Range of accepted event centralities.
Container class for histograms for the high- charged particle analysis.
bool SelectDCALPatch(TObject *o) const
Int_t GetRunNumber(TString)
TString GetFiredTriggerClassesFromPatches(const TClonesArray *triggerpatches) const
bool SelectJetPatch(TObject *o) const
bool SelectSingleShowerPatch(TObject *o) const
TClonesArray * fTriggerPatches
! Container with trigger patches
bool IsInRange(t value) const
void SetMinimum(Double_t min)