15   : 
EL::AnaAlgorithm(
name, svcLoc)
 
   23   if (m_trigList_2015.empty() && m_trigList_2016.empty() && m_trigList_2017.empty() && m_trigList_2018.empty()
 
   24       && m_trigList_2022.empty() && m_trigList_2023.empty() && m_trigList_2024.empty() && m_trigList_2025.empty()) {
 
   26     return StatusCode::FAILURE;
 
   37   ANA_CHECK(m_eventInfoHandle.initialize(m_systematicsList));
 
   38   ANA_CHECK(m_scaleFactorDecoration.initialize(m_systematicsList, m_eventInfoHandle));
 
   39   ANA_CHECK(m_matchingDecoration.initialize(m_systematicsList, m_eventInfoHandle));
 
   41   ANA_CHECK (m_filterParams.initialize(m_systematicsList));
 
   50   std::unordered_map<std::string, TrigGlobEffCorr::ImportData::TrigDef> triggerDefs;
 
   52     auto it = triggerDict.find(
key);
 
   53     if (
it != triggerDict.end()) {
 
   54       triggerDefs[
it->second] = trigDef;
 
   59   std::unordered_map<std::string, std::vector<std::string> > trigMap;
 
   60   trigMap[
"2015"] = m_trigList_2015;
 
   61   trigMap[
"2016"] = m_trigList_2016;
 
   62   trigMap[
"2017"] = m_trigList_2017;
 
   63   trigMap[
"2018"] = m_trigList_2018;
 
   64   trigMap[
"2022"] = m_trigList_2022;
 
   65   trigMap[
"2023"] = m_trigList_2023;
 
   66   trigMap[
"2024"] = m_trigList_2024;
 
   67   trigMap[
"2025"] = m_trigList_2025;
 
   70   std::map<std::string, std::string> triggerCombination;
 
   71   auto combineStrings = [](
const std::vector<std::string>& 
input ) {
 
   72     std::string combinedString;
 
   74     for (
const auto & 
i : 
input) {
 
   76     combinedString += 
" || ";
 
   81     return combinedString;
 
   85     if (triggerCombination.find(
year) == triggerCombination.end()) {
 
   86       triggerCombination[
year] = 
"";
 
   88       triggerCombination[
year] += 
" || ";
 
   94   std::map<std::string,std::string> electronLegsPerKey, photonLegsPerKey;
 
   95   if (!m_doMatchingOnly) {
 
  105   std::map<std::string, std::string> legsPerTool;
 
  109   ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronEffTools, electronSFTools;
 
  111   if (!m_electronsHandle.empty() && !m_doMatchingOnly) {
 
  112     if (m_electronID.empty()) 
ATH_MSG_ERROR(
"Electron ID was not set for TrigGlobalEfficiencyAlg!");
 
  113     for (
const auto &[trigKey, 
triggers] : electronLegsPerKey) {
 
  114       if (trigKey == nameForDefaultSF) {  
 
  115         auto [itr, added] = legsPerTool.emplace(nameForDefaultSF, 
triggers);
 
  116         if (!added) itr->second += 
"," + 
triggers;
 
  120       for (
bool isSFTool : {
true, 
false}) { 
 
  121     auto t = m_electronToolsFactory.emplace(m_electronToolsFactory.end(),
 
  122                         "AsgElectronEfficiencyCorrectionTool/ElTrigEff_" 
  125       ANA_CHECK(
t->setProperty(
"MapFilePath", 
"ElectronEfficiencyCorrection/2015_2018/rel21.2/Precision_Summer2020_v1/map4.txt"));
 
  127     ANA_CHECK(
t->setProperty(
"IdKey", m_electronID.value()));
 
  128     ANA_CHECK(
t->setProperty(
"IsoKey", m_electronIsol.value()));
 
  129     ANA_CHECK(
t->setProperty(
"TriggerKey", isSFTool ? trigKey : 
"Eff_" + trigKey ));
 
  130     ANA_CHECK(
t->setProperty(
"CorrelationModel", 
"TOTAL"));
 
  135     auto& handles = (isSFTool? electronSFTools : electronEffTools);
 
  136     handles.push_back(
t->getHandle());
 
  137     std::string 
name = handles[handles.size()-1].name();
 
  140     ANA_CHECK(m_systematicsList.addSystematics( *handles[handles.size()-1] ));
 
  146   ToolHandleArray<IAsgPhotonEfficiencyCorrectionTool> photonEffTools, photonSFTools;
 
  148   if (!m_photonsHandle.empty() && !m_doMatchingOnly) {
 
  149     if (m_photonIsol.empty()) 
ATH_MSG_ERROR(
"Photon Isolation was not set for TrigGlobalEfficiencyAlg!");
 
  150     for (
const auto &[trigKey, 
triggers] : photonLegsPerKey) {
 
  151       if (trigKey == nameForDefaultSF) {  
 
  152         auto [itr, added] = legsPerTool.emplace(nameForDefaultSF, 
triggers);
 
  153         if (!added) itr->second += 
"," + 
triggers;
 
  157       for (
bool isSFTool : {
true, 
false}) { 
 
  158     auto t = m_photonToolsFactory.emplace(m_photonToolsFactory.end(),
 
  159                           "AsgPhotonEfficiencyCorrectionTool/PhTrigEff_" 
  162       ANA_CHECK(
t->setProperty(
"MapFilePath", 
"PhotonEfficiencyCorrection/2015_2018/rel21.2/Summer2020_Rec_v1/map3.txt"));
 
  164     ANA_CHECK(
t->setProperty(
"IsoKey", m_photonIsol.value()));
 
  165     ANA_CHECK(
t->setProperty(
"TriggerKey", isSFTool ? trigKey : 
"Eff_" + trigKey ));
 
  170     auto& handles = (isSFTool? photonSFTools : photonEffTools);
 
  171     handles.push_back(
t->getHandle());
 
  172     std::string 
name = handles[handles.size()-1].name();
 
  175     ANA_CHECK(m_systematicsList.addSystematics( *handles[handles.size()-1] ));
 
  181   ToolHandleArray<CP::IMuonTriggerScaleFactors> muonTools;
 
  182   if (!m_muonsHandle.empty() && !m_doMatchingOnly) {
 
  183     if (m_muonID.empty()) 
ATH_MSG_ERROR(
"Muon ID was not set for TrigGlobalEfficiencyAlg!");
 
  185     ANA_CHECK(m_muonTool.setProperty(
"MuonQuality", m_muonID.value()));
 
  186     ANA_CHECK(m_muonTool.setProperty(
"AllowZeroSF", 
true));
 
  189     muonTools.push_back(m_muonTool.getHandle());
 
  191     ANA_CHECK(m_systematicsList.addSystematics( *m_muonTool ));
 
  195   for(
const std::string& trig : m_separateMatchingTriggers) {
 
  196     std::string 
s = trig;
 
  200     m_separateMatchingDecorators.emplace(trig, 
SysWriteDecorHandle<bool>(
"triggerMatch_"+
s+m_separateMatchingDecorSuffix+
"_%SYS%", 
this));
 
  201     ANA_CHECK(m_separateMatchingDecorators.at(trig).initialize(m_systematicsList, m_eventInfoHandle));
 
  203     m_separateMatchingFlags[trig] = 
false;
 
  208   ANA_CHECK(m_tgecTool.setProperty(
"ElectronEfficiencyTools", electronEffTools));
 
  209   ANA_CHECK(m_tgecTool.setProperty(
"ElectronScaleFactorTools", electronSFTools));
 
  210   ANA_CHECK(m_tgecTool.setProperty(
"PhotonEfficiencyTools", photonEffTools));
 
  211   ANA_CHECK(m_tgecTool.setProperty(
"PhotonScaleFactorTools", photonSFTools));
 
  212   ANA_CHECK(m_tgecTool.setProperty(
"MuonTools", muonTools));
 
  213   ANA_CHECK(m_tgecTool.setProperty(
"ListOfLegsPerTool", legsPerTool));
 
  214   ANA_CHECK(m_tgecTool.setProperty(
"TriggerCombination", triggerCombination));
 
  215   ANA_CHECK(m_tgecTool.setProperty(
"TriggerMatchingTool", m_trigMatchingTool));
 
  216   ANA_CHECK(m_tgecTool.setProperty(
"NumberOfToys", m_numToys));
 
  217   ANA_CHECK(m_tgecTool.setProperty(
"OutputLevel", MSG::ERROR));
 
  220   ANA_CHECK(m_systematicsList.initialize());
 
  222   return StatusCode::SUCCESS;
 
  230   for (
const auto & syst : m_systematicsList.systematicsVector()) {
 
  237     std::vector<const xAOD::Electron*> selectedElectrons;
 
  238     std::vector<const xAOD::Photon*> selectedPhotons;
 
  239     std::vector<const xAOD::Muon*> selectedMuons;
 
  241     if (!m_electronsHandle.empty()) {
 
  244     if (m_electronSelection.getBool(*
el, syst)) selectedElectrons.push_back(
el);
 
  247     if (!m_photonsHandle.empty()) {
 
  248       ANA_CHECK(m_photonsHandle.retrieve(photons, syst));
 
  250     if (m_photonSelection.getBool(*ph, syst)) selectedPhotons.push_back(ph);
 
  253     if (!m_muonsHandle.empty()) {
 
  254       ANA_CHECK(m_muonsHandle.retrieve(muons, syst));
 
  256     if (m_muonSelection.getBool(*
mu, syst)) selectedMuons.push_back(
mu);
 
  260     ANA_CHECK(m_tgecTool->applySystematicVariation(syst));
 
  264     if (selectedElectrons.empty() && selectedMuons.empty() && selectedPhotons.empty()) 
sf = 1.0;
 
  265     else if (m_doMatchingOnly) 
sf = 1.0;
 
  268       m_tgecTool->getEfficiencyScaleFactor(selectedElectrons, selectedMuons, selectedPhotons,
 
  274     ANA_CHECK(m_eventInfoHandle.retrieve(evtInfo, syst));
 
  278     if (!(selectedElectrons.empty() && selectedMuons.empty() && selectedPhotons.empty())) {
 
  279       if(m_separateMatchingTriggers.value().empty()) {
 
  280         ANA_CHECK(m_tgecTool->checkTriggerMatching(
matched, selectedElectrons, selectedMuons, selectedPhotons));
 
  282         ANA_CHECK(m_tgecTool->checkTriggerMatching(m_separateMatchingFlags, selectedElectrons, selectedMuons, selectedPhotons));
 
  283         for(
const auto& [trig, 
flag] : m_separateMatchingFlags) {
 
  285           m_separateMatchingDecorators.at(trig).set(*evtInfo, 
flag, syst);
 
  292     m_scaleFactorDecoration.set(*evtInfo, 
sf, syst);
 
  293     m_matchingDecoration.set(*evtInfo, 
matched, syst);
 
  296   return StatusCode::SUCCESS;
 
  303   return StatusCode::SUCCESS;