22 #include <TClonesArray.h>
25 #include <TObjArray.h>
26 #include <TObjString.h>
27 #include <TParameter.h>
30 #include "AliAnalysisUtils.h"
31 #include "AliAODEvent.h"
32 #include "AliAODInputHandler.h"
35 #include "AliEMCALGeometry.h"
36 #include "AliEMCALTriggerPatchInfo.h"
37 #include "AliEMCALTriggerMapping.h"
38 #include "AliESDEvent.h"
39 #include "AliInputEventHandler.h"
41 #include "AliOADBContainer.h"
42 #include "AliVVertex.h"
48 namespace EMCalTriggerPtAnalysis {
50 AliAnalysisTaskEmcalTriggerBase::AliAnalysisTaskEmcalTriggerBase():
53 fUseTriggerBits(kTRUE),
54 fRequireBunchCrossing(kTRUE),
55 fUseDownscaleCorrectionFormOCDB(kFALSE),
57 fTriggerStringFromPatches(kFALSE),
59 fNameClusterContainer(
""),
60 fRequireAnalysisUtils(kTRUE),
61 fVertexCut(-10., 10.),
62 fNameDownscaleOADB(
""),
65 fNameMaskedFastorOADB(),
68 fOnlineTriggerThresholds(),
69 fNameAcceptanceOADB(),
70 fSelectNoiseEvents(false),
71 fRejectNoiseEvents(false),
72 fEnableDCALTriggers(true),
73 fEnableT0Triggers(false),
74 fRequireL0forL1(false),
75 fExclusiveMinBias(false)
85 fUseTriggerBits(kTRUE),
86 fRequireBunchCrossing(kTRUE),
87 fUseDownscaleCorrectionFormOCDB(kFALSE),
89 fTriggerStringFromPatches(kFALSE),
91 fNameClusterContainer(
""),
92 fRequireAnalysisUtils(kTRUE),
93 fVertexCut(-10., 10.),
94 fNameDownscaleOADB(
""),
97 fNameMaskedFastorOADB(),
100 fOnlineTriggerThresholds(),
101 fNameAcceptanceOADB(),
102 fSelectNoiseEvents(false),
103 fRejectNoiseEvents(false),
104 fEnableDCALTriggers(true),
105 fEnableT0Triggers(false),
106 fRequireL0forL1(false),
107 fExclusiveMinBias(false)
132 fHistos->
CreateTH2(
"hTriggerCorrelation",
"Correlation selected trigger classes", 6, -0.5, 5.5, 6, -0.5, 5.5);
133 std::array<TString, 6> binlabels = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2"};
135 for(
int ib = 0; ib < 6; ib++){
136 correlationHist->GetXaxis()->SetBinLabel(ib+1, binlabels[ib]);
137 correlationHist->GetYaxis()->SetBinLabel(ib+1, binlabels[ib]);
155 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
157 if(vtx->GetNContributors() < 1)
return false;
160 if(fInputEvent->IsA() == AliESDEvent::Class() &&
fAliAnalysisUtils->IsFirstEventInChunk(fInputEvent))
return false;
171 AliDebugStream(1) << GetName() <<
": Reject MC outliers" << std::endl;
178 std::array<TString, 6> kAbsTriggers = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2"};
179 for(
int itrg = 0; itrg < 6; itrg++){
182 for(
int jtrg = 0; jtrg < 6; jtrg++){
185 fHistos->
FillTH2(
"hTriggerCorrelation", kAbsTriggers[itrg], kAbsTriggers[jtrg]);
203 triggerstring = fInputEvent->GetFiredTriggerClasses();
207 UInt_t selectionstatus = fInputHandler->IsEventSelected();
208 Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
209 isMinBiasT0 = selectionstatus & AliVEvent::kINT8,
226 if(
fRequireBunchCrossing && ! (triggerstring.Contains(
"-B-") || triggerstring.Contains(
"-S-")))
return;
233 const std::array<ULong_t, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerBits = {
234 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE,
235 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE
238 emcalTriggers[iclass] &= bool(selectionstatus & kSelectTriggerBits[iclass]);
239 emc8Triggers[iclass] &= bool(selectionstatus & kSelectTriggerBits[iclass]);
240 if(
fRequireL0forL1 && !
bool(selectionstatus & (AliVEvent::kEMC7|AliVEvent::kEMC8))) {
241 emcalTriggers[iclass] =
false;
242 emc8Triggers[iclass] =
false;
249 const std::array<TString, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerStrings = {
250 "CEMC7-|CEMC8-",
"EG1|EGA",
"EG2",
"EJ1|EJE",
"EJ2",
"CDMC7-|CDMC8-",
"DG1",
"DG2",
"DJ1",
"DJ2"
252 if(triggerstring.Contains(
"EMC")) AliDebugStream(1) << GetName() <<
": Trigger string " << triggerstring << std::endl;
253 bool isT0trigger = triggerstring.Contains(
"INT8") || triggerstring.Contains(
"EMC8");
255 bool selectionStatus =
false;
256 if(kSelectTriggerStrings[iclass].Contains(
"|")){
257 std::unique_ptr<TObjArray> options(kSelectTriggerStrings[iclass].Tokenize(
"|"));
258 for(
auto o : *options){
259 TObjString *optstring =
static_cast<TObjString *
>(o);
260 if(triggerstring.Contains(optstring->String())) selectionStatus =
true;
263 selectionStatus = triggerstring.Contains(kSelectTriggerStrings[iclass]);
266 emc8Triggers[iclass] &= selectionStatus;
267 emcalTriggers[iclass] =
false;
269 emcalTriggers[iclass] &= selectionStatus;
270 emc8Triggers[iclass] =
false;
272 if(emcalTriggers[iclass])
273 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT7 suite)" << std::endl;
274 if(emc8Triggers[iclass])
275 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT8 suite)" << std::endl;
281 if(emcalTriggers[itrg] || emc8Triggers[itrg]){
284 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= onlinestatus;
285 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= onlinestatus;
287 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= !onlinestatus;
288 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= !onlinestatus;
309 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EJ2excl");
313 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEJ2]))
fSelectedTriggers.push_back(
"EJ1excl");
317 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EG2excl");
321 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEG2]))
fSelectedTriggers.push_back(
"EG1excl");
333 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DJ2excl");
337 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDJ2]))
fSelectedTriggers.push_back(
"DJ1excl");
341 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DG2excl");
345 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDG2]))
fSelectedTriggers.push_back(
"DG1excl");
351 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]) {
356 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEG1]){
359 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EGAexcl");
361 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEJ1]){
364 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EJEexcl");
379 fDownscaleOADB =
new AliOADBContainer(
"AliEmcalDownscaleFactors");
396 if(fInputEvent->GetRunNumber() >= 15344 && fInputEvent->GetRunNumber() <= 197388){
412 AliDebugStream(1) << GetName() <<
": Loading acceptance map from OADB file " <<
fNameAcceptanceOADB << std::endl;
413 AliOADBContainer acceptanceCont(
"AliEmcalTriggerAcceptance");
415 TObjArray *acceptanceMaps =
dynamic_cast<TObjArray *
>(acceptanceCont.GetObject(fInputEvent->GetRunNumber()));
417 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG1")))){
418 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG1" << std::endl;
419 map->SetDirectory(
nullptr);
422 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG2")))){
423 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG2" << std::endl;
424 map->SetDirectory(
nullptr);
427 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG1")))){
428 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG1" << std::endl;
429 map->SetDirectory(
nullptr);
432 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG2")))){
433 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG2" << std::endl;
434 map->SetDirectory(
nullptr);
437 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ1")))){
438 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ1" << std::endl;
439 map->SetDirectory(
nullptr);
442 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ2")))){
443 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ2" << std::endl;
444 map->SetDirectory(
nullptr);
447 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ1")))){
448 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ1" << std::endl;
449 map->SetDirectory(
nullptr);
452 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ2")))){
453 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ2" << std::endl;
454 map->SetDirectory(
nullptr);
469 AliInfoStream() << GetName() <<
": No downscale factors provided for run " << runnumber << std::endl;
471 AliInfoStream() << GetName() <<
": Downscale factors used for run " << runnumber << std::endl;
474 AliInfoStream() << GetName() <<
": Trigger " << dfactor->GetName() <<
", downscale factor " << dfactor->GetVal() << std::endl;
493 std::vector<TString> triggers = {
"MB"};
494 const std::array<TString, 10> emcaltriggers = {
"EMC7",
"EJ1",
"EJ2",
"EG1",
"EG2",
"EMC7excl",
"EG2excl",
"EJ2excl",
"EJ1excl",
"EG1excl"},
495 dcaltriggers = {
"DMC7",
"DJ1",
"DJ2",
"DG1",
"DG2",
"DMC7excl",
"DG2excl",
"DJ2excl",
"DJ1excl",
"DG1excl"};
496 const std::array<TString, 7> t0triggers = {
"MBT0",
"EMC8",
"EMC8EGA",
"EMC8EJE",
"EMC8excl",
"EMC8EGAexcl",
"EMC8EJEexcl"};
498 for(
const auto &t : emcaltriggers) triggers.push_back(t);
501 for(
const auto &t : dcaltriggers) triggers.push_back(t);
504 for(
const auto &t: t0triggers) triggers.push_back(t);
510 AliDebugStream(1) <<
"Using V1 online trigger selector" << std::endl;
514 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(p);
536 double triggerweight = 1.;
537 if(result) triggerweight = 1./result->GetVal();
538 AliDebugStream(1) <<
"Using trigger weight " << triggerweight <<
" for trigger " << triggerclass << std::endl;
539 return triggerweight;
541 AliDebugStream(1) <<
"No downscale factors loaded - using trigger weight 1" << std::endl;
547 AliInfoStream() <<
"Reading downscale factors from OCDB for run " << fInputEvent->GetRunNumber() << std::endl;
554 if(downscaleOCDB->
GetCurrentRun() != fInputEvent->GetRunNumber()) downscaleOCDB->
SetRun(fInputEvent->GetRunNumber());
555 const std::array<TString, 11> khwtriggers = {
"INT7",
"EMC7",
"DMC7",
"EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2"};
557 for(
const auto &t : khwtriggers){
558 std::function<bool (TString)> triggerfinder = [t](
const TString &
test) ->
bool {
559 if(!
test.Contains(t +
"-B-"))
return false;
562 auto entry = std::find_if(runtriggers.begin(), runtriggers.end(), triggerfinder);
563 if(entry != runtriggers.end()){
566 AliInfoStream() <<
"Applying downscale factor " << downscalefactor <<
" for trigger " << t <<
" (" << triggername <<
") for run " << fInputEvent->GetRunNumber() << std::endl;
569 AliErrorStream() <<
"No downscale factor found for trigger " << t <<
" for run " << fInputEvent->GetRunNumber() << std::endl;
577 threshpar->SetVal(threshold);
587 threshold = val->GetVal();
593 "DG1",
"DG2",
"DJ1",
"DJ2"};
599 "DG1",
"DG2",
"DJ1",
"DJ2"};
600 bool isInitialized =
true;
603 isInitialized =
false;
607 return isInitialized;
616 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0, nDJ1 = 0, nDJ2 = 0, nDG1 = 0, nDG2 = 0;
617 for(
auto patchIter : *triggerpatches){
618 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(patchIter);
619 if(!patch->IsRecalc())
continue;
620 if(patch->IsEMCal()){
621 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG1", patch->GetADCAmp())) nEG1++;
622 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG2", patch->GetADCAmp())) nEG2++;
623 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ1", patch->GetADCAmp())) nEJ1++;
624 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ2", patch->GetADCAmp())) nEJ2++;
626 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG1", patch->GetADCAmp())) nDG1++;
627 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG2", patch->GetADCAmp())) nDG2++;
628 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ1", patch->GetADCAmp())) nDJ1++;
629 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ2", patch->GetADCAmp())) nDJ2++;
632 if(nEJ1) triggerstring +=
"EJ1";
634 if(triggerstring.Length()) triggerstring +=
",";
635 triggerstring +=
"EJ2";
638 if(triggerstring.Length()) triggerstring +=
",";
639 triggerstring +=
"EG1";
642 if(triggerstring.Length()) triggerstring +=
",";
643 triggerstring +=
"EG2";
646 if(triggerstring.Length()) triggerstring +=
",";
647 triggerstring +=
"DJ2";
650 if(triggerstring.Length()) triggerstring +=
",";
651 triggerstring +=
"DJ2";
654 if(triggerstring.Length()) triggerstring +=
",";
655 triggerstring +=
"DG1";
658 if(triggerstring.Length()) triggerstring +=
",";
659 triggerstring +=
"DG2";
661 return triggerstring;
EMCAL L1 Jet trigger, low threshold.
std::vector< TString > fSelectedTriggers
! Triggers selected for given event
Bool_t IsOfflineSelected(EmcalTriggerClass trgcls, const AliVEvent *const data) const
Select event as triggered event.
Bool_t fIsPythia
trigger, if it is a PYTHIA production
std::vector< TString > GetSupportedTriggers()
Int_t GetOnlineTriggerThresholdByIndex(AliEmcalTriggerOfflineSelection::EmcalTriggerClass trg) const
virtual void CreateUserHistos()=0
Bool_t fRejectNoiseEvents
Reject events triggered by noisy fastors.
THistManager * fHistos
Task Histogram container.
static AliEmcalDownscaleFactorsOCDB * Instance()
Bool_t fExclusiveMinBias
Only look at Min. Bias trigger.
Base task in the EMCAL framework.
void SetOnlineTriggerThreshold(const TString &triggerclass, Int_t threshold)
Setting trigger threshold for online trigger selection.
Bool_t fLocalInitialized
whether or not the task has been already initialized
Double_t GetTriggerWeight(const TString &triggerclass) const
TString GetFiredTriggerClassesFromPatches(const TClonesArray *triggerpatches) const
DCAL L1 Gamma trigger, low threshold.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
DCAL L1 Jet trigger, high threshold.
void SetRun(int runnumber)
AliAnalysisTaskEmcalTriggerBase()
Dummy I/O constructor.
AliEmcalTriggerOfflineSelection * fTriggerSelection
Offline trigger selection.
Number of supported triggers.
virtual void UserCreateOutputObjects()
Steering of object creation.
void PrepareDownscaleFactorsFormOCDB()
Read the downscale factors from the OCDB.
EMCAL L1 Gamma trigger, high threshold.
Int_t GetCurrentRun() const
Double_t GetDownscaleFactorForTriggerClass(const TString &trigger) const
TObjArray fOnlineTriggerThresholds
Trigger thresholds applied at online level.
Bool_t fEnableDCALTriggers
Enable / Disable event selection for DCAL trigger classes.
DCAL L1 Jet trigger, low threshold.
TObjArray * fDownscaleFactors
! Downscalfactors for given run
virtual void RunChanged(Int_t runnuber)
void SetCaloTriggerPatchInfoName(const char *n)
TString fNameMaskedFastorOADB
Name of the masked fastor OADB container.
EMCAL L1 Jet trigger, high threshold.
Bool_t fRequireAnalysisUtils
Switch whether to require event selection in AliAnalysisUtils.
Bool_t fUseDownscaleCorrectionFormOCDB
Use downscale factors from OCDB.
bool SelectOnlineTrigger(AliEmcalTriggerOfflineSelection::EmcalTriggerClass trigger) const
Bool_t CheckMCOutliers()
Filter the mc tails in pt-hard distributions.
Base class for analyses using EMCAL triggers.
Bool_t fRequireBunchCrossing
Require bunch-bunch events (tag -B- in trigger string)
void SetAcceptanceMap(EmcalTriggerClass trgcls, const TH2 *accmap)
Set acceptance map for a given trigger class.
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
Create a new TH2 within the container.
TObject * FindObject(const char *name) const
Find an object inside the container.
TString fNameClusterContainer
Name of the cluster container in the event.
THashList * GetListOfHistograms() const
Get the list of histograms.
EmcalTriggerClass
Definition of the various supported trigger types.
Bool_t fRequireL0forL1
Require L0 for L1.
Int_t GetOnlineTriggerThresholdByName(const TString &name) const
AliAnalysisUtils * fAliAnalysisUtils
!vertex selection (optional)
TString fNameDownscaleOADB
Name of the downscale OADB container.
static Bool_t IsSingleShower(EmcalTriggerClass cls)
Checks if the trigger class is a single shower patch trigger class.
void SetClusterContainer(const TString &clustercont)
DCAL L1 Gamma trigger, high threshold.
std::vector< TString > GetTriggerClasses() const
Bool_t fEnableT0Triggers
Enable triggers depending on T0 (INT8, EMC8, EMC8EGA, EMC8EJE)
virtual ~AliAnalysisTaskEmcalTriggerBase()
Destructor.
EMCAL L1 Gamma trigger, low threshold.
TString fNameAcceptanceOADB
Name of the OADB container with the trigger acceptance.
const TString & GetNameClusterContainer() const
Get the name of the cluster container.
AliOADBContainer * fMaskedFastorOADB
! Container with masked fastors
bool OnlineThresholdsInitialized() const
Bool_t fSelectNoiseEvents
Explicitly select events triggered only by noisy fastors.
Bool_t fUseTriggerBits
Switch whether using trigger bits (relies on physics selection)
Bool_t fTriggerStringFromPatches
Do rebuild the trigger string from trigger patches.
AliEmcalList * fOutput
!output list
virtual bool IsUserEventSelected()
std::vector< int > fMaskedFastors
List of masked fastors.
AliOADBContainer * fDownscaleOADB
! Container with downscale factors for different triggers
Double_t fVertex[3]
!event vertex
Handler for downscale factors for various triggers obtained from the OCDB.
void SetMakeGeneralHistograms(Bool_t g)
TClonesArray * fTriggerPatchInfo
!trigger patch info array
void SetNeedEmcalGeom(Bool_t n)
virtual bool IsEventSelected()
Container class for histograms.
virtual void ExecOnce()
Perform steps needed to initialize the analysis.
void test(int runnumber=195345)
void UserCreateOutputObjects()
Main initialization function on the worker.
virtual void UserFillHistosBeforeEventSelection()
AliCutValueRange< double > fVertexCut
Cut on the z-position of the primary vertex.
Bool_t SelectFiredPatch(const TString &triggerclass, Int_t adc) const
virtual void UserFillHistosAfterEventSelection()
bool IsInRange(t value) const
static TString ClusterContainerNameFactory(Bool_t isAOD)
Get name of the default cluster container.
virtual void CreateUserObjects()=0