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