From dcb23309e380fb8f30c680e0f7a772c0ab6535b9 Mon Sep 17 00:00:00 2001
From: Julien Maurer <julien.maurer@cern.ch>
Date: Wed, 22 May 2024 10:39:57 +0200
Subject: [PATCH] TrigGlobalEfficiencyCorrection adjustments for 2023 triggers
 and missing scale factors

introduce special RETURN_DEFAULT_SCALE_FACTOR for ListOfLegsPerTool property; add 2023 electron triggers
---
 .../Root/TrigGlobalEfficiencyAlg.cxx          |  11 ++
 .../ITrigGlobalEfficiencyCorrectionTool.h     |   3 +
 .../Root/Calculator.cxx                       |  36 ++--
 .../Root/CheckConfig.cxx                      |   1 +
 .../TrigGlobalEfficiencyCorrectionTool.cxx    |  41 ++++-
 .../Calculator.h                              |   3 +-
 .../TrigGlobalEfficiencyCorrectionTool.h      |  15 +-
 .../data/Hierarchies.cfg                      |   5 +-
 .../data/MapKeys.cfg                          |   6 +
 .../data/Thresholds.cfg                       |   6 +
 .../data/Triggers.cfg                         | 163 +++++++++---------
 .../util/TrigGlobEffCorrValidation.cxx        |  71 ++++++--
 12 files changed, 240 insertions(+), 121 deletions(-)

diff --git a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigGlobalEfficiencyAlg.cxx b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigGlobalEfficiencyAlg.cxx
index d2565f07bd8b..11adf7873863 100644
--- a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigGlobalEfficiencyAlg.cxx
+++ b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigGlobalEfficiencyAlg.cxx
@@ -101,6 +101,7 @@ StatusCode CP::TrigGlobalEfficiencyAlg::initialize()
   ANA_CHECK(TrigGlobalEfficiencyCorrectionTool::suggestPhotonMapKeys(triggerCombination, "2015_2018/rel21.2/Summer2020_Rec_v1", photonLegsPerKey));
 
   std::map<std::string, std::string> legsPerTool;
+  auto nameForDefaultSF = ITrigGlobalEfficiencyCorrectionTool::toolnameForDefaultScaleFactor();
 
   // ELECTRON TOOLS
   ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronEffTools, electronSFTools;
