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 ));
196 ANA_CHECK(m_tgecTool.setProperty(
"ElectronEfficiencyTools", electronEffTools));
197 ANA_CHECK(m_tgecTool.setProperty(
"ElectronScaleFactorTools", electronSFTools));
198 ANA_CHECK(m_tgecTool.setProperty(
"PhotonEfficiencyTools", photonEffTools));
199 ANA_CHECK(m_tgecTool.setProperty(
"PhotonScaleFactorTools", photonSFTools));
200 ANA_CHECK(m_tgecTool.setProperty(
"MuonTools", muonTools));
201 ANA_CHECK(m_tgecTool.setProperty(
"ListOfLegsPerTool", legsPerTool));
202 ANA_CHECK(m_tgecTool.setProperty(
"TriggerCombination", triggerCombination));
203 ANA_CHECK(m_tgecTool.setProperty(
"TriggerMatchingTool", m_trigMatchingTool));
204 ANA_CHECK(m_tgecTool.setProperty(
"NumberOfToys", m_numToys));
205 ANA_CHECK(m_tgecTool.setProperty(
"OutputLevel", MSG::ERROR));
208 ANA_CHECK(m_systematicsList.initialize());
210 return StatusCode::SUCCESS;
218 for (
const auto & syst : m_systematicsList.systematicsVector()) {
225 std::vector<const xAOD::Electron*> selectedElectrons;
226 std::vector<const xAOD::Photon*> selectedPhotons;
227 std::vector<const xAOD::Muon*> selectedMuons;
229 if (!m_electronsHandle.empty()) {
232 if (m_electronSelection.getBool(*
el, syst)) selectedElectrons.push_back(
el);
235 if (!m_photonsHandle.empty()) {
236 ANA_CHECK(m_photonsHandle.retrieve(photons, syst));
238 if (m_photonSelection.getBool(*ph, syst)) selectedPhotons.push_back(ph);
241 if (!m_muonsHandle.empty()) {
242 ANA_CHECK(m_muonsHandle.retrieve(muons, syst));
244 if (m_muonSelection.getBool(*
mu, syst)) selectedMuons.push_back(
mu);
248 ANA_CHECK(m_tgecTool->applySystematicVariation(syst));
252 if (selectedElectrons.empty() && selectedMuons.empty() && selectedPhotons.empty())
sf = 1.0;
253 else if (m_doMatchingOnly)
sf = 1.0;
256 m_tgecTool->getEfficiencyScaleFactor(selectedElectrons, selectedMuons, selectedPhotons,
262 if (!(selectedElectrons.empty() && selectedMuons.empty() && selectedPhotons.empty())) {
263 ANA_CHECK(m_tgecTool->checkTriggerMatching(
matched, selectedElectrons, selectedMuons, selectedPhotons));
269 ANA_CHECK(m_eventInfoHandle.retrieve(evtInfo, syst));
270 m_scaleFactorDecoration.set(*evtInfo,
sf, syst);
271 m_matchingDecoration.set(*evtInfo,
matched, syst);
275 return StatusCode::SUCCESS;
282 return StatusCode::SUCCESS;