ATLAS Offline Software
Loading...
Searching...
No Matches
SUSYToolsInit.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// For making the systematics list and looping through it
10
11// For the data types to be used in configuring tools
13
14// For the tau tool initialization
16
17// For the struct needed for OR init
19
20// Abstract interface classes
23
30
41
47
52
54//disable #include "IsolationSelection/IIsolationLowPtPLVTool.h"
57
61
66// Can't use the abstract interface for this one (see header comment)
68
76
78
79#ifndef XAOD_STANDALONE
81#endif
82
83using namespace ST;
84
85
86
87#define CONFIG_EG_EFF_TOOL( TOOLHANDLE, TOOLNAME, CORRFILE ) \
88 if( !TOOLHANDLE.isUserConfigured() ) { \
89 TOOLHANDLE.setTypeAndName("CP::AsgElectronEfficiencyCorrectionTool/"+TOOLNAME); \
90 std::vector< std::string > corrFileNameList = {CORRFILE}; \
91 ATH_CHECK( TOOLHANDLE.setProperty("CorrectionFileNameList", corrFileNameList) ); \
92 if(!isData()) \
93 ATH_CHECK (TOOLHANDLE.setProperty("ForceDataType", static_cast<int>(data_type))); \
94 ATH_CHECK( TOOLHANDLE.setProperty("CorrelationModel", m_EG_corrModel) ); \
95 ATH_CHECK( TOOLHANDLE.setProperty("OutputLevel", this->msg().level()) ); \
96 ATH_CHECK( TOOLHANDLE.initialize() ); \
97 } else ATH_CHECK(TOOLHANDLE.retrieve());
98
99#define CONFIG_EG_EFF_TOOL_KEY( TOOLHANDLE, TOOLNAME, KEYNAME, KEY, MAP ) \
100 if( !TOOLHANDLE.isUserConfigured() ) { \
101 TOOLHANDLE.setTypeAndName("CP::AsgElectronEfficiencyCorrectionTool/"+TOOLNAME); \
102 ATH_MSG_INFO( "Will now set key \"" << KEYNAME << "\" to value \"" << KEY << "\" when configuring an AsgElectronEfficiencyCorrectionTool" ); \
103 ATH_CHECK( TOOLHANDLE.setProperty(KEYNAME, KEY) ); \
104 if(!isData()) \
105 ATH_CHECK (TOOLHANDLE.setProperty("ForceDataType", static_cast<int>(data_type))); \
106 ATH_CHECK( TOOLHANDLE.setProperty("CorrelationModel", m_EG_corrModel) ); \
107 ATH_CHECK( TOOLHANDLE.setProperty("OutputLevel", this->msg().level()) ); \
108 ATH_CHECK( TOOLHANDLE.setProperty("MapFilePath", MAP) ); \
109 ATH_CHECK( TOOLHANDLE.initialize() ); \
110 } else if (!isData()) ATH_CHECK(TOOLHANDLE.retrieve());
111
113{
114 if (m_dataSource < 0) {
115 ATH_MSG_FATAL("Data source incorrectly configured!!");
116 ATH_MSG_FATAL("You must set the DataSource property to Data, FullSim or AtlfastII !!");
117 ATH_MSG_FATAL("Expect segfaults if you're not checking status codes, which you should be !!");
118 return StatusCode::FAILURE;
119 }
120
121 if (m_subtool_init) {
122 ATH_MSG_INFO("SUSYTools subtools already created. Ignoring this call.");
123 ATH_MSG_INFO("Note: No longer necessary to explicitly call SUSYToolsInit. Will avoid creating tools again.");
124 return StatusCode::SUCCESS;
125 }
126
127 // /////////////////////////////////////////////////////////////////////////////////////////
128 // Initialise PileupReweighting Tool
129
130 if (!m_prwTool.isUserConfigured()) {
131 ATH_MSG_DEBUG("Will now init the PRW tool");
132 std::vector<std::string> file_conf;
133 for (UInt_t i = 0; i < m_prwConfFiles.size(); i++) {
134 ATH_MSG_INFO("Adding PRW file: " << m_prwConfFiles.at(i));
135 file_conf.push_back(m_prwConfFiles.at(i));
136 }
137
138 std::vector<std::string> file_ilumi;
139 for (UInt_t i = 0; i < m_prwLcalcFiles.size(); i++) {
140 ATH_MSG_INFO("Adding ilumicalc file: " << m_prwLcalcFiles.at(i));
141 file_ilumi.push_back(m_prwLcalcFiles.at(i));
142 }
143
144 m_prwTool.setTypeAndName("CP::PileupReweightingTool/PrwTool");
145 ATH_CHECK( m_prwTool.setProperty("ConfigFiles", file_conf) );
146 ATH_CHECK( m_prwTool.setProperty("LumiCalcFiles", file_ilumi) );
147 ATH_CHECK( m_prwTool.setProperty("DataScaleFactor", m_prwDataSF) ); // 1./1.03 -> default for mc16, see: https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/ExtendedPileupReweighting#Tool_Properties
148 ATH_CHECK( m_prwTool.setProperty("DataScaleFactorUP", m_prwDataSF_UP) ); // 1. -> old value (mc15), as the one for mc16 is still missing
149 ATH_CHECK( m_prwTool.setProperty("DataScaleFactorDOWN", m_prwDataSF_DW) ); // 1./1.18 -> old value (mc15), as the one for mc16 is still missing
150 ATH_CHECK( m_prwTool.setProperty("TrigDecisionTool", m_trigDecTool.getHandle()) );
151 ATH_CHECK( m_prwTool.setProperty("UseRunDependentPrescaleWeight", m_runDepPrescaleWeightPRW) );
152 ATH_CHECK( m_prwTool.setProperty("OutputLevel", MSG::WARNING) );
153 ATH_CHECK( m_prwTool.retrieve() );
154 } else {
155 ATH_MSG_INFO("Using user-configured PRW tool");
156 ATH_CHECK( m_prwTool.retrieve() );
157 }
158
160 // Initialize LRT systematics tool
161 if (!m_LRTuncTool.isUserConfigured() && !isData())
162 {
163 ATH_MSG_INFO("Initializing LRT uncertainty tool");
164 m_LRTuncTool.setTypeAndName("InDet::InclusiveTrackFilterTool/LRTUncTool");
165 ATH_CHECK( m_LRTuncTool.setProperty("Seed", 1) );
166 if (m_isRun3) {
167 if (m_mcCampaign == "mc23d" || m_mcCampaign == "mc23e")
168 ATH_MSG_WARNING("Please note that current ID recommendations only cover mc23a and not (yet) mc23d/e!");
169 ATH_CHECK( m_LRTuncTool.setProperty("calibFileLRTEff", "InDetTrackSystematicsTools/CalibData_25.2_2025-v00/LargeD0TrackingRecommendations_mc23a.root") );
170 }
171 else
172 ATH_CHECK( m_LRTuncTool.setProperty("calibFileLRTEff", "InDetTrackSystematicsTools/CalibData_24.0_2023-v00/LargeD0TrackingRecommendations_20230824.root") );
173 ATH_CHECK(m_LRTuncTool.retrieve());
174 } else {
175 ATH_MSG_INFO("Using user-configured LRT uncertainty tool");
176 ATH_CHECK(m_LRTuncTool.retrieve());
177 }
178
179 std::string toolName; // to be used for tool init below, keeping explicit string constants a minimum /CO
180
181 std::string jetname,jetcoll,fatjetcoll;
182 if (m_slices["jet"]) {
184 // Initialise jet calibration tool
185
186 // pick the right config file for the JES tool : https://twiki.cern.ch/twiki/bin/view/AtlasProtected/ApplyJetCalibrationR22
188 jetcoll = jetname + "Jets";
189
190 if (!m_jetCalibTool.isUserConfigured()) {
191 toolName = "JetCalibTool_" + jetname;
192 m_jetCalibTool.setTypeAndName("JetCalibrationTool/"+toolName);
193 std::string JES_config_file, calibseq;
194
196 ATH_MSG_ERROR("Unknown (unsupported) jet collection is used, (m_jetInputType = " << m_jetInputType << ")");
197 return StatusCode::FAILURE;
198 }
199
200 std::string JESconfig = isAtlfast() ? m_jesConfigAFII : m_jesConfig;
201 if(isAtlfast() && m_isRun3) {
202 ATH_MSG_WARNING("Jet JES/JER recommendations currently not available for fast sim in Run 3, falling back to full sim version");
203 JESconfig = m_jesConfig;
204 }
205
206 calibseq = m_jesCalibSeq;
207 JES_config_file = JESconfig;
208
209 // remove Insitu if it's in the string if not data
210 if (!isData()) {
211 std::string insitu("_Insitu");
212 auto found = calibseq.find(insitu);
213 if(found != std::string::npos){
214 calibseq.erase(found, insitu.length());
215 }
216 }
217
218 // JMS calibration (if requested)
219 if (m_JMScalib){
220 ATH_MSG_ERROR("JMS calibration is not supported yet for R22. Please modify your settings.");
221 return StatusCode::FAILURE;
222 }
223
224 // now instantiate the tool
225 ATH_CHECK( m_jetCalibTool.setProperty("JetCollection", jetname) );
226 ATH_CHECK( m_jetCalibTool.setProperty("ConfigFile", JES_config_file) );
227 ATH_CHECK( m_jetCalibTool.setProperty("CalibSequence", calibseq) );
228 ATH_CHECK( m_jetCalibTool.setProperty("CalibArea", m_jesCalibArea) );
229 ATH_CHECK( m_jetCalibTool.setProperty("IsData", isData()) );
230 ATH_CHECK( m_jetCalibTool.setProperty("OutputLevel", this->msg().level()) );
231 ATH_CHECK( m_jetCalibTool.retrieve() );
232 } else ATH_CHECK(m_jetCalibTool.retrieve());
233 }
234
235 if (m_slices["fjet"]) {
236 //same for fat groomed jets
237 fatjetcoll = m_fatJets;
238
239 if(fatjetcoll == "AnalysisLargeRJets") {
240 ATH_MSG_DEBUG("Fall back to calibration for AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets, original name for AnalysisLargeRJets");
241 fatjetcoll = "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets";
242 }
243 if (fatjetcoll.size()>3)fatjetcoll.erase(fatjetcoll.size()-4,4);
244 if (!m_jetFatCalibTool.isUserConfigured() && !m_fatJets.empty()) {
245 toolName = "JetFatCalibTool_" + m_fatJets;
246 m_jetFatCalibTool.setTypeAndName("JetCalibrationTool/"+toolName);
247
248 std::string jesConfigFat = m_jesConfigFat;
249 std::string jesCalibSeqFat = m_jesCalibSeqFat;
250 // add Insitu if data
251 if(isData()) jesCalibSeqFat += "_Insitu";
252
253 // now instantiate the tool
254 ATH_CHECK( m_jetFatCalibTool.setProperty("JetCollection", fatjetcoll) );
255 ATH_CHECK( m_jetFatCalibTool.setProperty("ConfigFile", jesConfigFat) );
256 ATH_CHECK( m_jetFatCalibTool.setProperty("CalibSequence", jesCalibSeqFat) );
257 // always set to false : https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/ApplyJetCalibrationR21
258 ATH_CHECK( m_jetFatCalibTool.setProperty("IsData", isData()) );
259 ATH_CHECK( m_jetFatCalibTool.setProperty("OutputLevel", this->msg().level()) );
260 ATH_CHECK( m_jetFatCalibTool.retrieve() );
261 } else if (m_jetFatCalibTool.isUserConfigured()) ATH_CHECK(m_jetFatCalibTool.retrieve());
262 }
263
264 if (m_slices["fjet"]) {
266 // Initialise Boson taggers: https://twiki.cern.ch/twiki/bin/view/AtlasProtected/BoostedJetTaggingRecommendationFullRun2#Higgs_taggers
267 if (!m_WTaggerTool.isUserConfigured() && !m_WtagConfig.empty()) {
268 m_WTaggerTool.setTypeAndName("SmoothedWZTagger/WTagger");
269 ATH_CHECK( m_WTaggerTool.setProperty("ContainerName", m_fatJets) );
270 ATH_CHECK( m_WTaggerTool.setProperty("ConfigFile", m_WtagConfig) );
271 ATH_CHECK( m_WTaggerTool.setProperty("CalibArea", m_WZTaggerCalibArea) );
272 ATH_CHECK( m_WTaggerTool.setProperty("IsMC",!isData()));
273#ifndef XAOD_STANDALONE
274 ATH_CHECK( m_WTaggerTool.setProperty("SuppressOutputDependence", true) );
275#endif
276 ATH_CHECK( m_WTaggerTool.setProperty("OutputLevel", this->msg().level()) );
277 ATH_CHECK( m_WTaggerTool.retrieve() );
278
279 // Retrieving DecorationName (needed to access tagging results downstream):
280 std::string WConfigPath = PathResolverFindCalibFile("BoostedJetTaggers/"+m_WZTaggerCalibArea+"/"+m_WtagConfig);
281 if ( m_WconfigReader.ReadFile( WConfigPath.c_str(), EEnvLevel(0) ) ) {
282 ATH_MSG_ERROR( "Error while reading large-R config file : " << WConfigPath );
283 return StatusCode::FAILURE;
284 }
285 else ATH_MSG_DEBUG( "Successfully read large-R config file : " << WConfigPath );
286
287 m_WDecorName = m_WconfigReader.GetValue("DecorationName" ,"");
288 ANA_MSG_DEBUG( "Found DecorationName in large-R config file : " << m_WDecorName );
289
290 } else if (m_WTaggerTool.isUserConfigured()) ATH_CHECK(m_WTaggerTool.retrieve());
291
292 if (!m_ZTaggerTool.isUserConfigured() && !m_ZtagConfig.empty()) {
293 m_ZTaggerTool.setTypeAndName("SmoothedWZTagger/ZTagger");
294 ATH_CHECK( m_ZTaggerTool.setProperty("ContainerName", m_fatJets) );
295 ATH_CHECK( m_ZTaggerTool.setProperty("ConfigFile", m_ZtagConfig) );
296 ATH_CHECK( m_ZTaggerTool.setProperty("CalibArea", m_WZTaggerCalibArea) );
297 ATH_CHECK( m_ZTaggerTool.setProperty("IsMC",!isData()));
298#ifndef XAOD_STANDALONE
299 ATH_CHECK( m_ZTaggerTool.setProperty("SuppressOutputDependence", true) );
300#endif
301 ATH_CHECK( m_ZTaggerTool.setProperty("OutputLevel", this->msg().level()) );
302 ATH_CHECK( m_ZTaggerTool.retrieve() );
303
304 // Retrieving DecorationName (needed to access tagging results downstream):
305 std::string ZConfigPath = PathResolverFindCalibFile("BoostedJetTaggers/"+m_WZTaggerCalibArea+"/"+m_ZtagConfig);
306 if ( m_ZconfigReader.ReadFile( ZConfigPath.c_str(), EEnvLevel(0) ) ) {
307 ATH_MSG_ERROR( "Error while reading large-R config file : " << ZConfigPath );
308 return StatusCode::FAILURE;
309 }
310 else ATH_MSG_DEBUG( "Successfully read large-R config file : " << ZConfigPath );
311
312 m_ZDecorName = m_ZconfigReader.GetValue("DecorationName" ,"");
313 ANA_MSG_DEBUG( "Found DecorationName in large-R config file : " << m_ZDecorName );
314
315 } else if (m_ZTaggerTool.isUserConfigured()) ATH_CHECK(m_ZTaggerTool.retrieve());
316
317 if (!m_TopTaggerTool.isUserConfigured() && !m_ToptagConfig.empty()) {
318 m_TopTaggerTool.setTypeAndName("JSSWTopTaggerDNN/TopTagger");
319 ATH_CHECK( m_TopTaggerTool.setProperty("ContainerName", m_fatJets) );
320 ATH_CHECK( m_TopTaggerTool.setProperty("ConfigFile", m_ToptagConfig) );
321 ATH_CHECK( m_TopTaggerTool.setProperty("CalibArea", m_TopTaggerCalibArea) );
322 ATH_CHECK( m_TopTaggerTool.setProperty("IsMC",!isData()));
323#ifndef XAOD_STANDALONE
324 ATH_CHECK( m_TopTaggerTool.setProperty("SuppressOutputDependence", true) );
325#endif
326 ATH_CHECK( m_TopTaggerTool.setProperty("OutputLevel", this->msg().level()) );
327 ATH_CHECK( m_TopTaggerTool.retrieve() );
328
329 // Retrieving DecorationName (needed to access tagging results downstream):
330 std::string TopConfigPath = PathResolverFindCalibFile("BoostedJetTaggers/"+m_TopTaggerCalibArea+"/"+m_ToptagConfig);
331 if ( m_TopconfigReader.ReadFile( TopConfigPath.c_str(), EEnvLevel(0) ) ) {
332 ATH_MSG_ERROR( "Error while reading large-R config file : " << TopConfigPath );
333 return StatusCode::FAILURE;
334 }
335 else ATH_MSG_DEBUG( "Successfully read large-R config file : " << TopConfigPath );
336
337 m_TopDecorName = m_TopconfigReader.GetValue("DecorationName" ,"");
338 ANA_MSG_DEBUG( "Found DecorationName in large-R config file : " << m_TopDecorName );
339
340 } else if (m_TopTaggerTool.isUserConfigured()) ATH_CHECK(m_TopTaggerTool.retrieve());
341
343 // Initialise JetTruthLabelingTool: https://twiki.cern.ch/twiki/bin/view/AtlasProtected/JetUncertaintiesRel21Summer2019LargeR#AnalysisBase_21_2_114_and_newer
344 if(!isData()) {
345 m_label_truthKey = fatjetcoll+"."+m_JetTruthLabelName;
346 ATH_CHECK(m_label_truthKey.initialize());
347
348 if (!m_jetTruthLabelingTool.isUserConfigured()) {
349 m_jetTruthLabelingTool.setTypeAndName("JetTruthLabelingTool/ST_JetTruthLabelingTool");
350 ATH_CHECK( m_jetTruthLabelingTool.setProperty("RecoJetContainer", m_fatJets) );
351 ATH_CHECK( m_jetTruthLabelingTool.setProperty("TruthJetContainer", m_fatUngroomedTruthJets) );
352 ATH_CHECK( m_jetTruthLabelingTool.setProperty("TruthGroomedJetContainer", m_fatTruthJets) );
353 ATH_CHECK( m_jetTruthLabelingTool.setProperty("GetTruthGroomedJetValues", m_getTruthGroomedJetValues) );
354 ATH_CHECK( m_jetTruthLabelingTool.setProperty("MatchUngroomedParent", m_matchUngroomedParent) );
355 ATH_CHECK( m_jetTruthLabelingTool.setProperty("dRTruthJet", m_dRTruthJet) );
356 ATH_CHECK( m_jetTruthLabelingTool.setProperty("TruthLabelName", m_JetTruthLabelName) );
357 ATH_CHECK( m_jetTruthLabelingTool.setProperty("OutputLevel", this->msg().level()) );
358 ATH_CHECK( m_jetTruthLabelingTool.retrieve() );
359 } else if (m_jetTruthLabelingTool.isUserConfigured()) ATH_CHECK(m_jetTruthLabelingTool.retrieve());
360 }
361 }
362
363 if (m_slices["jet"] || m_slices["fjet"]) {
364
365
367 // Initialise jet uncertainty tool
368 // https://twiki.cern.ch/twiki/bin/view/AtlasProtected/JetUncertaintiesRel22
369 ATH_MSG_INFO("Set up Jet Uncertainty tool...");
370
371 // if not set, derive the MCType from the simulation type and MC campaign
372 if (m_jetUncertaintiesMCType.empty()) m_jetUncertaintiesMCType = m_isRun3 ? (isAtlfast() ? "MC23AF3" : "MC23") : (isAtlfast() ? "AF3" : "MC20");
373
374 // large-R jets use MC20AF3 instead of AF3
376 if (m_fatJetUncertaintiesMCType == "AF3") {
377 m_fatJetUncertaintiesMCType = "MC20AF3";
378 }
379
380 if (!m_jetUncertaintiesTool.isUserConfigured()) {
381 std::string jetdef("AntiKt4" + xAOD::JetInput::typeName(xAOD::JetInput::Type(m_jetInputType)));
382
383 if(jetdef !="AntiKt4EMPFlow"){
384 ATH_MSG_WARNING("Jet Uncertaintes recommendations only exist for PFlow jets, falling back to AntiKt4EMPFlow");
385 jetdef = "AntiKt4EMPFlow";
386 }
387 toolName = "JetUncertaintiesTool_" + jetdef;
388
389 m_jetUncertaintiesTool.setTypeAndName("JetUncertaintiesTool/"+toolName);
390
391 ATH_CHECK( m_jetUncertaintiesTool.setProperty("JetDefinition", jetdef) );
393 ATH_CHECK( m_jetUncertaintiesTool.setProperty("IsData", false) ); // Never use the PDSmearing for the nominal tool.
394 ATH_CHECK( m_jetUncertaintiesTool.setProperty("ConfigFile", m_jetUncertaintiesConfig) );
397 ATH_CHECK( m_jetUncertaintiesTool.setProperty("OutputLevel", this->msg().level()) );
398 ATH_CHECK( m_jetUncertaintiesTool.retrieve() );
399 } else ATH_CHECK( m_jetUncertaintiesTool.retrieve() );
400
401 ATH_MSG_INFO("Set up Jet PD Smear Uncertainty tool...");
402
403 if (!m_jetUncertaintiesPDSmearTool.isUserConfigured() && m_jetUncertaintiesPDsmearing == true) {
404 std::string jetdef("AntiKt4" + xAOD::JetInput::typeName(xAOD::JetInput::Type(m_jetInputType)));
405
406 if(jetdef !="AntiKt4EMPFlow"){
407 ATH_MSG_WARNING("Jet Uncertaintes recommendations only exist for PFlow jets, falling back to AntiKt4EMPFlow");
408 jetdef = "AntiKt4EMPFlow";
409 }
410 toolName = "JetUncertaintiesPDSmearTool_" + jetdef;
411
412 m_jetUncertaintiesPDSmearTool.setTypeAndName("JetUncertaintiesTool/"+toolName);
413
414 // If, for some reason, you're trying to use the PDSmear, with the reduced set return an error (you shouldn't do this, you're just going to duplicate the SimpleJER results.
415 bool JERUncPDsmearing = isData() ? isData() : m_jetUncertaintiesPDsmearing;
416 if (m_jetUncertaintiesConfig.find("SimpleJER") != std::string::npos && JERUncPDsmearing){
417 ATH_MSG_ERROR("You are trying to use the SimpleJER set, with PDsmearing. There is no functionality for this. Please fix your config file. Either run with PDSmear set to false, or run with the AllJER or FullJER sets.");
418 return StatusCode::FAILURE;
419 }
420 ATH_CHECK( m_jetUncertaintiesPDSmearTool.setProperty("JetDefinition", jetdef) );
422 ATH_CHECK( m_jetUncertaintiesPDSmearTool.setProperty("IsData", true) ); // Set to True by default for PDSmear-named tool.
423 ATH_CHECK( m_jetUncertaintiesPDSmearTool.setProperty("PseudoDataJERsmearingMode", true) );
426 ATH_CHECK( m_jetUncertaintiesPDSmearTool.setProperty("OutputLevel", this->msg().level()) );
428 } else{
429 ATH_MSG_DEBUG("Do not retrieve the jet PD Smearing tool if it is not configured");
430 //ATH_CHECK( m_jetUncertaintiesPDSmearTool.retrieve() );
431 }
432 }
433
434 if (m_slices["fjet"]) {
435
436 // JetUncertaintiesTool handles JES, JER and JMS uncertainties for large-R jets
437 if (!m_fatjetUncertaintiesTool.isUserConfigured() && !m_fatJets.empty() && !m_fatJetUncConfig.empty()) {
438
439 ATH_MSG_INFO("Set up Large-R Jet Uncertainty tool...");
440
441 // Print warning about missing large-R jets uncertainties for FastSim in mc23
442 if (m_isRun3 && isAtlfast())
443 ATH_MSG_WARNING("Uncertainties for large-R jets in mc23 and fast simulation not yet available; be aware uncertainties might be not complete!");
444
445 toolName = "JetUncertaintiesTool_" + m_fatJets;
446 m_fatjetUncertaintiesTool.setTypeAndName("JetUncertaintiesTool/"+toolName);
447
448 ATH_CHECK( m_fatjetUncertaintiesTool.setProperty("JetDefinition", fatjetcoll) );
450 ATH_CHECK( m_fatjetUncertaintiesTool.setProperty("IsData", isData()) );
451 ATH_CHECK( m_fatjetUncertaintiesTool.setProperty("ConfigFile", m_fatJetUncConfig) );
453
454 //Restrict variables to be shifted if (required)
455 if( m_fatJetUncVars != "default" ){
456 std::vector<std::string> shift_vars = {};
457
458 std::string temp(m_fatJetUncVars);
459 do {
460 auto pos = temp.find(',');
461 shift_vars.push_back(temp.substr(0, pos));
462 if (pos == std::string::npos)
463 temp = "";
464 else
465 temp = temp.substr(pos + 1);
466
467 }
468 while (!temp.empty() );
469
470 ATH_CHECK( m_fatjetUncertaintiesTool.setProperty("VariablesToShift", shift_vars) );
471 }
472
473 ATH_CHECK( m_fatjetUncertaintiesTool.setProperty("OutputLevel", this->msg().level()) );
475 } else if (m_fatjetUncertaintiesTool.isUserConfigured()) ATH_CHECK(m_fatjetUncertaintiesTool.retrieve());
476
477
478 if (!m_fatjetUncertaintiesPDSmearTool.isUserConfigured() && !m_fatJets.empty() && !m_fatJetUncConfig.empty() && m_fatJetUncertaintiesPDsmearing == true) {
479
480 ATH_MSG_INFO("Set up Jet PD Smear Uncertainty tool...");
481
482 toolName = "JetUncertaintiesPDSmearTool_" + m_fatJets;
483 m_fatjetUncertaintiesPDSmearTool.setTypeAndName("JetUncertaintiesTool/"+toolName);
484
485 // If, for some reason, you're trying to use the PDSmear, with the reduced set return an error (you shouldn't do this, you're just going to duplicate the SimpleJER results.
486 bool JERUncPDsmearing = isData() ? isData() : m_fatJetUncertaintiesPDsmearing;
487 if (m_fatJetUncConfig.find("SimpleJER") != std::string::npos && JERUncPDsmearing){
488 ATH_MSG_ERROR("You are trying to use the SimpleJER set, with PDsmearing. There is no functionality for this. Please fix your config file. Either run with PDSmear set to false, or run with the AllJER or FullJER sets.");
489 return StatusCode::FAILURE;
490 }
491 ATH_CHECK( m_fatjetUncertaintiesPDSmearTool.setProperty("JetDefinition", fatjetcoll) );
493 ATH_CHECK( m_fatjetUncertaintiesPDSmearTool.setProperty("IsData", true) ); // Set to True by default for PDSmear-named tool.
494 ATH_CHECK( m_fatjetUncertaintiesPDSmearTool.setProperty("PseudoDataJERsmearingMode", true) );
497 ATH_CHECK( m_fatjetUncertaintiesPDSmearTool.setProperty("OutputLevel", this->msg().level()) );
499 } else{
500 ATH_MSG_DEBUG("Do not retrieve the jet PD Smearing tool if it is not configured");
501 }
502
503
504 // FFSmearingTool handles JMR uncertainties for large-R jets
505 if (!m_fatjetFFSmearingTool.isUserConfigured() && !m_fatJets.empty() && !m_fatJetUncConfig.empty()) {
506
507 ATH_MSG_INFO("Set up Large-R FFJetSmearingTool ...");
508
509 toolName = "FFJetSmearingTool_" + m_fatJets;
510 m_fatjetFFSmearingTool.setTypeAndName("CP::FFJetSmearingTool/"+toolName);
511
512 ATH_CHECK( m_fatjetFFSmearingTool.setProperty("MassDef", "UFO") );
514 ATH_CHECK( m_fatjetFFSmearingTool.setProperty("ConfigFile", "rel22/Spring2025_PreRec/R10_FullJMR.config") );
515 ATH_CHECK( m_fatjetFFSmearingTool.setProperty("OutputLevel", this->msg().level()) );
516 ATH_CHECK( m_fatjetFFSmearingTool.retrieve() );
517 } else if (m_fatjetFFSmearingTool.isUserConfigured()) ATH_CHECK(m_fatjetFFSmearingTool.retrieve());
518
519 // Need to keep track of systematics of FFJetSmearingTool
520 if (!m_fatJets.empty()) {
521 // m_fatjetFFSmearingSyst = CP::make_systematics_vector(m_fatjetFFSmearingTool->recommendedSystematics());
522 ATH_MSG_INFO("The following uncertainties have been defined for the m_fatjetFFSmearingTool");
523 for (auto & sysSet : m_fatjetFFSmearingTool->recommendedSystematics()){
524 m_fatjetFFSmearingSyst.push_back(CP::SystematicSet({sysSet}));
525 ATH_MSG_INFO(" - " << sysSet.name());
526 }
527 }
528
529 ATH_MSG_INFO(" Won't initialise Wtagger uncertainty tool for fat jets until we get rec for UFO");
530 // Won't initialise Wtagger uncertainty tool for fat jets until we get rec for UFO
531 /*
532 if (!m_WTagjetUncertaintiesTool.isUserConfigured() && !m_fatJets.empty() && !m_WtagConfig.empty() && !m_WTagUncConfig.empty()) {
533
534 toolName = "WTagJetUncertaintiesTool_" + m_fatJets;
535 m_WTagjetUncertaintiesTool.setTypeAndName("JetUncertaintiesTool/"+toolName);
536 ATH_CHECK( m_WTagjetUncertaintiesTool.setProperty("JetDefinition", fatjetcoll) );
537 ATH_CHECK( m_WTagjetUncertaintiesTool.setProperty("MCType", "MC16") );
538 ATH_CHECK( m_WTagjetUncertaintiesTool.setProperty("IsData", isData()) );
539 ATH_CHECK( m_WTagjetUncertaintiesTool.setProperty("ConfigFile", "rel21/Fall2020/"+m_WTagUncConfig) );
540 ATH_CHECK( m_WTagjetUncertaintiesTool.setProperty("OutputLevel", this->msg().level()) );
541 ATH_CHECK( m_WTagjetUncertaintiesTool.retrieve() );
542 } else if (m_WTagjetUncertaintiesTool.isUserConfigured()) ATH_CHECK(m_WTagjetUncertaintiesTool.retrieve());
543 */
544 ATH_MSG_INFO(" Won't initialise Ztagger uncertainty tool for fat jets until we get rec for UFO");
545 // Won't initialise Ztagger uncertainty tool for fat jets until we get rec for UFO
546 /*
547 if (!m_ZTagjetUncertaintiesTool.isUserConfigured() && !m_fatJets.empty() && !m_ZtagConfig.empty() && !m_ZTagUncConfig.empty()) {
548
549 toolName = "ZTagJetUncertaintiesTool_" + m_fatJets;
550 m_ZTagjetUncertaintiesTool.setTypeAndName("JetUncertaintiesTool/"+toolName);
551 ATH_CHECK( m_ZTagjetUncertaintiesTool.setProperty("JetDefinition", fatjetcoll) );
552 ATH_CHECK( m_ZTagjetUncertaintiesTool.setProperty("ConfigFile", "rel21/Fall2020/"+m_ZTagUncConfig) );
553 ATH_CHECK( m_ZTagjetUncertaintiesTool.setProperty("MCType", "MC16") );
554 ATH_CHECK( m_ZTagjetUncertaintiesTool.setProperty("IsData", isData()) );
555 ATH_CHECK( m_ZTagjetUncertaintiesTool.setProperty("OutputLevel", this->msg().level()) );
556 ATH_CHECK( m_ZTagjetUncertaintiesTool.retrieve() );
557 } else if (m_ZTagjetUncertaintiesTool.isUserConfigured()) ATH_CHECK(m_ZTagjetUncertaintiesTool.retrieve());
558 */
559 ATH_MSG_INFO(" Won't initialise top-tagger uncertainty tool for fat jets until we get rec for UFO");
560 // Won't initialise top-tagger uncertainty tool for fat jets until we get rec for UFO
561 /*
562 if (!m_TopTagjetUncertaintiesTool.isUserConfigured() && !m_fatJets.empty() && !m_ToptagConfig.empty() && !m_TopTagUncConfig.empty()) {
563
564 toolName = "TopTagJetUncertaintiesTool_" + m_fatJets;
565 m_TopTagjetUncertaintiesTool.setTypeAndName("JetUncertaintiesTool/"+toolName);
566 ATH_CHECK( m_TopTagjetUncertaintiesTool.setProperty("JetDefinition", fatjetcoll) );
567 ATH_CHECK( m_TopTagjetUncertaintiesTool.setProperty("MCType", "MC16") );
568 ATH_CHECK( m_TopTagjetUncertaintiesTool.setProperty("IsData", isData()) );
569 ATH_CHECK( m_TopTagjetUncertaintiesTool.setProperty("ConfigFile", "rel21/Fall2020/"+m_TopTagUncConfig) );
570 ATH_CHECK( m_TopTagjetUncertaintiesTool.setProperty("OutputLevel", this->msg().level()) );
571 ATH_CHECK( m_TopTagjetUncertaintiesTool.retrieve() );
572 } else if (m_TopTagjetUncertaintiesTool.isUserConfigured()) ATH_CHECK(m_TopTagjetUncertaintiesTool.retrieve());
573 */
574 }
575
576
577 // tagger SF and uncertainties
578 // https://twiki.cern.ch/twiki/bin/view/AtlasProtected/BoostedJetTaggingRecommendationFullRun2
579 // To be implemented here
580
581 if (m_slices["jet"]) {
583 // Initialise jet cleaning tools
584
585 // see https://twiki.cern.ch/twiki/bin/view/AtlasProtected/HowToCleanJetsR22
586 if (m_badJetCut!="" && !m_jetCleaningTool.isUserConfigured()) {
587 toolName = "JetCleaningTool";
588 m_jetCleaningTool.setTypeAndName("JetCleaningTool/"+toolName);
589 ATH_CHECK( m_jetCleaningTool.setProperty("CutLevel", m_badJetCut) );
590 ATH_CHECK( m_jetCleaningTool.setProperty("DoUgly", false) );
591 ATH_CHECK( m_jetCleaningTool.setProperty("OutputLevel", this->msg().level()) );
592 ATH_CHECK( m_jetCleaningTool.retrieve() );
593 } else if (m_jetCleaningTool.isUserConfigured()) ATH_CHECK( m_jetCleaningTool.retrieve() );
594
596 // Initialise jet pileup labeling tool (required for labels used by JvtEfficiencyTools)
597
598 if(!m_jetPileupLabelingTool.isUserConfigured() && !isData()) {
599 toolName = "PileupLabelingTool";
600 m_jetPileupLabelingTool.setTypeAndName("JetPileupLabelingTool/"+toolName);
601 ATH_CHECK( m_jetPileupLabelingTool.setProperty("RecoJetContainer", m_defaultJets) );
602 ATH_CHECK( m_jetPileupLabelingTool.setProperty("TruthJetContainer", m_defaultTruthJets) );
603 #ifndef XAOD_STANDALONE
604 ATH_CHECK( m_jetPileupLabelingTool.setProperty("SuppressInputDependence", true) );
605 ATH_CHECK( m_jetPileupLabelingTool.setProperty("SuppressOutputDependence", true) );
606 #endif
607 ATH_CHECK( m_jetPileupLabelingTool.setProperty("OutputLevel", this->msg().level()) );
608 ATH_CHECK( m_jetPileupLabelingTool.retrieve() );
609 } else if (m_jetPileupLabelingTool.isUserConfigured()) ATH_CHECK( m_jetPileupLabelingTool.retrieve() );
610
612 // Initialise jet Jvt moment tool
613
614 if (!m_jetJvtMomentTool.isUserConfigured()) {
615 toolName = "JvtMomentTool";
616 m_jetJvtMomentTool.setTypeAndName("JetVertexTaggerTool/"+toolName);
617 ATH_CHECK( m_jetJvtMomentTool.setProperty("JetContainer", m_defaultJets) );
618 #ifndef XAOD_STANDALONE
619 ATH_CHECK( m_jetJvtMomentTool.setProperty("SuppressInputDependence", true) );
620 ATH_CHECK( m_jetJvtMomentTool.setProperty("SuppressOutputDependence", true) );
621 #endif
622 ATH_CHECK( m_jetJvtMomentTool.setProperty("OutputLevel", this->msg().level()) );
623 ATH_CHECK( m_jetJvtMomentTool.retrieve() );
624 } else if (m_jetJvtMomentTool.isUserConfigured()) ATH_CHECK( m_jetJvtMomentTool.retrieve() );
625
627 // Initialise jet NNJvt moment tool
628
629 m_applyJVTCut = !m_JvtWP.empty();
630 if (!m_jetNNJvtMomentTool.isUserConfigured() && m_applyJVTCut) {
631 toolName = "NNJvtMomentTool";
632 m_jetNNJvtMomentTool.setTypeAndName("JetPileupTag::JetVertexNNTagger/"+toolName);
633 ATH_CHECK( m_jetNNJvtMomentTool.setProperty("JetContainer", m_defaultJets) );
634 #ifndef XAOD_STANDALONE
635 ATH_CHECK( m_jetNNJvtMomentTool.setProperty("SuppressInputDependence", true) );
636 ATH_CHECK( m_jetNNJvtMomentTool.setProperty("SuppressOutputDependence", true) );
637 #endif
638 ATH_CHECK( m_jetNNJvtMomentTool.setProperty("OutputLevel", this->msg().level()) );
639 ATH_CHECK( m_jetNNJvtMomentTool.retrieve() );
640 } else if (m_jetNNJvtMomentTool.isUserConfigured()) ATH_CHECK( m_jetNNJvtMomentTool.retrieve() );
641
643 // Initialise jet NNJvt selection tool
644
645 if (!m_jetNNJvtSelectionTool.isUserConfigured() && m_applyJVTCut) {
646 toolName = "NNJvtSelectionTool";
647 m_jetNNJvtSelectionTool.setTypeAndName("CP::NNJvtSelectionTool/"+toolName);
648 ATH_CHECK( m_jetNNJvtSelectionTool.setProperty("JetContainer", m_defaultJets) );
649 ATH_CHECK( m_jetNNJvtSelectionTool.setProperty("WorkingPoint", m_JvtWP) );
650 ATH_CHECK( m_jetNNJvtSelectionTool.setProperty("MaxPtForJvt", m_JvtPtMax) );
651 ATH_CHECK( m_jetNNJvtSelectionTool.setProperty("JvtMomentName", "NNJvt") );
652 ATH_CHECK( m_jetNNJvtSelectionTool.setProperty("OutputLevel", this->msg().level()) );
654 } else if (m_jetNNJvtSelectionTool.isUserConfigured()) ATH_CHECK( m_jetNNJvtSelectionTool.retrieve() );
655
657 // Initialise jet NNJvt efficiency tool (scale factors)
658
659 if (!m_jetNNJvtEfficiencyTool.isUserConfigured() && m_applyJVTCut) {
660 toolName = "NNJvtEfficiencyTool";
661 m_jetNNJvtEfficiencyTool.setTypeAndName("CP::NNJvtEfficiencyTool/"+toolName);
662 ATH_CHECK( m_jetNNJvtEfficiencyTool.setProperty("JetContainer", m_defaultJets) );
663 ATH_CHECK( m_jetNNJvtEfficiencyTool.setProperty("WorkingPoint", m_JvtWP) );
664 ATH_CHECK( m_jetNNJvtEfficiencyTool.setProperty("MaxPtForJvt", m_JvtPtMax) );
666 ATH_CHECK( m_jetNNJvtEfficiencyTool.setProperty("OutputLevel", this->msg().level()) );
668 } else if (m_jetNNJvtEfficiencyTool.isUserConfigured()) ATH_CHECK( m_jetNNJvtEfficiencyTool.retrieve() );
669
671 // Initialise jet fJvt selection tool
672
673 if (!m_jetfJvtSelectionTool.isUserConfigured() && m_doFwdJVT) {
674 toolName = "fJvtSelectionTool";
675 m_jetfJvtSelectionTool.setTypeAndName("CP::FJvtSelectionTool/"+toolName);
676 ATH_CHECK( m_jetfJvtSelectionTool.setProperty("JetContainer", m_defaultJets) );
677 ATH_CHECK( m_jetfJvtSelectionTool.setProperty("WorkingPoint", m_fJvtWP) );
678 ATH_CHECK( m_jetfJvtSelectionTool.setProperty("MaxPtForJvt", m_fJvtPtMax) );
679 ATH_CHECK( m_jetfJvtSelectionTool.setProperty("JvtMomentName", "DFCommonJets_fJvt") );
680 ATH_CHECK( m_jetfJvtSelectionTool.setProperty("OutputLevel", this->msg().level()) );
681 ATH_CHECK( m_jetfJvtSelectionTool.retrieve() );
682 } else if (m_jetfJvtSelectionTool.isUserConfigured()) ATH_CHECK( m_jetfJvtSelectionTool.retrieve() );
683
685 // Initialise jet fJvt efficiency tool for scale factors (scale factors)
686
687 if (!m_jetfJvtEfficiencyTool.isUserConfigured() && m_doFwdJVT) {
688 toolName = "fJvtEfficiencyTool";
689 m_jetfJvtEfficiencyTool.setTypeAndName("CP::FJvtEfficiencyTool/"+toolName);
690 ATH_CHECK( m_jetfJvtEfficiencyTool.setProperty("JetContainer", m_defaultJets) );
691 ATH_CHECK( m_jetfJvtEfficiencyTool.setProperty("WorkingPoint", m_fJvtWP) );
692 ATH_CHECK( m_jetfJvtEfficiencyTool.setProperty("MaxPtForJvt", m_fJvtPtMax) );
694 ATH_CHECK( m_jetfJvtEfficiencyTool.setProperty("OutputLevel", this->msg().level()) );
696 } else ATH_CHECK( m_jetfJvtEfficiencyTool.retrieve() );
697 }
698
699
700 if (m_slices["mu"]) {
702 // Check muon baseline ID
703
704 std::string muQualBaseline = "";
705 switch (m_muIdBaseline) {
706 case static_cast<int>(xAOD::Muon::Quality::VeryLoose): muQualBaseline = "VeryLoose";
707 ATH_MSG_WARNING("No muon scale factors are available for VeryLoose working point.");
708 break;
709 case static_cast<int>(xAOD::Muon::Quality::Loose): muQualBaseline = "Loose"; break;
710 case static_cast<int>(xAOD::Muon::Quality::Medium): muQualBaseline = "Medium"; break;
711 case static_cast<int>(xAOD::Muon::Quality::Tight): muQualBaseline = "Tight"; break;
712 case 4: muQualBaseline = "HighPt"; break;
713 case 5: muQualBaseline = "LowPt"; break;
714 case 6: muQualBaseline = "LowPtMVA"; break;
715 case 7: muQualBaseline = "HighPt3Layers"; break;
716 default:
717 ATH_MSG_ERROR("Invalid muon working point provided: " << m_muIdBaseline << ". Cannot initialise!");
718 return StatusCode::FAILURE;
719 break;
720 }
721
723 // Initialise muon calibration tool
724 // https://twiki.cern.ch/twiki/bin/view/AtlasProtected/MuonMomentumCorrectionsSubgroup#CP_MuonCalibrationAndSmearingToo
725 // Please not that for AthAnalysis we need to configure the MuonCalibTool within METSignificance manually and just can't pass the handle
726 // Hence, any changes here should also be propagated to the METSignificance setup further below
727
728 if (!m_muonCalibTool.isUserConfigured()) {
729 m_muonCalibTool.setTypeAndName("CP::MuonCalibTool/ST_MuonCalibrationTool");
730 if (m_isRun3) ATH_CHECK( m_muonCalibTool.setProperty("IsRun3Geo", true ));
731 ATH_CHECK( m_muonCalibTool.setProperty("calibMode", m_muCalibrationMode) );
732 ATH_CHECK( m_muonCalibTool.setProperty("OutputLevel", this->msg().level()) );
733 ATH_CHECK( m_muonCalibTool.setProperty("release", "Recs2025_12_11_Run2Run3" ));
734 int IdBaselineInt = m_muIdBaseline;
735 if (IdBaselineInt == 4) {
736 ATH_CHECK( m_muonCalibTool.setProperty("do2StationsHighPt", true) );
737 }
738 ATH_CHECK( m_muonCalibTool.setProperty("doExtraSmearing", m_muHighPtExtraSmear) );
739 ATH_CHECK( m_muonCalibTool.retrieve() );
740 } else ATH_CHECK( m_muonCalibTool.retrieve() );
741
743 // Initialise muon selection tool
744
745 if (!m_muonSelectionToolBaseline.isUserConfigured()) {
746 toolName = "MuonSelectionTool_Baseline_" + muQualBaseline;
747 m_muonSelectionToolBaseline.setTypeAndName("CP::MuonSelectionTool/"+toolName);
748 if (m_isRun3) ATH_CHECK( m_muonSelectionToolBaseline.setProperty("IsRun3Geo", true ));
749
750 if (m_muBaselineEta<m_muEta){ // Test for inconsistent configuration
751 ATH_MSG_ERROR( "Requested a baseline eta cut for muons (" << m_muBaselineEta <<
752 ") that is tighter than the signal cut (" << m_muEta << "). Please check your config." );
753 return StatusCode::FAILURE;
754 }
755 int IdBaselineInt = m_muIdBaseline;
756 ATH_CHECK( m_muonSelectionToolBaseline.setProperty( "MaxEta", m_muBaselineEta) );
757 if (IdBaselineInt == 6){
758 ATH_CHECK( m_muonSelectionToolBaseline.setProperty( "MuQuality", 5 ) );
759 ATH_CHECK( m_muonSelectionToolBaseline.setProperty( "UseMVALowPt", true));
760 } else if (IdBaselineInt == 7){
761 ATH_CHECK( m_muonSelectionToolBaseline.setProperty( "MuQuality", 4 ) );
762 ATH_CHECK( m_muonSelectionToolBaseline.setProperty( "Use2stationMuonsHighPt", false));
763 } else ATH_CHECK(m_muonSelectionToolBaseline.setProperty( "MuQuality", m_muIdBaseline ));
764 ATH_CHECK( m_muonSelectionToolBaseline.setProperty("OutputLevel", this->msg().level()) );
766 } else ATH_CHECK( m_muonSelectionToolBaseline.retrieve() );
767
768
769 std::string muQual = "";
770 switch (m_muId) {
771 case static_cast<int>(xAOD::Muon::Quality::VeryLoose): muQual = "VeryLoose";
772 ATH_MSG_WARNING("No muon scale factors are available for VeryLoose working point.");
773 break;
774 case static_cast<int>(xAOD::Muon::Quality::Loose): muQual = "Loose"; break;
775 case static_cast<int>(xAOD::Muon::Quality::Medium): muQual = "Medium"; break;
776 case static_cast<int>(xAOD::Muon::Quality::Tight): muQual = "Tight"; break;
777 case 4: muQual = "HighPt"; break;
778 case 5: muQual = "LowPt"; break;
779 case 6: muQual = "LowPtMVA"; break;
780 case 7: muQual = "HighPt3Layers"; break;
781 default:
782 ATH_MSG_ERROR("Invalid muon working point provided: " << m_muId << ". Cannot initialise!");
783 return StatusCode::FAILURE;
784 break;
785 }
786
787 if (!m_muonSelectionTool.isUserConfigured()) {
788 toolName = "MuonSelectionTool_" + muQual;
789 m_muonSelectionTool.setTypeAndName("CP::MuonSelectionTool/"+toolName);
790 if (m_isRun3) ATH_CHECK( m_muonSelectionTool.setProperty("IsRun3Geo", true ));
791 ATH_CHECK( m_muonSelectionTool.setProperty( "MaxEta", m_muEta) );
792 int IdInt = m_muId;
793 if (IdInt == 6){
794 ATH_CHECK( m_muonSelectionTool.setProperty( "MuQuality", 5 ) );
795 ATH_CHECK( m_muonSelectionTool.setProperty( "UseMVALowPt", true));
796 } else if (IdInt == 7){
797 ATH_CHECK( m_muonSelectionTool.setProperty( "MuQuality", 4 ) );
798 ATH_CHECK( m_muonSelectionTool.setProperty( "Use2stationMuonsHighPt", false));
799 } else ATH_CHECK(m_muonSelectionTool.setProperty( "MuQuality", m_muId ));
800 ATH_CHECK( m_muonSelectionTool.setProperty("OutputLevel", this->msg().level()) );
801 ATH_CHECK( m_muonSelectionTool.retrieve() );
802 } else ATH_CHECK( m_muonSelectionTool.retrieve() );
803
804
805 if (!m_muonSelectionHighPtTool.isUserConfigured()) { //Fixed to HighPt WP
806 toolName = "MuonSelectionHighPtTool_" + muQual;
807 m_muonSelectionHighPtTool.setTypeAndName("CP::MuonSelectionTool/"+toolName);
808 if (m_isRun3) ATH_CHECK( m_muonSelectionHighPtTool.setProperty("IsRun3Geo", true ));
809 ATH_CHECK( m_muonSelectionHighPtTool.setProperty( "MaxEta", m_muEta) );
810 ATH_CHECK( m_muonSelectionHighPtTool.setProperty( "MuQuality", 4 ) );
811 ATH_CHECK( m_muonSelectionHighPtTool.setProperty("OutputLevel", this->msg().level()) );
813 } else ATH_CHECK( m_muonSelectionHighPtTool.retrieve() );
814
815
817 // Initialise prompt/LRT muon OR tool
818 if (!m_muonLRTORTool.isUserConfigured()) {
819 toolName = "MuonLRTOverlapRemovalTool";
820 m_muonLRTORTool.setTypeAndName("CP::MuonLRTOverlapRemovalTool/"+toolName);
822 if (m_isRun3) ATH_CHECK( m_muonLRTORTool.setProperty("UseRun3WP", true ));
823 ATH_CHECK( m_muonLRTORTool.setProperty("OutputLevel", this->msg().level()) );
824 ATH_CHECK( m_muonLRTORTool.retrieve() );
825 } else ATH_CHECK( m_muonLRTORTool.retrieve() );
826
828 // Initialise muon efficiency tools
829
830 // Hotfix for the Run2 Muon Identification SFs for the Tight WP
831 std::string MuonCP_Run2_TightFix = "";
832 if(!m_isRun3) {
833 MuonCP_Run2_TightFix = (m_muId == static_cast<int>(xAOD::Muon::Quality::Tight)) ? "220725_Preliminary_r22run2" : "230213_Preliminary_r22run2_loosefix";
834 }
835 if (!m_muonEfficiencySFTool.isUserConfigured() && m_muId != static_cast<int>(xAOD::Muon::Quality::VeryLoose) && !isData()) {
836 toolName = "MuonEfficiencyScaleFactors_" + muQual;
837 m_muonEfficiencySFTool.setTypeAndName("CP::MuonEfficiencyScaleFactors/"+toolName);
838 ATH_CHECK( m_muonEfficiencySFTool.setProperty("WorkingPoint", muQual) );
839 ATH_CHECK( m_muonEfficiencySFTool.setProperty("CalibrationRelease", m_isRun3 ? "251211_Preliminary_r24run3" : MuonCP_Run2_TightFix) );
840 ATH_CHECK( m_muonEfficiencySFTool.setProperty("OutputLevel", this->msg().level()) );
841 ATH_CHECK( m_muonEfficiencySFTool.retrieve() );
842 } else if (m_muonEfficiencySFTool.isUserConfigured()) ATH_CHECK( m_muonEfficiencySFTool.retrieve() );
843
844
845 if (!m_muonEfficiencyBMHighPtSFTool.isUserConfigured() && !isData()){
846 toolName = "MuonEfficiencyScaleFactorsBMHighPt_" + muQual;
847 m_muonEfficiencyBMHighPtSFTool.setTypeAndName("CP::MuonEfficiencyScaleFactors/"+toolName);
848 ATH_CHECK( m_muonEfficiencyBMHighPtSFTool.setProperty("WorkingPoint", "BadMuonVeto_HighPt") );
849 ATH_CHECK( m_muonEfficiencyBMHighPtSFTool.setProperty("CalibrationRelease", m_isRun3? "220817_Preliminary_r22run3":"230213_Preliminary_r22run2_loosefix") ); //BadMuonVeto_HighPt currently not available for 240711_Preliminary_r24run3
850 ATH_CHECK( m_muonEfficiencyBMHighPtSFTool.setProperty("OutputLevel", this->msg().level()) );
852 } else if (m_muonEfficiencyBMHighPtSFTool.isUserConfigured()) ATH_CHECK( m_muonEfficiencyBMHighPtSFTool.retrieve() );
853
854
855 if (m_doTTVAsf && m_mud0sig<0 && m_muz0<0){
856 ATH_MSG_WARNING("Requested TTVA SFs without d0sig and z0 cuts. Disabling scale factors as they will not make sense.");
857 m_doTTVAsf=false;
858 }
859
860 if (m_doTTVAsf && !m_muonTTVAEfficiencySFTool.isUserConfigured() && !isData()) {
861 toolName = "MuonTTVAEfficiencyScaleFactors";
862 m_muonTTVAEfficiencySFTool.setTypeAndName("CP::MuonEfficiencyScaleFactors/"+toolName);
863 ATH_CHECK( m_muonTTVAEfficiencySFTool.setProperty("WorkingPoint", "TTVA") );
864 ATH_CHECK( m_muonTTVAEfficiencySFTool.setProperty("CalibrationRelease", m_isRun3? "251211_Preliminary_r24run3":"230213_Preliminary_r22run2_loosefix") );
865 ATH_CHECK( m_muonTTVAEfficiencySFTool.setProperty("OutputLevel", this->msg().level()) );
867 } else if (m_muonTTVAEfficiencySFTool.isUserConfigured()) ATH_CHECK( m_muonTTVAEfficiencySFTool.retrieve() );
868
869
870
872 // Initialise muon isolation tool
873 if (!m_muonIsolationSFTool.isUserConfigured() && !m_muIso_WP.empty() && !isData()) {
874 toolName = "MuonIsolationScaleFactors_" + m_muIso_WP;
875
876 std::string tmp_muIso_WP = m_muIso_WP;
877 if ( !check_isOption(m_muIso_WP, m_mu_iso_support) ) { //check if supported
878 ATH_MSG_WARNING("Your selected muon Iso WP ("
879 << m_muIso_WP
880 << ") does not have SFs defined. Will try to find an appropriate fall-back.");
881 if (m_mu_iso_fallback.count(m_muIso_WP) > 0){
882 tmp_muIso_WP = m_mu_iso_fallback[m_muIso_WP];
883 ATH_MSG_WARNING("Your selected muon Iso WP ("
884 << m_muIso_WP
885 << " is not supported, and does not have SFs available. Falling back to "
886 << tmp_muIso_WP
887 << " for SF determination.");
888 } else {
889 ATH_MSG_ERROR("*** The muon isolation WP you selected (" << m_muIso_WP << ") is not currentely supported, and no known fall-back option for SFs exists. Sorry! ***");
890 return StatusCode::FAILURE;
891 }
892 }
893
894 m_muonIsolationSFTool.setTypeAndName("CP::MuonEfficiencyScaleFactors/"+toolName);
895 ATH_CHECK( m_muonIsolationSFTool.setProperty("WorkingPoint", tmp_muIso_WP + "Iso") );
896 ATH_CHECK( m_muonIsolationSFTool.setProperty("CalibrationRelease", m_isRun3? "251211_Preliminary_r24run3":"230213_Preliminary_r22run2_loosefix") );
897 ATH_CHECK( m_muonIsolationSFTool.setProperty("OutputLevel", this->msg().level()) );
898 ATH_CHECK( m_muonIsolationSFTool.retrieve() );
899
900 } else if (m_muonIsolationSFTool.isUserConfigured()) ATH_CHECK( m_muonIsolationSFTool.retrieve() );
901
902
903 if (!m_muonHighPtIsolationSFTool.isUserConfigured() && !m_muIsoHighPt_WP.empty() && !isData()) {
904 toolName = "MuonHighPtIsolationScaleFactors_" + m_muIsoHighPt_WP;
905
906 std::string tmp_muIsoHighPt_WP = m_muIsoHighPt_WP;
907 if ( !check_isOption(m_muIsoHighPt_WP, m_mu_iso_support) ) { //check if supported
908 ATH_MSG_WARNING("Your selected muon high-pt Iso WP ("
910 << ") does not have SFs defined. Will try to find an appropriate fall-back.");
911 if (m_mu_iso_fallback.count(m_muIsoHighPt_WP) > 0){
912 tmp_muIsoHighPt_WP = m_mu_iso_fallback[m_muIsoHighPt_WP];
913 ATH_MSG_WARNING("Your selected muon high-pt Iso WP ("
915 << " is not supported, and does not have SFs available. Falling back to "
916 << tmp_muIsoHighPt_WP
917 << " for SF determination.");
918 } else {
919 ATH_MSG_ERROR("*** The muon isolation WP you selected (" << m_muIsoHighPt_WP << ") is not currentely supported, and no known fall-back option for SFs exists. Sorry! ***");
920 return StatusCode::FAILURE;
921 }
922 }
923
924 m_muonHighPtIsolationSFTool.setTypeAndName("CP::MuonEfficiencyScaleFactors/"+toolName);
925 // Use for the low-pt WP a dedicated set of isolation scale-factors having an extra uncertainty in place
926 ATH_CHECK( m_muonHighPtIsolationSFTool.setProperty("WorkingPoint", tmp_muIsoHighPt_WP + "Iso") );
927 ATH_CHECK( m_muonHighPtIsolationSFTool.setProperty("CalibrationRelease", m_isRun3? "251211_Preliminary_r24run3":"230213_Preliminary_r22run2_loosefix") );
928 ATH_CHECK( m_muonHighPtIsolationSFTool.setProperty("OutputLevel", this->msg().level()) );
930
931 } else if (m_muonHighPtIsolationSFTool.isUserConfigured()) ATH_CHECK( m_muonHighPtIsolationSFTool.retrieve() );
932
933
935 // Initialise muon trigger scale factor tools
936
937 if (!m_muonTriggerSFTool.isUserConfigured() && !isData()) {
938 toolName = "MuonTriggerScaleFactors_" + muQual;
939 m_muonTriggerSFTool.setTypeAndName("CP::MuonTriggerScaleFactors/"+toolName);
940 if ( muQual=="LowPt" ) {
941 ATH_MSG_WARNING("You're using the LowPt muon selection, which is not supported yet in terms of muon trigger scale facorts. TEMPORAIRLY configuring the muonTriggerSFTool for Medium muons. Beware!");
942 ATH_CHECK( m_muonTriggerSFTool.setProperty("MuonQuality", "Medium" ) );
943 }
944 else ATH_CHECK( m_muonTriggerSFTool.setProperty("MuonQuality", muQual) );
945 //ATH_CHECK( m_muonTriggerSFTool.setProperty("Isolation", m_muIso_WP)); This property has been depreacted long time ago
946 ATH_CHECK( m_muonTriggerSFTool.setProperty("AllowZeroSF", true) );
947 ATH_CHECK( m_muonTriggerSFTool.setProperty("OutputLevel", this->msg().level()) );
948 if(!m_muTriggerSFCalibRelease.empty() ) ATH_CHECK( m_muonTriggerSFTool.setProperty("CalibrationRelease",m_muTriggerSFCalibRelease) );
950 if(!m_mcCampaign.empty()) ATH_CHECK( m_muonTriggerSFTool.setProperty("Campaign", m_mcCampaign) ); // if not set, loads all !86245
951 ATH_CHECK( m_muonTriggerSFTool.retrieve() );
952 m_muonTrigSFTools.push_back(m_muonTriggerSFTool.getHandle());
953 } else if (m_muonTriggerSFTool.isUserConfigured()) {
954 ATH_CHECK( m_muonTriggerSFTool.retrieve() );
955 m_muonTrigSFTools.push_back(m_muonTriggerSFTool.getHandle());
956 }
957 }
958
959 if (m_slices["ele"]) {
960 // /////////////////////////////////////////////////////////////////////////////////////////
961 // Initialise electron selector tools
962
963 // Signal Electrons
964 if (!m_elecSelLikelihood.isUserConfigured()) {
965 toolName = "EleSelLikelihood_" + m_eleId;
966
967 if (m_eleId.find("DNN") != std::string::npos) {
968 m_elecSelLikelihood.setTypeAndName("AsgElectronSelectorTool/"+toolName);
969 }
970 else {
971 m_elecSelLikelihood.setTypeAndName("AsgElectronLikelihoodTool/"+toolName);
972 }
973
974 if (! m_eleConfig.empty() ){
975 ATH_MSG_INFO("Overriding specified Ele.Id working point in favour of configuration file");
976 ATH_CHECK( m_elecSelLikelihood.setProperty("ConfigFile", m_eleConfig) );
977 } else if ( !check_isOption(m_eleId, m_el_id_support) ) { //check if supported
978 ATH_MSG_ERROR("Invalid electron ID selected: " << m_eleId);
979 return StatusCode::FAILURE;
980 }
981 else if (m_eleId == "VeryLooseLLH" || m_eleId == "LooseLLH") {
982 ATH_MSG_WARNING(" ****************************************************************************");
983 ATH_MSG_WARNING(" CAUTION: Setting " << m_eleId << " as signal electron ID");
984 ATH_MSG_WARNING(" These may be used for loose electron CRs but no scale factors are provided.");
985 ATH_MSG_WARNING(" ****************************************************************************");
986 ATH_CHECK( m_elecSelLikelihood.setProperty("WorkingPoint", EG_WP(m_eleId) ));
987 } else {
988 ATH_CHECK( m_elecSelLikelihood.setProperty("WorkingPoint", EG_WP(m_eleId) ));
989 }
990
991 ATH_CHECK( m_elecSelLikelihood.setProperty("OutputLevel", this->msg().level()) );
992 ATH_CHECK( m_elecSelLikelihood.retrieve() );
993 } else ATH_CHECK( m_elecSelLikelihood.retrieve() );
994
995 // Baseline Electrons
996 if (!m_elecSelLikelihoodBaseline.isUserConfigured()) {
997 toolName = "EleSelLikelihoodBaseline_" + m_eleIdBaseline;
998
999 if (m_eleIdBaseline.find("DNN") != std::string::npos) {
1000 m_elecSelLikelihoodBaseline.setTypeAndName("AsgElectronSelectorTool/"+toolName);
1001 }
1002 else {
1003 m_elecSelLikelihoodBaseline.setTypeAndName("AsgElectronLikelihoodTool/"+toolName);
1004 }
1005
1006 if (! m_eleConfigBaseline.empty() ){
1007 ATH_MSG_INFO("Overriding specified EleBaseline.Id working point in favour of configuration file");
1008 ATH_CHECK( m_elecSelLikelihoodBaseline.setProperty("ConfigFile", m_eleConfigBaseline ));
1009 } else if ( !check_isOption(m_eleIdBaseline, m_el_id_support) ) { //check if supported
1010 ATH_MSG_ERROR("Invalid electron ID selected: " << m_eleIdBaseline);
1011 return StatusCode::FAILURE;
1012 } else {
1013 ATH_CHECK( m_elecSelLikelihoodBaseline.setProperty("WorkingPoint", EG_WP(m_eleIdBaseline)) );
1014 }
1015
1016 ATH_CHECK( m_elecSelLikelihoodBaseline.setProperty("OutputLevel", this->msg().level()) );
1018 } else ATH_CHECK( m_elecSelLikelihoodBaseline.retrieve() );
1019 }
1020
1022 // Initialise prompt/LRT electron OR tool
1023 if (!m_elecLRTORTool.isUserConfigured()) {
1024 toolName = "ElectronLRTOverlapRemovalTool";
1025 m_elecLRTORTool.setTypeAndName("CP::ElectronLRTOverlapRemovalTool/"+toolName);
1026 ATH_MSG_DEBUG("Setting ElectronLRTOverlapRemovalTool strategy to "<<m_eleLRT_strat);
1027 ATH_CHECK( m_elecLRTORTool.setProperty("overlapStrategy", m_eleLRT_strat) );
1028 ATH_CHECK( m_elecLRTORTool.retrieve() );
1029 } else ATH_CHECK( m_elecLRTORTool.retrieve() );
1030
1031 if (m_slices["pho"]) {
1032 // /////////////////////////////////////////////////////////////////////////////////////////
1033 // Initialise photon selector tools
1034
1035 if (!m_photonSelIsEM.isUserConfigured()) {
1036 toolName = "PhotonSelIsEM_" + m_photonId;
1037 m_photonSelIsEM.setTypeAndName("AsgPhotonIsEMSelector/"+toolName);
1038
1039 if (!check_isOption(m_photonId, m_ph_id_support)){ //check if supported
1040 ATH_MSG_ERROR("Invalid photon ID selected: " << m_photonId);
1041 return StatusCode::FAILURE;
1042 }
1043
1044 ATH_CHECK( m_photonSelIsEM.setProperty("WorkingPoint", m_photonId+"Photon") );
1045 ATH_CHECK( m_photonSelIsEM.setProperty("OutputLevel", this->msg().level()) );
1046 ATH_CHECK( m_photonSelIsEM.retrieve() );
1047 } else ATH_CHECK( m_photonSelIsEM.retrieve() );
1048
1049 if (!m_photonSelIsEMBaseline.isUserConfigured()) {
1050 toolName = "PhotonSelIsEMBaseline_" + m_photonIdBaseline;
1051 m_photonSelIsEMBaseline.setTypeAndName("AsgPhotonIsEMSelector/"+toolName);
1052
1053 if(!check_isOption(m_photonIdBaseline, m_ph_id_support)){ //check if supported
1054 ATH_MSG_ERROR("Invalid photon ID selected: " << m_photonIdBaseline);
1055 return StatusCode::FAILURE;
1056 }
1057
1058 ATH_CHECK( m_photonSelIsEMBaseline.setProperty("WorkingPoint", m_photonIdBaseline+"Photon") );
1059 ATH_CHECK( m_photonSelIsEMBaseline.setProperty("OutputLevel", this->msg().level()) );
1060 ATH_CHECK( m_photonSelIsEMBaseline.retrieve() );
1061 } else ATH_CHECK( m_photonSelIsEMBaseline.retrieve() );
1062 }
1063
1064 if (m_slices["ele"]||m_slices["pho"]) {
1066 // Initialise DeadHVCellRemovalTool
1067 // https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/EGammaIdentificationRun2#Removal_of_Electron_Photon_clust
1068
1069 ATH_MSG_DEBUG("Setup AsgDeadHVCellRemovalTool/deadHVTool");
1070 m_deadHVTool.setTypeAndName("AsgDeadHVCellRemovalTool/deadHVTool");
1071 ATH_CHECK(m_deadHVTool.retrieve());
1072 }
1073
1074 if (m_slices["ele"]) {
1076 // Initialise electron efficiency tool
1077
1079 if (!isData()) {
1080 if (isAtlfast()) data_type = PATCore::ParticleDataType::Fast;
1081 else data_type = PATCore::ParticleDataType::Full;
1082 ATH_MSG_DEBUG( "Setting data type to " << data_type);
1083 }
1084
1085 m_eleEffMapFilePathTriggerRun2 = "ElectronEfficiencyCorrection/2015_2018/rel21.2/Precision_Summer2020_v1/map4.txt";
1086 m_eleEffMapFilePathTriggerRun3 = "ElectronEfficiencyCorrection/2015_2025/rel22.2/2025_Run3_Consolidated_Recommendation_v4/map2.txt";
1087
1088 if(!m_isRun3) {
1089 ATH_MSG_INFO( "Running on Run2 samples; Using egamma SF tools from R21 map for trigger");
1091 } else {
1092 ATH_MSG_INFO( "Running on Run3 samples; Using different egamma SF tools map for trigger");
1094 }
1095
1096 toolName = "AsgElectronEfficiencyCorrectionTool_reco";
1097 CONFIG_EG_EFF_TOOL_KEY(m_elecEfficiencySFTool_reco, toolName, "RecoKey", "Reconstruction", m_eleEffMapFilePath);
1098
1099 //-- get KEYS supported by egamma SF tools
1100 std::vector<std::string> eSF_keys = getElSFkeys( m_eleEffMapFilePath);
1101 std::vector<std::string> eSF_keys_trigger = getElSFkeys( m_isRun3? m_eleEffMapFilePathTriggerRun3 : m_eleEffMapFilePathTriggerRun2);
1102
1103 if (m_eleId.find("NoPix") != std::string::npos || m_eleId == "VeryLooseLLH" || m_eleId == "LooseLLH" || m_eleId == "Medium") {
1104 ATH_MSG_WARNING("Not configuring electron ID and trigger scale factors for " << m_eleId);
1105 }
1106 else {
1107 // This needs to be formatted for the scale factors: no _Rel20, no LH label, etc.
1108 std::string eleId = TString(m_eleId).ReplaceAll("AndBLayer", "BLayer").ReplaceAll("LLH", "LH").Data();
1109
1110 if (m_eleId.find("DNN") != std::string::npos) {
1111 eleId = TString(eleId).ReplaceAll("DNNnoCF", "").ReplaceAll("DNN", "").ReplaceAll("Loose", "LooseBLayer").Data();
1112 ATH_MSG_WARNING("Electron DNN ID working point " << m_eleId << " doesn't have SFs yet, fall back to " << eleId);
1113 }
1114
1115 // electron id
1116 toolName = "AsgElectronEfficiencyCorrectionTool_id_" + m_eleId;
1118
1119 // override map file use if correction file list is set for WP
1120 std::map<std::string,std::string> corrFNList;
1121 if ( !m_EG_corrFNList.empty() ) {
1122 for ( const auto& WP_fname : split( m_EG_corrFNList, "," ) ) {
1123 std::string WP = WP_fname.substr(0,WP_fname.find(":"));
1124 std::string fname = WP_fname.substr(WP_fname.find(":")+1);
1125 corrFNList[WP] = fname;
1126 ATH_MSG_WARNING( "Correction file list defined for WP " << WP << ": " << fname << "." );
1127 ATH_MSG_WARNING( "Will use correction file rather than central map file." );
1128 }
1129 }
1130
1131 // electron iso
1132 std::string EleIso("");
1133 if (std::find(eSF_keys.begin(), eSF_keys.end(), eleId+"_"+m_eleIso_WP) != eSF_keys.end()){
1134 EleIso = m_eleIso_WP;
1135 } else if (std::find(eSF_keys.begin(), eSF_keys.end(), eleId+"_"+m_el_iso_fallback[m_eleIso_WP]) != eSF_keys.end()){
1136 //--- Check to see if the only issue is an unknown isolation working point
1138 ATH_MSG_WARNING("(AsgElectronEfficiencyCorrectionTool_iso_*) Your selected electron Iso WP ("
1139 << m_eleIso_WP
1140 << ") does not have iso SFs defined. Falling back to "
1142 << " for SF calculations");
1143 }
1144 else{
1145 ATH_MSG_ERROR("*** THE ELECTRON ISOLATION SF YOU SELECTED (" << m_eleIso_WP << ") GOT NO SUPPORT ***");
1146 return StatusCode::FAILURE;
1147 }
1148
1149 toolName = "AsgElectronEfficiencyCorrectionTool_iso_" + m_eleId + EleIso;
1150
1151 // if running with correction file list
1152 if ( (!m_EG_corrFNList.empty()) && corrFNList.find(EleIso)!=corrFNList.end() ) { // overriding central map file
1153 CONFIG_EG_EFF_TOOL( m_elecEfficiencySFTool_iso, toolName, corrFNList[EleIso] );
1154 }
1155 // can't do the iso tool via the macro, it needs two properties set
1156 else { // default: use map file
1157 if ( !m_elecEfficiencySFTool_iso.isUserConfigured() ) {
1158 if ( !check_isOption(EleIso, m_el_iso_support) ) { //check if supported
1159 ATH_MSG_WARNING( "(" << toolName << ") Your electron Iso WP: " << EleIso<< " is no longer supported. This will almost certainly cause a crash now.");
1160 }
1161
1162 m_elecEfficiencySFTool_iso.setTypeAndName("CP::AsgElectronEfficiencyCorrectionTool/"+toolName);
1163
1164 if ( m_EG_corrFNList.empty() ) {
1165 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("MapFilePath", m_eleEffMapFilePath) );
1166 } else {
1167 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("CorrectionFileNameList", corrFNList) );
1168 }
1169 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("IdKey", eleId) );
1170 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("IsoKey", EleIso) );
1171 if (!isData() && ((EleIso.find("TightTrackOnly_VarRad")!=std::string::npos)||
1172 (EleIso.find("TightTrackOnly_FixedRad")!=std::string::npos)||
1173 (EleIso.find("Tight_VarRad")!=std::string::npos)||
1174 (EleIso.find("Loose_VarRad")!=std::string::npos))) {
1175 if (isAtlfast()) ATH_MSG_WARNING("(CP::AsgElectronEfficiencyCorrectionTool/"+toolName+"). Your selected electron Iso WP (" + EleIso + ") don't have AFII SF. Falling back to FullSim");
1176 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("ForceDataType", static_cast<int>(PATCore::ParticleDataType::Full)));
1177 }
1178 else if (!isData()){
1179 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("ForceDataType", static_cast<int>(data_type)));
1180 }
1181 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("CorrelationModel", m_EG_corrModel) );
1182 ATH_CHECK( m_elecEfficiencySFTool_iso.setProperty("OutputLevel", this->msg().level()) );
1183 ATH_CHECK( m_elecEfficiencySFTool_iso.initialize() );
1184 } else ATH_CHECK( m_elecEfficiencySFTool_iso.initialize() );
1185 }
1186
1187 // electron iso high-pt
1188 std::string EleIsohighPt("");
1189 if (std::find(eSF_keys.begin(), eSF_keys.end(), eleId+"_"+m_eleIsoHighPt_WP) != eSF_keys.end()){
1190 EleIsohighPt = m_eleIsoHighPt_WP;
1191 } else if (std::find(eSF_keys.begin(), eSF_keys.end(), eleId+"_"+m_el_iso_fallback[m_eleIsoHighPt_WP]) != eSF_keys.end()){
1192 //--- Check to see if the only issue is an unknown isolation working point
1193 EleIsohighPt = m_el_iso_fallback[m_eleIsoHighPt_WP];
1194 ATH_MSG_WARNING("(CP::AsgElectronEfficiencyCorrectionTool_iso_*) Your selected high-pT electron Iso WP ("
1196 << ") does not have iso SFs defined. Falling back to "
1198 << " for SF calculations");
1199 }
1200 else{
1201 ATH_MSG_ERROR("*** THE HIGH PT ELECTRON ISOLATION SF YOU SELECTED (" << m_eleIsoHighPt_WP << ") GOT NO SUPPORT");
1202 return StatusCode::FAILURE;
1203 }
1204
1205 toolName = "AsgElectronEfficiencyCorrectionTool_isoHigPt_" + m_eleId + EleIsohighPt;
1206
1207 // if running with correction file list
1208 if ( (!m_EG_corrFNList.empty()) && corrFNList.find(EleIsohighPt)!=corrFNList.end() ) { // overriding central map file
1209 CONFIG_EG_EFF_TOOL( m_elecEfficiencySFTool_isoHighPt, toolName, corrFNList[EleIsohighPt] );
1210 }
1211 // can't do the iso tool via the macro, it needs two properties set
1212 else { // default: use map file
1213 if ( !m_elecEfficiencySFTool_isoHighPt.isUserConfigured() ) {
1214
1215 if ( !check_isOption(EleIsohighPt, m_el_iso_support) ) { //check if supported
1216 ATH_MSG_WARNING( "(" << toolName << ") Your electron high-pt Iso WP: " << EleIsohighPt << " is no longer supported. This will almost certainly cause a crash now.");
1217 }
1218
1219 m_elecEfficiencySFTool_isoHighPt.setTypeAndName("CP::AsgElectronEfficiencyCorrectionTool/"+toolName);
1220
1221 ATH_CHECK( m_elecEfficiencySFTool_isoHighPt.setProperty("MapFilePath", m_eleEffMapFilePath) );
1222 ATH_CHECK( m_elecEfficiencySFTool_isoHighPt.setProperty("IdKey", eleId) );
1223 ATH_CHECK( m_elecEfficiencySFTool_isoHighPt.setProperty("IsoKey", EleIsohighPt) );
1224 if (!isData()) {
1225 ATH_CHECK (m_elecEfficiencySFTool_isoHighPt.setProperty("ForceDataType", (int) data_type) );
1226 }
1227 ATH_CHECK( m_elecEfficiencySFTool_isoHighPt.setProperty("CorrelationModel", m_EG_corrModel) );
1228 ATH_CHECK( m_elecEfficiencySFTool_isoHighPt.setProperty("OutputLevel", this->msg().level()) );
1230 } else ATH_CHECK( m_elecEfficiencySFTool_isoHighPt.initialize() );
1231 }
1232
1233 // electron triggers - first SFs (but we need to massage the id string since all combinations are not supported)
1234
1235 //single lepton
1236
1237 if(m_isRun3 && eleId.find("LooseBLayer") != std::string::npos) ATH_MSG_WARNING("Replacing 'LooseBLayer' with 'Loose' for Electron ID while configuring single-ele trigger SF using: " << m_eleEffMapFilePathTriggerRun3);
1238 // This needs to be formatted for the trigger scale factors: no LH label
1239 std::string triggerEleID = m_isRun3? TString(eleId).ReplaceAll("LooseBLayer", "Loose").ReplaceAll("LH", "").Data() : TString(eleId).ReplaceAll("LH", "").Data();
1240 std::string triggerEleIso= m_eleIso_WP;
1241
1242 // This is an hack to work with ElectronEfficiencyCorrection/2015_2025/rel22.2/2022_Summer_Prerecom_v1/map4.txt to allow
1243
1245 bool pass_isRun3TrigSFFallback = true;
1246 if (triggerEleID.find("Medium") != std::string::npos && triggerEleIso.find("Loose") != std::string::npos) {triggerEleID = "LooseBLayer";}
1247 else if (triggerEleID.find("Medium") != std::string::npos && triggerEleIso.find("Tight") != std::string::npos) {triggerEleID = "Tight"; triggerEleIso = "Tight_VarRad";}
1248 else if (triggerEleID.find("Medium") != std::string::npos && triggerEleIso.find("HighPtCaloOnly") != std::string::npos) {triggerEleID = "Tight"; triggerEleIso = "Tight_VarRad";}
1249 else if (triggerEleID.find("Tight") != std::string::npos && triggerEleIso.find("Loose") != std::string::npos) {triggerEleID = "LooseBLayer";}
1250 else if (triggerEleID.find("Tight") != std::string::npos && triggerEleIso.find("Tight") != std::string::npos) {triggerEleIso= "Tight_VarRad";}
1251 else if (triggerEleID.find("Tight") != std::string::npos && triggerEleIso.find("HighPtCaloOnly") != std::string::npos) {triggerEleID = "Tight"; triggerEleIso = "Tight_VarRad";}
1252 else if (triggerEleID.find("Loose") != std::string::npos && triggerEleIso.find("Tight") != std::string::npos) {triggerEleID = "LooseBLayer"; triggerEleIso = "Loose_VarRad";}
1253 else if (triggerEleID.find("Loose") != std::string::npos && triggerEleIso.find("HighPtCaloOnly") != std::string::npos) {triggerEleID = "LooseBLayer"; triggerEleIso = "Loose_VarRad";}
1254 else {pass_isRun3TrigSFFallback=false;}
1255 if(pass_isRun3TrigSFFallback){
1256 ATH_MSG_INFO(" ************** This is only for testing/studying purpose! ************** ");
1257 ATH_MSG_INFO(" ************** For official recommendation, please get in contact with the SUSY Bkg Forum ************** ");
1258 ATH_MSG_INFO("In the current map ("<<m_eleEffMapFilePathTriggerRun3<<"), the only supported Electron ID working-points supported for Electron Trigger Scale Factor are 'Loose_Loose_VarRad' and 'Tight_Tight_VarRad' ");
1259 ATH_MSG_INFO("Only for single-lepton trigger scale factor, fall back to Electron ID: -> "<< triggerEleID << " with Isolation: " << triggerEleIso);
1260 }
1261 }
1262
1263 // The L1 seed changed from 2023 and beyond, so we need to adjust the trigger key accordingly, the SF are now derived by year so we need to change the year in the key as well.
1264
1265 if(m_isRun3){
1266 // Find year positions (or npos if not present)
1267 size_t p22 = m_electronTriggerSFStringSingle.find("2022");
1268 size_t p23 = m_electronTriggerSFStringSingle.find("2023");
1269 size_t p24 = m_electronTriggerSFStringSingle.find("2024");
1270
1271 auto next_pos = [&](size_t self) {
1272 size_t next = std::string::npos;
1273
1274 if (self == p22) {
1275 if (p23 > self && p23 < next) next = p23;
1276 if (p24 > self && p24 < next) next = p24;
1277 }
1278 else if (self == p23) {
1279 if (p22 > self && p22 < next) next = p22;
1280 if (p24 > self && p24 < next) next = p24;
1281 }
1282 else if (self == p24) {
1283 if (p22 > self && p22 < next) next = p22;
1284 if (p23 > self && p23 < next) next = p23;
1285 }
1286
1287 return next;
1288 };
1289 std::string SFStringSingle22="";
1290 std::string SFStringSingle23="";
1291 std::string SFStringSingle24="";
1292
1293 // Extract 2022,2023,2025 block
1294 if (p22 != std::string::npos) {size_t end = next_pos(p22); SFStringSingle22 = m_electronTriggerSFStringSingle.substr(p22, end - p22);}
1295 if (p23 != std::string::npos) {size_t end = next_pos(p23); SFStringSingle23 = m_electronTriggerSFStringSingle.substr(p23, end - p23);}
1296 if (p24 != std::string::npos) {size_t end = next_pos(p24); SFStringSingle24 = m_electronTriggerSFStringSingle.substr(p24, end - p24);}
1297
1298 // Remove trailing underscores from tokens if present
1299 std::string* toks[] = { &SFStringSingle22, &SFStringSingle23, &SFStringSingle24 };
1300 for (auto t : toks) {
1301 while (!t->empty() && t->back() == '_') t->pop_back();
1302 }
1303
1304 if(m_mcCampaign == "mc23a") m_electronTriggerSFStringSingle = SFStringSingle22;
1305 else if(m_mcCampaign == "mc23d") m_electronTriggerSFStringSingle = SFStringSingle23;
1306 else if(m_mcCampaign == "mc23e") m_electronTriggerSFStringSingle = SFStringSingle24;
1307 else {
1308 ATH_MSG_WARNING("Unknown or unsupported mcCampaign for Run 3: " << m_mcCampaign << ". Please contact the SUSY Bkg Forum for assistance.");
1309 ATH_MSG_WARNING("Falling back to 2024 trigger SFs for single-electron triggers.");
1310 m_electronTriggerSFStringSingle = SFStringSingle24;
1311 }
1312 }
1313
1314
1315 ATH_MSG_INFO("eSF_keys: " << m_electronTriggerSFStringSingle<< "_"<<triggerEleID<<"_"<<triggerEleIso);
1316
1317 if (std::find(eSF_keys_trigger.begin(), eSF_keys_trigger.end(), m_electronTriggerSFStringSingle+"_"+triggerEleID+"_"+triggerEleIso) != eSF_keys_trigger.end()){
1318 triggerEleIso = m_eleIso_WP;
1319 } else if (std::find(eSF_keys_trigger.begin(), eSF_keys_trigger.end(), m_electronTriggerSFStringSingle+"_"+triggerEleID+"_"+m_el_iso_fallback[triggerEleIso]) != eSF_keys_trigger.end()){
1320 //--- Check to see if the only issue is an unknown isolation working point
1321 triggerEleIso = m_el_iso_fallback[triggerEleIso];
1322 ATH_MSG_WARNING("(AsgElectronEfficiencyCorrectionTool_trig_singleLep_*) Your selected electron Iso WP ("
1323 << m_eleIso_WP
1324 << ") does not have trigger SFs defined. Falling back to "
1325 << triggerEleIso
1326 << " for SF calculations");
1327 }
1328 else{
1329 ATH_MSG_ERROR("*** THE SINGLE ELECTRON TRIGGER SF YOU SELECTED (" << m_electronTriggerSFStringSingle << ") GOT NO SUPPORT FOR YOUR ID+ISO WPs (" << m_eleId << "+" << m_eleIso_WP << ") ***");
1330 return StatusCode::FAILURE;
1331 }
1332
1333 toolName = "AsgElectronEfficiencyCorrectionTool_trig_singleLep_" + triggerEleID;
1334 if ( !m_elecEfficiencySFTool_trig_singleLep.isUserConfigured() ) {
1335 m_elecEfficiencySFTool_trig_singleLep.setTypeAndName("CP::AsgElectronEfficiencyCorrectionTool/"+toolName);
1338 ATH_CHECK( m_elecEfficiencySFTool_trig_singleLep.setProperty("IdKey", triggerEleID) );
1339 ATH_CHECK( m_elecEfficiencySFTool_trig_singleLep.setProperty("IsoKey", triggerEleIso) );
1340 ATH_CHECK( m_elecEfficiencySFTool_trig_singleLep.setProperty("CorrelationModel", m_EG_corrModel) );
1341 if (!isData()) {
1342 ATH_CHECK( m_elecEfficiencySFTool_trig_singleLep.setProperty("ForceDataType", (int) (data_type==PATCore::ParticleDataType::Fast)? PATCore::ParticleDataType::Full : data_type) );
1343 }
1344 ATH_CHECK( m_elecEfficiencySFTool_trig_singleLep.setProperty("OutputLevel", this->msg().level()) );
1347
1348
1349 toolName = "AsgElectronEfficiencyCorrectionTool_trigEff_singleLep_" + triggerEleID;
1350 if ( !m_elecEfficiencySFTool_trigEff_singleLep.isUserConfigured() ) {
1351 m_elecEfficiencySFTool_trigEff_singleLep.setTypeAndName("CP::AsgElectronEfficiencyCorrectionTool/"+toolName);
1354 ATH_CHECK( m_elecEfficiencySFTool_trigEff_singleLep.setProperty("IdKey", triggerEleID) );
1355 ATH_CHECK( m_elecEfficiencySFTool_trigEff_singleLep.setProperty("IsoKey", triggerEleIso) );
1356 ATH_CHECK( m_elecEfficiencySFTool_trigEff_singleLep.setProperty("CorrelationModel", m_EG_corrModel) );
1357 if (!isData()) {
1358 ATH_CHECK( m_elecEfficiencySFTool_trigEff_singleLep.setProperty("ForceDataType", (int) (data_type==PATCore::ParticleDataType::Fast)? PATCore::ParticleDataType::Full : data_type) );
1359 }
1360 ATH_CHECK( m_elecEfficiencySFTool_trigEff_singleLep.setProperty("OutputLevel", this->msg().level()) );
1363
1364 if (!m_isRun3){
1365 //mixed-leptons
1366 std::map<std::string,std::string> electronTriggerSFMapMixedLepton {
1367 // legs, Trigger keys,
1368 {"e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose,e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0", m_electronTriggerSFStringSingle},
1369 {"e24_lhvloose_nod0_L1EM20VH,e17_lhvloose_nod0,e12_lhloose_L1EM10VH","DI_E_2015_e12_lhloose_L1EM10VH_2016_e17_lhvloose_nod0_2017_2018_e24_lhvloose_nod0_L1EM20VH"},
1370 {"e26_lhmedium_nod0_L1EM22VHI,e26_lhmedium_nod0","MULTI_L_2015_e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose_2016_e26_lhmedium_nod0_L1EM22VHI_2017_2018_e26_lhmedium_nod0"},
1371 {"e17_lhloose,e17_lhloose_nod0","MULTI_L_2015_e17_lhloose_2016_2018_e17_lhloose_nod0"},
1372 {"e12_lhloose,e12_lhloose_nod0","MULTI_L_2015_e12_lhloose_2016_2018_e12_lhloose_nod0"},
1373 {"e7_lhmedium,e7_lhmedium_nod0","MULTI_L_2015_e7_lhmedium_2016_2018_e7_lhmedium_nod0"},
1374 {"e9_lhloose,e9_lhloose_nod0,e12_lhvloose_nod0_L1EM10VH","TRI_E_2015_e9_lhloose_2016_e9_lhloose_nod0_2017_2018_e12_lhvloose_nod0_L1EM10VH"}
1375
1376 };
1377
1378 // 2e17 trigger is used in 2017 or 2018?
1380 if (triglist_2017to2018.find("2e17_lhvloose_nod0_L12EM15VHI") != std::string::npos) {
1381 electronTriggerSFMapMixedLepton["e17_lhvloose_nod0_L1EM15VHI"] = "DI_E_2015_e12_lhloose_L1EM10VH_2016_e17_lhvloose_nod0_2017_2018_e17_lhvloose_nod0_L1EM15VHI";
1382 }
1383
1384 std::string triggerMixedEleIso("");
1385
1386 for(auto const& item : electronTriggerSFMapMixedLepton){
1387
1388 if (std::find(eSF_keys_trigger.begin(), eSF_keys_trigger.end(), item.second+"_"+triggerEleID+"_"+m_eleIso_WP) != eSF_keys_trigger.end()){
1389 triggerMixedEleIso = m_eleIso_WP;
1390 } else if (std::find(eSF_keys_trigger.begin(), eSF_keys_trigger.end(), item.second+"_"+triggerEleID+"_"+m_el_iso_fallback[m_eleIso_WP]) != eSF_keys_trigger.end()){
1391 //--- Check to see if the only issue is an unknown isolation working point
1392 triggerMixedEleIso = m_el_iso_fallback[m_eleIso_WP];
1393 ATH_MSG_WARNING("(AsgElectronEfficiencyCorrectionTool_trig_mixLep_*) Your selected electron Iso WP ("
1394 << m_eleIso_WP
1395 << ") does not have trigger SFs defined. Falling back to "
1396 << triggerMixedEleIso
1397 << " for SF calculations");
1398 } else {
1399 ATH_MSG_ERROR("*** THE MIXED ELECTRON TRIGGER SF YOU SELECTED (" << item.second << ") GOT NO SUPPORT FOR YOUR ID+ISO WPs (" << m_eleId << "+" << m_eleIso_WP << "). The fallback options failed as well sorry! ***");
1400 return StatusCode::FAILURE;
1401 }
1402
1403 ATH_MSG_VERBOSE ("Selected WP: " << item.second << "_" << triggerEleID << "_" << triggerMixedEleIso);
1404
1405 toolName = "AsgElectronEfficiencyCorrectionTool_trig_mixLep_" + (item.first).substr(0,8) + m_eleId;
1406 auto t_sf = m_elecEfficiencySFTool_trig_mixLep.emplace(m_elecEfficiencySFTool_trig_mixLep.end(), "CP::AsgElectronEfficiencyCorrectionTool/"+toolName);
1408 ATH_CHECK( t_sf->setProperty("TriggerKey", item.second) );
1409 ATH_CHECK( t_sf->setProperty("IdKey", triggerEleID) );
1410 ATH_CHECK( t_sf->setProperty("IsoKey", triggerMixedEleIso) );
1411 ATH_CHECK( t_sf->setProperty("CorrelationModel", m_EG_corrModel) );
1412 if (!isData()) {
1413 ATH_CHECK( t_sf->setProperty("ForceDataType", (int) (data_type==PATCore::ParticleDataType::Fast)? PATCore::ParticleDataType::Full : data_type) );
1414 }
1415 ATH_CHECK( t_sf->setProperty("OutputLevel", this->msg().level()) );
1416 ATH_CHECK( t_sf->initialize() );
1417 m_elecTrigSFTools.push_back(t_sf->getHandle());
1418 #ifndef XAOD_STANDALONE
1419 m_legsPerTool[toolName] = item.first;
1420 #else
1421 m_legsPerTool["ToolSvc."+toolName] = item.first;
1422 #endif
1423
1424 toolName = "AsgElectronEfficiencyCorrectionTool_trigEff_mixLep_" + (item.first).substr(0,8) + m_eleId;
1425 auto t_eff = m_elecEfficiencySFTool_trigEff_mixLep.emplace(m_elecEfficiencySFTool_trigEff_mixLep.end(), "CP::AsgElectronEfficiencyCorrectionTool/"+toolName);
1427 ATH_CHECK( t_eff->setProperty("TriggerKey", "Eff_"+item.second) );
1428 ATH_CHECK( t_eff->setProperty("IdKey", triggerEleID) );
1429 ATH_CHECK( t_eff->setProperty("IsoKey", triggerMixedEleIso) );
1430 ATH_CHECK( t_eff->setProperty("CorrelationModel", m_EG_corrModel) );
1431 if (!isData()) {
1432 ATH_CHECK( t_eff->setProperty("ForceDataType", (int) (data_type==PATCore::ParticleDataType::Fast)? PATCore::ParticleDataType::Full : data_type) );
1433 }
1434 ATH_CHECK( t_eff->setProperty("OutputLevel", this->msg().level()) );
1435 ATH_CHECK( t_eff->initialize() );
1436 m_elecTrigEffTools.push_back(t_eff->getHandle());
1437 #ifndef XAOD_STANDALONE
1438 m_legsPerTool[toolName] = item.first;
1439 #else
1440 m_legsPerTool["ToolSvc."+toolName] = item.first;
1441 #endif
1442
1443 }
1444 }
1445 else ATH_MSG_WARNING("*** THE ELECTRON TRIGGER SF MIXED AND SF DILEP ARE CURRENTY NOT SUPPORTED IN RUN3 ***");
1446
1447 ATH_MSG_WARNING("*** THE ELECTRON CHARGE FLIP SF ARE CURRENTY NOT SUPPORTED ***");
1448 // all the iinitialisation of the related tools have been cleaned up
1449
1450 }
1451
1452 if (m_slices["pho"]) {
1453 // /////////////////////////////////////////////////////////////////////////////////////////
1454 // Initialise photon efficiency tool
1455
1456 if (!m_photonEfficiencySFTool.isUserConfigured() && !isData()) {
1457 m_photonEfficiencySFTool.setTypeAndName("CP::AsgPhotonEfficiencyCorrectionTool/AsgPhotonEfficiencyCorrectionTool_" + m_photonId);
1458
1459 if (m_photonId != "Tight" ) {
1460 ATH_MSG_WARNING( "No Photon efficiency available for " << m_photonId << ", using Tight instead..." );
1461 }
1462
1463 ATH_CHECK( m_photonEfficiencySFTool.setProperty("MapFilePath", "PhotonEfficiencyCorrection/2015_2025/rel22.2/2026_Run3Consolidated_Recommendation_v1/map0.txt") );
1464 ATH_CHECK( m_photonEfficiencySFTool.setProperty("ForceDataType", isAtlfast()? (m_isRun3? 1: 3) : 1) ); // Set data type: 1 for FULLSIM, 3 for AtlFast. For Run3 pre-rec only FullSim SFs are available
1465 ATH_CHECK( m_photonEfficiencySFTool.setProperty("OutputLevel", this->msg().level()) );
1466 ATH_CHECK( m_photonEfficiencySFTool.retrieve() );
1467 } else if (m_photonEfficiencySFTool.isUserConfigured()) ATH_CHECK( m_photonEfficiencySFTool.retrieve() );
1468
1469 if (!m_photonIsolationSFTool.isUserConfigured() && !isData()) {
1470 m_photonIsolationSFTool.setTypeAndName("CP::AsgPhotonEfficiencyCorrectionTool/AsgPhotonEfficiencyCorrectionTool_isol" + m_photonIso_WP);
1471
1472 if (m_photonIso_WP != "FixedCutTight" && m_photonIso_WP != "FixedCutLoose" && m_photonIso_WP != "TightCaloOnly") {
1473 ATH_MSG_WARNING( "No Photon efficiency available for " << m_photonIso_WP);
1474 }
1475
1476 ATH_CHECK( m_photonIsolationSFTool.setProperty("MapFilePath", m_isRun3 ? "PhotonEfficiencyCorrection/2015_2025/rel22.2/2022_Summer_Prerecom_v1/map1.txt" : "PhotonEfficiencyCorrection/2015_2025/rel22.2/2022_Summer_Prerecom_v1/map0.txt") );
1477 ATH_CHECK( m_photonIsolationSFTool.setProperty("IsoKey", m_photonIso_WP != "TightCaloOnly" ? m_photonIso_WP.substr(8) : m_photonIso_WP )); // Set isolation WP: Loose,Tight,TightCaloOnly
1478 ATH_CHECK( m_photonIsolationSFTool.setProperty("ForceDataType", 1) ); // Set data type: 1 for FULLSIM, 3 for AF2
1479 ATH_CHECK( m_photonIsolationSFTool.setProperty("OutputLevel", this->msg().level()) );
1480 ATH_CHECK( m_photonIsolationSFTool.retrieve() );
1481 } else if (m_photonEfficiencySFTool.isUserConfigured()) ATH_CHECK( m_photonIsolationSFTool.retrieve() );
1482
1483 // trigger scale factors
1484 if (!m_photonTriggerSFTool.isUserConfigured() && !isData()) {
1485 m_photonTriggerSFTool.setTypeAndName("CP::AsgPhotonEfficiencyCorrectionTool/AsgPhotonEfficiencyCorrectionTool_trig" + m_photonTriggerName);
1486
1487 // Fallback to TightCaloOnly if Tight is selected
1488 std::string photonIso_forTrigSF = m_photonIso_WP;
1489 if (m_photonIso_WP == "FixedCutTight") {
1490 ATH_MSG_WARNING( "No Photon trigger SF available for " << m_photonIso_WP << ", using TightCaloOnly instead... Use at your own risk" );
1491 photonIso_forTrigSF = "TightCaloOnly";
1492 } else { // isolation WP supported: Loose or TightCaloOnly, removing "FixedCut" suffix..
1493 photonIso_forTrigSF = TString(m_photonIso_WP).ReplaceAll("FixedCut","").Data();
1494 }
1495
1496 // "symmetric" diphoton triggers (year dependent)
1497 ATH_CHECK( m_photonTriggerSFTool.setProperty("MapFilePath", "PhotonEfficiencyCorrection/2015_2018/rel21.2/Summer2020_Rec_v1/map3.txt") );
1498 ATH_CHECK( m_photonTriggerSFTool.setProperty("IsoKey", photonIso_forTrigSF )); // Set isolation WP: Loose,TightCaloOnly
1499 ATH_CHECK( m_photonTriggerSFTool.setProperty("TriggerKey", m_photonTriggerName ));
1500 ATH_CHECK( m_photonTriggerSFTool.setProperty("ForceDataType", 1) ); // Set data type: 1 for FULLSIM, 3 for AF2
1501 ATH_CHECK( m_photonTriggerSFTool.setProperty("OutputLevel", this->msg().level()) );
1502 ATH_CHECK( m_photonTriggerSFTool.retrieve() );
1503
1504 // "asymmetric" diphoton triggers
1505 std::map<std::string,std::string> diphotonTriggerSFMapAsymmetric {
1506 // legs, Trigger keys,
1507 {"g25_loose,g25_medium_L1EM20VH", "DI_PH_2015_g25_loose_2016_g25_loose_2017_g25_medium_L1EM20VH_2018_g25_medium_L1EM20VH"},
1508 {"g35_loose,g35_medium_L1EM20VH", "DI_PH_2015_g35_loose_2016_g35_loose_2017_g35_medium_L1EM20VH_2018_g35_medium_L1EM20VH"},
1509 };
1510
1511 for(auto const& item : diphotonTriggerSFMapAsymmetric){
1512
1513 toolName = "AsgPhotonEfficiencyCorrectionTool_trigSF_asymm_diphoton_" + (item.first).substr(0,9) + photonIso_forTrigSF;
1514 auto ph_trigSF = m_photonEfficiencySFTool_trigSF_AsymDiphoton.emplace(m_photonEfficiencySFTool_trigSF_AsymDiphoton.end(), "CP::AsgPhotonEfficiencyCorrectionTool/"+toolName);
1515 ATH_CHECK( ph_trigSF->setProperty("MapFilePath", "PhotonEfficiencyCorrection/2015_2018/rel21.2/Summer2020_Rec_v1/map3.txt") );
1516 ATH_CHECK( ph_trigSF->setProperty("IsoKey", photonIso_forTrigSF) );
1517 ATH_CHECK( ph_trigSF->setProperty("TriggerKey", item.second) );
1518 ATH_CHECK( ph_trigSF->setProperty("ForceDataType", 1) ); // Set DataType: 1 for FullSim and 3 for AFII
1519 ATH_CHECK( ph_trigSF->setProperty("OutputLevel", this->msg().level()) );
1520 ATH_CHECK( ph_trigSF->initialize() );
1521 m_photonTrigSFTools.push_back(ph_trigSF->getHandle());
1522 #ifndef XAOD_STANDALONE
1523 m_legsPerTool_ph[toolName] = item.first;
1524 #else
1525 m_legsPerTool_ph["ToolSvc."+toolName] = item.first;
1526 #endif
1527
1528 toolName = "AsgPhotonEfficiencyCorrectionTool_trigEff_asymm_diphoton_" + (item.first).substr(0,9) + photonIso_forTrigSF;
1529 auto ph_trigEff = m_photonEfficiencySFTool_trigEff_AsymDiphoton.emplace(m_photonEfficiencySFTool_trigEff_AsymDiphoton.end(), "CP::AsgPhotonEfficiencyCorrectionTool/"+toolName);
1530 ATH_CHECK( ph_trigEff->setProperty("MapFilePath", "PhotonEfficiencyCorrection/2015_2018/rel21.2/Summer2020_Rec_v1/map3.txt") );
1531 ATH_CHECK( ph_trigEff->setProperty("IsoKey", photonIso_forTrigSF) );
1532 ATH_CHECK( ph_trigEff->setProperty("TriggerKey", "Eff_"+item.second) );
1533 ATH_CHECK( ph_trigEff->setProperty("ForceDataType", 1) ); // Set DataType: 1 for FullSim and 3 for AFII
1534 ATH_CHECK( ph_trigEff->setProperty("OutputLevel", this->msg().level()) );
1535 ATH_CHECK( ph_trigEff->initialize() );
1536 m_photonTrigEffTools.push_back(ph_trigEff->getHandle());
1537 #ifndef XAOD_STANDALONE
1538 m_legsPerTool_ph[toolName] = item.first;
1539 #else
1540 m_legsPerTool_ph["ToolSvc."+toolName] = item.first;
1541 #endif
1542
1543 }
1544 }
1545 }
1546
1547 }
1548 if (m_slices["ele"] || m_slices["pho"]) {
1550 // Initialize the EgammaAmbiguityTool
1551
1552 if (!m_egammaAmbiguityTool.isUserConfigured()) {
1553 m_egammaAmbiguityTool.setTypeAndName("EGammaAmbiguityTool/EGammaAmbiguityTool");
1554 ATH_CHECK( m_egammaAmbiguityTool.setProperty("OutputLevel", this->msg().level()) );
1555 ATH_CHECK( m_egammaAmbiguityTool.retrieve() );
1556 } else ATH_CHECK( m_egammaAmbiguityTool.retrieve() );
1557 }
1558
1559
1560 if (m_slices["ele"]) {
1561 //disable ///////////////////////////////////////////////////////////////////////////////////////////
1562 //disable // Initialize the AsgElectronChargeIDSelector
1563
1564 //disable if (!m_elecChargeIDSelectorTool.isUserConfigured()) {
1565
1566 //disable // For the selector, can use the nice function
1567 //disable std::string eleId = EG_WP(m_eleId);
1568 //disable m_elecChargeIDSelectorTool.setTypeAndName("AsgElectronChargeIDSelectorTool/ElectronChargeIDSelectorTool_"+eleId);
1569 //disable //default cut value for https://twiki.cern.ch/twiki/bin/view/AtlasProtected/ElectronChargeFlipTaggerTool
1570 //disable float BDTcut = -0.337671; // Loose 97%
1571 //disable if (m_eleChID_WP != "Loose" && !m_eleChID_WP.empty()) {
1572 //disable ATH_MSG_ERROR("Only Loose WP is supported in R21. Invalid ChargeIDSelector WP selected : " << m_eleChID_WP);
1573 //disable return StatusCode::FAILURE;
1574 //disable }
1575
1576 //disable ATH_CHECK( m_elecChargeIDSelectorTool.setProperty("TrainingFile", "ElectronPhotonSelectorTools/ChargeID/ECIDS_20180731rel21Summer2018.root"));
1577 //disable ATH_CHECK( m_elecChargeIDSelectorTool.setProperty("CutOnBDT", BDTcut));
1578 //disable ATH_CHECK( m_elecChargeIDSelectorTool.setProperty("OutputLevel", this->msg().level()) );
1579 //disable ATH_CHECK( m_elecChargeIDSelectorTool.retrieve() );
1580 //disable } else ATH_CHECK( m_elecChargeIDSelectorTool.retrieve() );
1581
1582
1584 // Initialise egamma calibration tool
1585
1586 if (!m_egammaCalibTool.isUserConfigured()) {
1587 m_egammaCalibTool.setTypeAndName("CP::EgammaCalibrationAndSmearingTool/EgammaCalibrationAndSmearingTool");
1588 ATH_MSG_DEBUG( "Initialising EgcalibTool " );
1589 ATH_CHECK( m_egammaCalibTool.setProperty("ESModel", m_isRun3 ? "es2024_Run3_v0" : "es2023_R22_Run2_v1") );
1590 ATH_CHECK( m_egammaCalibTool.setProperty("decorrelationModel", "1NP_v1") );
1591 // allows to bypass (intended) abort from of egamma calibration tool when configured for fastSim
1593 ATH_MSG_WARNING( "Forcing EgcalibTool to use calibrations for full simulation" );
1594 ATH_CHECK( m_egammaCalibTool.setProperty("useFastSim", false) );
1595 }
1596 else {
1597 ATH_MSG_INFO("is Fast Sim:" << isAtlfast());
1598 ATH_CHECK( m_egammaCalibTool.setProperty("useFastSim", isAtlfast() ? 1 : 0) );
1599 }
1600 ATH_CHECK( m_egammaCalibTool.setProperty("OutputLevel", this->msg().level()) );
1601 ATH_CHECK( m_egammaCalibTool.retrieve() );
1602 } else ATH_CHECK( m_egammaCalibTool.retrieve() );
1603 }
1604
1605
1606 if (m_slices["tau"]) {
1608
1610 // Initialise path to tau config file and config reader
1611
1612 // Read in the config file so we can retrieve the fields later when configuring the efficiency tools
1613 if ( m_tauConfigReader.ReadFile( PathResolverFindCalibFile(m_tauInputFile).c_str(), EEnvLevel(0) ) ) {
1614 ATH_MSG_ERROR( "Error while reading tau config file : " << m_tauInputFile );
1615 return StatusCode::FAILURE;
1616 }
1617 else ATH_MSG_DEBUG( "Successfully read tau config file : " << m_tauInputFile );
1618
1619
1621 // Initialise tau selection tools
1622
1623 if (!m_tauSelTool.isUserConfigured()) {
1624 toolName = "TauSelectionTool_" + m_tauId;
1625 m_tauSelTool.setTypeAndName("TauAnalysisTools::TauSelectionTool/"+toolName);
1626 ATH_CHECK( m_tauSelTool.setProperty("ConfigPath", m_tauInputFile) );
1627 ATH_CHECK( m_tauSelTool.setProperty("OutputLevel", this->msg().level()) );
1628 ATH_CHECK( m_tauSelTool.retrieve() );
1629 } else ATH_CHECK( m_tauSelTool.retrieve() );
1630
1631
1632 if (!m_tauSelToolBaseline.isUserConfigured()) {
1633 toolName = "TauSelectionToolBaseline_" + m_tauIdBaseline;
1634 m_tauSelToolBaseline.setTypeAndName("TauAnalysisTools::TauSelectionTool/"+toolName);
1635 ATH_CHECK( m_tauSelToolBaseline.setProperty("ConfigPath", m_tauInputFileBaseline) );
1636 ATH_CHECK( m_tauSelToolBaseline.setProperty("OutputLevel", this->msg().level()) );
1637 ATH_CHECK( m_tauSelToolBaseline.retrieve() );
1638 } else ATH_CHECK( m_tauSelToolBaseline.retrieve() );
1639
1640
1642 // jetIDWP/elIDWP for efficiency tool + trigger tool
1643 std::string jetIDWP = m_tauConfigReader.GetValue("JetIDWP" ,"");
1644 ANA_MSG_DEBUG( "Found JetIDWP in tau config file : " << jetIDWP );
1645 int jet_id_lvl;
1646 // Read out the tau ID from the config file and map into the enum from tau CP
1647 if (jetIDWP == "JETIDNONE") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDNONE;
1648 else if (jetIDWP == "JETIDRNNVERYLOOSE") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDRNNVERYLOOSE;
1649 else if (jetIDWP == "JETIDRNNLOOSE") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDRNNLOOSE;
1650 else if (jetIDWP == "JETIDRNNMEDIUM") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDRNNMEDIUM;
1651 else if (jetIDWP == "JETIDRNNTIGHT") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDRNNTIGHT;
1652 else if (jetIDWP == "JETIDGNTAUVERYLOOSE") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDGNTAUVERYLOOSE;
1653 else if (jetIDWP == "JETIDGNTAULOOSE") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDGNTAULOOSE;
1654 else if (jetIDWP == "JETIDGNTAUMEDIUM") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDGNTAUMEDIUM;
1655 else if (jetIDWP == "JETIDGNTAUTIGHT") jet_id_lvl = (int)TauAnalysisTools::JetID::JETIDGNTAUTIGHT;
1656 else {
1657 ATH_MSG_ERROR("Invalid Tau ID in tau config file " << jetIDWP);
1658 return StatusCode::FAILURE;
1659 }
1660 // Read out the (optional) Ele OR from the config file and map into the enum from tau CP
1661 std::string eleIDWP = m_tauConfigReader.GetValue("EleIDWP" ,"");
1662 ANA_MSG_DEBUG( "Found EleIDWP in tau config file : " << eleIDWP );
1663 int ele_id_lvl = -1;
1664 if (eleIDWP == "ELEIDRNNLOOSE") ele_id_lvl = (int)TauAnalysisTools::EleID::ELEIDRNNLOOSE;
1665 else if (eleIDWP == "ELEIDRNNMEDIUM") ele_id_lvl = (int)TauAnalysisTools::EleID::ELEIDRNNMEDIUM;
1666 else if (eleIDWP == "ELEIDRNNTIGHT") ele_id_lvl = (int)TauAnalysisTools::EleID::ELEIDRNNTIGHT;
1667 else {
1668 ATH_MSG_INFO("No or invalid Ele OR in tau config file " << eleIDWP << " will not apply SFs for electro veto" );
1669 }
1670 if (jet_id_lvl == (int)TauAnalysisTools::JetID::JETIDRNNTIGHT || jet_id_lvl == (int)TauAnalysisTools::JetID::JETIDGNTAUTIGHT) {
1671 ATH_MSG_WARNING("EleOR with Tight TauID is currently not supported, please discuss with TauCP!");
1672 }
1673
1674 int jet_id_lvl_fb = jet_id_lvl;
1675 if (m_tau_id_fallback.count(jet_id_lvl) > 0) {
1676 jet_id_lvl_fb = m_tau_id_fallback[jet_id_lvl];
1677 ATH_MSG_WARNING("Configuring fallback RNN ID SF for GNTau config, do not use in production!");
1678 }
1679
1680
1682 // Initialise tau efficiency tool
1683
1684 // TEMPORARY: no recommendations yet for 2024+
1685 if (!m_tauEffTool.isUserConfigured() && !isData() && !(m_mcCampaign=="mc23e" || m_mcCampaign=="mc23g")) {
1686 toolName = "TauEffTool_" + m_tauId;
1687 m_tauEffTool.setTypeAndName("TauAnalysisTools::TauEfficiencyCorrectionsTool/"+toolName);
1688
1689 std::vector<int> correction_types;
1690 // Add retrieval of reco and ID SFs
1691 correction_types.insert(correction_types.end(), {TauAnalysisTools::EfficiencyCorrectionType::SFRecoHadTau,
1692 TauAnalysisTools::EfficiencyCorrectionType::SFJetIDHadTau});
1693
1694 // Add retrieval of electron veto SFs if its applied
1695 if (ele_id_lvl != -1 )
1696 correction_types.insert(correction_types.end(), {TauAnalysisTools::EfficiencyCorrectionType::SFEleIDHadTau,
1697 TauAnalysisTools::EfficiencyCorrectionType::SFEleIDElectron});
1698
1699 ATH_CHECK( m_tauEffTool.setProperty("JetIDLevel", jet_id_lvl_fb) );
1700 ATH_CHECK( m_tauEffTool.setProperty("EleIDLevel", ele_id_lvl) );
1701 ATH_CHECK( m_tauEffTool.setProperty("EfficiencyCorrectionTypes", correction_types) );
1702 ATH_CHECK( m_tauEffTool.setProperty("OutputLevel", this->msg().level()) );
1703 ATH_CHECK( m_tauEffTool.setProperty("useFastSim", isAtlfast()) );
1704 ATH_CHECK( m_tauEffTool.setProperty("RecommendationTag", m_tauEffToolRecommendationTag) );
1705 if (m_isRun3){ ATH_CHECK( m_tauEffTool.setProperty("Campaign", "mc23") );}
1706 else { ATH_CHECK( m_tauEffTool.setProperty("Campaign", "mc20") );}
1707 ATH_CHECK( m_tauEffTool.retrieve() );
1708 } else if (m_tauEffTool.isUserConfigured()) ATH_CHECK( m_tauEffTool.retrieve() );
1709
1710
1712 // Initialise tau trigger efficiency tool(s)
1713
1714 // TEMPORARY: no recommendations yet for 2024+
1715 if (!isData() && !(m_mcCampaign=="mc23e" || m_mcCampaign=="mc23g")) {
1716 // map format: SF file name, corresponding single-tau leg (comma-separated in case of OR)
1718 {"HLT_tau25_medium1_tracktwo", "HLT_tau25_medium1_tracktwo"},
1719 {"HLT_tau35_medium1_tracktwo", "HLT_tau35_medium1_tracktwo"},
1720 {"HLT_tau50L1TAU12_medium1_tracktwo", "HLT_tau50_medium1_tracktwo_L1TAU12"},
1721 {"HLT_tau60_medium1_tracktwo", "HLT_tau60_medium1_tracktwo"},
1722 {"HLT_tau80L1TAU60_medium1_tracktwo", "HLT_tau80_medium1_tracktwo_L1TAU60"},
1723 {"HLT_tau125_medium1_tracktwo", "HLT_tau125_medium1_tracktwo"},
1724 {"HLT_tau160_medium1_tracktwo", "HLT_tau160_medium1_tracktwo"},
1725 {"HLT_tau160L1TAU100_medium1_tracktwo", "HLT_tau160_medium1_tracktwo_L1TAU100"},
1726 // whole 2018 data taking period
1727 {"HLT_tau25_medium1_tracktwoEF", "HLT_tau25_medium1_tracktwoEF"},
1728 {"HLT_tau35_medium1_tracktwoEF", "HLT_tau35_medium1_tracktwoEF"},
1729 {"HLT_tau60_medium1_tracktwoEF", "HLT_tau60_medium1_tracktwoEF"},
1730 {"HLT_tau80L1TAU60_medium1_tracktwoEF", "HLT_tau80_medium1_tracktwoEF_L1TAU60"},
1731 {"HLT_tau160L1TAU100_medium1_tracktwoEF", "HLT_tau160_medium1_tracktwoEF_L1TAU100"},
1732 };
1733
1734 if (m_isRun3){
1736 // 2024,2025,2026
1737 // TBA
1738 // 2022, 2023
1739 {"HLT_tau25_mediumRNN_tracktwoMVA", "HLT_tau25_mediumRNN_tracktwoMVA"},
1740 {"HLT_tau35_mediumRNN_tracktwoMVA", "HLT_tau35_mediumRNN_tracktwoMVA"},
1741 // 2022, 2023 75-1800 bunches
1742 {"HLT_tau160_mediumRNN_tracktwoMVA", "HLT_tau160_mediumRNN_tracktwoMVA_L1TAU100"},
1743 // 2023 from 400 bunches
1744 {"HLT_tau160_mediumRNN_tracktwoMVA", "HLT_tau160_mediumRNN_tracktwoMVA_L1eTAU140"}
1745 };
1746 }
1747
1748 for(auto const& trigger : m_tau_trig_support) {
1749 toolName = "TauTrigEffTool_" + m_tauId + "_" + trigger.first;
1750 auto tau_trigSF = m_tauTrigEffTool.emplace(m_tauTrigEffTool.end(), "TauAnalysisTools::TauEfficiencyCorrectionsTool/"+toolName);
1751 ATH_CHECK( tau_trigSF->setProperty("EfficiencyCorrectionTypes", std::vector<int>({TauAnalysisTools::SFTriggerHadTau})) );
1752 ATH_CHECK( tau_trigSF->setProperty("TriggerName", trigger.first) );
1753 ATH_CHECK( tau_trigSF->setProperty("JetIDLevel", jet_id_lvl_fb) );
1754 ATH_CHECK( tau_trigSF->setProperty("EleIDLevel", ele_id_lvl) );
1755 ATH_CHECK( tau_trigSF->setProperty("OutputLevel", this->msg().level()) );
1756 ATH_CHECK( tau_trigSF->setProperty("useFastSim", isAtlfast()) );
1757 ATH_CHECK( tau_trigSF->setProperty("RecommendationTag", m_tauEffToolRecommendationTag) );
1758 if (m_isRun3){ ATH_CHECK( tau_trigSF->setProperty("Campaign", m_mcCampaign) );}
1759 else { ATH_CHECK( tau_trigSF->setProperty("Campaign", "mc20") );}
1760 ATH_CHECK( tau_trigSF->initialize() );
1761 }
1762 }
1763
1764
1766 // Initialise tau smearing tool
1767
1768 if (!m_tauSmearingTool.isUserConfigured()) {
1769 m_tauSmearingTool.setTypeAndName("TauAnalysisTools::TauSmearingTool/TauSmearingTool");
1770 ATH_CHECK( m_tauSmearingTool.setProperty("RecommendationTag", m_tauSmearingToolRecommendationTag) );
1771 if (m_isRun3){ ATH_CHECK( m_tauSmearingTool.setProperty("Campaign", "mc23") );}
1772 else { ATH_CHECK( m_tauSmearingTool.setProperty("Campaign", "mc20") );}
1773 ATH_CHECK( m_tauSmearingTool.setProperty("MVATESQualityCheck", m_ApplyMVATESQualityCheck) );
1774 ATH_CHECK( m_tauSmearingTool.setProperty("useFastSim", isAtlfast()) );
1775 ATH_CHECK( m_tauSmearingTool.setProperty("OutputLevel", this->msg().level()) );
1776 ATH_CHECK( m_tauSmearingTool.retrieve() );
1777 } else ATH_CHECK( m_tauSmearingTool.retrieve() );
1778
1779
1781 // Initialise tau truth matching tool
1782
1783 if (!m_tauTruthMatch.isUserConfigured() && m_tauDoTTM && !isData()) {
1784 m_tauTruthMatch.setTypeAndName("TauAnalysisTools::TauTruthMatchingTool/TauTruthMatch");
1785 ATH_CHECK( m_tauTruthMatch.setProperty("TruthJetContainerName", m_defaultTruthJets ) );
1786 ATH_CHECK( m_tauTruthMatch.setProperty("OutputLevel", this->msg().level()) );
1787 ATH_CHECK( m_tauTruthMatch.retrieve() );
1788 } else if (m_tauTruthMatch.isUserConfigured()) ATH_CHECK( m_tauTruthMatch.retrieve() );
1789
1790
1791 }
1792
1793
1794 if (m_slices["bjet"]) {
1796 // Initialise B-tagging tools
1797
1798 // btagSelectionTool
1799 std::string jetcollBTag = jetcoll;
1800 if (jetcoll == "AntiKt4LCTopoJets") {
1801 ATH_MSG_WARNING(" *** HACK *** Treating LCTopoJets jets as EMTopo -- use at your own risk!");
1802 jetcollBTag = "AntiKt4EMTopoJets";
1803 }
1804
1805 // print a warning if there is indication that the user supplied a CDI file not matching to the sample being processed
1806 // see --> https://twiki.cern.ch/twiki/bin/view/AtlasProtected/BTagRel22HighLevelSummary
1807 if( (m_bTaggingCalibrationFilePath.find(!m_isRun3 ? "MC20" : "MC23") == std::string::npos) && (m_bTaggingCalibrationFilePath.find(!m_isRun3 ? "MC20" : "MC21") == std::string::npos) ) {
1808 ATH_MSG_WARNING( "You are using a "<<(!m_isRun3 ? "Run3":"Run2")<<" CDI file while running on "<<(!m_isRun3 ? "Run2":"Run3")<<" sample; Please updates your CDI file to the correct version for "<<(!m_isRun3 ? "Run2":"Run3"));
1809 }
1810
1811 if (m_useBtagging && !m_btagSelTool.isUserConfigured() && !m_BtagWP.empty()) {
1812 if (jetcollBTag.find("AntiKt4EMTopoJets") == std::string::npos && jetcollBTag.find("AntiKt4EMPFlowJets")==std::string::npos) {
1813 ATH_MSG_WARNING("** Only AntiKt4EMTopoJets and AntiKt4EMPFlowJets are supported with FTAG scale factors!");
1814 return StatusCode::FAILURE;
1815 }
1816
1817 toolName = "BTagSel_" + jetcollBTag + m_BtagTagger + m_BtagWP;
1818
1819 m_btagSelTool.setTypeAndName("BTaggingSelectionTool/"+toolName);
1820 ATH_CHECK( m_btagSelTool.setProperty("TaggerName", m_BtagTagger ) );
1821 ATH_CHECK( m_btagSelTool.setProperty("OperatingPoint", m_BtagWP ) );
1822 ATH_CHECK( m_btagSelTool.setProperty("JetAuthor", jetcollBTag ) );
1823 ATH_CHECK( m_btagSelTool.setProperty("MinPt", m_BtagMinPt ) );
1824 ATH_CHECK( m_btagSelTool.setProperty("FlvTagCutDefinitionsFileName", m_bTaggingCalibrationFilePath) );
1825 // Read from BTagging object. This will be needed until the input file is produced from
1826 // a derivation release that includes !80336.
1827 ATH_CHECK( m_btagSelTool.setProperty("readFromBTaggingObject", m_BtagReadFromObject ) );
1828 ATH_CHECK( m_btagSelTool.setProperty("OutputLevel", this->msg().level()) );
1829 ATH_CHECK( m_btagSelTool.retrieve() );
1830 } else if (m_btagSelTool.isUserConfigured()) ATH_CHECK( m_btagSelTool.retrieve() );
1831
1832
1833 if (m_useBtagging && !m_btagSelTool_OR.isUserConfigured() && !m_orBtagWP.empty()) {
1834 if (jetcoll != "AntiKt4EMTopoJets" && jetcoll != "AntiKt4EMPFlowJets") {
1835 ATH_MSG_WARNING("** Only AntiKt4EMTopoJets and AntiKt4EMPFlowJets are supported with FTAG scale factors!");
1836 return StatusCode::FAILURE;
1837 }
1838
1839 toolName = "BTagSelOR_" + jetcollBTag + m_orBtagWP;
1840 m_btagSelTool_OR.setTypeAndName("BTaggingSelectionTool/"+toolName);
1841 ATH_CHECK( m_btagSelTool_OR.setProperty("TaggerName", m_BtagTagger ) );
1842 ATH_CHECK( m_btagSelTool_OR.setProperty("OperatingPoint", m_orBtagWP ) );
1843 ATH_CHECK( m_btagSelTool_OR.setProperty("JetAuthor", jetcollBTag ) );
1844 ATH_CHECK( m_btagSelTool_OR.setProperty("MinPt", m_BtagMinPt ) );
1845 ATH_CHECK( m_btagSelTool_OR.setProperty("FlvTagCutDefinitionsFileName", m_bTaggingCalibrationFilePath) );
1846 // Read from BTagging object. This will be needed until the input file is produced from
1847 // a derivation release that includes !80336.
1848 ATH_CHECK( m_btagSelTool_OR.setProperty("readFromBTaggingObject", m_BtagReadFromObject ) );
1849 ATH_CHECK( m_btagSelTool_OR.setProperty("OutputLevel", this->msg().level()) );
1850 ATH_CHECK( m_btagSelTool_OR.retrieve() );
1851 } else if (m_btagSelTool_OR.isUserConfigured()) ATH_CHECK( m_btagSelTool_OR.retrieve() );
1852
1853
1854 std::string trkjetcoll = m_defaultTrackJets;
1855 const std::string& BTagColl_TrkJet = trkjetcoll;
1856 if (m_slices["tjet"]) {
1857 if ( m_useBtagging_trkJet && m_defaultTrackJets.empty()) {
1858 m_useBtagging_trkJet = false;
1859 ATH_MSG_INFO("TrackJet collection set to None: disabling btagging for TrackJets.");
1860 }
1861
1862 if (m_useBtagging_trkJet && !m_btagSelTool_trkJet.isUserConfigured() && !m_BtagWP_trkJet.empty()) {
1863 if (trkjetcoll.find("AntiKt2PV0TrackJets")==std::string::npos && trkjetcoll.find("AntiKtVR30Rmax4Rmin02TrackJets")==std::string::npos) {
1864 ATH_MSG_WARNING("** Only AntiKt2PV0TrackJets and AntiKtVR30Rmax4Rmin02TrackJets are supported with FTAG scale factors!");
1865 return StatusCode::FAILURE;
1866 }
1867
1868 toolName = "BTagSel_" + trkjetcoll + m_BtagTagger_trkJet + m_BtagWP_trkJet;
1869
1870 m_btagSelTool_trkJet.setTypeAndName("BTaggingSelectionTool/"+toolName);
1871 ATH_CHECK( m_btagSelTool_trkJet.setProperty("TaggerName", m_BtagTagger_trkJet ) );
1872 ATH_CHECK( m_btagSelTool_trkJet.setProperty("OperatingPoint", m_BtagWP_trkJet ) );
1873 ATH_CHECK( m_btagSelTool_trkJet.setProperty("MinPt", m_BtagMinPt_trkJet ) );
1874 ATH_CHECK( m_btagSelTool_trkJet.setProperty("JetAuthor", BTagColl_TrkJet ) );
1875 ATH_CHECK( m_btagSelTool_trkJet.setProperty("MinPt", m_BtagMinPt_trkJet ) );
1876 ATH_CHECK( m_btagSelTool_trkJet.setProperty("FlvTagCutDefinitionsFileName", m_bTaggingCalibrationFilePath) );
1877 // Read from BTagging object. This will be needed until the input file is produced from
1878 // a derivation release that includes !80336.
1879 ATH_CHECK( m_btagSelTool_trkJet.setProperty("readFromBTaggingObject", m_BtagReadFromObject_trkJet ) );
1880 ATH_CHECK( m_btagSelTool_trkJet.setProperty("OutputLevel", this->msg().level()) );
1881 ATH_CHECK( m_btagSelTool_trkJet.retrieve() );
1882 } else if (m_btagSelTool_trkJet.isUserConfigured()) ATH_CHECK( m_btagSelTool_trkJet.retrieve() );
1883 }
1884
1885 // Set MCshowerType for FTAG MC/MC SFs
1886 // https://twiki.cern.ch/twiki/bin/view/AtlasProtected/BTagCalibrationRecommendationsRelease21#MC_MC_Scale_Factors_for_Analysis
1887 std::string MCshowerID;
1888 if(m_showerType==-1){
1889 ATH_MSG_ERROR( "Error! m_showerType=-1, which is an error case for FTAG MC/MC SFs." );
1890 return StatusCode::FAILURE;
1891 }
1892 if(m_BtagTagger=="DL1dv01"){
1893 if(!m_isRun3){
1894 MCshowerID= "default"; // Powheg+Pythia8 (410470) - PhPy8EG_A14
1895 if (m_showerType == 1) MCshowerID = "411233"; // PowhegHerwig7
1896 else if (m_showerType == 2) MCshowerID = "600666"; // PhH7EG_H7UE - 601414
1897 else if (m_showerType == 3) MCshowerID = "410250"; // Sherpa_221
1898 else if (m_showerType == 4) MCshowerID = "700122"; // Sh_2210
1899 else if (m_showerType == 5) MCshowerID = "700122"; // Sh_2211
1900 else if (m_showerType == 6) MCshowerID = "700660"; // Sh_2212 - 700660
1901 else if (m_showerType == 7) MCshowerID = "410464"; // aMcAtNloPy8
1902 else if (m_showerType == 8) MCshowerID = "412116"; // aMcAtNloHerwig7
1903 else if (m_showerType != 0){
1904 ATH_MSG_WARNING("Unknown ShowerID detected! Using default FTAG MC-MC SFs (Powheg+Pythia8). Please check if these are applicable for this sample!");
1905 }
1906 }
1907 else{
1908 MCshowerID= "default"; // Powheg+Pythia8 (601229) - PhPy8EG_A14
1909 if (m_showerType == 2) MCshowerID = "601414"; // POWHEG+Herwig721 - PhH7EG_A14
1910 else if (m_showerType == 6) MCshowerID = "700660"; // Sherpa 2.2.12 - Sh_2212
1911 else if (m_showerType != 0){
1912 ATH_MSG_WARNING("Unknown ShowerID detected! Using default FTAG MC-MC SFs (Powheg+Pythia8). Please check if these are applicable for this sample!");
1913 }
1914 }
1915 } else if (m_BtagTagger=="GN2v01"){
1916 if(!m_isRun3){
1917 MCshowerID= "default"; // PowhegPythia8EvtGen (410470)
1918 if (m_showerType == 2) MCshowerID = "411233"; // POWHEGHERWIG7 - 411233
1919 else if (m_showerType == 3) MCshowerID = "600666"; // PhH7EG_H7UE - 600666
1920 else if (m_showerType == 4) MCshowerID = "700660"; // Sh_2210 FTAGAnalysisConfig uses this, but docs say only 11-16 can be used
1921 else if (m_showerType == 5) MCshowerID = "700660"; // Sh_2211
1922 else if (m_showerType == 6) MCshowerID = "700660"; // Sh_2212
1923 else if (m_showerType == 7) MCshowerID = "700660"; // Sh_2214
1924 else if (m_showerType == 8) {
1925 ATH_MSG_WARNING("Unknown Sherpa version detected! Using FTAG MC-MC SFs for Sherpa 2.2.11-2.2.16. Please check if these are applicable for this sample!");
1926 MCshowerID = "700660"; // Unknown Sherpa Version. This is to handle Sh_blank (e.g. DSID 701050). The examples I've found are all 2.2.16, but that's not guaranteed.
1927 }
1928 else if (m_showerType != 0){
1929 ATH_MSG_WARNING("Unknown ShowerID detected! Using default FTAG MC-MC SFs (Powheg+Pythia8). Please check if these are applicable for this sample!");
1930 }
1931 }
1932 else {
1933 MCshowerID= "default"; // PowhegPythia8EvtGen (601229)
1934 if (m_showerType == 3) MCshowerID = "601414"; // PhH7EG_H7UE - 601414
1935 else if (m_showerType == 5) MCshowerID = "700808"; // Sh_2211
1936 else if (m_showerType == 6) MCshowerID = "700808"; // Sh_2212
1937 else if (m_showerType == 7) MCshowerID = "700808"; // Sh_2214
1938 else if (m_showerType == 8) {
1939 ATH_MSG_WARNING("Unknown Sherpa version detected! Using FTAG MC-MC SFs for Sherpa 2.2.11-2.2.16. Please check if these are applicable for this sample!");
1940 MCshowerID = "700660"; // Unknown Sherpa Version
1941 }
1942 else if (m_showerType != 0){
1943 ATH_MSG_WARNING("Unknown ShowerID detected! Using default FTAG MC-MC SFs (Powheg+Pythia8). Please check if these are applicable for this sample!");
1944 }
1945 }
1946 } else {
1947 ATH_MSG_WARNING("Unknown b-tagger detected! Only DL1dv01 and GN2v01 are supported. Falling back to default FTAG MC-MC SFs (Powheg+Pythia8). Please check if these are applicable for this sample!");
1948 MCshowerID= "default";
1949 }
1950
1951 // btagEfficiencyTool
1952 if (m_useBtagging && !m_btagEffTool.isUserConfigured() && !m_BtagWP.empty()) {
1953 if (jetcoll != "AntiKt4EMTopoJets" && jetcoll != "AntiKt4EMPFlowJets") {
1954 ATH_MSG_WARNING("** Only AntiKt4EMTopoJets and AntiKt4EMPFlowJets are supported with FTAG scale factors!");
1955 return StatusCode::FAILURE;
1956 }
1957
1958 toolName = "BTagSF_" + jetcollBTag + m_BtagTagger + m_BtagWP;
1959 m_btagEffTool.setTypeAndName("BTaggingEfficiencyTool/"+toolName);
1960 ATH_CHECK( m_btagEffTool.setProperty("TaggerName", m_BtagTagger ) );
1961 ATH_CHECK( m_btagEffTool.setProperty("ScaleFactorFileName", m_bTaggingCalibrationFilePath) );
1962 ATH_CHECK( m_btagEffTool.setProperty("OperatingPoint", m_BtagWP ) );
1963 ATH_CHECK( m_btagEffTool.setProperty("JetAuthor", jetcollBTag ) );
1964 // Read from BTagging object. This will be needed until the input file is produced from
1965 // a derivation release that includes !80336.
1966 ATH_CHECK( m_btagEffTool.setProperty("readFromBTaggingObject", m_BtagReadFromObject ) );
1967 ATH_CHECK( m_btagEffTool.setProperty("MinPt", m_BtagMinPt ) );
1968 ATH_CHECK( m_btagEffTool.setProperty("SystematicsStrategy", m_BtagSystStrategy ) );
1969 ATH_CHECK( m_btagEffTool.setProperty("EfficiencyBCalibrations", MCshowerID ));
1970 ATH_CHECK( m_btagEffTool.setProperty("EfficiencyCCalibrations", MCshowerID ));
1971 ATH_CHECK( m_btagEffTool.setProperty("EfficiencyTCalibrations", MCshowerID ));
1972 ATH_CHECK( m_btagEffTool.setProperty("EfficiencyLightCalibrations", MCshowerID ));
1973 ATH_CHECK( m_btagEffTool.setProperty("EigenvectorReductionB", m_EigenvectorReductionB ));
1974 ATH_CHECK( m_btagEffTool.setProperty("EigenvectorReductionC", m_EigenvectorReductionC ));
1975 ATH_CHECK( m_btagEffTool.setProperty("EigenvectorReductionLight", m_EigenvectorReductionLight ));
1976 ATH_CHECK( m_btagEffTool.setProperty("OutputLevel", this->msg().level()) );
1977 ATH_CHECK( m_btagEffTool.retrieve() );
1978 } else ATH_CHECK( m_btagEffTool.retrieve() );
1979
1980
1981 if (m_slices["tjet"]) {
1982 if (m_useBtagging_trkJet && !m_btagEffTool_trkJet.isUserConfigured() && !m_BtagWP_trkJet.empty()) {
1983 if (trkjetcoll.find("AntiKt2PV0TrackJets")==std::string::npos && trkjetcoll.find("AntiKtVR30Rmax4Rmin02TrackJets")==std::string::npos) {
1984 ATH_MSG_WARNING("** Only AntiKt2PV0TrackJets and AntiKtVR30Rmax4Rmin02TrackJets are supported with FTAG scale factors!");
1985 return StatusCode::FAILURE;
1986 }
1987
1988 toolName = "BTagSF_" + trkjetcoll;
1989 m_btagEffTool_trkJet.setTypeAndName("BTaggingEfficiencyTool/"+toolName);
1990 ATH_CHECK( m_btagEffTool_trkJet.setProperty("TaggerName", m_BtagTagger_trkJet ) );
1991 ATH_CHECK( m_btagEffTool_trkJet.setProperty("ScaleFactorFileName", m_bTaggingCalibrationFilePath) );
1992 ATH_CHECK( m_btagEffTool_trkJet.setProperty("OperatingPoint", m_BtagWP_trkJet ) );
1993 ATH_CHECK( m_btagEffTool_trkJet.setProperty("JetAuthor", BTagColl_TrkJet ) );
1994 // Read from BTagging object. This will be needed until the input file is produced from
1995 // a derivation release that includes !80336.
1996 ATH_CHECK( m_btagEffTool_trkJet.setProperty("readFromBTaggingObject", m_BtagReadFromObject_trkJet ) );
1997 ATH_CHECK( m_btagEffTool_trkJet.setProperty("MinPt", m_BtagMinPt_trkJet ) );
1998 ATH_CHECK( m_btagEffTool_trkJet.setProperty("SystematicsStrategy", m_BtagSystStrategy ) );
1999 ATH_CHECK( m_btagEffTool_trkJet.setProperty("EfficiencyBCalibrations", MCshowerID ));
2000 ATH_CHECK( m_btagEffTool_trkJet.setProperty("EfficiencyCCalibrations", MCshowerID ));
2001 ATH_CHECK( m_btagEffTool_trkJet.setProperty("EfficiencyTCalibrations", MCshowerID ));
2002 ATH_CHECK( m_btagEffTool_trkJet.setProperty("EfficiencyLightCalibrations", MCshowerID ));
2003 ATH_CHECK( m_btagEffTool_trkJet.setProperty("EigenvectorReductionB", m_EigenvectorReductionB ));
2004 ATH_CHECK( m_btagEffTool_trkJet.setProperty("EigenvectorReductionC", m_EigenvectorReductionC ));
2005 ATH_CHECK( m_btagEffTool_trkJet.setProperty("EigenvectorReductionLight", m_EigenvectorReductionLight ));
2006 ATH_CHECK( m_btagEffTool_trkJet.setProperty("OutputLevel", this->msg().level()) );
2007 ATH_CHECK( m_btagEffTool_trkJet.retrieve() );
2008 } else if (m_btagEffTool_trkJet.isUserConfigured()) ATH_CHECK( m_btagEffTool_trkJet.retrieve() );
2009 }
2010 }
2011
2012
2013 if (m_slices["met"]) {
2015 // Initialise MET tools
2016
2017 if (!m_metMaker.isUserConfigured()) {
2018 toolName = m_doFwdJVT ? m_metJetSelection+"_fJVT" : m_metJetSelection+"_NOfJVT";
2019 m_metMaker.setTypeAndName("met::METMaker/METMaker_ST_"+toolName);
2020
2021 ATH_CHECK( m_metMaker.setProperty("JetContainer", jetcoll) );
2022 ATH_CHECK( m_metMaker.setProperty("ORCaloTaggedMuons", m_metRemoveOverlappingCaloTaggedMuons) );
2023 ATH_CHECK( m_metMaker.setProperty("DoSetMuonJetEMScale", m_metDoSetMuonJetEMScale) );
2024 ATH_CHECK( m_metMaker.setProperty("DoRemoveMuonJets", m_metDoRemoveMuonJets) );
2025 ATH_CHECK( m_metMaker.setProperty("UseGhostMuons", m_metUseGhostMuons) );
2026 ATH_CHECK( m_metMaker.setProperty("DoMuonEloss", m_metDoMuonEloss) );
2027 ATH_CHECK( m_metMaker.setProperty("GreedyPhotons", m_metGreedyPhotons) );
2028 ATH_CHECK( m_metMaker.setProperty("VeryGreedyPhotons", m_metVeryGreedyPhotons) );
2029
2030 // set the jet selection if default empty string is overridden through config file
2031 if (m_metJetSelection.size()) {
2032 ATH_CHECK( m_metMaker.setProperty("JetSelection", m_metJetSelection) );
2033 }
2035 ATH_CHECK( m_metMaker.setProperty("DoPFlow", true) );
2036 }
2037
2038 ATH_CHECK( m_metMaker.setProperty("OutputLevel", this->msg().level()) );
2039 ATH_CHECK( m_metMaker.retrieve() );
2040 } else ATH_CHECK( m_metMaker.retrieve() );
2041
2042
2043 if (!m_metSystTool.isUserConfigured()) {
2044 m_metSystTool.setTypeAndName("met::METSystematicsTool/METSystTool");
2045 ATH_CHECK( m_metSystTool.setProperty("ConfigPrefix", m_metsysConfigPrefix) );
2046
2048 ATH_MSG_ERROR( "Can only have CST *or* TST configured for MET maker. Please unset either METDoCaloSyst or METDoTrkSyst in your config file" );
2049 return StatusCode::FAILURE;
2050 }
2051
2052 if (m_trkMETsyst) {
2053 ATH_CHECK( m_metSystTool.setProperty("ConfigSoftCaloFile", "") );
2054 ATH_CHECK( m_metSystTool.setProperty("ConfigSoftTrkFile", "TrackSoftTerms-pflow_Dec24.config") );
2055 }
2056
2057 if (m_caloMETsyst) {
2058 ATH_MSG_WARNING( "CST is no longer recommended by Jet/MET group");
2059 ATH_CHECK( m_metSystTool.setProperty("ConfigSoftTrkFile", "") );
2060 }
2061
2062 if (m_trkJetsyst) {
2063 ATH_CHECK( m_metSystTool.setProperty("ConfigJetTrkFile", "JetTrackSyst.config") );
2064 }
2065
2066 ATH_CHECK( m_metSystTool.setProperty("OutputLevel", this->msg().level()) );
2067 ATH_CHECK( m_metSystTool.retrieve());
2068 } else ATH_CHECK( m_metSystTool.retrieve());
2069
2070
2071 if (!m_metSignif.isUserConfigured()) {
2072 // See https://twiki.cern.ch/twiki/bin/view/AtlasProtected/MetSignificance
2073 m_metSignif.setTypeAndName("met::METSignificance/metSignificance_"+jetname);
2074#ifndef XAOD_STANDALONE // Athena and AthAnalysis; need to take into account that MuonCalibTool is private tool
2075 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "SoftTermParam", m_softTermParam));
2076 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "TreatPUJets", m_treatPUJets));
2077 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "DoPhiReso", m_doPhiReso));
2078 if(jetname != "AntiKt4EMPFlow")
2079 ATH_MSG_WARNING("METSignificance recommendations only exist for AntiKt4EMPFlow jets, falling back to this.");
2080 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "JetCollection", "AntiKt4EMPFlow"));
2081 // This is the only recommended set of jet resolutions for use with R22+ MET Significance until "Consolidated" recommendations are available
2082 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "JetCalibConfig", "JES_data2017_2016_2015_Recommendation_PFlow_Aug2018_rel21.config") );
2083 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "JetCalibSequence", "JetArea_Residual_EtaJES_GSC_Smear") );
2084 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "JetCalibArea", "00-04-81") );
2085 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "EgammaESModel", m_isRun3 ? "es2024_Run3_v0" : "es2023_R22_Run2_v1") );
2086 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "EgammaDecorrelationModel", "1NP_v1") );
2087 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "EgammaUseFastsim", isAtlfast()) );
2088 // setup a dedicated new muon calib tool for passing down to METSignificance
2089 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "MuonCalibTool", "CP::MuonCalibTool/calibTool"));
2090 if (m_isRun3)
2091 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "calibTool.IsRun3Geo", true));
2092 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "calibTool.calibMode", m_muCalibrationMode));
2093 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "calibTool.OutputLevel",this->msg().level()));
2094 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "calibTool.release", "Recs2025_12_11_Run2Run3"));
2095 int IdBaselineInt = m_muIdBaseline;
2096 if (IdBaselineInt == 4)
2097 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "calibTool.do2StationsHighPt", true));
2098 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "calibTool.doExtraSmearing", m_muHighPtExtraSmear));
2099 ATH_CHECK( AAH::setProperty(m_metSignif.getHandle(), "OutputLevel", this->msg().level()));
2100#else // AnalysisBase; can just pass the jet/egamma/muon calib tools configured above
2101 ATH_CHECK( m_metSignif.setProperty("SoftTermParam", m_softTermParam) );
2102 ATH_CHECK( m_metSignif.setProperty("TreatPUJets", m_treatPUJets) );
2103 ATH_CHECK( m_metSignif.setProperty("DoPhiReso", m_doPhiReso) );
2104 if(jetname != "AntiKt4EMPFlow")
2105 ATH_MSG_WARNING("METSignificance recommendations only exist for AntiKt4EMPFlow jets, falling back to this.");
2106 ATH_CHECK( m_metSignif.setProperty( "JetCollection", "AntiKt4EMPFlow"));
2107 // This is the only recommended set of jet resolutions for use with R22+ MET Significance until "Consolidated" recommendations are available
2108 ATH_CHECK( m_metSignif.setProperty( "JetCalibConfig", "JES_data2017_2016_2015_Recommendation_PFlow_Aug2018_rel21.config") );
2109 ATH_CHECK( m_metSignif.setProperty( "JetCalibSequence", "JetArea_Residual_EtaJES_GSC_Smear") );
2110 ATH_CHECK( m_metSignif.setProperty( "JetCalibArea", "00-04-81") );
2111 ATH_CHECK( m_metSignif.setProperty("egammaCalibTool", m_egammaCalibTool.getHandle()) );
2112 // just pass the muon calib tool
2113 ATH_CHECK( m_metSignif.setProperty("MuonCalibTool",m_muonCalibTool.getHandle()));
2114 ATH_CHECK( m_metSignif.setProperty("OutputLevel", this->msg().level()) );
2115#endif
2116 ATH_CHECK( m_metSignif.retrieve() );
2117 } else ATH_CHECK( m_metSignif.retrieve() );
2118 }
2119
2120
2122// Initialise trigger tools
2123
2124 if (!m_trigDecTool.isUserConfigured()) {
2125
2126 // The decision tool
2127 m_trigDecTool.setTypeAndName("Trig::TrigDecisionTool/TrigDecisionTool");
2128 ATH_CHECK( m_trigDecTool.setProperty("TrigDecisionKey", "xTrigDecision") );
2129 if (m_isRun3) {
2130 ATH_CHECK( m_trigDecTool.setProperty("NavigationFormat", "TrigComposite") );
2131 ATH_CHECK( m_trigDecTool.setProperty("HLTSummary", "HLTNav_Summary_DAODSlimmed") );
2132 }
2133 ATH_CHECK( m_trigDecTool.setProperty("OutputLevel", this->msg().level()) );
2134
2135#ifndef XAOD_STANDALONE // Athena and AthAnalysis
2136 // Clear the default tool handle to cause a fallback on the config service
2137 ATH_CHECK( m_trigDecTool.setProperty("ConfigTool", ""));
2138#else // AnalysisBase
2139 m_trigConfTool.setTypeAndName("TrigConf::xAODConfigTool/xAODConfigTool");
2140 ATH_CHECK(m_trigConfTool.retrieve() );
2141 ATH_CHECK( m_trigDecTool.setProperty("ConfigTool", m_trigConfTool.getHandle()) );
2142#endif
2143
2144 ATH_CHECK( m_trigDecTool.retrieve() );
2145
2146 } else ATH_CHECK( m_trigDecTool.retrieve() );
2147
2148 if (m_isRun3) {
2149 if (!m_trigDRScoringTool.isUserConfigured()) {
2150 m_trigDRScoringTool.setTypeAndName("Trig::DRScoringTool/TrigDRScoringTool");
2151 ATH_CHECK( m_trigDRScoringTool.setProperty("OutputLevel", this->msg().level()) );
2152 ATH_CHECK( m_trigDRScoringTool.retrieve() );
2153 } else ATH_CHECK( m_trigDRScoringTool.retrieve() );
2154 }
2155
2156 if (!m_trigMatchingTool.isUserConfigured()) {
2158 m_trigMatchingTool.setTypeAndName("Trig::MatchFromCompositeTool/TrigMatchFromCompositeTool");
2159 ATH_CHECK( m_trigMatchingTool.setProperty("InputPrefix", m_trigMatchingPrefix) );
2160 ATH_CHECK( m_trigMatchingTool.setProperty("RemapBrokenLinks", true) );
2161 }
2162 else {
2163 if (m_isRun3){
2164 m_trigMatchingTool.setTypeAndName("Trig::R3MatchingTool/TrigR3MatchingTool");
2165 ATH_CHECK( m_trigMatchingTool.setProperty("ScoringTool", m_trigDRScoringTool.getHandle()) );
2166 ATH_CHECK( m_trigMatchingTool.setProperty("TrigDecisionTool", m_trigDecTool.getHandle()) );
2167 }
2168 else {
2169 m_trigMatchingTool.setTypeAndName("Trig::MatchingTool/TrigMatchingTool");
2170 ATH_CHECK( m_trigMatchingTool.setProperty("TrigDecisionTool", m_trigDecTool.getHandle()) );
2171 }
2172 }
2173 ATH_CHECK( m_trigMatchingTool.setProperty("OutputLevel", this->msg().level()) );
2174 ATH_CHECK( m_trigMatchingTool.retrieve() );
2175 } else ATH_CHECK( m_trigMatchingTool.retrieve() );
2176
2178// Initialise trigGlobalEfficiencyCorrection tool
2179
2180 if (!m_trigGlobalEffCorrTool_diLep.isUserConfigured() && !isData()) {
2181
2182 std::string no2e17("");
2183 if (m_trig2017combination_diLep.find("||2e17_lhvloose_nod0_L12EM15VHI") != std::string::npos) {
2184 auto pos_2e17 = m_trig2017combination_diLep.find("||2e17_lhvloose_nod0_L12EM15VHI");
2185 no2e17 = m_trig2017combination_diLep.substr(0, pos_2e17) + m_trig2017combination_diLep.substr(pos_2e17+31, m_trig2017combination_diLep.size());
2186 } else if (m_trig2017combination_diLep.find("2e17_lhvloose_nod0_L12EM15VHI||") != std::string::npos) {
2187 auto pos_2e17 = m_trig2017combination_diLep.find("2e17_lhvloose_nod0_L12EM15VHI||");
2188 no2e17 = m_trig2017combination_diLep.substr(0, pos_2e17) + m_trig2017combination_diLep.substr(pos_2e17+31, m_trig2017combination_diLep.size());
2189 } else {
2191 }
2192 ATH_MSG_DEBUG( "TrigGlobalEfficiencyCorrectionTool/TrigGlobal_diLep: no2e17 trigger string: " << no2e17 );
2193
2194 std::map<std::string,std::string> triggers_diLep;
2195 triggers_diLep["2015"] = m_trig2015combination_diLep;
2196 triggers_diLep["2016"] = m_trig2016combination_diLep;
2197 triggers_diLep["324320-326695"] = m_trig2017combination_diLep; // 2017 before accidental prescale of L12EM15VHI
2198 triggers_diLep["326834-328393"] = no2e17; // 2017 during accidental prescale
2199 triggers_diLep["329385-340453"] = m_trig2017combination_diLep; // 2017 after accidental prescale
2200 triggers_diLep["2018"] = m_trig2018combination_diLep;
2201
2202 m_trigGlobalEffCorrTool_diLep.setTypeAndName("TrigGlobalEfficiencyCorrectionTool/TrigGlobal_diLep");
2203 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("ElectronEfficiencyTools", m_elecTrigEffTools) );
2204 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("ElectronScaleFactorTools", m_elecTrigSFTools) );
2205 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("MuonTools", m_muonTrigSFTools) );
2206 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("TriggerCombination", triggers_diLep) );
2207 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("TriggerMatchingTool", m_trigMatchingTool.getHandle()) );
2208 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("ListOfLegsPerTool", m_legsPerTool) );
2209 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("NumberOfToys", m_trigNToys_diLep) );
2210 ATH_CHECK( m_trigGlobalEffCorrTool_diLep.setProperty("OutputLevel", this->msg().level()) );
2212 } else if (m_trigGlobalEffCorrTool_diLep.isUserConfigured()) ATH_CHECK( m_trigGlobalEffCorrTool_diLep.retrieve() );
2213
2214
2215 if (!m_trigGlobalEffCorrTool_multiLep.isUserConfigured() && !isData()) {
2216
2217 std::string no2e17("");
2218 if (m_trig2017combination_multiLep.find("||2e17_lhvloose_nod0_L12EM15VHI") != std::string::npos) {
2219 auto pos_2e17 = m_trig2017combination_multiLep.find("||2e17_lhvloose_nod0_L12EM15VHI");
2220 no2e17 = m_trig2017combination_multiLep.substr(0, pos_2e17) + m_trig2017combination_multiLep.substr(pos_2e17+31, m_trig2017combination_multiLep.size());
2221 } else if (m_trig2017combination_multiLep.find("2e17_lhvloose_nod0_L12EM15VHI||") != std::string::npos) {
2222 auto pos_2e17 = m_trig2017combination_multiLep.find("2e17_lhvloose_nod0_L12EM15VHI||");
2223 no2e17 = m_trig2017combination_multiLep.substr(0, pos_2e17) + m_trig2017combination_multiLep.substr(pos_2e17+31, m_trig2017combination_multiLep.size());
2224 } else {
2226 }
2227 ATH_MSG_DEBUG( "TrigGlobalEfficiencyCorrectionTool/TrigGlobal_multiLep: no2e17 trigger string: " << no2e17 );
2228
2229 std::map<std::string,std::string> triggers_multiLep;
2230 triggers_multiLep["2015"] = m_trig2015combination_multiLep;
2231 triggers_multiLep["2016"] = m_trig2016combination_multiLep;
2232 triggers_multiLep["324320-326695"] = m_trig2017combination_multiLep; // 2017 before accidental prescale of L12EM15VHI
2233 triggers_multiLep["326834-328393"] = no2e17; // 2017 during accidental prescale
2234 triggers_multiLep["329385-340453"] = m_trig2017combination_multiLep; // 2017 after accidental prescale
2235 triggers_multiLep["2018"] = m_trig2018combination_multiLep;
2236
2237 m_trigGlobalEffCorrTool_multiLep.setTypeAndName("TrigGlobalEfficiencyCorrectionTool/TrigGlobal_multiLep");
2238 ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.setProperty("ElectronEfficiencyTools", m_elecTrigEffTools) );
2239 ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.setProperty("ElectronScaleFactorTools", m_elecTrigSFTools) );
2241 ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.setProperty("TriggerCombination", triggers_multiLep) );
2242 ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.setProperty("TriggerMatchingTool", m_trigMatchingTool.getHandle()) );
2243 ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.setProperty("ListOfLegsPerTool", m_legsPerTool) );
2244 ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.setProperty("NumberOfToys", m_trigNToys_multiLep) );
2245 ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.setProperty("OutputLevel", this->msg().level()) );
2247 } else if (m_trigGlobalEffCorrTool_multiLep.isUserConfigured()) ATH_CHECK( m_trigGlobalEffCorrTool_multiLep.retrieve() );
2248
2249
2250 if (!m_trigGlobalEffCorrTool_diPhoton.isUserConfigured() && !isData()) {
2251 m_trigGlobalEffCorrTool_diPhoton.setTypeAndName("TrigGlobalEfficiencyCorrectionTool/TrigGlobal_diPhoton");
2252 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("PhotonEfficiencyTools", m_photonTrigEffTools) );
2253 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("PhotonScaleFactorTools", m_photonTrigSFTools) );
2254 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("TriggerCombination2015", m_trig2015combination_diPhoton) );
2255 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("TriggerCombination2016", m_trig2016combination_diPhoton) );
2256 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("TriggerCombination2017", m_trig2017combination_diPhoton) );
2257 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("TriggerCombination2018", m_trig2018combination_diPhoton) );
2258 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("ListOfLegsPerTool", m_legsPerTool_ph) );
2259 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("NumberOfToys", m_trigNToys_diPhoton) );
2260 ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.setProperty("OutputLevel", this->msg().level()) );
2262 } else if (m_trigGlobalEffCorrTool_diPhoton.isUserConfigured()) ATH_CHECK( m_trigGlobalEffCorrTool_diPhoton.retrieve() );
2263
2264
2265 if (m_slices["ele"] || m_slices["pho"] || m_slices["mu"]) {
2266 // /////////////////////////////////////////////////////////////////////////////////////////
2267 // Initialise Isolation Correction Tool
2268
2269 if ( !m_isoCorrTool.isUserConfigured() ) {
2270 m_isoCorrTool.setTypeAndName("CP::IsolationCorrectionTool/IsoCorrTool");
2271 ATH_CHECK( m_isoCorrTool.setProperty( "ToolVer", "REL22") );
2272 ATH_CHECK( m_isoCorrTool.setProperty( "IsMC", !isData()) );
2273 ATH_CHECK( m_isoCorrTool.setProperty( "AFII_corr", isAtlfast()) );
2274 ATH_CHECK( m_isoCorrTool.setProperty( "Apply_SC_leakcorr", false) );
2275 ATH_CHECK( m_isoCorrTool.setProperty( "FixTimingIssueInCore", true) ); // Similar to https://gitlab.cern.ch/atlas/athena/-/merge_requests/83939
2276 ATH_CHECK( m_isoCorrTool.setProperty( "CorrFile", "IsolationCorrections/v6/isolation_ptcorrections_rel22_mc20.root") );
2277 ATH_CHECK( m_isoCorrTool.setProperty( "OutputLevel", this->msg().level()) );
2278 ATH_CHECK( m_isoCorrTool.retrieve() );
2279 } else ATH_CHECK( m_isoCorrTool.retrieve() );
2280
2281
2282 // /////////////////////////////////////////////////////////////////////////////////////////
2283 // Initialise Isolation Tool
2284 if (!m_isoTool.isUserConfigured()) {
2285 m_isoTool.setTypeAndName("CP::IsolationSelectionTool/IsoTool");
2286 ATH_CHECK( m_isoTool.setProperty("ElectronWP", m_eleIso_WP.empty() ? "Loose_VarRad" : m_eleIso_WP) );
2287 ATH_CHECK( m_isoTool.setProperty("MuonWP", m_muIso_WP.empty() ? "Loose_VarRad" : m_muIso_WP) );
2288 ATH_CHECK( m_isoTool.setProperty("PhotonWP", m_photonIso_WP.empty() ? "FixedCutTight" : m_photonIso_WP ) );
2289 ATH_CHECK( m_isoTool.setProperty("OutputLevel", this->msg().level()) );
2290 ATH_CHECK( m_isoTool.retrieve() );
2291 } else ATH_CHECK( m_isoTool.retrieve() );
2292
2293 //disable if (!m_isoToolLowPtPLV.isUserConfigured()) {
2294 //disable m_isoToolLowPtPLV.setTypeAndName("CP::IsolationLowPtPLVTool/IsoToolLowPtPLV");
2295 //disable ATH_CHECK( m_isoToolLowPtPLV.setProperty("OutputLevel", this->msg().level()) );
2296 //disable ATH_CHECK( m_isoToolLowPtPLV.retrieve() );
2297 //disable } else ATH_CHECK( m_isoToolLowPtPLV.retrieve() );
2298
2299
2300 if (!m_isoBaselineTool.isUserConfigured()) {
2301 m_isoBaselineTool.setTypeAndName("CP::IsolationSelectionTool/IsoBaselineTool");
2302 ATH_CHECK( m_isoBaselineTool.setProperty("ElectronWP", m_eleBaselineIso_WP.empty() ? "Loose_VarRad" : m_eleBaselineIso_WP ) );
2303 ATH_CHECK( m_isoBaselineTool.setProperty("MuonWP", m_muBaselineIso_WP.empty() ? "Loose_VarRad" : m_muBaselineIso_WP ) );
2304 ATH_CHECK( m_isoBaselineTool.setProperty("PhotonWP", m_photonBaselineIso_WP.empty() ? "FixedCutTight" : m_photonBaselineIso_WP ) );
2305 ATH_CHECK( m_isoBaselineTool.setProperty("OutputLevel", this->msg().level()) );
2306 ATH_CHECK( m_isoBaselineTool.retrieve() );
2307 } else ATH_CHECK( m_isoBaselineTool.retrieve() );
2308
2309
2310 if (!m_isoHighPtTool.isUserConfigured()) {
2311 m_isoHighPtTool.setTypeAndName("CP::IsolationSelectionTool/IsoHighPtTool");
2312 ATH_CHECK( m_isoHighPtTool.setProperty("ElectronWP", m_eleIsoHighPt_WP.empty() ? "Loose_VarRad" : m_eleIsoHighPt_WP) );
2313 ATH_CHECK( m_isoHighPtTool.setProperty("MuonWP", m_muIsoHighPt_WP.empty() ? "Loose_VarRad" : m_muIsoHighPt_WP ) );
2314 ATH_CHECK( m_isoHighPtTool.setProperty("PhotonWP", m_photonIso_WP.empty() ? "FixedCutTight" : m_photonIso_WP ) );
2315 ATH_CHECK( m_isoHighPtTool.setProperty("OutputLevel", this->msg().level()) );
2316 ATH_CHECK( m_isoHighPtTool.retrieve() );
2317 } else ATH_CHECK( m_isoHighPtTool.retrieve() );
2318
2319
2320 // /////////////////////////////////////////////////////////////////////////////////////////
2321 // Initialise IsolationCloseByCorrectionTool Tool
2322 if (!m_isoCloseByTool.isUserConfigured()) {
2323 m_isoCloseByTool.setTypeAndName("CP::IsolationCloseByCorrectionTool/IsoCloseByTool");
2324 // Actually we could debate about what is the proper tool to choose if the users have different baseline & signal islation WP's
2325 ATH_CHECK( m_isoCloseByTool.setProperty("IsolationSelectionTool", m_useSigLepForIsoCloseByOR ? m_isoTool : m_isoBaselineTool));
2326 ATH_CHECK( m_isoCloseByTool.setProperty("PassoverlapDecorator", m_IsoCloseByORpassLabel) );
2327 ATH_CHECK( m_isoCloseByTool.setProperty("SelectionDecorator", m_useSigLepForIsoCloseByOR ? "signal" : "baseline") );
2328 // Make this propery configurable as well?
2329 ATH_CHECK( m_isoCloseByTool.setProperty("BackupPrefix", "ORIG") );
2330 // The isolation selection decorator is updated as well by the tool
2331 ATH_CHECK( m_isoCloseByTool.setProperty("IsolationSelectionDecorator", "isol") );
2332
2333 ATH_CHECK( m_isoCloseByTool.setProperty("OutputLevel", this->msg().level()) );
2334#ifndef XAOD_ANALYSIS
2335 ATH_CHECK( m_isoCloseByTool.setProperty("ParticleCaloExtensionTool", "") );
2336#endif
2337 ATH_CHECK( m_isoCloseByTool.retrieve() );
2338 } else ATH_CHECK( m_isoCloseByTool.retrieve() );
2339 }
2340
2341
2342// /////////////////////////////////////////////////////////////////////////////////////////
2343// Initialise Overlap Removal Tool
2344 if ( m_orToolbox.masterTool.empty() ){
2345
2346 // set up the master tool
2347 std::string suffix = "";
2348 if (m_orDoTau) suffix += "Tau";
2349 if (m_orDoPhoton) suffix += "Gamma";
2350 if (m_orDoBjet) suffix += "Bjet";
2351 std::string toolName = "ORTool" + suffix;
2352 ATH_MSG_INFO("SUSYTools: Autoconfiguring " << toolName);
2353
2354 std::string bJetLabel = "";
2355 //overwrite lepton flags if the global is false (yes?)
2356 if (!m_orDoBjet || !m_useBtagging) {
2357 m_orDoElBjet = false;
2358 m_orDoMuBjet = false;
2359 m_orDoTauBjet = false;
2360 }
2362 bJetLabel = "bjet_loose";
2363 }
2364
2365 // Set the generic flags
2366 ORUtils::ORFlags orFlags(toolName, m_orInputLabel, "passOR");
2367 orFlags.bJetLabel = bJetLabel;
2368 orFlags.boostedLeptons = (m_orDoBoostedElectron || m_orDoBoostedMuon);
2369 orFlags.outputPassValue = true;
2370 orFlags.linkOverlapObjects = m_orLinkOverlapObjects;
2371 if (m_orDoElEl) {
2372 orFlags.doEleEleOR = true;
2373 } else orFlags.doEleEleOR = false;
2374 orFlags.doElectrons = true;
2375 orFlags.doMuons = true;
2376 orFlags.doJets = true;
2377 orFlags.doTaus = m_orDoTau;
2378 orFlags.doPhotons = m_orDoPhoton;
2379 orFlags.doFatJets = m_orDoFatjets;
2380
2381 //set up all recommended tools
2382 ATH_CHECK( ORUtils::recommendedTools(orFlags, m_orToolbox));
2383
2384 // We don't currently have a good way to determine here which object
2385 // definitions are disabled, so we currently just configure all overlap
2386 // tools and disable the pointer safety checks
2387 ATH_CHECK( m_orToolbox.setGlobalProperty("OutputLevel", this->msg().level()) );
2388 ATH_CHECK( m_orToolbox.masterTool.setProperty("RequireExpectedPointers", false) );
2389
2390 // Override boosted OR sliding cone options
2391 ATH_CHECK( m_orToolbox.eleJetORT.setProperty("UseSlidingDR", m_orDoBoostedElectron) );
2392 ATH_CHECK( m_orToolbox.muJetORT.setProperty("UseSlidingDR", m_orDoBoostedMuon) );
2393
2394 //add custom tau-jet OR tool
2395 if(m_orDoTau){
2396 m_orToolbox.tauJetORT.setTypeAndName("ORUtils::TauJetOverlapTool/" + orFlags.masterName + ".TauJetORT");
2397 ATH_CHECK( m_orToolbox.tauJetORT.setProperty("BJetLabel", m_orDoTauBjet?bJetLabel:"") );
2398 }
2399
2400 // override sliding cone params if sliding dR is on and the user-provided parameter values are non-negative
2402 if (m_orBoostedElectronC1 > 0) ATH_CHECK( m_orToolbox.eleJetORT.setProperty("SlidingDRC1", m_orBoostedElectronC1) );
2403 if (m_orBoostedElectronC2 > 0) ATH_CHECK( m_orToolbox.eleJetORT.setProperty("SlidingDRC2", m_orBoostedElectronC2) );
2404 if (m_orBoostedElectronMaxConeSize > 0) ATH_CHECK( m_orToolbox.eleJetORT.setProperty("SlidingDRMaxCone", m_orBoostedElectronMaxConeSize) );
2405 }
2406 if (m_orDoBoostedMuon) {
2407 if (m_orBoostedMuonC1 > 0) ATH_CHECK( m_orToolbox.muJetORT.setProperty("SlidingDRC1", m_orBoostedMuonC1) );
2408 if (m_orBoostedMuonC2 > 0) ATH_CHECK( m_orToolbox.muJetORT.setProperty("SlidingDRC2", m_orBoostedMuonC2) );
2409 if (m_orBoostedMuonMaxConeSize > 0) ATH_CHECK( m_orToolbox.muJetORT.setProperty("SlidingDRMaxCone", m_orBoostedMuonMaxConeSize) );
2410 }
2411
2412 // and switch off lep-bjet check if not requested
2413 if (!m_orDoElBjet) {
2414 ATH_CHECK(m_orToolbox.eleJetORT.setProperty("BJetLabel", ""));
2415 }
2416 if (!m_orDoMuBjet) {
2417 ATH_CHECK(m_orToolbox.muJetORT.setProperty("BJetLabel", ""));
2418 }
2419
2420 // propagate the mu-jet ghost-association option which might be set by the user (default is true)
2421 ATH_CHECK(m_orToolbox.muJetORT.setProperty("UseGhostAssociation", m_orDoMuonJetGhostAssociation));
2422
2423 // propagate mu-jet OR settings if requested
2424 ATH_CHECK(m_orToolbox.muJetORT.setProperty("ApplyRelPt", m_orApplyRelPt) );
2425 if(m_orApplyRelPt){
2426 if (m_orMuJetPtRatio > 0) ATH_CHECK(m_orToolbox.muJetORT.setProperty("MuJetPtRatio", m_orMuJetPtRatio) );
2427 if (m_orMuJetTrkPtRatio > 0) ATH_CHECK(m_orToolbox.muJetORT.setProperty("MuJetTrkPtRatio", m_orMuJetTrkPtRatio) );
2428 }
2429 if (m_orMuJetInnerDR > 0) ATH_CHECK(m_orToolbox.muJetORT.setProperty("InnerDR", m_orMuJetInnerDR) );
2430
2431 // propagate the calo muon setting for EleMuORT
2432 ATH_CHECK(m_orToolbox.eleMuORT.setProperty("RemoveCaloMuons", m_orRemoveCaloMuons) );
2433
2434 // Use electron-muon DR matching to remove electrons within DR < 0.01 of Muons.
2435 if (m_orDoElMu){
2436 ATH_CHECK(m_orToolbox.eleMuORT.setProperty("UseDRMatching", m_orDoElMu) );
2437 }
2438
2439 // propagate the fatjets OR settings
2440 if(m_orDoFatjets){
2441 if(m_EleFatJetDR>0) ATH_CHECK(m_orToolbox.eleFatJetORT.setProperty("DR", m_EleFatJetDR));
2442 if(m_JetFatJetDR>0) ATH_CHECK(m_orToolbox.jetFatJetORT.setProperty("DR", m_JetFatJetDR));
2443 }
2444
2445 // Make sure that we deal with prorities correctly
2446 ATH_CHECK(m_orToolbox.eleJetORT.setProperty("EnableUserPriority", true));
2447 ATH_CHECK(m_orToolbox.muJetORT.setProperty("EnableUserPriority", true));
2448 if (m_orDoTau) ATH_CHECK(m_orToolbox.tauJetORT.setProperty("EnableUserPriority", true));
2449 if (m_orDoPhoton) ATH_CHECK(m_orToolbox.phoJetORT.setProperty("EnableUserPriority", true));
2450
2451 if ( m_orPhotonFavoured ) {
2452 ATH_CHECK(m_orToolbox.phoEleORT.setProperty("SwapContainerPrecedence", true));
2453 ATH_CHECK(m_orToolbox.phoMuORT.setProperty("SwapContainerPrecedence", true));
2454 }
2455
2456 if (!m_orDoEleJet){
2457 // Disable the electron removal part of e-j overlap removal
2458 ATH_CHECK( m_orToolbox.eleJetORT.setProperty("OuterDR",-1.) );
2459 ATH_CHECK( m_orToolbox.eleJetORT.setProperty("SlidingDRMaxCone",-1.) );
2460 }
2461 if (!m_orDoMuonJet){
2462 // Disable the muon removal part of m-j overlap removal
2463 ATH_CHECK( m_orToolbox.muJetORT.setProperty("OuterDR",-1.) );
2464 ATH_CHECK( m_orToolbox.muJetORT.setProperty("SlidingDRMaxCone",-1.) );
2465 }
2466
2467 ATH_CHECK( m_orToolbox.initialize() );
2468
2469 }
2470 // Done with the OR toolbox setup!
2471
2472// /////////////////////////////////////////////////////////////////////////////////////////
2473// Initialise PMG Tools
2474 if (!m_pmgSHnjetWeighter.isUserConfigured() && !isData()) {
2475 m_pmgSHnjetWeighter.setTypeAndName("PMGTools::PMGSherpa22VJetsWeightTool/PMGSHVjetReweighter");
2476 ATH_CHECK( m_pmgSHnjetWeighter.setProperty( "TruthJetContainer", "AntiKt4TruthJets"));
2477 ATH_CHECK( m_pmgSHnjetWeighter.setProperty("OutputLevel", this->msg().level()) );
2478 ATH_CHECK( m_pmgSHnjetWeighter.retrieve());
2479 } else if (m_pmgSHnjetWeighter.isUserConfigured()) ATH_CHECK( m_pmgSHnjetWeighter.retrieve());
2480
2481
2482 if (!m_pmgSHnjetWeighterWZ.isUserConfigured() && !isData()) {
2483 m_pmgSHnjetWeighterWZ.setTypeAndName("PMGTools::PMGSherpa22VJetsWeightTool/PMGSHVjetReweighterWZ");
2484 ATH_CHECK( m_pmgSHnjetWeighterWZ.setProperty( "TruthJetContainer", "AntiKt4TruthWZJets"));
2485 ATH_CHECK( m_pmgSHnjetWeighterWZ.setProperty("OutputLevel", this->msg().level()) );
2486 ATH_CHECK( m_pmgSHnjetWeighterWZ.retrieve() );
2487 } else if (m_pmgSHnjetWeighterWZ.isUserConfigured()) ATH_CHECK( m_pmgSHnjetWeighterWZ.retrieve() );
2488
2489
2490 // prevent these initialiation snippets from being run again
2491 m_subtool_init = true;
2492
2493 ATH_MSG_INFO("Done initialising SUSYTools");
2494
2495 return StatusCode::SUCCESS;
2496}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
#define ANA_MSG_DEBUG(xmsg,...)
Macro printing debug messages.
Defines helper functions for initializing the OR tools in C++.
const std::string bJetLabel
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
#define CONFIG_EG_EFF_TOOL(TOOLHANDLE, TOOLNAME, CORRFILE)
#define CONFIG_EG_EFF_TOOL_KEY(TOOLHANDLE, TOOLNAME, KEYNAME, KEY, MAP)
static StatusCode setProperty(const GaudiHandleBase &toolHandle, const std::string &property, const int &value, bool override=true)
Class to wrap a set of SystematicVariations.
asg::AnaToolHandle< TauAnalysisTools::ITauSelectionTool > m_tauSelToolBaseline
std::string m_defaultTrackJets
std::vector< std::string > m_ph_id_support
bool m_metRemoveOverlappingCaloTaggedMuons
std::string m_BtagWP_trkJet
std::string m_fatJetUncertaintiesMCType
bool isAtlfast() const override final
asg::AnaToolHandle< IWeightTool > m_pmgSHnjetWeighter
std::string m_JetTruthLabelName
asg::AnaToolHandle< CP::IElectronLRTOverlapRemovalTool > m_elecLRTORTool
std::vector< std::string > m_mu_iso_support
std::vector< std::string > m_el_id_support
asg::AnaToolHandle< Trig::TrigDecisionTool > m_trigDecTool
asg::AnaToolHandle< CP::IMuonSelectionTool > m_muonSelectionTool
asg::AnaToolHandle< IWeightTool > m_pmgSHnjetWeighterWZ
std::string m_trig2017combination_diPhoton
std::vector< asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > > m_elecEfficiencySFTool_trig_mixLep
std::string m_trig2016combination_multiLep
std::string m_photonIdBaseline
asg::AnaToolHandle< IJetCalibrationTool > m_jetFatCalibTool
std::string m_trig2016combination_diPhoton
asg::AnaToolHandle< ITrigGlobalEfficiencyCorrectionTool > m_trigGlobalEffCorrTool_multiLep
asg::AnaToolHandle< CP::IIsolationSelectionTool > m_isoBaselineTool
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_isoHighPt
asg::AnaToolHandle< CP::IMuonEfficiencyScaleFactors > m_muonEfficiencySFTool
asg::AnaToolHandle< CP::IPileupReweightingTool > m_prwTool
std::string m_fatUngroomedTruthJets
std::string m_EG_corrFNList
asg::AnaToolHandle< TauAnalysisTools::ITauSelectionTool > m_tauSelTool
asg::AnaToolHandle< ICPJetUncertaintiesTool > m_jetUncertaintiesPDSmearTool
asg::AnaToolHandle< IAsgElectronLikelihoodTool > m_elecSelLikelihood
std::vector< asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > > m_elecEfficiencySFTool_trigEff_mixLep
double m_orBoostedElectronMaxConeSize
ToolHandleArray< CP::IMuonTriggerScaleFactors > m_muonTrigSFTools
std::vector< std::string > m_prwLcalcFiles
std::string m_metsysConfigPrefix
asg::AnaToolHandle< TauAnalysisTools::ITauEfficiencyCorrectionsTool > m_tauEffTool
std::string m_trigMatchingPrefix
Use composite trigger matching tool if matching was done upstream.
asg::AnaToolHandle< CP::IIsolationSelectionTool > m_isoHighPtTool
std::map< std::string, bool > m_slices
asg::AnaToolHandle< ITrigGlobalEfficiencyCorrectionTool > m_trigGlobalEffCorrTool_diPhoton
asg::AnaToolHandle< IAsgElectronLikelihoodTool > m_elecSelLikelihoodBaseline
std::string m_eleEffMapFilePathTriggerRun2
asg::AnaToolHandle< IAsgPhotonIsEMSelector > m_photonSelIsEM
bool isData() const override final
std::map< std::string, std::string > m_legsPerTool_ph
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_id
asg::AnaToolHandle< CP::IMuonEfficiencyScaleFactors > m_muonTTVAEfficiencySFTool
asg::AnaToolHandle< ICPJetCorrectionTool > m_fatjetFFSmearingTool
std::string m_eleEffMapFilePath
std::string m_WZTaggerCalibArea
std::string m_EigenvectorReductionB
asg::AnaToolHandle< IMETSignificance > m_metSignif
asg::AnaToolHandle< CP::IIsolationSelectionTool > m_isoTool
asg::AnaToolHandle< CP::IJvtEfficiencyTool > m_jetfJvtEfficiencyTool
std::string m_metJetSelection
std::vector< std::string > m_el_iso_support
std::string m_trig2017combination_multiLep
std::string m_jetUncertaintiesConfig
Prefix for trigger matchiing container name.
asg::AnaToolHandle< Trig::IMatchingTool > m_trigMatchingTool
std::string m_photonBaselineIso_WP
std::string m_BtagSystStrategy
ToolHandleArray< IAsgElectronEfficiencyCorrectionTool > m_elecTrigEffTools
std::map< std::string, std::string > m_tau_trig_support
std::vector< asg::AnaToolHandle< IAsgPhotonEfficiencyCorrectionTool > > m_photonEfficiencySFTool_trigSF_AsymDiphoton
ToolHandleArray< IAsgElectronEfficiencyCorrectionTool > m_elecTrigSFTools
std::string EG_WP(const std::string &wp) const
std::string m_defaultTruthJets
asg::AnaToolHandle< JetPileupLabelingTool > m_jetPileupLabelingTool
asg::AnaToolHandle< CP::IMuonLRTOverlapRemovalTool > m_muonLRTORTool
asg::AnaToolHandle< JSSWTopTaggerDNN > m_TopTaggerTool
asg::AnaToolHandle< CP::IMuonTriggerScaleFactors > m_muonTriggerSFTool
std::string m_jetUncertaintiesCalibArea
std::string m_tauEffToolRecommendationTag
std::string m_muBaselineIso_WP
asg::AnaToolHandle< IAsgDeadHVCellRemovalTool > m_deadHVTool
std::string m_TopTaggerCalibArea
std::string m_trig2015combination_diLep
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_trigEff_singleLep
std::string m_photonTriggerName
asg::AnaToolHandle< IAsgSelectionTool > m_jetNNJvtSelectionTool
asg::AnaToolHandle< SmoothedWZTagger > m_ZTaggerTool
asg::AnaToolHandle< JetPileupTag::JetVertexNNTagger > m_jetNNJvtMomentTool
std::string m_fJvtConfigRun3
std::string m_eleIdBaseline
std::map< std::string, std::string > m_el_iso_fallback
asg::AnaToolHandle< CP::IMuonEfficiencyScaleFactors > m_muonEfficiencyBMHighPtSFTool
std::string m_muIsoHighPt_WP
asg::AnaToolHandle< CP::IMuonCalibrationAndSmearingTool > m_muonCalibTool
std::string m_fJvtConfigRun2
asg::AnaToolHandle< JetVertexTaggerTool > m_jetJvtMomentTool
asg::AnaToolHandle< ICPJetUncertaintiesTool > m_jetUncertaintiesTool
std::string m_tauSmearingToolRecommendationTag
asg::AnaToolHandle< IEGammaAmbiguityTool > m_egammaAmbiguityTool
asg::AnaToolHandle< TrigConf::ITrigConfigTool > m_trigConfTool
asg::AnaToolHandle< CP::IIsolationCloseByCorrectionTool > m_isoCloseByTool
std::map< int, int > m_tau_id_fallback
std::string m_tauIdBaseline
std::string m_eleIsoHighPt_WP
bool check_isOption(const std::string &wp, const std::vector< std::string > &list) const
asg::AnaToolHandle< IMETMaker > m_metMaker
asg::AnaToolHandle< Trig::IMatchScoringTool > m_trigDRScoringTool
asg::AnaToolHandle< IAsgPhotonEfficiencyCorrectionTool > m_photonIsolationSFTool
bool m_orDoTau
Overlap removal options.
std::string m_trig2016combination_diLep
std::string m_JvtConfigRun2
asg::AnaToolHandle< ICPJetUncertaintiesTool > m_fatjetUncertaintiesTool
asg::AnaToolHandle< CP::IIsolationCorrectionTool > m_isoCorrTool
ToolHandleArray< IAsgPhotonEfficiencyCorrectionTool > m_photonTrigSFTools
std::string m_eleConfigBaseline
asg::AnaToolHandle< IMETSystematicsTool > m_metSystTool
asg::AnaToolHandle< CP::IMuonSelectionTool > m_muonSelectionHighPtTool
std::string m_EigenvectorReductionLight
asg::AnaToolHandle< IAsgSelectionTool > m_jetfJvtSelectionTool
std::string m_trig2018combination_diPhoton
asg::AnaToolHandle< IJetSelector > m_jetCleaningTool
asg::AnaToolHandle< IBTaggingSelectionTool > m_btagSelTool_trkJet
asg::AnaToolHandle< InDet::IInclusiveTrackFilterTool > m_LRTuncTool
std::vector< std::string > getElSFkeys(const std::string &mapFile) const
asg::AnaToolHandle< CP::IJvtEfficiencyTool > m_jetNNJvtEfficiencyTool
asg::AnaToolHandle< CP::IMuonEfficiencyScaleFactors > m_muonHighPtIsolationSFTool
asg::AnaToolHandle< TauAnalysisTools::ITauSmearingTool > m_tauSmearingTool
std::string m_trig2018combination_diLep
std::string m_trig2017combination_diLep
asg::AnaToolHandle< ITrigGlobalEfficiencyCorrectionTool > m_trigGlobalEffCorrTool_diLep
const std::vector< std::string > split(const std::string &s, const std::string &delim) const
asg::AnaToolHandle< IBTaggingEfficiencyTool > m_btagEffTool_trkJet
std::vector< std::string > m_prwConfFiles
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_reco
Combined muon collection.
std::string m_jesConfigAFII
std::vector< CP::SystematicSet > m_fatjetFFSmearingSyst
asg::AnaToolHandle< IBTaggingEfficiencyTool > m_btagEffTool
StatusCode SUSYToolsInit()
SG::ReadDecorHandleKey< xAOD::JetContainer > m_label_truthKey
asg::AnaToolHandle< TauAnalysisTools::ITauTruthMatchingTool > m_tauTruthMatch
std::map< std::string, std::string > m_legsPerTool
asg::AnaToolHandle< IBTaggingSelectionTool > m_btagSelTool_OR
std::string m_muTriggerSFCalibRelease
std::vector< asg::AnaToolHandle< IAsgPhotonEfficiencyCorrectionTool > > m_photonEfficiencySFTool_trigEff_AsymDiphoton
std::map< std::string, std::string > m_mu_iso_fallback
std::string m_jetUncertaintiesAnalysisFile
asg::AnaToolHandle< IAsgPhotonIsEMSelector > m_photonSelIsEMBaseline
std::string m_jetUncertaintiesMCType
std::string m_eleEffMapFilePathTriggerRun3
std::vector< asg::AnaToolHandle< TauAnalysisTools::ITauEfficiencyCorrectionsTool > > m_tauTrigEffTool
asg::AnaToolHandle< IBTaggingSelectionTool > m_btagSelTool
ToolHandleArray< IAsgPhotonEfficiencyCorrectionTool > m_photonTrigEffTools
asg::AnaToolHandle< IAsgPhotonEfficiencyCorrectionTool > m_photonTriggerSFTool
std::string m_EigenvectorReductionC
std::string m_fatJetUncConfig
ORUtils::ToolBox m_orToolbox
std::string m_tauInputFileBaseline
asg::AnaToolHandle< CP::IMuonSelectionTool > m_muonSelectionToolBaseline
std::string m_muTriggerSFCalibFilename
asg::AnaToolHandle< CP::IEgammaCalibrationAndSmearingTool > m_egammaCalibTool
Combined electron collection.
std::string m_IsoCloseByORpassLabel
std::string m_trig2015combination_multiLep
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_trig_singleLep
asg::AnaToolHandle< JetTruthLabelingTool > m_jetTruthLabelingTool
asg::AnaToolHandle< ICPJetUncertaintiesTool > m_fatjetUncertaintiesPDSmearTool
std::string m_bTaggingCalibrationFilePath
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_iso
asg::AnaToolHandle< SmoothedWZTagger > m_WTaggerTool
asg::AnaToolHandle< IJetCalibrationTool > m_jetCalibTool
std::string m_eleBaselineIso_WP
std::string m_fatJetUncVars
std::string m_electronTriggerSFStringSingle
std::string m_trig2015combination_diPhoton
asg::AnaToolHandle< CP::IMuonEfficiencyScaleFactors > m_muonIsolationSFTool
std::string m_BtagTagger_trkJet
std::string m_trig2018combination_multiLep
asg::AnaToolHandle< IAsgPhotonEfficiencyCorrectionTool > m_photonEfficiencySFTool
std::string m_JvtConfigRun3
std::string m_jesCalibSeqFat
const std::string & typeName(Type id)
setRawEt setRawPhi int