6 from AnalysisAlgorithmsConfig.ConfigBlock
import ConfigBlock
7 from AnalysisAlgorithmsConfig.ConfigAccumulator
import DataType
8 from AthenaConfiguration.Enums
import LHCPeriod
9 from AthenaCommon.Logging
import logging
14 """the ConfigBlock for the common preprocessing of jet uncertainties"""
17 super (JetUncertaintiesConfig, self).__init__ ()
18 self.setBlockName(
'Uncertainties')
19 self.addDependency(
'OverlapRemoval', required=
False)
20 self.addOption (
'containerName',
'', type=str,
22 info=
"the name of the output container after calibration.")
23 self.addOption (
'jetInput',
'', type=str,
26 self.addOption(
'analysisJetSelection',
'', type=str,
27 info=
"the jet selection to use to calculate N jets for an analysis specific "
28 "jet flavor composition uncertainty. Of the form jvt_selection,as_char&&passesOR,as_char...")
29 self.addOption(
'analysisFile',
'', type=str,
30 info=
"the file containing gluon fraction histograms needed to calculate an analysis specific "
31 "jet flavor composition uncertainty.")
32 self.addOption (
'largeRMass',
"Comb", type=str,
34 self.addOption (
'systematicsModelJES',
"Category", type=str,
35 info=
"the NP reduction scheme to use for JES: All, Global, Category, "
36 "Scenario. The default is Category.")
37 self.addOption (
'systematicsModelJER',
"Full", type=str,
38 info=
"the NP reduction scheme to use for JER: All, Full, Simple. The "
40 self.addOption (
'systematicsModelJMS',
"Full", type=str)
41 self.addOption (
'systematicsModelJMR',
"Full", type=str,
42 info=
"the NP reduction scheme to use for JMR: Full, Simple. The default is Full.")
43 self.addOption (
'runJERsystematicsOnData',
False, type=bool,
44 info=
"whether to run the All/Full JER model variations also on data samples. Expert option!")
46 self.addOption (
'uncertToolConfigPath',
None, type=str,
47 info=
"name (str) of the config file to use for the jet uncertainty "
48 "tool. Expert option to override JetETmiss recommendations. The "
50 self.addOption (
'uncertToolCalibArea',
None, type=str,
51 info=
"name (str) of the CVMFS area to use for the jet uncertainty "
52 "tool. Expert option to override JetETmiss recommendations. The "
54 self.addOption (
'uncertToolMCType',
None, type=str,
55 info=
"data type (str) to use for the jet uncertainty tool (e.g. "
56 "'AF3' or 'MC16'). Expert option to override JetETmiss "
57 "recommendations. The default is None.")
60 """Return the instance name for this block"""
61 return self.containerName
72 config_file =
"R4_AllNuisanceParameters_AllJERNP.config"
76 "Invalid uncertainty configuration - Scenario* systematicsModelJESs can "
77 "only be used together with the Simple systematicsModelJER")
83 "Invalid combination of systematicsModelJES and systematicsModelJER settings: "
88 if self.uncertToolCalibArea
is not None:
89 calib_area = self.uncertToolCalibArea
92 if self.uncertToolConfigPath
is not None:
93 config_file = self.uncertToolConfigPath
95 if config.geometry()
is LHCPeriod.Run2:
96 if config.dataType()
is DataType.FastSim:
97 config_file =
"rel22/Fall2024_PreRec/" + config_file
100 config_file =
"HIJetUncertainties/Spring2023/HI" + config_file
102 config_file =
"rel22/Summer2023_PreRec/" + config_file
104 if config.dataType()
is DataType.FastSim:
105 config_file =
"rel22/Winter2025_AF3_PreRec/" + config_file
108 config_file =
"HIJetUncertainties/Spring2023/HI" + config_file
110 config_file =
"rel22/Winter2025_PreRec/" + config_file
114 if self.uncertToolMCType
is not None:
115 mc_type = self.uncertToolMCType
117 if config.geometry()
is LHCPeriod.Run2:
118 if config.dataType()
is DataType.FastSim:
123 if config.dataType()
is DataType.FastSim:
131 return config_file, calib_area, mc_type
146 config.addPrivateTool(
'uncertaintiesTool',
'JetUncertaintiesTool' )
147 jetUncertaintiesAlg.uncertaintiesTool.JetDefinition = jetCollectionName[:-4]
148 jetUncertaintiesAlg.uncertaintiesTool.ConfigFile = configFile
149 if calibArea
is not None:
150 jetUncertaintiesAlg.uncertaintiesTool.CalibArea = calibArea
151 jetUncertaintiesAlg.uncertaintiesTool.MCType = mcType
152 jetUncertaintiesAlg.uncertaintiesTool.IsData = (config.dataType()
is DataType.Data)
153 jetUncertaintiesAlg.uncertaintiesTool.PseudoDataJERsmearingMode =
False
155 if config.dataType()
is DataType.Data
and not (doPseudoData
and self.runJERsystematicsOnData):
157 jetUncertaintiesAlg.affectingSystematicsFilter =
'.*'
158 if config.dataType()
is not DataType.Data
and doPseudoData
and not self.runJERsystematicsOnData:
160 config.addPrivateTool(
'uncertaintiesToolPD',
'JetUncertaintiesTool' )
161 jetUncertaintiesAlg.uncertaintiesToolPD.JetDefinition = jetCollectionName[:-4]
162 jetUncertaintiesAlg.uncertaintiesToolPD.ConfigFile = configFile
163 if calibArea
is not None:
164 jetUncertaintiesAlg.uncertaintiesToolPD.CalibArea = calibArea
165 jetUncertaintiesAlg.uncertaintiesToolPD.MCType = mcType
168 jetUncertaintiesAlg.uncertaintiesToolPD.IsData =
True
169 jetUncertaintiesAlg.uncertaintiesToolPD.PseudoDataJERsmearingMode =
True
176 log = logging.getLogger(
'LargeRJetAnalysisConfig')
180 if self.
systematicsModelJER in [
"Simple",
"Full"]
and self.systematicsModelJMS
in [
"Simple",
"Full"]:
184 "Invalid request for systematicsModelJER/JMS settings: "
185 "systematicsModelJER = '{0}', "
187 if self.uncertToolConfigPath
is not None:
189 config_file = self.uncertToolConfigPath
191 if config.geometry()
in [LHCPeriod.Run2, LHCPeriod.Run3]:
192 config_file =
"rel22/Summer2025_PreRec/" + config_file
194 log.warning(
"Uncertainties for UFO jets are not for Run 4!")
198 if self.uncertToolCalibArea
is not None:
199 calib_area = self.uncertToolCalibArea
202 if self.uncertToolMCType
is not None:
203 mc_type = self.uncertToolMCType
205 if config.dataType()
is DataType.FastSim:
206 if config.geometry()
is LHCPeriod.Run2:
211 if config.geometry()
is LHCPeriod.Run2:
216 return config_file, calib_area, mc_type
220 Create instance(s) of JetUncertaintiesTool following JetETmiss recommendations.
222 JER uncertainties under the "Full" scheme must be run on MC samples twice:
224 2. Pseudodata (PD) mode, as if the events are Data.
231 config.addPrivateTool(
'uncertaintiesTool',
'JetUncertaintiesTool' )
232 jetUncertaintiesAlg.uncertaintiesTool.JetDefinition = jetCollectionName[:-4]
233 jetUncertaintiesAlg.uncertaintiesTool.ConfigFile = configFile
234 from PathResolver
import PathResolver
235 if self.analysisFile
is not None:
237 if calibArea
is not None:
238 jetUncertaintiesAlg.uncertaintiesTool.CalibArea = calibArea
239 jetUncertaintiesAlg.uncertaintiesTool.MCType = mcType
240 jetUncertaintiesAlg.uncertaintiesTool.IsData = (config.dataType()
is DataType.Data)
241 jetUncertaintiesAlg.uncertaintiesTool.PseudoDataJERsmearingMode =
False
242 jetUncertaintiesAlg.uncertaintiesTool.NJetAccessorName =
"Njet_NOSYS"
245 if config.dataType()
is DataType.Data
and not (config.isPhyslite()
and doPseudoData
and self.runJERsystematicsOnData):
247 jetUncertaintiesAlg.affectingSystematicsFilter =
'.*'
249 if config.dataType()
is not (DataType.Data
and config.isPhyslite())
and doPseudoData
and not self.runJERsystematicsOnData:
251 config.addPrivateTool(
'uncertaintiesToolPD',
'JetUncertaintiesTool' )
252 jetUncertaintiesAlg.uncertaintiesToolPD.JetDefinition = jetCollectionName[:-4]
253 jetUncertaintiesAlg.uncertaintiesToolPD.ConfigFile = configFile
254 if calibArea
is not None:
255 jetUncertaintiesAlg.uncertaintiesToolPD.CalibArea = calibArea
256 jetUncertaintiesAlg.uncertaintiesToolPD.MCType = mcType
257 jetUncertaintiesAlg.uncertaintiesToolPD.IsData =
True
258 jetUncertaintiesAlg.uncertaintiesToolPD.PseudoDataJERsmearingMode =
True
262 jetCollectionName=config.originalName(self.containerName)
263 if(config.originalName(self.containerName)==
"AnalysisJets") :
264 jetCollectionName=
"AntiKt4EMPFlowJets"
265 if(config.originalName(self.containerName)==
"AnalysisLargeRJets") :
266 jetCollectionName=
"AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets"
269 collection_pattern = re.compile(
270 r"AntiKt(\d+)(EMTopo|EMPFlow|LCTopo|TrackCaloCluster|UFO|Track|HI)(TrimmedPtFrac5SmallR20|CSSKSoftDropBeta100Zcut10)?Jets")
271 match = collection_pattern.match(jetCollectionName)
274 "Jet collection {0} does not match expected pattern!".
format(jetCollectionName) )
275 radius =
int(match.group(1) )
276 if radius
not in [2, 4, 6, 10]:
277 raise ValueError(
"Jet collection has an unsupported radius '{0}'!".
format(radius) )
279 if (self.analysisJetSelection!=
''):
280 alg = config.createAlgorithm(
'CP::NJetDecoratorAlg',
'NJetDecoratorAlg' )
281 alg.jets = config.readName(self.containerName)
282 alg.jetSelection = self.analysisJetSelection
283 config.addOutputVar(
'EventInfo',
'Njet_%SYS%',
'Njet')
287 alg = config.createAlgorithm(
'CP::JetUncertaintiesAlg',
'JetUncertaintiesAlg' )
289 alg.jets = config.readName (self.containerName)
290 alg.jetsOut = config.copyName (self.containerName)
291 alg.preselection = config.getPreselection (self.containerName,
'')
294 if self.
jetInput ==
"UFO" and config.dataType()
in [DataType.FullSim, DataType.FastSim]:
295 alg = config.createAlgorithm(
'CP::JetUncertaintiesAlg',
'JetUncertaintiesAlg' )
298 alg.uncertaintiesTool.JetDefinition = jetCollectionName[:-4]
301 alg.outOfValidity = 2
302 alg.outOfValidityDeco =
'outOfValidity'
304 alg.jets = config.readName (self.containerName)
305 alg.jetsOut = config.copyName (self.containerName)
306 alg.preselection = config.getPreselection (self.containerName,
'')
309 alg = config.createAlgorithm(
'CP::JetUncertaintiesAlg',
'JetUncertaintiesAlg' )
312 alg.outOfValidity = 2
313 alg.outOfValidityDeco =
'outOfValidity'
314 config.addPrivateTool(
'uncertaintiesTool',
'JetUncertaintiesTool' )
316 alg.uncertaintiesTool.JetDefinition = jetCollectionName[:-4]
317 alg.uncertaintiesTool.ConfigFile = \
318 "rel21/Moriond2018/R10_{0}Mass_all.config".
format(self.largeRMass)
319 alg.uncertaintiesTool.MCType =
"MC16a"
320 alg.uncertaintiesTool.IsData = (config.dataType()
is DataType.Data)
322 alg.jets = config.readName (self.containerName)
323 alg.jetsOut = config.copyName (self.containerName)
324 alg.preselection = config.getPreselection (self.containerName,
'')
325 config.addSelection (self.containerName,
'',
'outOfValidity')