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