@@ -108,6 +109,11 @@ StatusCode CP::TrigGlobalEfficiencyAlg::initialize()
   if (!m_electronsHandle.empty() && !m_doMatchingOnly) {
     if (m_electronID.empty()) ATH_MSG_ERROR("Electron ID was not set for TrigGlobalEfficiencyAlg!");
     for (const auto &[trigKey, triggers] : electronLegsPerKey) {
+      if (trigKey == nameForDefaultSF) {  // no tool needed in this case
+        auto [itr, added] = legsPerTool.emplace(nameForDefaultSF, triggers);
+        if (!added) itr->second += "," + triggers;
+        continue;
+      }
       nTools++;
       for (bool isSFTool : {true, false}) { // one tool instance for efficiencies, another for scale factors
 	auto t = m_electronToolsFactory.emplace(m_electronToolsFactory.end(),
@@ -140,6 +146,11 @@ StatusCode CP::TrigGlobalEfficiencyAlg::initialize()
   if (!m_photonsHandle.empty() && !m_doMatchingOnly) {
     if (m_photonIsol.empty()) ATH_MSG_ERROR("Photon Isolation was not set for TrigGlobalEfficiencyAlg!");
     for (const auto &[trigKey, triggers] : photonLegsPerKey) {
+      if (trigKey == nameForDefaultSF) {  // no tool needed in this case
+        auto [itr, added] = legsPerTool.emplace(nameForDefaultSF, triggers);
+        if (!added) itr->second += "," + triggers;
+        continue;
+      }
       nTools++;
       for (bool isSFTool : {true, false}) { // one tool instance for efficiencies, another for scale factors
 	auto t = m_photonToolsFactory.emplace(m_photonToolsFactory.end(),
diff --git a/PhysicsAnalysis/Interfaces/TriggerAnalysisInterfaces/TriggerAnalysisInterfaces/ITrigGlobalEfficiencyCorrectionTool.h b/PhysicsAnalysis/Interfaces/TriggerAnalysisInterfaces/TriggerAnalysisInterfaces/ITrigGlobalEfficiencyCorrectionTool.h
index 4b72be7f5a30..2872de55fb17 100644
--- a/PhysicsAnalysis/Interfaces/TriggerAnalysisInterfaces/TriggerAnalysisInterfaces/ITrigGlobalEfficiencyCorrectionTool.h
+++ b/PhysicsAnalysis/Interfaces/TriggerAnalysisInterfaces/TriggerAnalysisInterfaces/ITrigGlobalEfficiencyCorrectionTool.h
@@ -15,6 +15,7 @@
 
 #include <vector>
 #include <type_traits>
+#include <string_view>
 
 class ITrigGlobalEfficiencyCorrectionTool : public virtual CP::ISystematicsTool
 {
@@ -51,6 +52,8 @@ public:
 	virtual CP::CorrectionCode getEfficiencyScaleFactor(unsigned runNumber, const std::vector<const xAOD::IParticle*>& particles, double& efficiencyScaleFactor) = 0;
 	virtual CP::CorrectionCode getEfficiency(unsigned runNumber, const std::vector<const xAOD::IParticle*>& particles, double& efficiencyData, double& efficiencyMc) = 0;	
 	
+	/// To be used with the ListOfLegsPerTool property:
+	static std::string toolnameForDefaultScaleFactor() { return "RETURN_DEFAULT_SCALE_FACTOR"; }
 protected:
 	double* handleArg(double& arg, std::vector<const xAOD::IParticle*>&) { return &arg; }
 	template<typename P>  double* handleArg(const std::vector<P>& arg, std::vector<const xAOD::IParticle*>& particles)
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/Calculator.cxx b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/Calculator.cxx
index 52d28e413d35..064bb27f64c2 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/Calculator.cxx
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/Calculator.cxx
@@ -116,10 +116,18 @@ const Calculator::Period* Calculator::getPeriod(unsigned runNumber) const
 bool Calculator::compute(TrigGlobalEfficiencyCorrectionTool& parent, const LeptonList& leptons, unsigned runNumber, Efficiencies& efficiencies)
 {
 	m_parent = &parent;
+	m_forceUnitSF = false;
 	auto period = getPeriod(runNumber);
 	if(!period) return false;
 	m_cachedEfficiencies.clear();
-	return period->m_formula && period->m_formula(this, leptons, runNumber, efficiencies);
+	bool success = period->m_formula && period->m_formula(this, leptons, runNumber, efficiencies);
+	if (m_forceUnitSF)
+	{
+		efficiencies.data() = 1.;
+		efficiencies.mc() = 1.;
+		success = true;
+	}
+	return success;
 }
 
 bool Calculator::checkTriggerMatching(TrigGlobalEfficiencyCorrectionTool& parent, bool& matched, const LeptonList& leptons, unsigned runNumber)
@@ -236,28 +244,36 @@ Efficiencies Calculator::getCachedTriggerLegEfficiencies(const Lepton& lepton, u
 	Efficiencies& efficiencies = insertion.first->second;
 	if(insertion.second)
 	{
-		bool cpSuccess = false;
+		auto res = TrigGlobalEfficiencyCorrectionTool::TLE_ERROR;
 		switch(lepton.type())
 		{
 		case xAOD::Type::Electron:
-			cpSuccess = m_parent->getTriggerLegEfficiencies(lepton.electron(), runNumber, leg, lepton.tag(), efficiencies);
+			res = m_parent->getTriggerLegEfficiencies(lepton.electron(), runNumber, leg, lepton.tag(), efficiencies);
 			break;
 		case xAOD::Type::Muon:
-			cpSuccess = m_parent->getTriggerLegEfficiencies(lepton.muon(), leg, lepton.tag(), efficiencies);
+			res = m_parent->getTriggerLegEfficiencies(lepton.muon(), runNumber, leg, lepton.tag(), efficiencies);
 			break;
 		case xAOD::Type::Photon:
-			cpSuccess = m_parent->getTriggerLegEfficiencies(lepton.photon(), runNumber, leg, lepton.tag(), efficiencies);
+			res = m_parent->getTriggerLegEfficiencies(lepton.photon(), runNumber, leg, lepton.tag(), efficiencies);
 			break;
 		default: ATH_MSG_ERROR("Unsupported particle type");
 		}
-		if(!cpSuccess)
+		switch (res)
 		{
-			efficiencies.data() = -777.;
-			efficiencies.mc() = -777.;
-			success = false;
+			case TrigGlobalEfficiencyCorrectionTool::TLE_OK:
+				break;
+			case TrigGlobalEfficiencyCorrectionTool::TLE_UNAVAILABLE:
+				m_forceUnitSF = true;
+				break;
+			case TrigGlobalEfficiencyCorrectionTool::TLE_ERROR:
+				[[fallthrough]];
+			default:
+				success = false;
+				efficiencies.data() = -777.;
+				efficiencies.mc() = -777.;
 		}
 	}
-	if(efficiencies.mc()==-777.) success = false;
+	if(efficiencies.mc()==-777. && !m_forceUnitSF) success = false;
 	return efficiencies;
 }
 
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/CheckConfig.cxx b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/CheckConfig.cxx
index 64750ee19ea8..cb7de4a0e97d 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/CheckConfig.cxx
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/CheckConfig.cxx
@@ -56,6 +56,7 @@ bool CheckConfig::basicConfigChecks()
 	for(auto& kv : m_parent.m_legsPerTool)
 	{
 		auto& name = kv.first;
+		if (name == ITrigGlobalEfficiencyCorrectionTool::toolnameForDefaultScaleFactor()) continue;
 		if(findToolByName(m_parent.m_suppliedElectronEfficiencyTools, name)
 			|| findToolByName(m_parent.m_suppliedElectronScaleFactorTools, name)
 			|| findToolByName(m_parent.m_suppliedPhotonEfficiencyTools, name)
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/TrigGlobalEfficiencyCorrectionTool.cxx b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/TrigGlobalEfficiencyCorrectionTool.cxx
index 3836db07409c..18fe53daf253 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/TrigGlobalEfficiencyCorrectionTool.cxx
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/Root/TrigGlobalEfficiencyCorrectionTool.cxx
@@ -125,6 +125,16 @@ StatusCode TrigGlobalEfficiencyCorrectionTool::initialize()
 	{
 		return StatusCode::FAILURE;
 	}
+	// List legs (if any) for which a dummy scale factor should be returned.
+	auto itr = m_legsPerTool.find(toolnameForDefaultScaleFactor());
+	if (itr != m_legsPerTool.end())
+	{
+		bool success = true;
+		for (ToolKey leg: parseListOfLegs(data, itr->second, success))
+		{
+			m_unsupportedLegs.insert(leg);
+		}
+	}
 	
 	ATH_MSG_DEBUG("Loading user-defined trigger combination"); 
 	bool useDefaultElectronTools = (m_suppliedElectronEfficiencyTools.size()==1) && (m_suppliedElectronScaleFactorTools.size()==1) && (m_legsPerTool.size()==0);
@@ -191,7 +201,8 @@ bool TrigGlobalEfficiencyCorrectionTool::enumerateTools(ImportData& data, ToolHa
 	for(unsigned index=0;index<suppliedTools.size();++index)
 	{
 		auto& handle = suppliedTools[index];
-		const std::string& name = handle.name(), altname = handle->name(); // athena: not always the same
+		const std::string& name = handle.name();
+		const std::string& altname = handle->name(); // athena: not always the same
 		flat_set<ToolKey> listOfLegs;
 		/// Find the legs associated to this tool ("ListOfLegsPerTool" property)
 		if(suppliedTools.size()!=1 || m_legsPerTool.size()!=0)
@@ -568,7 +579,7 @@ auto TrigGlobalEfficiencyCorrectionTool::listNonOrderedCSValues(const std::strin
 }
 
 template<class ParticleType>
-bool TrigGlobalEfficiencyCorrectionTool::getEgammaTriggerLegEfficiencies(const ParticleType* p, unsigned runNumber, std::size_t leg, std::size_t tag, Efficiencies& efficiencies)
+auto TrigGlobalEfficiencyCorrectionTool::getEgammaTriggerLegEfficiencies(const ParticleType* p, unsigned runNumber, std::size_t leg, std::size_t tag, Efficiencies& efficiencies) -> TLE_RESULT
 {
 	/// Common implementation for electrons and photons
 	auto ptype = []() { return std::is_same<ParticleType, xAOD::Electron>::value? "electron" : std::is_same<ParticleType, xAOD::Photon>::value? "photon" : "<unknown type>"; };
@@ -579,40 +590,52 @@ bool TrigGlobalEfficiencyCorrectionTool::getEgammaTriggerLegEfficiencies(const P
 	auto itrEff = GetEfficiencyToolIndex(p).find(ToolKey(leg, tag, runNumber));
 	if(itrSf==GetScaleFactorToolIndex(p).end() || itrEff==GetEfficiencyToolIndex(p).end())
 	{
+		if (m_unsupportedLegs.count(ToolKey(leg, 0u, runNumber))) 
+		{
+			efficiencies.data() = 0.5;
+			efficiencies.mc() = 0.5;
+			return TLE_UNAVAILABLE;
+		}
 		if(!tag) ATH_MSG_ERROR("Unable to find " << ptype() << " tools needed for trigger leg " << m_dictionary[leg] << " (run number = " << runNumber << ")");
 		else ATH_MSG_ERROR("Unable to find " << ptype() << " tools needed for trigger leg " << m_dictionary[leg] << " and selection tag " << m_dictionary[tag] 
 			<< " (run number = " << runNumber << ")");
-		return false;
+		return TLE_ERROR;
 	}
 	double sf;
 	bool success = checkAndRecord(GetScaleFactorTool(p, itrSf->second).getEfficiencyScaleFactor(*p, sf))
 		&& checkAndRecord(GetEfficiencyTool(p, itrEff->second).getEfficiencyScaleFactor(*p, efficiencies.mc()));
 	efficiencies.data() = sf * efficiencies.mc();
 	ATH_MSG_DEBUG("found for that " << ptype() << " eff(data) = " << efficiencies.data()<<" and eff(MC) = "<<efficiencies.mc());
-	return success;
+	return success? TLE_OK: TLE_ERROR;
 }
 
-bool TrigGlobalEfficiencyCorrectionTool::getTriggerLegEfficiencies(const xAOD::Electron* p, unsigned runNumber, std::size_t leg, std::size_t tag, Efficiencies& efficiencies)
+auto TrigGlobalEfficiencyCorrectionTool::getTriggerLegEfficiencies(const xAOD::Electron* p, unsigned runNumber, std::size_t leg, std::size_t tag, Efficiencies& efficiencies) -> TLE_RESULT
 {
 	return getEgammaTriggerLegEfficiencies(p, runNumber, leg, tag, efficiencies);
 }
 
-bool TrigGlobalEfficiencyCorrectionTool::getTriggerLegEfficiencies(const xAOD::Photon* p, unsigned runNumber, std::size_t leg, std::size_t tag, Efficiencies& efficiencies)
+auto TrigGlobalEfficiencyCorrectionTool::getTriggerLegEfficiencies(const xAOD::Photon* p, unsigned runNumber, std::size_t leg, std::size_t tag, Efficiencies& efficiencies) -> TLE_RESULT
 {
 	return getEgammaTriggerLegEfficiencies(p, runNumber, leg, tag, efficiencies);
 }
 
-bool TrigGlobalEfficiencyCorrectionTool::getTriggerLegEfficiencies(const xAOD::Muon* p, std::size_t leg, std::size_t tag, Efficiencies& efficiencies)
+auto TrigGlobalEfficiencyCorrectionTool::getTriggerLegEfficiencies(const xAOD::Muon* p, unsigned runNumber, std::size_t leg, std::size_t tag, Efficiencies& efficiencies) -> TLE_RESULT
 {
 	ATH_MSG_DEBUG("Retrieving efficiencies for muon " <<p << " (pt=" << p->pt() << ", eta=" << p->eta() 
 		<< ", tag='" << m_dictionary[tag] << "') for trigger leg " << m_dictionary[leg]);
+	if (m_unsupportedLegs.size() && m_unsupportedLegs.count(ToolKey(leg, 0u, runNumber)))
+	{
+		efficiencies.data() = 0.5;
+		efficiencies.mc() = 0.5;
+		return TLE_UNAVAILABLE;
+	}
 	auto itr = m_muonToolIndex.find(ToolKey(0, tag, 0));
 	if(itr==m_muonToolIndex.end())
 	{
 		if(!tag) ATH_MSG_ERROR("Unable to find muon tool");
 		else ATH_MSG_ERROR("Unable to find muon tool needed for selection tag " << m_dictionary[tag]);
 		m_cpCode = CP::CorrectionCode::Error;
-		return false;
+		return TLE_ERROR;
 	}
 	auto& tool = *m_suppliedMuonTools[itr->second];
 	auto& hltTrig = m_dictionary[leg ^ 0xB0DDD56fF8E3250D];
@@ -629,7 +652,7 @@ bool TrigGlobalEfficiencyCorrectionTool::getTriggerLegEfficiencies(const xAOD::M
 	bool success = checkAndRecord(tool.getTriggerEfficiency(*p, efficiencies.mc(), hltTrig, kFALSE))
 		&& checkAndRecord(tool.getTriggerEfficiency(*p, efficiencies.data(), hltTrig, kTRUE));
 	ATH_MSG_DEBUG("found for that muon eff(data) = " << efficiencies.data()<<" and eff(MC) = "<<efficiencies.mc());
-	return success;
+	return success? TLE_OK: TLE_ERROR;
 }
 
 bool TrigGlobalEfficiencyCorrectionTool::retrieveRunNumber(unsigned& runNumber)
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/Calculator.h b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/Calculator.h
index f2135bcb6cf2..42213495ca08 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/Calculator.h
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/Calculator.h
@@ -49,7 +49,8 @@ private:
 	TrigGlobalEfficiencyCorrectionTool* m_parent; /// pointer updated at each call to compute() because the parent tool might have been moved in-between
 	
 	std::vector<Period> m_periods;
-	std::map<std::pair<const Lepton*, std::size_t>, Efficiencies> m_cachedEfficiencies;
+	std::map<std::pair<const Lepton*, std::size_t>, Efficiencies> m_cachedEfficiencies;  // not thread safe
+	bool m_forceUnitSF;  // not thread safe
 	
 	bool aboveThreshold(const Lepton& p,std::size_t leg) const { return m_parent->aboveThreshold(p, leg); }
 	template<typename Trig1L> auto getLoosestLegAboveThreshold(const Lepton& lepton, const flat_set<Trig1L>& trigs, bool& success)
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrectionTool.h b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrectionTool.h
index e2d84da91411..67353f2ad9a3 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrectionTool.h
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrection/TrigGlobalEfficiencyCorrectionTool.h
@@ -137,6 +137,7 @@ private:
 	bool m_checkMuonLegTag; //!
 	bool m_checkPhotonLegTag; //!
 	std::map<std::size_t, std::string> m_dictionary; //!
+	std::set<ToolKey> m_unsupportedLegs; //!
 	
 	std::vector<Hierarchy> m_hierarchyMeta; //!
 	std::vector<std::size_t> m_hierarchyData; //!
@@ -175,11 +176,17 @@ private:
 	template<class Container> CachedRanking rankTriggerLegs(float pt, const Container& legs);
 	template<class Particle> bool updateLeptonList(LeptonList& leptons, const std::vector<const Particle*>& particles);
 	void updateMuonTriggerNames(std::size_t leg, const std::string& name);
-	bool getTriggerLegEfficiencies(const xAOD::Electron* p, unsigned runNumber, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
-	bool getTriggerLegEfficiencies(const xAOD::Muon* p, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
-	bool getTriggerLegEfficiencies(const xAOD::Photon* p, unsigned runNumber, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
+	enum TLE_RESULT
+	{
+		TLE_OK,
+		TLE_UNAVAILABLE,
+		TLE_ERROR
+	};
+	TLE_RESULT getTriggerLegEfficiencies(const xAOD::Electron* p, unsigned runNumber, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
+	TLE_RESULT getTriggerLegEfficiencies(const xAOD::Muon* p, unsigned runNumber, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
+	TLE_RESULT getTriggerLegEfficiencies(const xAOD::Photon* p, unsigned runNumber, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
 	template<class ParticleType>
-	bool getEgammaTriggerLegEfficiencies(const ParticleType* p, unsigned runNumber, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
+	TLE_RESULT getEgammaTriggerLegEfficiencies(const ParticleType* p, unsigned runNumber, std::size_t leg, std::size_t tag, TrigGlobEffCorr::Efficiencies& efficiencies);
 	decltype(m_electronSfToolIndex)& GetScaleFactorToolIndex(const xAOD::Electron*) { return m_electronSfToolIndex; }
 	decltype(m_photonSfToolIndex)& GetScaleFactorToolIndex(const xAOD::Photon*) { return m_photonSfToolIndex; }
 	decltype(m_electronEffToolIndex)& GetEfficiencyToolIndex(const xAOD::Electron*) { return m_electronEffToolIndex; }
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Hierarchies.cfg b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Hierarchies.cfg
index 0032e624b7d3..51de1d85fbc4 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Hierarchies.cfg
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Hierarchies.cfg
@@ -42,7 +42,7 @@ loose2 := e17_lhloose_nod0 > e12_lhloose_nod0 > e9_lhloose_nod0 > e17_lhvloose_n
 [61-141 GeV] medium > e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0 > e24_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0 > loose1 > loose2
 [>141 GeV]   medium > loose1 > e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0 > e24_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0 > loose2
 
-## electron triggers, Run 3, preliminary
+## electron triggers, 2022
 ## to do: check actual overlap of lhloose+VH and lhvloose+VHI
 looseRun3 := e17_lhloose_L1EM15VH > e12_lhloose_L1EM8VH > e12_lhloose > e24_lhvloose_L1EM20VH > e12_lhvloose_L1EM10VH > e9_lhvloose
 looseRun3VHI := e17_lhvloose_L1EM15VHI > e24_lhvloose_L1EM20VH > e12_lhvloose_L1EM10VH > e9_lhvloose
@@ -55,5 +55,8 @@ looseRun3VHI := e17_lhvloose_L1EM15VHI > e24_lhvloose_L1EM20VH > e12_lhvloose_L1
 [>141 GeV] e26_lhmedium_L1EM22VHI > e26_lhtight_ivarloose_L1EM22VHI_OR_e60_lhmedium_L1EM22VHI_OR_e140_lhloose_L1EM22VHI > looseRun3VHI
 [-] e26_dnntight_ivarloose_L1EM22VHI > e26_dnntight_ivarloose_L1EM22VHI_OR_e60_dnnmedium_nogsf_L1EM22VHI_OR_e140_dnnloose_nogsf_L1EM22VHI > looseRun3VHI
 
+## electron triggers, 2023, preliminary
+[-] e26_lhtight_ivarloose_L1eEM26M > e60_lhmedium_L1eEM26M > e140_lhloose_L1eEM26M > e17_lhvloose_L1eEM18M > e24_lhvloose_L1eEM24L > e12_lhvloose_L1eEM12L
+
 ## photon triggers
 [-] g35_tight_icalotight_L1EM24VHI > g20_tight_icalovloose_L1EM15VHI > g22_tight_L1EM15VHI > g22_tight > g20_tight > g35_medium_L1EM20VH > g25_medium_L1EM20VH > g25_medium > g35_loose_L1EM24VHI > g35_loose_L1EM22VHI > g50_loose_L1EM20VH > g140_loose > g120_loose > g35_loose > g25_loose > g20_loose > g15_loose > g12_loose > g10_loose > g35_loose_L1EM15 > g25_loose_L1EM15
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/MapKeys.cfg b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/MapKeys.cfg
index bf0b2bed9382..2223ad505200 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/MapKeys.cfg
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/MapKeys.cfg
@@ -183,3 +183,9 @@
 2022  e17_lhvloose_L1EM15VHI  2022_e17_lhvloose
 2022  e24_lhvloose  2022_e24_lhvloose
 2022  e24_lhvloose_L1EM20VH  2022_e24_lhvloose
+2023  e26_lhtight_ivarloose_L1eEM26M  RETURN_DEFAULT_SCALE_FACTOR
+2023  e60_lhmedium_L1eEM26M  RETURN_DEFAULT_SCALE_FACTOR
+2023  e140_lhloose_L1eEM26M  RETURN_DEFAULT_SCALE_FACTOR
+2023  e17_lhvloose_L1eEM18M  RETURN_DEFAULT_SCALE_FACTOR
+2023  e24_lhvloose_L1eEM24L  RETURN_DEFAULT_SCALE_FACTOR
+2023  e12_lhvloose_L1eEM12L  RETURN_DEFAULT_SCALE_FACTOR
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Thresholds.cfg b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Thresholds.cfg
index b0a1399f3aa3..42aaf0bb864d 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Thresholds.cfg
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Thresholds.cfg
@@ -61,11 +61,13 @@ mu2noL1      2000 MeV
 e140_lhloose_nod0                 141 GeV
 e140_lhloose_L1EM22VHI            141 GeV
 e140_dnnloose_nogsf_L1EM22VHI     141 GeV
+e140_lhloose_L1eEM26M             141 GeV
 e120_lhloose                      121 GeV
 e60_lhmedium                      61 GeV
 e60_lhmedium_nod0                 61 GeV
 e60_lhmedium_L1EM22VHI            61 GeV
 e60_dnnmedium_nogsf_L1EM22VHI     61 GeV
+e60_lhmedium_L1eEM26M             61 GeV
 e26_dnntight_ivarloose_L1EM22VHI  27 GeV
 e26_dnntight_ivarloose_L1EM22VHI_OR_e60_dnnmedium_nogsf_L1EM22VHI_OR_e140_dnnloose_nogsf_L1EM22VHI  27 GeV
 e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0                                27 GeV
@@ -75,6 +77,7 @@ e26_lhtight_ivarloose_L1EM22VHI   27 GeV
 e26_lhmedium_nod0                 27 GeV
 e26_lhmedium_nod0_L1EM22VHI       27 GeV
 e26_lhmedium_L1EM22VHI            27 GeV
+e26_lhtight_ivarloose_L1eEM26M    27 GeV
 e24_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0  25 GeV
 e24_lhtight_nod0_ivarloose                                            25 GeV
 e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose                 25 GeV
@@ -86,8 +89,10 @@ e24_lhmedium_nod0_L1EM20VHI  25 GeV
 e24_lhmedium_nod0_L1EM15VH   25 GeV
 e24_lhvloose_nod0_L1EM20VH   25 GeV
 e24_lhvloose_L1EM20VH        25 GeV
+e24_lhvloose_L1eEM24L        25 GeV
 e20_lhmedium_nod0            21 GeV
 e20_lhmedium                 21 GeV
+e17_lhvloose_L1eEM18M        19 GeV
 e17_lhloose                  18 GeV
 e17_lhloose_nod0             18 GeV
 e17_lhloose_L1EM15VH         18 GeV
@@ -102,6 +107,7 @@ e12_lhloose_L1EM10VH         13 GeV
 e12_lhloose_L1EM8VH          13 GeV
 e12_lhvloose_nod0_L1EM10VH   13 GeV
 e12_lhvloose_L1EM10VH        13 GeV
+e12_lhvloose_L1eEM12L        13 GeV
 e10_lhloose_nod0_L1EM8VH     11 GeV
 e9_lhloose                   10 GeV
 e9_lhloose_nod0              10 GeV
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Triggers.cfg b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Triggers.cfg
index 2f2cef8032b2..c7cf478a7872 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Triggers.cfg
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/data/Triggers.cfg
@@ -36,25 +36,25 @@ mu26_ivarmedium_L1MU14FCH_OR_mu50_L1MU14FCH
 mu50_L1MU14FCH
 
 ## Dimuon triggers
-2mu10					mu10			mu10
-2mu14					mu14			mu14
-mu18_mu8noL1			mu18			mu8noL1
-mu20_mu8noL1			mu20			mu8noL1
-mu22_mu8noL1			mu22			mu8noL1
+2mu10          mu10   mu10
+2mu14          mu14   mu14
+mu18_mu8noL1   mu18   mu8noL1
+mu20_mu8noL1   mu20   mu8noL1
+mu22_mu8noL1   mu22   mu8noL1
 # Run 3
-2mu14_L12MU8F			mu14_L1MU8F		mu14_L1MU8F
-mu20_ivarmedium_mu8noL1_L1MU14FCH  mu20_ivarmedium_L1MU14FCH  mu8noL1
-mu22_mu8noL1_L1MU14FCH	mu22_L1MU14FCH	mu8noL1
+2mu14_L12MU8F                       mu14_L1MU8F                 mu14_L1MU8F
+mu20_ivarmedium_mu8noL1_L1MU14FCH   mu20_ivarmedium_L1MU14FCH   mu8noL1
+mu22_mu8noL1_L1MU14FCH              mu22_L1MU14FCH              mu8noL1
 
 ## Trimuon triggers
-3mu4		mu4		mu4		mu4
-3mu6		mu6		mu6		mu6
-mu6_2mu4	mu6		mu4		mu4
+3mu4       mu4   mu4   mu4
+3mu6       mu6   mu6   mu6
+mu6_2mu4   mu6   mu4   mu4
 # Run 3
-3mu6_L13MU5VF   mu6_L1MU5VF  mu6_L1MU5VF  mu6_L1MU5VF
-mu18_2mu4noL1   mu18   mu4noL1   mu4noL1
-mu20_2mu4noL1_L1MU14FCH  mu20_L1MU14FCH  mu4noL1 mu4noL1
-4mu4_L14MU3V mu4_L1MU3V  mu4_L1MU3V  mu4_L1MU3V  mu4_L1MU3V
+3mu6_L13MU5VF             mu6_L1MU5VF      mu6_L1MU5VF   mu6_L1MU5VF
+mu18_2mu4noL1             mu18             mu4noL1       mu4noL1
+mu20_2mu4noL1_L1MU14FCH   mu20_L1MU14FCH   mu4noL1       mu4noL1
+4mu4_L14MU3V mu4_L1MU3V   mu4_L1MU3V       mu4_L1MU3V    mu4_L1MU3V
 
 ## Single electron triggers
 e15_lhvloose_nod0_L1EM13VH
@@ -68,53 +68,60 @@ e26_lhtight_ivarloose_L1EM22VHI
 e26_lhtight_ivarloose_L1EM22VHI_OR_e60_lhmedium_L1EM22VHI_OR_e140_lhloose_L1EM22VHI
 e26_dnntight_ivarloose_L1EM22VHI
 e26_dnntight_ivarloose_L1EM22VHI_OR_e60_dnnmedium_nogsf_L1EM22VHI_OR_e140_dnnloose_nogsf_L1EM22VHI
+e26_lhtight_ivarloose_L1eEM26M
 e120_lhloose
 e60_lhmedium
 e60_lhmedium_nod0
 e60_lhmedium_L1EM22VHI
 e60_dnnmedium_nogsf_L1EM22VHI
+e60_lhmedium_L1eEM26M
 e140_lhloose_nod0
 e140_lhloose_L1EM22VHI
 e140_dnnloose_nogsf_L1EM22VHI
+e140_lhloose_L1eEM26M
+
 
 ## Dielectron triggers
-2e12_lhloose_L12EM10VH			e12_lhloose_L1EM10VH			e12_lhloose_L1EM10VH
-2e15_lhvloose_nod0_L12EM13VH	e15_lhvloose_nod0_L1EM13VH		e15_lhvloose_nod0_L1EM13VH
-2e17_lhvloose_nod0				e17_lhvloose_nod0				e17_lhvloose_nod0
-2e17_lhvloose_nod0_L12EM15VHI	e17_lhvloose_nod0_L1EM15VHI		e17_lhvloose_nod0_L1EM15VHI
-2e17_lhvloose_L12EM15VHI		e17_lhvloose_L1EM15VHI			e17_lhvloose_L1EM15VHI
-2e24_lhvloose_nod0				e24_lhvloose_nod0_L1EM20VH		e24_lhvloose_nod0_L1EM20VH
-2e24_lhvloose_L12EM20VH			e24_lhvloose_L1EM20VH			e24_lhvloose_L1EM20VH
+2e12_lhloose_L12EM10VH          e12_lhloose_L1EM10VH          e12_lhloose_L1EM10VH
+2e15_lhvloose_nod0_L12EM13VH    e15_lhvloose_nod0_L1EM13VH    e15_lhvloose_nod0_L1EM13VH
+2e17_lhvloose_nod0              e17_lhvloose_nod0             e17_lhvloose_nod0
+2e17_lhvloose_nod0_L12EM15VHI   e17_lhvloose_nod0_L1EM15VHI   e17_lhvloose_nod0_L1EM15VHI
+2e17_lhvloose_L12EM15VHI        e17_lhvloose_L1EM15VHI        e17_lhvloose_L1EM15VHI
+2e17_lhvloose_L12eEM18M         e17_lhvloose_L1eEM18M         e17_lhvloose_L1eEM18M
+2e24_lhvloose_nod0              e24_lhvloose_nod0_L1EM20VH    e24_lhvloose_nod0_L1EM20VH
+2e24_lhvloose_L12EM20VH         e24_lhvloose_L1EM20VH         e24_lhvloose_L1EM20VH
+2e24_lhvloose_L12eEM24L         e24_lhvloose_L1eEM24L         e24_lhvloose_L1eEM24L
 
 ## Trielectron triggers
-e17_lhloose_2e9_lhloose				e17_lhloose			e9_lhloose			e9_lhloose
-e17_lhloose_nod0_2e9_lhloose_nod0	e17_lhloose_nod0	e9_lhloose_nod0		e9_lhloose_nod0
-e17_lhloose_nod0_2e10_lhloose_nod0_L1EM15VH_3EM8VH		e17_lhloose_nod0_L1EM15VH	e10_lhloose_nod0_L1EM8VH	e10_lhloose_nod0_L1EM8VH
-e24_lhvloose_nod0_2e12_lhvloose_nod0_L1EM20VH_3EM10VH	e24_lhvloose_nod0_L1EM20VH	e12_lhvloose_nod0_L1EM10VH	e12_lhvloose_nod0_L1EM10VH
+e17_lhloose_2e9_lhloose             e17_lhloose        e9_lhloose        e9_lhloose
+e17_lhloose_nod0_2e9_lhloose_nod0   e17_lhloose_nod0   e9_lhloose_nod0   e9_lhloose_nod0
+e17_lhloose_nod0_2e10_lhloose_nod0_L1EM15VH_3EM8VH      e17_lhloose_nod0_L1EM15VH    e10_lhloose_nod0_L1EM8VH     e10_lhloose_nod0_L1EM8VH
+e24_lhvloose_nod0_2e12_lhvloose_nod0_L1EM20VH_3EM10VH   e24_lhvloose_nod0_L1EM20VH   e12_lhvloose_nod0_L1EM10VH   e12_lhvloose_nod0_L1EM10VH
 # Run 3
-e24_lhvloose_2e12_lhvloose_L1EM20VH_3EM10VH  e24_lhvloose_L1EM20VH  e12_lhvloose_L1EM10VH  e12_lhvloose_L1EM10VH
+e24_lhvloose_2e12_lhvloose_L1EM20VH_3EM10VH   e24_lhvloose_L1EM20VH   e12_lhvloose_L1EM10VH   e12_lhvloose_L1EM10VH
+e24_lhvloose_2e12_lhvloose_L1eEM24L_3eEM12L   e24_lhvloose_L1eEM24L   e12_lhvloose_L1eEM12L   e12_lhvloose_L1eEM12L
 
 ## Electron-muon triggers
-e17_lhloose_nod0_mu14			e17_lhloose_nod0		mu14
-e17_lhloose_mu14_L1EM15VH_MU8F	e17_lhloose_L1EM15VH	mu14_L1MU8F
-e7_lhmedium_nod0_mu24			e7_lhmedium_nod0		mu24
-e17_lhloose_mu14				e17_lhloose				mu14
-e7_lhmedium_mu24				e7_lhmedium				mu24
-e24_lhmedium_L1EM20VHI_mu8noL1			e24_lhmedium_L1EM20VHI			mu8noL1
-e24_lhmedium_nod0_L1EM20VHI_mu8noL1		e24_lhmedium_nod0_L1EM20VHI		mu8noL1
-e26_lhmedium_nod0_mu8noL1				e26_lhmedium_nod0				mu8noL1
-e26_lhmedium_nod0_L1EM22VHI_mu8noL1		e26_lhmedium_nod0_L1EM22VHI		mu8noL1
-e12_lhloose_2mu10		e12_lhloose			mu10				mu10
-e12_lhloose_nod0_2mu10	e12_lhloose_nod0	mu10				mu10
-2e12_lhloose_mu10		e12_lhloose			e12_lhloose			mu10
-2e12_lhloose_nod0_mu10	e12_lhloose_nod0	e12_lhloose_nod0	mu10
+e17_lhloose_nod0_mu14                 e17_lhloose_nod0              mu14
+e17_lhloose_mu14_L1EM15VH_MU8F        e17_lhloose_L1EM15VH          mu14_L1MU8F
+e7_lhmedium_nod0_mu24                 e7_lhmedium_nod0              mu24
+e17_lhloose_mu14                      e17_lhloose                   mu14
+e7_lhmedium_mu24                      e7_lhmedium                   mu24
+e24_lhmedium_L1EM20VHI_mu8noL1        e24_lhmedium_L1EM20VHI        mu8noL1
+e24_lhmedium_nod0_L1EM20VHI_mu8noL1   e24_lhmedium_nod0_L1EM20VHI   mu8noL1
+e26_lhmedium_nod0_mu8noL1             e26_lhmedium_nod0             mu8noL1
+e26_lhmedium_nod0_L1EM22VHI_mu8noL1   e26_lhmedium_nod0_L1EM22VHI   mu8noL1
+e12_lhloose_2mu10        e12_lhloose        mu10               mu10
+e12_lhloose_nod0_2mu10   e12_lhloose_nod0   mu10               mu10
+2e12_lhloose_mu10        e12_lhloose        e12_lhloose        mu10
+2e12_lhloose_nod0_mu10   e12_lhloose_nod0   e12_lhloose_nod0   mu10
 # Run 3
-e7_lhmedium_mu24_L1MU14FCH      e7_lhmedium     mu24_L1MU14FCH
-e17_lhloose_mu14_L1EM15VH_MU8F  e17_lhvloose_L1EM15VHI  mu14_L1MU8F
-e26_lhmedium_mu8noL1_L1EM22VHI  e26_lhmedium_L1EM22VHI  mu8noL1
-2e12_lhloose_mu10_L12EM8VH_MU8F  e12_lhloose_L1EM8VH  e12_lhloose_L1EM8VH  mu10_L1MU8F
-e9_lhvloose_mu20_mu8noL1_L1MU14FCH  e9_lhvloose  mu20_L1MU14FCH  mu8noL1
-e12_lhloose_2mu10_L12MU8F   e12_lhloose   mu10_L1MU8F mu10_L1MU8F
+e7_lhmedium_mu24_L1MU14FCH           e7_lhmedium              mu24_L1MU14FCH
+e17_lhloose_mu14_L1EM15VH_MU8F       e17_lhvloose_L1EM15VHI   mu14_L1MU8F
+e26_lhmedium_mu8noL1_L1EM22VHI       e26_lhmedium_L1EM22VHI   mu8noL1
+2e12_lhloose_mu10_L12EM8VH_MU8F      e12_lhloose_L1EM8VH      e12_lhloose_L1EM8VH   mu10_L1MU8F
+e9_lhvloose_mu20_mu8noL1_L1MU14FCH   e9_lhvloose              mu20_L1MU14FCH        mu8noL1
+e12_lhloose_2mu10_L12MU8F            e12_lhloose              mu10_L1MU8F           mu10_L1MU8F
 
 ## Single photon triggers
 g140_loose
@@ -122,42 +129,42 @@ g140_loose_L1EM22VHI
 g120_loose
 
 ## Diphoton triggers
-2g50_loose_L12EM20VH				g50_loose_L1EM20VH					g50_loose_L1EM20VH
-g35_medium_g25_medium_L12EM20VH		g35_medium_L1EM20VH					g25_medium_L1EM20VH
-g35_loose_g25_loose					g35_loose							g25_loose
-g35_loose_L1EM15_g25_loose_L1EM15	g35_loose_L1EM15					g25_loose_L1EM15
-2g20_tight_icalovloose_L12EM15VHI	g20_tight_icalovloose_L1EM15VHI		g20_tight_icalovloose_L1EM15VHI
-2g22_tight_L12EM15VHI				g22_tight_L1EM15VHI					g22_tight_L1EM15VHI
-2g22_tight							g22_tight							g22_tight
-2g20_tight							g20_tight							g20_tight
+2g50_loose_L12EM20VH                g50_loose_L1EM20VH                g50_loose_L1EM20VH
+g35_medium_g25_medium_L12EM20VH     g35_medium_L1EM20VH               g25_medium_L1EM20VH
+g35_loose_g25_loose                 g35_loose                         g25_loose
+g35_loose_L1EM15_g25_loose_L1EM15   g35_loose_L1EM15                  g25_loose_L1EM15
+2g20_tight_icalovloose_L12EM15VHI   g20_tight_icalovloose_L1EM15VHI   g20_tight_icalovloose_L1EM15VHI
+2g22_tight_L12EM15VHI               g22_tight_L1EM15VHI               g22_tight_L1EM15VHI
+2g22_tight                          g22_tight                         g22_tight
+2g20_tight                          g20_tight                         g20_tight
 
 ## Triphoton triggers
-2g25_loose_g15_loose	g25_loose	g25_loose	g15_loose
-2g20_loose_g15_loose	g20_loose	g20_loose	g15_loose
-3g20_loose				g20_loose	g20_loose	g20_loose
-3g15_loose				g15_loose	g15_loose	g15_loose
+2g25_loose_g15_loose   g25_loose   g25_loose   g15_loose
+2g20_loose_g15_loose   g20_loose   g20_loose   g15_loose
+3g20_loose             g20_loose   g20_loose   g20_loose
+3g15_loose             g15_loose   g15_loose   g15_loose
 
 ## Electron-photon triggers
-e24_lhmedium_nod0_L1EM20VH_g25_medium	e24_lhmedium_nod0_L1EM20VH		g25_medium_L1EM20VH
-e24_lhmedium_nod0_L1EM15VH_g25_medium	e24_lhmedium_nod0_L1EM15VH		g25_medium_L1EM20VH
-e24_lhmedium_L1EM15VH_g25_medium		e24_lhmedium_L1EM15VH			g25_medium_L1EM20VH
-e20_lhmedium_nod0_g35_loose		e20_lhmedium_nod0		g35_loose
-e20_lhmedium_g35_loose			e20_lhmedium			g35_loose
-e24_lhmedium_nod0_2g12_loose	e24_lhmedium_nod0_L1EM20VH		g12_loose		g12_loose
-e20_lhmedium_nod0_2g10_loose	e24_lhmedium_nod0_L1EM20VH		g10_loose		g10_loose
-e20_lhmedium_2g10_loose			e20_lhmedium					g10_loose		g10_loose
+e24_lhmedium_nod0_L1EM20VH_g25_medium   e24_lhmedium_nod0_L1EM20VH   g25_medium_L1EM20VH
+e24_lhmedium_nod0_L1EM15VH_g25_medium   e24_lhmedium_nod0_L1EM15VH   g25_medium_L1EM20VH
+e24_lhmedium_L1EM15VH_g25_medium        e24_lhmedium_L1EM15VH        g25_medium_L1EM20VH
+e20_lhmedium_nod0_g35_loose             e20_lhmedium_nod0            g35_loose
+e20_lhmedium_g35_loose                  e20_lhmedium                 g35_loose
+e24_lhmedium_nod0_2g12_loose            e24_lhmedium_nod0_L1EM20VH   g12_loose   g12_loose
+e20_lhmedium_nod0_2g10_loose            e24_lhmedium_nod0_L1EM20VH   g10_loose   g10_loose
+e20_lhmedium_2g10_loose                 e20_lhmedium                 g10_loose   g10_loose
 
 ## Muon-photon triggers
-g35_tight_icalotight_L1EM24VHI_mu18noL1		g35_tight_icalotight_L1EM24VHI		mu18noL1
-g35_loose_L1EM22VHI_mu18noL1				g35_loose_L1EM22VHI					mu18noL1
-g35_loose_L1EM24VHI_mu18					g35_loose_L1EM24VHI					mu18
-g25_medium_mu24								g25_medium_L1EM20VH					mu24
-g35_tight_icalotight_L1EM24VHI_mu15noL1_mu2noL1 	g35_tight_icalotight_L1EM24VHI		mu15noL1		mu2noL1
-g35_loose_L1EM24VHI_mu15_mu2noL1					g35_loose_L1EM24VHI					mu15			mu2noL1	
-g35_loose_L1EM22VHI_mu15noL1_mu2noL1				g35_loose_L1EM22VHI					mu15noL1		mu2noL1
-2g10_loose_mu20										g10_loose							g10_loose		mu20
+g35_tight_icalotight_L1EM24VHI_mu18noL1           g35_tight_icalotight_L1EM24VHI   mu18noL1
+g35_loose_L1EM22VHI_mu18noL1                      g35_loose_L1EM22VHI              mu18noL1
+g35_loose_L1EM24VHI_mu18                          g35_loose_L1EM24VHI              mu18
+g25_medium_mu24                                   g25_medium_L1EM20VH              mu24
+g35_tight_icalotight_L1EM24VHI_mu15noL1_mu2noL1   g35_tight_icalotight_L1EM24VHI   mu15noL1    mu2noL1
+g35_loose_L1EM24VHI_mu15_mu2noL1                  g35_loose_L1EM24VHI              mu15        mu2noL1    
+g35_loose_L1EM22VHI_mu15noL1_mu2noL1              g35_loose_L1EM22VHI              mu15noL1    mu2noL1
+2g10_loose_mu20                                   g10_loose                        g10_loose   mu20
 # Run 3
-g25_medium_mu24_L1MU14FCH  g25_medium  mu24_L1MU14FCH
-g35_loose_mu18_L1EM24VHI  g35_loose_L1EM24VHI  mu18           
-2g10_loose_mu20_L1MU14FCH  g10_loose  g10_loose  mu20_L1MU14FCH
-g35_loose_mu15_mu2noL1_L1EM24VHI  g35_loose_L1EM24VHI  mu15  mu2noL1
+g25_medium_mu24_L1MU14FCH          g25_medium            mu24_L1MU14FCH
+g35_loose_mu18_L1EM24VHI           g35_loose_L1EM24VHI   mu18           
+2g10_loose_mu20_L1MU14FCH          g10_loose             g10_loose   mu20_L1MU14FCH
+g35_loose_mu15_mu2noL1_L1EM24VHI   g35_loose_L1EM24VHI   mu15        mu2noL1
diff --git a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/util/TrigGlobEffCorrValidation.cxx b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/util/TrigGlobEffCorrValidation.cxx
index 86923febd566..32a94daae93c 100644
--- a/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/util/TrigGlobEffCorrValidation.cxx
+++ b/Trigger/TrigAnalysis/TrigGlobalEfficiencyCorrection/util/TrigGlobEffCorrValidation.cxx
@@ -131,8 +131,12 @@ struct Config
 	std::vector<float> leptonPtValues;
 	std::map<std::string, std::function<double(float)>> efficiencies;
 	std::function<bool(const std::vector<const xAOD::Electron*>&,const std::vector<const xAOD::Muon*>&,const std::vector<const xAOD::Photon*>&)> eventSelection = nullptr;
+	std::string unavailable;
 	double expectedEfficiency = -1.;
 	double expectedEfficiencyTolerance = 1e-6;
+	bool generateElectrons = false;
+	bool generateMuons = false;
+	bool generatePhotons = false;
 	bool debug = false;
 	
 	Config(const char* name) : testName(name), leptonPtValues {30e4f} { }
@@ -147,11 +151,13 @@ struct Config
 	Config& setEfficiency(const std::string& leg, double eff)
 	{
 		efficiencies.emplace(leg, [=](float){return eff;});
+		updateFlavours(leg);
 		return *this;
 	}
 	Config& setEfficiency(const std::string& leg, std::function<double(float)>&& eff)
 	{
 		efficiencies.emplace(leg, eff);
+		updateFlavours(leg);
 		return *this;
 	}
 	Config& setEventSelection(const decltype(eventSelection)& sel) { eventSelection = sel; return *this; }
@@ -162,6 +168,20 @@ struct Config
 		expectedEfficiencyTolerance = tolerance;
 		return *this;
 	}
+	Config& setUnavailable(const std::string& leg)
+	{
+		if (!unavailable.empty()) unavailable += ',';
+		unavailable += leg;
+		updateFlavours(leg);
+		return *this;
+	}
+private:
+	void updateFlavours(const std::string& leg)
+	{
+		if (leg[0] == 'e') generateElectrons = true;
+		else if (leg[0] == 'm') generateMuons = true;
+		else if (leg[0] == 'g') generatePhotons = true;
+	}
 };
 
 xAOD::ElectronContainer* electronContainer = nullptr;
@@ -251,6 +271,14 @@ int main(int argc, char* argv[])
 		.setExpectedEfficiency(0.60, 1e-6)
 	));
 	
+	ANA_CHECK(run_test(Config("RETURN_UNIT_SCALE_FACTOR")
+		.setTriggers("e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose || mu20_iloose_L1MU15_OR_mu50")
+		.setLeptonPDF(1, 1, {30e3f})
+		.setUnavailable("e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose")
+		.setEfficiency("mu20_iloose_L1MU15_OR_mu50", 0.60)
+		.setExpectedEfficiency(0.806800, 1e-6)
+	));
+	
 	ANA_CHECK(run_test(Config("1L (2 flavours, 1-4 leptons)")
 		.setTriggers("e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose || mu20_iloose_L1MU15_OR_mu50")
 		.setLeptonPDF(1, 4, {30e3f})
@@ -514,7 +542,6 @@ bool run_test(const Config& cfg, int toy_to_debug)
 	std::vector<SimplePhotonEfficiencyCorrectionTool*> photonTools;
 	ToolHandleArray<IAsgPhotonEfficiencyCorrectionTool> photonEffToolsHandles, photonSFToolsHandles;
 	std::map<std::string,std::string> legsPerTool;
-	bool generateElectrons = false, generateMuons = false, generatePhotons = false;
 	for(auto& kv : cfg.efficiencies)
 	{
 		if(kv.first[0]=='e')
@@ -529,7 +556,6 @@ bool run_test(const Config& cfg, int toy_to_debug)
 			#ifdef XAOD_STANDALONE
 				electronSFToolsHandles.push_back(electronTools.back());
 			#endif
-			generateElectrons  =true;
 		}
 		else if(kv.first[0]=='g')
 		{
@@ -543,9 +569,11 @@ bool run_test(const Config& cfg, int toy_to_debug)
 			#ifdef XAOD_STANDALONE
 				photonSFToolsHandles.push_back(photonTools.back());
 			#endif
-			generatePhotons = true;
 		}
-		else if(kv.first[0]=='m') generateMuons = true;
+	}
+	if (!cfg.unavailable.empty())
+	{
+		legsPerTool[ITrigGlobalEfficiencyCorrectionTool::toolnameForDefaultScaleFactor()] = cfg.unavailable;
 	}
 	std::vector<SimpleMuonTriggerScaleFactors*> muonTools;
 	muonTools.emplace_back(new SimpleMuonTriggerScaleFactors("EFF-muons", cfg.efficiencies));
@@ -557,11 +585,14 @@ bool run_test(const Config& cfg, int toy_to_debug)
 	asg::AnaToolHandle<ITrigGlobalEfficiencyCorrectionTool> trigGlobTool("TrigGlobalEfficiencyCorrectionTool/trigGlobTool" + suffix);
 	asg::AnaToolHandle<ITrigGlobalEfficiencyCorrectionTool> trigGlobTool_toys("TrigGlobalEfficiencyCorrectionTool/trigGlobTool_toys" + suffix);
 	bool debug = cfg.debug || (toy_to_debug>=0);
+	bool compareWithToys = cfg.unavailable.empty();
 	ANA_CHECK(configure(trigGlobTool, electronEffToolsHandles, electronSFToolsHandles, muonToolsHandles, photonEffToolsHandles, photonSFToolsHandles, cfg.triggers, legsPerTool, 0, debug));
-	ANA_CHECK(configure(trigGlobTool_toys, electronEffToolsHandles, electronSFToolsHandles, muonToolsHandles, photonEffToolsHandles, photonSFToolsHandles, cfg.triggers, legsPerTool, nToysPerEvent, debug));
+	if (compareWithToys) {
+		ANA_CHECK(configure(trigGlobTool_toys, electronEffToolsHandles, electronSFToolsHandles, muonToolsHandles, photonEffToolsHandles, photonSFToolsHandles, cfg.triggers, legsPerTool, nToysPerEvent, debug));
+	}
 	std::default_random_engine rdm;
 	std::uniform_int_distribution<unsigned> nleptonsPdf(cfg.minLeptons, cfg.maxLeptons);
-	std::discrete_distribution<> flavourPdf({1.*generateElectrons, 1.*generateMuons, 1.*generatePhotons});
+	std::discrete_distribution<> flavourPdf({1.*cfg.generateElectrons, 1.*cfg.generateMuons, 1.*cfg.generatePhotons});
 	std::uniform_int_distribution<unsigned> ptIndexPdf(0, cfg.leptonPtValues.size()-1);
 	std::vector<const xAOD::Electron*> electrons;
 	std::vector<const xAOD::Muon*> muons;
@@ -624,7 +655,7 @@ bool run_test(const Config& cfg, int toy_to_debug)
 			return false;
 		}
 		sum_eff += eff;
-		for(int spl=0;spl<nToySamples;++spl)
+		for(int spl=0;spl<compareWithToys*nToySamples;++spl)
 		{
 			eff_toys = 0.;
 			if(trigGlobTool_toys->getEfficiency(runNumber, particles, eff_toys, dummy) != CP::CorrectionCode::Ok)
@@ -646,22 +677,26 @@ bool run_test(const Config& cfg, int toy_to_debug)
 		double eff = sum_eff / nToysPerTest;
 		if(fabs(eff - cfg.expectedEfficiency) > cfg.expectedEfficiencyTolerance)
 		{
+			Error(MSGSOURCE, "The difference is too large, %f versus %f", eff, cfg.expectedEfficiency);
 			return false;
 		}
 	}
-	double eff = sum_eff/nToysPerTest, eff_toys = 0., toys_rms = 0.;
-	for(double sum : sum_eff_toys) eff_toys += sum / nToysPerTest;
-	eff_toys /= nToySamples;
-	for(double sum : sum_eff_toys) toys_rms += pow(sum/nToysPerTest - eff_toys, 2);
-	toys_rms = sqrt(toys_rms / (nToySamples-1));
-	double  sigma = fabs(eff-eff_toys) / toys_rms;
-	if(!quiet) Info(MSGSOURCE, "Efficiency: %f, toys: %f (signif. = %.1f sigma)", eff, eff_toys, sigma);
-	if(sigma >= 3.)
+	if (compareWithToys)
 	{
-		Error(MSGSOURCE, "The difference is too large");
-		return false;
+		double eff = sum_eff/nToysPerTest, eff_toys = 0., toys_rms = 0.;
+		for(double sum : sum_eff_toys) eff_toys += sum / nToysPerTest;
+		eff_toys /= nToySamples;
+		for(double sum : sum_eff_toys) toys_rms += pow(sum/nToysPerTest - eff_toys, 2);
+		toys_rms = sqrt(toys_rms / (nToySamples-1));
+		double  sigma = fabs(eff-eff_toys) / toys_rms;
+		if(!quiet) Info(MSGSOURCE, "Efficiency: %f, toys: %f (signif. = %.1f sigma)", eff, eff_toys, sigma);
+		if(sigma >= 3.)
+		{
+			Error(MSGSOURCE, "The difference is too large");
+			return false;
+		}
+		else if(sigma >= 2.) Warning(MSGSOURCE, "The difference isn't small");
 	}
-	else if(sigma >= 2.) Warning(MSGSOURCE, "The difference isn't small");
 	for(auto tool : electronTools) delete tool;
 	for(auto tool : muonTools) delete tool;
 	for(auto tool : photonTools) delete tool;
-- 
GitLab