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" 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 fEnableCentralityTriggers(false),
74 fEnableT0Triggers(false),
75 fRequireL0forL1(false),
76 fExclusiveMinBias(false)
136 fHistos->
CreateTH2(
"hTriggerCorrelation",
"Correlation selected trigger classes", 6, -0.5, 5.5, 6, -0.5, 5.5);
137 std::array<TString, 6> binlabels = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2"};
139 for(
int ib = 0; ib < 6; ib++){
140 correlationHist->GetXaxis()->SetBinLabel(ib+1, binlabels[ib]);
141 correlationHist->GetYaxis()->SetBinLabel(ib+1, binlabels[ib]);
160 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
162 if(vtx->GetNContributors() < 1)
return false;
165 if(fInputEvent->IsA() == AliESDEvent::Class() &&
fAliAnalysisUtils->IsFirstEventInChunk(fInputEvent))
return false;
176 AliDebugStream(1) << GetName() <<
": Reject MC outliers" << std::endl;
183 std::array<TString, 6> kAbsTriggers = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2"};
184 for(
int itrg = 0; itrg < 6; itrg++){
187 for(
int jtrg = 0; jtrg < 6; jtrg++){
190 fHistos->
FillTH2(
"hTriggerCorrelation", kAbsTriggers[itrg], kAbsTriggers[jtrg]);
208 triggerstring = fInputEvent->GetFiredTriggerClasses();
212 UInt_t selectionstatus = fInputHandler->IsEventSelected();
213 Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
214 isMinBiasT0 = selectionstatus & AliVEvent::kINT8,
215 isCENT = selectionstatus & AliVEvent::kCentral,
216 isSemiCENT = selectionstatus & AliVEvent::kSemiCentral,
237 if(
fRequireBunchCrossing && ! (triggerstring.Contains(
"-B-") || triggerstring.Contains(
"-S-")))
return;
244 const std::array<ULong_t, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerBits = {
245 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE,
246 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE
249 emcalTriggers[iclass] &= bool(selectionstatus & kSelectTriggerBits[iclass]);
250 emc8Triggers[iclass] &= bool(selectionstatus & kSelectTriggerBits[iclass]);
251 if(
fRequireL0forL1 && !
bool(selectionstatus & (AliVEvent::kEMC7|AliVEvent::kEMC8))) {
252 emcalTriggers[iclass] =
false;
253 emc8Triggers[iclass] =
false;
260 const std::array<TString, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerStrings = {
261 "CEMC7-|CEMC8-",
"EG1|EGA",
"EG2",
"EJ1|EJE",
"EJ2",
"CDMC7-|CDMC8-",
"DG1",
"DG2",
"DJ1",
"DJ2" 263 if(triggerstring.Contains(
"EMC")) AliDebugStream(1) << GetName() <<
": Trigger string " << triggerstring << std::endl;
264 bool isT0trigger = triggerstring.Contains(
"INT8") || triggerstring.Contains(
"EMC8");
266 bool selectionStatus =
false;
267 if(kSelectTriggerStrings[iclass].Contains(
"|")){
268 std::unique_ptr<TObjArray> options(kSelectTriggerStrings[iclass].Tokenize(
"|"));
269 for(
auto o : *options){
270 TObjString *optstring =
static_cast<TObjString *
>(o);
271 if(triggerstring.Contains(optstring->String())) selectionStatus =
true;
274 selectionStatus = triggerstring.Contains(kSelectTriggerStrings[iclass]);
277 emc8Triggers[iclass] &= selectionStatus;
278 emcalTriggers[iclass] =
false;
280 emcalTriggers[iclass] &= selectionStatus;
281 emc8Triggers[iclass] =
false;
283 if(emcalTriggers[iclass])
284 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT7 suite)" << std::endl;
285 if(emc8Triggers[iclass])
286 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT8 suite)" << std::endl;
292 if(emcalTriggers[itrg] || emc8Triggers[itrg]){
295 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= onlinestatus;
296 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= onlinestatus;
298 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= !onlinestatus;
299 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= !onlinestatus;
324 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EJ2excl");
328 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEJ2]))
fSelectedTriggers.push_back(
"EJ1excl");
332 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EG2excl");
336 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEG2]))
fSelectedTriggers.push_back(
"EG1excl");
348 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DJ2excl");
352 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDJ2]))
fSelectedTriggers.push_back(
"DJ1excl");
356 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DG2excl");
360 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDG2]))
fSelectedTriggers.push_back(
"DG1excl");
366 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]) {
371 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEG1]){
374 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EGAexcl");
376 if(emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEJ1]){
379 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EJEexcl");
394 fDownscaleOADB =
new AliOADBContainer(
"AliEmcalDownscaleFactors");
411 if(fInputEvent->GetRunNumber() >= 15344 && fInputEvent->GetRunNumber() <= 197388){
427 AliDebugStream(1) << GetName() <<
": Loading acceptance map from OADB file " <<
fNameAcceptanceOADB << std::endl;
428 AliOADBContainer acceptanceCont(
"AliEmcalTriggerAcceptance");
430 TObjArray *acceptanceMaps =
dynamic_cast<TObjArray *
>(acceptanceCont.GetObject(fInputEvent->GetRunNumber()));
432 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG1")))){
433 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG1" << std::endl;
434 map->SetDirectory(
nullptr);
437 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG2")))){
438 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG2" << std::endl;
439 map->SetDirectory(
nullptr);
442 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG1")))){
443 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG1" << std::endl;
444 map->SetDirectory(
nullptr);
447 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG2")))){
448 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG2" << std::endl;
449 map->SetDirectory(
nullptr);
452 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ1")))){
453 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ1" << std::endl;
454 map->SetDirectory(
nullptr);
457 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ2")))){
458 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ2" << std::endl;
459 map->SetDirectory(
nullptr);
462 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ1")))){
463 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ1" << std::endl;
464 map->SetDirectory(
nullptr);
467 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ2")))){
468 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ2" << std::endl;
469 map->SetDirectory(
nullptr);
484 AliInfoStream() << GetName() <<
": No downscale factors provided for run " << runnumber << std::endl;
486 AliInfoStream() << GetName() <<
": Downscale factors used for run " << runnumber << std::endl;
489 AliInfoStream() << GetName() <<
": Trigger " << dfactor->GetName() <<
", downscale factor " << dfactor->GetVal() << std::endl;
508 std::vector<TString> triggers = {
"MB"};
509 const std::array<TString, 10> emcaltriggers = {{
"EMC7",
"EJ1",
"EJ2",
"EG1",
"EG2",
"EMC7excl",
"EG2excl",
"EJ2excl",
"EJ1excl",
"EG1excl"}},
510 dcaltriggers = {{
"DMC7",
"DJ1",
"DJ2",
"DG1",
"DG2",
"DMC7excl",
"DG2excl",
"DJ2excl",
"DJ1excl",
"DG1excl"}};
511 const std::array<TString, 7> t0triggers = {{
"MBT0",
"EMC8",
"EMC8EGA",
"EMC8EJE",
"EMC8excl",
"EMC8EGAexcl",
"EMC8EJEexcl"}};
512 const std::array<TString, 2> centralitytriggers = {{
"CENT",
"SEMICENT"}};
514 for(
const auto &t : emcaltriggers) triggers.push_back(t);
517 for(
const auto &t : dcaltriggers) triggers.push_back(t);
520 for(
const auto &t: t0triggers) triggers.push_back(t);
523 for(
const auto &t : centralitytriggers) triggers.push_back(t);
529 AliDebugStream(1) <<
"Using V1 online trigger selector" << std::endl;
533 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(p);
555 double triggerweight = 1.;
556 if(result) triggerweight = 1./result->GetVal();
557 AliDebugStream(1) <<
"Using trigger weight " << triggerweight <<
" for trigger " << triggerclass << std::endl;
558 return triggerweight;
560 AliDebugStream(1) <<
"No downscale factors loaded - using trigger weight 1" << std::endl;
566 AliInfoStream() <<
"Reading downscale factors from OCDB for run " << fInputEvent->GetRunNumber() << std::endl;
573 if(downscaleOCDB->GetCurrentRun() != fInputEvent->GetRunNumber()) downscaleOCDB->SetRun(fInputEvent->GetRunNumber());
574 const std::array<TString, 11> khwtriggers = {
"INT7",
"EMC7",
"DMC7",
"EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2"};
575 std::vector<TString> runtriggers = downscaleOCDB->GetTriggerClasses();
576 for(
const auto &t : khwtriggers){
577 std::function<bool (TString)> triggerfinder = [t](
const TString &
test) ->
bool {
578 if(!
test.Contains(t +
"-B-"))
return false;
581 auto entry = std::find_if(runtriggers.begin(), runtriggers.end(), triggerfinder);
582 if(entry != runtriggers.end()){
584 double downscalefactor = downscaleOCDB->GetDownscaleFactorForTriggerClass(triggername);
585 AliInfoStream() <<
"Applying downscale factor " << downscalefactor <<
" for trigger " << t <<
" (" << triggername <<
") for run " << fInputEvent->GetRunNumber() << std::endl;
588 AliErrorStream() <<
"No downscale factor found for trigger " << t <<
" for run " << fInputEvent->GetRunNumber() << std::endl;
596 threshpar->SetVal(threshold);
606 threshold = val->GetVal();
612 "DG1",
"DG2",
"DJ1",
"DJ2"};
618 "DG1",
"DG2",
"DJ1",
"DJ2"};
619 bool isInitialized =
true;
622 isInitialized =
false;
626 return isInitialized;
635 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0, nDJ1 = 0, nDJ2 = 0, nDG1 = 0, nDG2 = 0;
636 for(
auto patchIter : *triggerpatches){
637 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(patchIter);
638 if(!patch->IsRecalc())
continue;
639 if(patch->IsEMCal()){
640 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG1", patch->GetADCAmp())) nEG1++;
641 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG2", patch->GetADCAmp())) nEG2++;
642 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ1", patch->GetADCAmp())) nEJ1++;
643 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ2", patch->GetADCAmp())) nEJ2++;
645 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG1", patch->GetADCAmp())) nDG1++;
646 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG2", patch->GetADCAmp())) nDG2++;
647 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ1", patch->GetADCAmp())) nDJ1++;
648 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ2", patch->GetADCAmp())) nDJ2++;
651 if(nEJ1) triggerstring +=
"EJ1";
653 if(triggerstring.Length()) triggerstring +=
",";
654 triggerstring +=
"EJ2";
657 if(triggerstring.Length()) triggerstring +=
",";
658 triggerstring +=
"EG1";
661 if(triggerstring.Length()) triggerstring +=
",";
662 triggerstring +=
"EG2";
665 if(triggerstring.Length()) triggerstring +=
",";
666 triggerstring +=
"DJ2";
669 if(triggerstring.Length()) triggerstring +=
",";
670 triggerstring +=
"DJ2";
673 if(triggerstring.Length()) triggerstring +=
",";
674 triggerstring +=
"DG1";
677 if(triggerstring.Length()) triggerstring +=
",";
678 triggerstring +=
"DG2";
680 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.
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.
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.
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
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