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" 39 #include "AliESDEvent.h" 40 #include "AliInputEventHandler.h" 42 #include "AliOADBContainer.h" 43 #include "AliVVertex.h" 51 AliAnalysisTaskEmcalTriggerBase::AliAnalysisTaskEmcalTriggerBase():
54 fUseTriggerBits(kTRUE),
55 fRequireBunchCrossing(kTRUE),
56 fUseDownscaleCorrectionFormOCDB(kFALSE),
58 fTriggerStringFromPatches(kFALSE),
60 fNameClusterContainer(
""),
61 fRequireAnalysisUtils(kTRUE),
62 fVertexCut(-10., 10.),
63 fNameDownscaleOADB(
""),
66 fNameMaskedFastorOADB(),
69 fOnlineTriggerThresholds(),
70 fNameAcceptanceOADB(),
71 fNameTriggerSelectionContainer(
"EmcalTriggerDecision"),
72 fSelectNoiseEvents(false),
73 fRejectNoiseEvents(false),
74 fEnableDCALTriggers(true),
75 fEnableCentralityTriggers(false),
76 fEnableT0Triggers(false),
77 fRequireL0forL1(false),
78 fExclusiveMinBias(false),
79 fUseTriggerSelectionContainer(false)
141 fHistos->
CreateTH2(
"hTriggerCorrelation",
"Correlation selected trigger classes", 6, -0.5, 5.5, 6, -0.5, 5.5);
142 std::array<TString, 6> binlabels = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2"};
144 for(
int ib = 0; ib < 6; ib++){
145 correlationHist->GetXaxis()->SetBinLabel(ib+1, binlabels[ib]);
146 correlationHist->GetYaxis()->SetBinLabel(ib+1, binlabels[ib]);
165 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
167 if(vtx->GetNContributors() < 1)
return false;
170 if(fInputEvent->IsA() == AliESDEvent::Class() &&
fAliAnalysisUtils->IsFirstEventInChunk(fInputEvent))
return false;
181 AliDebugStream(1) << GetName() <<
": Reject MC outliers" << std::endl;
188 std::array<TString, 6> kAbsTriggers = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2"};
189 for(
int itrg = 0; itrg < 6; itrg++){
192 for(
int jtrg = 0; jtrg < 6; jtrg++){
195 fHistos->
FillTH2(
"hTriggerCorrelation", kAbsTriggers[itrg], kAbsTriggers[jtrg]);
213 triggerstring = fInputEvent->GetFiredTriggerClasses();
217 UInt_t selectionstatus = fInputHandler->IsEventSelected();
218 Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
219 isMinBiasT0 = selectionstatus & AliVEvent::kINT8,
220 isCENT = selectionstatus & AliVEvent::kCentral,
221 isSemiCENT = selectionstatus & AliVEvent::kSemiCentral,
241 AliErrorStream() <<
"Trigger selection container requested but not found - not possible to select EMCAL triggers" << std::endl;
251 if(
fRequireBunchCrossing && ! (triggerstring.Contains(
"-B-") || triggerstring.Contains(
"-S-")))
return;
258 const std::array<ULong_t, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerBits = {
259 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE,
260 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE
263 emcalTriggers[iclass] &= bool(selectionstatus & kSelectTriggerBits[iclass]);
264 emc8Triggers[iclass] &= bool(selectionstatus & kSelectTriggerBits[iclass]);
265 if(
fRequireL0forL1 && !
bool(selectionstatus & (AliVEvent::kEMC7|AliVEvent::kEMC8))) {
266 emcalTriggers[iclass] =
false;
267 emc8Triggers[iclass] =
false;
274 const std::array<TString, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerStrings = {
275 "CEMC7-|CEMC8-",
"EG1|EGA",
"EG2",
"EJ1|EJE",
"EJ2",
"CDMC7-|CDMC8-",
"DG1",
"DG2",
"DJ1",
"DJ2" 277 if(triggerstring.Contains(
"EMC")) AliDebugStream(1) << GetName() <<
": Trigger string " << triggerstring << std::endl;
278 bool isT0trigger = triggerstring.Contains(
"INT8") || triggerstring.Contains(
"EMC8");
280 bool selectionStatus =
false;
281 if(kSelectTriggerStrings[iclass].Contains(
"|")){
282 std::unique_ptr<TObjArray> options(kSelectTriggerStrings[iclass].Tokenize(
"|"));
283 for(
auto o : *options){
284 TObjString *optstring =
static_cast<TObjString *
>(o);
285 if(triggerstring.Contains(optstring->String())){
286 selectionStatus =
true;
291 selectionStatus = triggerstring.Contains(kSelectTriggerStrings[iclass]);
295 emc8Triggers[iclass] &= selectionStatus;
296 emcalTriggers[iclass] =
false;
298 emcalTriggers[iclass] &= selectionStatus;
299 emc8Triggers[iclass] =
false;
301 if(emcalTriggers[iclass])
302 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT7 suite)" << std::endl;
303 if(emc8Triggers[iclass])
304 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT8 suite)" << std::endl;
310 if(emcalTriggers[itrg] || emc8Triggers[itrg]){
313 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= onlinestatus;
314 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= onlinestatus;
316 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= !onlinestatus;
317 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= !onlinestatus;
342 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EJ2excl");
346 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEJ2]))
fSelectedTriggers.push_back(
"EJ1excl");
350 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EG2excl");
354 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEG2]))
fSelectedTriggers.push_back(
"EG1excl");
366 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DJ2excl");
370 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDJ2]))
fSelectedTriggers.push_back(
"DJ1excl");
374 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DG2excl");
378 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDG2]))
fSelectedTriggers.push_back(
"DG1excl");
384 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]) {
389 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEG1]){
392 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EGAexcl");
394 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEJ1]){
397 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EJEexcl");
412 fDownscaleOADB =
new AliOADBContainer(
"AliEmcalDownscaleFactors");
429 if(fInputEvent->GetRunNumber() >= 15344 && fInputEvent->GetRunNumber() <= 197388){
445 AliDebugStream(1) << GetName() <<
": Loading acceptance map from OADB file " <<
fNameAcceptanceOADB << std::endl;
446 AliOADBContainer acceptanceCont(
"AliEmcalTriggerAcceptance");
448 TObjArray *acceptanceMaps =
dynamic_cast<TObjArray *
>(acceptanceCont.GetObject(fInputEvent->GetRunNumber()));
450 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG1")))){
451 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG1" << std::endl;
452 map->SetDirectory(
nullptr);
455 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG2")))){
456 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG2" << std::endl;
457 map->SetDirectory(
nullptr);
460 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG1")))){
461 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG1" << std::endl;
462 map->SetDirectory(
nullptr);
465 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG2")))){
466 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG2" << std::endl;
467 map->SetDirectory(
nullptr);
470 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ1")))){
471 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ1" << std::endl;
472 map->SetDirectory(
nullptr);
475 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ2")))){
476 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ2" << std::endl;
477 map->SetDirectory(
nullptr);
480 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ1")))){
481 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ1" << std::endl;
482 map->SetDirectory(
nullptr);
485 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ2")))){
486 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ2" << std::endl;
487 map->SetDirectory(
nullptr);
502 AliInfoStream() << GetName() <<
": No downscale factors provided for run " << runnumber << std::endl;
504 AliInfoStream() << GetName() <<
": Downscale factors used for run " << runnumber << std::endl;
507 AliInfoStream() << GetName() <<
": Trigger " << dfactor->GetName() <<
", downscale factor " << dfactor->GetVal() << std::endl;
526 std::vector<TString> triggers = {
"MB"};
527 const std::array<TString, 5> emcaltriggers = {{
"EMC7",
"EJ1",
"EJ2",
"EG1",
"EG2"}},
528 dcaltriggers = {{
"DMC7",
"DJ1",
"DJ2",
"DG1",
"DG2"}},
529 emcalexclusive = {{
"EMC7excl",
"EG2excl",
"EJ2excl",
"EJ1excl",
"EG1excl"}},
530 dcalexclusive = {{
"DMC7excl",
"DG2excl",
"DJ2excl",
"DJ1excl",
"DG1excl"}};
531 const std::array<TString, 4> t0triggers = {{
"MBT0",
"EMC8",
"EMC8EGA",
"EMC8EJE"}};
532 const std::array<TString, 3> t0exclusive = {{
"EMC8excl",
"EMC8EGAexcl",
"EMC8EJEexcl"}};
533 const std::array<TString, 2> centralitytriggers = {{
"CENT",
"SEMICENT"}};
535 for(
const auto &t : emcaltriggers) triggers.push_back(t);
536 if(useExclusiveTriggers)
537 for(
const auto &t : emcalexclusive) triggers.push_back(t);
540 for(
const auto &t : dcaltriggers) triggers.push_back(t);
541 if(useExclusiveTriggers)
542 for(
const auto &t : dcalexclusive) triggers.push_back(t);
545 for(
const auto &t: t0triggers) triggers.push_back(t);
546 if(useExclusiveTriggers)
547 for(
const auto &t : t0exclusive) triggers.push_back(t);
550 for(
const auto &t : centralitytriggers) triggers.push_back(t);
556 AliDebugStream(1) <<
"Using V1 online trigger selector" << std::endl;
560 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(p);
582 double triggerweight = 1.;
583 if(result) triggerweight = 1./result->GetVal();
584 AliDebugStream(1) <<
"Using trigger weight " << triggerweight <<
" for trigger " << triggerclass << std::endl;
585 return triggerweight;
587 AliDebugStream(1) <<
"No downscale factors loaded - using trigger weight 1" << std::endl;
593 AliInfoStream() <<
"Reading downscale factors from OCDB for run " << fInputEvent->GetRunNumber() << std::endl;
600 if(downscaleOCDB->GetCurrentRun() != fInputEvent->GetRunNumber()) downscaleOCDB->SetRun(fInputEvent->GetRunNumber());
601 const std::array<TString, 11> khwtriggers = {
"INT7",
"EMC7",
"DMC7",
"EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2"};
602 std::vector<TString> runtriggers = downscaleOCDB->GetTriggerClasses();
603 for(
const auto &t : khwtriggers){
604 std::function<bool (TString)> triggerfinder = [t](
const TString &
test) ->
bool {
605 if(!
test.Contains(t +
"-B-"))
return false;
608 auto entry = std::find_if(runtriggers.begin(), runtriggers.end(), triggerfinder);
609 if(entry != runtriggers.end()){
611 double downscalefactor = downscaleOCDB->GetDownscaleFactorForTriggerClass(triggername);
612 AliInfoStream() <<
"Applying downscale factor " << downscalefactor <<
" for trigger " << t <<
" (" << triggername <<
") for run " << fInputEvent->GetRunNumber() << std::endl;
615 AliErrorStream() <<
"No downscale factor found for trigger " << t <<
" for run " << fInputEvent->GetRunNumber() << std::endl;
623 threshpar->SetVal(threshold);
633 threshold = val->GetVal();
639 "DG1",
"DG2",
"DJ1",
"DJ2"};
645 "DG1",
"DG2",
"DJ1",
"DJ2"};
646 bool isInitialized =
true;
649 isInitialized =
false;
653 return isInitialized;
662 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0, nDJ1 = 0, nDJ2 = 0, nDG1 = 0, nDG2 = 0;
663 for(
auto patchIter : *triggerpatches){
664 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(patchIter);
665 if(!patch->IsRecalc())
continue;
666 if(patch->IsEMCal()){
667 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG1", patch->GetADCAmp())) nEG1++;
668 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG2", patch->GetADCAmp())) nEG2++;
669 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ1", patch->GetADCAmp())) nEJ1++;
670 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ2", patch->GetADCAmp())) nEJ2++;
672 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG1", patch->GetADCAmp())) nDG1++;
673 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG2", patch->GetADCAmp())) nDG2++;
674 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ1", patch->GetADCAmp())) nDJ1++;
675 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ2", patch->GetADCAmp())) nDJ2++;
678 if(nEJ1) triggerstring +=
"EJ1";
680 if(triggerstring.Length()) triggerstring +=
",";
681 triggerstring +=
"EJ2";
684 if(triggerstring.Length()) triggerstring +=
",";
685 triggerstring +=
"EG1";
688 if(triggerstring.Length()) triggerstring +=
",";
689 triggerstring +=
"EG2";
692 if(triggerstring.Length()) triggerstring +=
",";
693 triggerstring +=
"DJ2";
696 if(triggerstring.Length()) triggerstring +=
",";
697 triggerstring +=
"DJ2";
700 if(triggerstring.Length()) triggerstring +=
",";
701 triggerstring +=
"DG1";
704 if(triggerstring.Length()) triggerstring +=
",";
705 triggerstring +=
"DG2";
707 return triggerstring;
EMCAL L1 Jet trigger, low threshold.
std::vector< TString > fSelectedTriggers
! Triggers selected for given event
bool IsEventSelected(const char *name) const
Checks whether the events is selected for a given trigger type.
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
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.
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.
AliAnalysisTaskEmcalTriggerBase()
Dummy I/O constructor.
static AliEmcalDownscaleFactorsOCDB * Instance()
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.
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.
TString fNameTriggerSelectionContainer
Name of the trigger selection container.
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.
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.
Container for trigger decision object.
Bool_t fEnableCentralityTriggers
Enable central / semi-central trigger.
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
Analysis of high- tracks in triggered events.
Double_t fVertex[3]
!event vertex
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
Bool_t fUseTriggerSelectionContainer
Use trigger decision in trigger selection container.
std::vector< TString > GetSupportedTriggers(Bool_t useExclusiveTriggers=true) 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