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),
63 fApplyVertexCuts(true),
64 fVertexCut(-10., 10.),
65 fNameDownscaleOADB(
""),
68 fNameMaskedFastorOADB(),
71 fOnlineTriggerThresholds(),
72 fNameAcceptanceOADB(),
73 fNameTriggerSelectionContainer(
"EmcalTriggerDecision"),
74 fSelectNoiseEvents(false),
75 fRejectNoiseEvents(false),
76 fEnableDCALTriggers(true),
77 fEnableCentralityTriggers(false),
78 fEnableV0Triggers(true),
79 fEnableT0Triggers(false),
80 fEnableNoINTTriggers(false),
81 fRequireL0forL1(false),
82 fExclusiveMinBias(false),
83 fUseTriggerSelectionContainer(false)
149 std::array<TString, 11> binlabels = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2",
"DMC7",
"DG1",
"DG2",
"DJ1",
"DJ2"};
150 fHistos->
CreateTH2(
"hTriggerCorrelation",
"Correlation selected trigger classes", binlabels.size(), -0.5, binlabels.size() - 0.5, binlabels.size(), -0.5, binlabels.size() - 0.5);
152 for(
int ib = 0; ib < 6; ib++){
153 correlationHist->GetXaxis()->SetBinLabel(ib+1, binlabels[ib]);
154 correlationHist->GetYaxis()->SetBinLabel(ib+1, binlabels[ib]);
170 AliDebugStream(1) <<
"Failed trigger selection" << std::endl;
177 const AliVVertex *vtx =
fUseSPDVertex ? fInputEvent->GetPrimaryVertexSPD() : fInputEvent->GetPrimaryVertex();
179 if(vtx->GetNContributors() < 1) {
180 AliDebugStream(1) <<
"Failed Vertex Selection" << std::endl;
184 AliDebugStream(1) <<
"Failed vertex-z cut" << std::endl;
190 AliDebugStream(1) <<
"Checking cuts in AliAnalysisUtils" << std::endl;
191 if(fInputEvent->IsA() == AliESDEvent::Class() &&
fAliAnalysisUtils->IsFirstEventInChunk(fInputEvent))
return false;
197 AliDebugStream(1) <<
"Failed user extra cuts" << std::endl;
204 AliDebugStream(1) << GetName() <<
": Reject MC outliers" << std::endl;
211 std::array<TString, 11> kAbsTriggers = {
"MB",
"EMC7",
"EG1",
"EG2",
"EJ1",
"EJ2",
"DMC7",
"DG1",
"DG2",
"DJ1",
"DJ2"};
212 for(
int itrg = 0; itrg < kAbsTriggers.size(); itrg++){
215 for(
int jtrg = 0; jtrg < kAbsTriggers.size(); jtrg++){
218 fHistos->
FillTH2(
"hTriggerCorrelation", kAbsTriggers[itrg], kAbsTriggers[jtrg]);
224 AliDebugStream(1) <<
"Event is selected" << std::endl;
230 AliDebugStream(1) <<
"Entering trigger selection\n";
238 triggerstring = fInputEvent->GetFiredTriggerClasses();
242 UInt_t selectionstatus = fInputHandler->IsEventSelected();
243 Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
244 isMinBiasT0 = selectionstatus & AliVEvent::kINT8,
245 isCENT = selectionstatus & AliVEvent::kCentral,
246 isSemiCENT = selectionstatus & AliVEvent::kSemiCentral,
252 AliDebugStream(1) <<
"Min bias mode\n";
268 AliErrorStream() <<
"Trigger selection container requested but not found - not possible to select EMCAL triggers" << std::endl;
273 AliDebugStream(1) <<
"Found triggers " << fInputEvent->GetFiredTriggerClasses() << std::endl;
281 if(
fRequireBunchCrossing && ! (triggerstring.Contains(
"-B-") || triggerstring.Contains(
"-S-")))
return;
288 AliDebugStream(1) <<
"Require trigger bits" << std::endl;
289 const std::array<ULong_t, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerBits = {
290 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE,
291 AliVEvent::kEMC7|AliVEvent::kEMC8, AliVEvent::kEMCEGA, AliVEvent::kEMCEGA, AliVEvent::kEMCEJE, AliVEvent::kEMCEJE
294 if(!(selectionstatus & kSelectTriggerBits[iclass])) {
295 emcNoIntTriggers[iclass] = emc8Triggers[iclass] = emcalTriggers[iclass] =
false;
297 if(
fRequireL0forL1 && !
bool(selectionstatus & (AliVEvent::kEMC7|AliVEvent::kEMC8))) {
298 emcNoIntTriggers[iclass] = emc8Triggers[iclass] = emcalTriggers[iclass] =
false;
305 const std::array<TString, AliEmcalTriggerOfflineSelection::kTrgn> kSelectTriggerStrings = {
306 "CEMC7-|CEMC8-|C0EMC-",
"EG1|EGA",
"EG2",
"EJ1|EJE",
"EJ2",
"CDMC7-|CDMC8-|C0DMC-",
"DG1",
"DG2",
"DJ1",
"DJ2" 308 if(triggerstring.Contains(
"EMC")) AliDebugStream(1) << GetName() <<
": Trigger string " << triggerstring << std::endl;
309 bool isT0trigger = triggerstring.Contains(
"INT8") || triggerstring.Contains(
"TVX") || triggerstring.Contains(
"EMC8") || triggerstring.Contains(
"DMC8"),
310 isVZEROtrigger = triggerstring.Contains(
"INT7") || triggerstring.Contains(
"EMC7") || triggerstring.Contains(
"DMC7");
312 AliDebugStream(1) <<
"Next trigger: " << kSelectTriggerStrings[iclass] << std::endl;
313 bool selectionStatus =
false;
314 if(kSelectTriggerStrings[iclass].Contains(
"|")){
315 std::unique_ptr<TObjArray> options(kSelectTriggerStrings[iclass].Tokenize(
"|"));
316 for(
auto o : *options){
317 TObjString *optstring =
static_cast<TObjString *
>(o);
318 AliDebugStream(1) <<
"Checking trigger " << optstring->String() << std::endl;
319 if(triggerstring.Contains(optstring->String())){
320 AliDebugStream(1) <<
"Found " << optstring->String() <<
" ... " << std::endl;
321 selectionStatus =
true;
323 AliDebugStream(1) <<
"Checking trigger patch container for additional online patch" << std::endl;
324 selectionStatus = selectionStatus && triggersel->
IsEventSelected(optstring->String().Data());
329 selectionStatus = triggerstring.Contains(kSelectTriggerStrings[iclass]);
331 AliDebugStream(1) <<
"Found " << kSelectTriggerStrings[iclass] <<
" ... " << std::endl;
335 AliDebugStream(1) <<
"Checking trigger patch container for additional online patch" << std::endl;
336 selectionStatus = selectionStatus && triggersel->
IsEventSelected(kSelectTriggerStrings[iclass]);
340 emc8Triggers[iclass] &= selectionStatus;
341 emcalTriggers[iclass] =
false;
342 emcNoIntTriggers[iclass] =
false;
343 }
else if(isVZEROtrigger){
344 emcalTriggers[iclass] &= selectionStatus;
345 emc8Triggers[iclass] =
false;
346 emcNoIntTriggers[iclass] =
false;
349 emcNoIntTriggers[iclass] &= selectionStatus;
350 emcalTriggers[iclass] =
false;
351 emc8Triggers[iclass] =
false;
353 if(emcalTriggers[iclass])
354 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT7 suite)" << std::endl;
355 if(emc8Triggers[iclass])
356 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (INT8 suite)" << std::endl;
357 if(emcNoIntTriggers[iclass])
358 AliDebugStream(1) << GetName() <<
": Event selected as trigger " << kSelectTriggerStrings[iclass] <<
" (No INT coincidence)" << std::endl;
364 if(emcalTriggers[itrg] || emc8Triggers[itrg]){
367 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= onlinestatus;
368 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= onlinestatus;
370 if(emcalTriggers[itrg]) emcalTriggers[itrg] &= !onlinestatus;
371 if(emc8Triggers[itrg]) emc8Triggers[itrg] &= !onlinestatus;
392 AliDebugStream(1) <<
"Event selected as EMC7" << std::endl;
397 AliDebugStream(1) <<
"Event selected as EJ2" << std::endl;
399 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EJ2excl");
402 AliDebugStream(1) <<
"Event selected as EJ1" << std::endl;
404 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEJ2]))
fSelectedTriggers.push_back(
"EJ1excl");
407 AliDebugStream(1) <<
"Event selected as EG2" << std::endl;
409 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EG2excl");
412 AliDebugStream(1) <<
"Event selected as EG1" << std::endl;
414 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgEG2]))
fSelectedTriggers.push_back(
"EG1excl");
421 AliDebugStream(1) <<
"Event selected as DMC7" << std::endl;
426 AliDebugStream(1) <<
"Event selected as DJ2" << std::endl;
428 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DJ2excl");
431 AliDebugStream(1) <<
"Event selected as DJ1" << std::endl;
433 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDJ2]))
fSelectedTriggers.push_back(
"DJ1excl");
436 AliDebugStream(1) <<
"Event selected as DG2" << std::endl;
438 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DG2excl");
441 AliDebugStream(1) <<
"Event selected as DG1" << std::endl;
443 if(!(isMinBias || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcalTriggers[AliEmcalTriggerOfflineSelection::kTrgDG2]))
fSelectedTriggers.push_back(
"DG1excl");
452 AliDebugStream(1) <<
"Event selected as EMC8" << std::endl;
457 AliDebugStream(1) <<
"Event selected as EJ2 (EMC8)" << std::endl;
459 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EJ2excl");
462 AliDebugStream(1) <<
"Event selected as EJ1 (EMC8)" << std::endl;
464 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEJ2]))
fSelectedTriggers.push_back(
"EMC8EJ1excl");
467 AliDebugStream(1) <<
"Event selected as EG2 (EMC8)" << std::endl;
469 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0]))
fSelectedTriggers.push_back(
"EMC8EG2excl");
472 AliDebugStream(1) <<
"Event selected as EG1 (EMC8)" << std::endl;
474 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgEG2]))
fSelectedTriggers.push_back(
"EMC8EG1excl");
481 AliDebugStream(1) <<
"Event selected as DMC8" << std::endl;
486 AliDebugStream(1) <<
"Event selected as DJ2 (DMC8)" << std::endl;
488 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DMC8DJ2excl");
491 AliDebugStream(1) <<
"Event selected as DJ1 (DMC8)" << std::endl;
493 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgDJ2]))
fSelectedTriggers.push_back(
"DMC8DJ1excl");
496 AliDebugStream(1) <<
"Event selected as DG2 (DMC8)" << std::endl;
498 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgDL0]))
fSelectedTriggers.push_back(
"DMC8DG2excl");
501 AliDebugStream(1) <<
"Event selected as DG1 (DMC8)" << std::endl;
503 if(!(isMinBiasT0 || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emc8Triggers[AliEmcalTriggerOfflineSelection::kTrgDG2]))
fSelectedTriggers.push_back(
"DMC8DG1excl");
511 AliDebugStream(1) <<
"Event selected as 0EMC" << std::endl;
515 AliDebugStream(1) <<
"Event selected as EJ2 (E0MC)" << std::endl;
517 if(!emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0])
fSelectedTriggers.push_back(
"0EMCEJ2excl");
520 AliDebugStream(1) <<
"Event selected as EJ1 (0EMC)" << std::endl;
522 if(!(emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgEJ2]))
fSelectedTriggers.push_back(
"0EMCEJ1excl");
525 AliDebugStream(1) <<
"Event selected as EG2 (0EMC)" << std::endl;
527 if(!emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0])
fSelectedTriggers.push_back(
"0EMCEG2excl");
530 AliDebugStream(1) <<
"Event selected as EG1 (EMC8)" << std::endl;
532 if(!(emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgEL0] || emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgEG2]))
fSelectedTriggers.push_back(
"0EMCEG1excl");
539 AliDebugStream(1) <<
"Event selected as 0DMC" << std::endl;
543 AliDebugStream(1) <<
"Event selected as DJ2 (0DMC)" << std::endl;
545 if(!emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0])
fSelectedTriggers.push_back(
"0DMCDJ2excl");
548 AliDebugStream(1) <<
"Event selected as DJ1 (0DMC)" << std::endl;
550 if(!(emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgDJ2]))
fSelectedTriggers.push_back(
"0DMCDJ1excl");
553 AliDebugStream(1) <<
"Event selected as DG2 (0DMC)" << std::endl;
555 if(!emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0])
fSelectedTriggers.push_back(
"0DMCDG2excl");
558 AliDebugStream(1) <<
"Event selected as DG1 (0DMC)" << std::endl;
560 if(!(emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgDL0] || emcNoIntTriggers[AliEmcalTriggerOfflineSelection::kTrgDG2]))
fSelectedTriggers.push_back(
"0DMCDG1excl");
576 fDownscaleOADB =
new AliOADBContainer(
"AliEmcalDownscaleFactors");
593 if(fInputEvent->GetRunNumber() >= 15344 && fInputEvent->GetRunNumber() <= 197388){
609 AliDebugStream(1) << GetName() <<
": Loading acceptance map from OADB file " <<
fNameAcceptanceOADB << std::endl;
610 AliOADBContainer acceptanceCont(
"AliEmcalTriggerAcceptance");
612 TObjArray *acceptanceMaps =
dynamic_cast<TObjArray *
>(acceptanceCont.GetObject(fInputEvent->GetRunNumber()));
614 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG1")))){
615 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG1" << std::endl;
616 map->SetDirectory(
nullptr);
619 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EG2")))){
620 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EG2" << std::endl;
621 map->SetDirectory(
nullptr);
624 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG1")))){
625 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG1" << std::endl;
626 map->SetDirectory(
nullptr);
629 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DG2")))){
630 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DG2" << std::endl;
631 map->SetDirectory(
nullptr);
634 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ1")))){
635 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ1" << std::endl;
636 map->SetDirectory(
nullptr);
639 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"EJ2")))){
640 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger EJ2" << std::endl;
641 map->SetDirectory(
nullptr);
644 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ1")))){
645 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ1" << std::endl;
646 map->SetDirectory(
nullptr);
649 if((map = dynamic_cast<TH2 *>(acceptanceMaps->FindObject(
"DJ2")))){
650 AliDebugStream(1) << GetName() <<
": Found acceptance map for trigger DJ2" << std::endl;
651 map->SetDirectory(
nullptr);
666 AliInfoStream() << GetName() <<
": No downscale factors provided for run " << runnumber << std::endl;
668 AliInfoStream() << GetName() <<
": Downscale factors used for run " << runnumber << std::endl;
671 AliInfoStream() << GetName() <<
": Trigger " << dfactor->GetName() <<
", downscale factor " << dfactor->GetVal() << std::endl;
690 std::vector<TString> triggers;
691 const std::array<TString, 5> emcaltriggers = {{
"EMC7",
"EJ1",
"EJ2",
"EG1",
"EG2"}},
692 dcaltriggers = {{
"DMC7",
"DJ1",
"DJ2",
"DG1",
"DG2"}},
693 emcalexclusive = {{
"EMC7excl",
"EG2excl",
"EJ2excl",
"EJ1excl",
"EG1excl"}},
694 dcalexclusive = {{
"DMC7excl",
"DG2excl",
"DJ2excl",
"DJ1excl",
"DG1excl"}},
695 t0triggers = {{
"EMC8",
"EMC8EJ1",
"EMC8EJ2",
"EMC8EG1",
"EMC8EG2"}},
696 t0exclusive = {{
"EMC8excl",
"EMC8EG2excl",
"EMC8EJ2excl",
"EMC8EJ1excl",
"EMC8EG1excl"}},
697 t0dcaltriggers = {{
"DMC8",
"DMC8DJ1",
"DMC8DJ2",
"DMC8DG1",
"DMC8DG2"}},
698 t0dcalexclusive = {{
"DMC8excl",
"DMC8DG2excl",
"DMC8DJ2excl",
"DMC8DJ1excl",
"DMC8DG1excl"}},
699 nointEMCAL = {{
"0EMC",
"0EMCEJ1",
"0EMCEJ2",
"0EMCEG1",
"0EMCEG2"}},
700 nointDCAL = {{
"0DMC",
"0DMCDJ1",
"0DMCDJ2",
"0DMCDG1",
"0DMCDG2"}};
701 const std::array<TString, 4> nointemcalexclusive = {{
"0EMCEG2excl",
"0EMCEJ2excl",
"0EMCEJ1excl",
"0EMCEG1excl"}},
702 nointdcalexclusive = {{
"0DMCDG2excl",
"0DMCDJ2excl",
"0DMCDJ1excl",
"0DMCDG1excl"}};
703 const std::array<TString, 2> centralitytriggers = {{
"CENT",
"SEMICENT"}};
705 triggers.push_back(
"MB");
707 for(
const auto &t : emcaltriggers) triggers.push_back(t);
708 if(useExclusiveTriggers)
709 for(
const auto &t : emcalexclusive) triggers.push_back(t);
712 for(
const auto &t : dcaltriggers) triggers.push_back(t);
713 if(useExclusiveTriggers)
714 for(
const auto &t : dcalexclusive) triggers.push_back(t);
717 for(
const auto &t : centralitytriggers) triggers.push_back(t);
721 triggers.push_back(
"MBT0");
723 for(
const auto &t: t0triggers) triggers.push_back(t);
724 if(useExclusiveTriggers)
725 for(
const auto &t : t0exclusive) triggers.push_back(t);
728 for(
const auto &t: t0dcaltriggers) triggers.push_back(t);
729 if(useExclusiveTriggers)
730 for(
const auto &t : t0dcalexclusive) triggers.push_back(t);
736 for(
const auto &t: nointEMCAL) triggers.push_back(t);
737 if(useExclusiveTriggers)
738 for(
const auto &t : nointemcalexclusive) triggers.push_back(t);
741 for(
const auto &t: nointDCAL) triggers.push_back(t);
742 if(useExclusiveTriggers)
743 for(
const auto &t : nointdcalexclusive) triggers.push_back(t);
750 AliDebugStream(1) <<
"Using V1 online trigger selector" << std::endl;
754 AliEMCALTriggerPatchInfo *patch =
static_cast<AliEMCALTriggerPatchInfo *
>(p);
776 double triggerweight = 1.;
777 if(result) triggerweight = 1./result->GetVal();
778 AliDebugStream(1) <<
"Using trigger weight " << triggerweight <<
" for trigger " << triggerclass << std::endl;
779 return triggerweight;
781 AliDebugStream(1) <<
"No downscale factors loaded - using trigger weight 1" << std::endl;
787 AliInfoStream() <<
"Reading downscale factors from OCDB for run " << fInputEvent->GetRunNumber() << std::endl;
794 if(downscaleOCDB->GetCurrentRun() != fInputEvent->GetRunNumber()) downscaleOCDB->SetRun(fInputEvent->GetRunNumber());
795 const std::array<TString, 11> khwtriggers = {
"INT7",
"EMC7",
"DMC7",
"EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2"};
796 std::vector<TString> runtriggers = downscaleOCDB->GetTriggerClasses();
797 for(
const auto &t : khwtriggers){
798 std::function<bool (TString)> triggerfinder = [t](
const TString &
test) ->
bool {
799 if(!
test.Contains(t +
"-B-"))
return false;
802 auto entry = std::find_if(runtriggers.begin(), runtriggers.end(), triggerfinder);
803 if(entry != runtriggers.end()){
805 double downscalefactor = downscaleOCDB->GetDownscaleFactorForTriggerClass(triggername);
806 AliInfoStream() <<
"Applying downscale factor " << downscalefactor <<
" for trigger " << t <<
" (" << triggername <<
") for run " << fInputEvent->GetRunNumber() << std::endl;
809 AliErrorStream() <<
"No downscale factor found for trigger " << t <<
" for run " << fInputEvent->GetRunNumber() << std::endl;
817 threshpar->SetVal(threshold);
827 threshold = val->GetVal();
833 "DG1",
"DG2",
"DJ1",
"DJ2"};
839 "DG1",
"DG2",
"DJ1",
"DJ2"};
840 bool isInitialized =
true;
843 isInitialized =
false;
847 return isInitialized;
856 Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0, nDJ1 = 0, nDJ2 = 0, nDG1 = 0, nDG2 = 0;
857 for(
auto patchIter : *triggerpatches){
858 AliEMCALTriggerPatchInfo *patch =
dynamic_cast<AliEMCALTriggerPatchInfo *
>(patchIter);
859 if(!patch->IsRecalc())
continue;
860 if(patch->IsEMCal()){
861 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG1", patch->GetADCAmp())) nEG1++;
862 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"EG2", patch->GetADCAmp())) nEG2++;
863 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ1", patch->GetADCAmp())) nEJ1++;
864 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"EJ2", patch->GetADCAmp())) nEJ2++;
866 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG1", patch->GetADCAmp())) nDG1++;
867 if(patch->IsGammaLowRecalc() &&
SelectFiredPatch(
"DG2", patch->GetADCAmp())) nDG2++;
868 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ1", patch->GetADCAmp())) nDJ1++;
869 if(patch->IsJetLowRecalc() &&
SelectFiredPatch(
"DJ2", patch->GetADCAmp())) nDJ2++;
872 if(nEJ1) triggerstring +=
"EJ1";
874 if(triggerstring.Length()) triggerstring +=
",";
875 triggerstring +=
"EJ2";
878 if(triggerstring.Length()) triggerstring +=
",";
879 triggerstring +=
"EG1";
882 if(triggerstring.Length()) triggerstring +=
",";
883 triggerstring +=
"EG2";
886 if(triggerstring.Length()) triggerstring +=
",";
887 triggerstring +=
"DJ2";
890 if(triggerstring.Length()) triggerstring +=
",";
891 triggerstring +=
"DJ2";
894 if(triggerstring.Length()) triggerstring +=
",";
895 triggerstring +=
"DG1";
898 if(triggerstring.Length()) triggerstring +=
",";
899 triggerstring +=
"DG2";
901 return triggerstring;
EMCAL L1 Jet trigger, low threshold.
std::vector< TString > fSelectedTriggers
! Triggers selected for given event
Bool_t fApplyVertexCuts
Apply vertex cuts (default: True)
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.
Double_t fVertexSPD[3]
!event Svertex
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.
Bool_t fEnableV0Triggers
Enable VZERO-based triggers (default)
AliAnalysisTaskEmcalTriggerBase()
Dummy I/O constructor.
static AliEmcalDownscaleFactorsOCDB * Instance()
Bool_t fEnableNoINTTriggers
Process EMCAL triggers without coincidence with INT triggers - exotic case - default off...
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) - default off.
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.
Bool_t fUseSPDVertex
Use SPD vertex (for productions without TPC)
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