ATLAS Offline Software
Loading...
Searching...
No Matches
JetCalibStepsConfig Namespace Reference

Classes

class  JetCalibConfigError

Functions

 smearingStep (flags, **configDict)
 puresidualStep (flags, **configDict)
 gscStep (flags, **configDict)
 etajesStep (flags, **configDic)
 jmsStep (flags, **configDic)
 insituStep (flags, **configDic)
 af3Step (flags, **configDic)
 ptResidualStep (flags, **configDic)
 mc2mcStep (flags, **configDic)
 calibConfigToToolList (flags, **configDict)
 calibToolFromConfigFile (flags, configFile, name="jetcalib")
 load_yaml_cfg (configFile)

Variables

 jcslog = Logging.logging.getLogger('JetCalibStepsConfig')
 calibStepDic
dict generatorDic

Function Documentation

◆ af3Step()

JetCalibStepsConfig.af3Step ( flags,
** configDic )

Definition at line 171 of file JetCalibStepsConfig.py.

171def af3Step(flags, **configDic):
172
173 # Get the settings for the histograms:
174 histoParams = configDic.pop('histoParams')
175 histoParams['inputFile'] = PathResolver.FindCalibFile(configDic.pop('CalibConstantFile'))
176 configDic["histoTool"] = HistoInputCfg(flags, "histoTool", **histoParams)
177
178 return [CompFactory.Generic4VecCorrectionStep("AF3", **configDic)]
179
static std::string FindCalibFile(const std::string &logical_file_name)

◆ calibConfigToToolList()

JetCalibStepsConfig.calibConfigToToolList ( flags,
** configDict )
Returns a list of instantiated tools for each of the calibration steps. 
The order of the steps is determined by the InScale and OutScale properties given in the config.
Tools are instantiated by calling functions declared in the calibStepDic dictionary.

Definition at line 279 of file JetCalibStepsConfig.py.

279def calibConfigToToolList(flags, **configDict):
280 """
281 Returns a list of instantiated tools for each of the calibration steps.
282 The order of the steps is determined by the InScale and OutScale properties given in the config.
283 Tools are instantiated by calling functions declared in the calibStepDic dictionary.
284 """
285
286 isFullSim = True
287 if flags.Input.isMC:
288 metaData = GetFileMD(flags.Input.Files[0])
289 simFlavour = metaData.get('Simulator','') # ATLFAST3 or FullG4
290 if 'ATLFAST3' in simFlavour:
291 isFullSim = False
292
293 # For fast simulation, we want to implement an additional calibration right after the GSC
294 if flags.Input.isMC and not isFullSim and 'AF3' in configDict:
295 # Change the input scale of the next calibration step to the output scale of the AF3 calibration:
296 for step in configDict:
297 if configDict.get(step)['InScale'] == 'JetGSCScaleMomentum' and step != 'Insitu' and step != 'AF3':
298 configDict.get(step)['InScale'] = 'JetFastSimScaleMomentum'
299 break
300
301 toolDic = {}
302 foundCS = False # check at least one of the steps starts from constituent scale
303 for step in configDict:
304
305 configDict.get(step).pop('prereqs',{}) # removes the 'prereqs' entry not refined in steps
306 # expert option to skip a step
307 if configDict.get(step).pop('noRun',False):
308 jcslog.warning(f'Expert option: Skipping calib step {step}')
309 continue
310
311 # Skip Insitu for MC
312 if step=="Insitu" and flags.Input.isMC and not configDict.get("Insitu").get("CalibrateMC",False):
313 jcslog.info('Skipping Insitu for MC')
314 continue
315
316 # Skip MC to MC calibration factors for data or Pythia8
317 if step=="MC2MC":
318 if not flags.Input.isMC:
319 jcslog.info('Skipping MC2MC calibration for data')
320 continue
321
322 for key, value in flags.Input.GeneratorsInfo.items():
323 generator = key
324 break
325 if 'Pythia' in generator:
326 jcslog.info('Skipping MC2MC calibration for Pythia8')
327 continue
328
329 # Skip additional fast simulation calibration steps for data or full simulation
330 if step=="AF3":
331 if not flags.Input.isMC:
332 jcslog.info('Skipping additional FastSimulation calibration for data')
333 continue
334 # Check if full simulation
335 if isFullSim:
336 jcslog.info('Skipping additional FastSimulation calibration for full sim')
337 continue
338
339 calibFunc = calibStepDic.get(step,None)
340 if calibFunc is None:
341 raise NotImplementedError(f'Calibration step {step} is not found in calibStepDic')
342
343 calibConfig = configDict.get(step)
344
345 # each func returns a list (to allow one YAML block to configure multiple steps run in order)
346 toolList = calibFunc(flags, **calibConfig)
347
348 toolDic[step] = toolList
349 if toolList[0].InScale == "JetConstitScaleMomentum":
350 foundCS = True
351
352 if not foundCS:
353 raise JetCalibConfigError('At least one step must have InScale = JetConstitScaleMomentum')
354
355 def findNextSteps(ordered_tools=[], ordered_step_names=[], startScale = "JetConstitScaleMomentum"):
356 ''' Recursively add tools to ordered_tools based on in/out scale '''
357 for step in toolDic:
358 if toolDic[step][0].InScale == startScale:
359 ordered_tools += toolDic[step]
360 ordered_step_names.append(step)
361 ordered_tools, ordered_step_names = findNextSteps(ordered_tools, ordered_step_names, toolDic[step][-1].OutScale)
362
363 return ordered_tools, ordered_step_names
364
365 ordered_tools, ordered_step_names = findNextSteps([], [])
366
367 # Check we've got all the steps
368 for step in toolDic:
369 if step not in ordered_step_names:
370 raise JetCalibConfigError(f'Could not place calib step {step} - have you set InScale and OutScale correctly?')
371
372 jcslog.info(f'Ordered jet calib steps: {"->".join(ordered_step_names)}')
373
374 return ordered_tools
375
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130

◆ calibToolFromConfigFile()

JetCalibStepsConfig.calibToolFromConfigFile ( flags,
configFile,
name = "jetcalib" )

Definition at line 376 of file JetCalibStepsConfig.py.

376def calibToolFromConfigFile(flags, configFile, name = "jetcalib"):
377
378 configDic = load_yaml_cfg(configFile)
379
380 globalSettings = configDic.pop('Global',{})
381
382 calibTool = CompFactory.JetCalibTool(name, CalibSteps=calibConfigToToolList(flags, **configDic), **globalSettings)
383 return calibTool
384

◆ etajesStep()

JetCalibStepsConfig.etajesStep ( flags,
** configDic )

Definition at line 109 of file JetCalibStepsConfig.py.

109def etajesStep(flags, **configDic):
110
111 pVars = configDic.pop("ParametrizedVars")
112
113 jesstep = CompFactory.EtaJESCalibStep("EtaJESCalib",
114 VarToolE= VarToolCfg(flags, var=pVars['varE']),
115 VarToolEta= VarToolCfg(flags, var=pVars["varEta"]),
116 **configDic
117 )
118 return [jesstep]
119

◆ gscStep()

JetCalibStepsConfig.gscStep ( flags,
** configDict )

Definition at line 60 of file JetCalibStepsConfig.py.

60def gscStep(flags, **configDict):
61
62 defaultFileGSC = PathResolver.FindCalibFile(configDict.pop('fileGSC'))
63
64 # These HistoInput2D defaults can't be set in the C++, so are set here:
65 defaultHistTools = dict(
66 histTool_EM3 = [dict(varX = "pt", varY = "EM3", histName=f"AntiKt4EMPFlow_EM3_interpolation_resp_eta_{j}", inputFile=defaultFileGSC) for j in range(35)],
67 histTool_CharFrac = [dict(varX = "pt", varY = "ChargedFraction", histName = f"AntiKt4EMPFlow_chargedFraction_interpolation_resp_eta_{j}", inputFile=defaultFileGSC) for j in range(25)],
68 histTool_Tile0 = [dict(varX = "pt", varY = "Tile0", histName=f"AntiKt4EMPFlow_Tile0_interpolation_resp_eta_{j}", inputFile=defaultFileGSC) for j in range(18)],
69 histTool_nTrk=[dict(varX = "pt", varY = dict(Name="nTrk", Type="int",), histName=f"AntiKt4EMPFlow_nTrk_interpolation_resp_eta_{j}", inputFile=defaultFileGSC) for j in range(25)],
70 histTool_trackWIDTH=[dict(varX = "pt", varY = "trackWIDTH", histName=f"AntiKt4EMPFlow_trackWIDTH_interpolation_resp_eta_{j}", inputFile=defaultFileGSC) for j in range(25)],
71 histTool_PunchThrough=[dict(varX = "e", varY = dict(Name="Nsegments", Type="int",), histName=f"AntiKt4EMPFlow_PunchThrough_interpolation_resp_eta_{j}", inputFile=defaultFileGSC) for j in range(2)],
72 )
73
74 gsc_steps = ['histTool_EM3', 'histTool_CharFrac', 'histTool_Tile0', 'histTool_nTrk', 'histTool_trackWIDTH']
75 if configDict.get('applyPunchThrough',False):
76 gsc_steps.append('histTool_PunchThrough')
77
78 # Build the hist tools
79 for key in gsc_steps:
80 # Use defaultHistTools by default
81 if key not in configDict:
82 toolArray = defaultHistTools[key]
83
84 # In this case the full list of sub-tools has been specified in the YAML
85 # and the defaultDict will be fully overwritten (ie. all parameters must be specified)
86 elif isinstance(configDict[key],list):
87 toolArray = configDict[key]
88 for subDict in toolArray:
89 subDict.setdefault('inputFile',defaultFileGSC)
90
91 # Functionality to build the arrays of histogram reader from a shorter block in the YAML file
92 # Fall back on defaultHistTools for defaults
93 else:
94 baseDict = dict(configDict[key])
95 N_hist = baseDict.pop('N_hist')
96 histNameBase = baseDict.pop('histNameBase')
97 inputFile = baseDict.pop('inputFile', defaultFileGSC)
98 varX = baseDict.pop('varX',defaultHistTools[key][0]['varX'])
99 varY = baseDict.pop('varY', defaultHistTools[key][0]['varY'])
100 toolArray = [dict(varX = varX, varY = varY, histName=f'{histNameBase}_{j}', inputFile = inputFile) for j in range(N_hist)]
101
102 # Convert array of properties to HistoInput tools
103 configDict[key] = [HistoInputCfg(flags, Tname=f"{key.split('_')[1]}_{j}", **toolConfig) for j, toolConfig in enumerate(toolArray)]
104
105 GSCstep = CompFactory.GSCCalibStep("gsccalibstep", **configDict)
106
107 return [GSCstep]
108

◆ insituStep()

JetCalibStepsConfig.insituStep ( flags,
** configDic )

Definition at line 134 of file JetCalibStepsConfig.py.

134def insituStep(flags, **configDic):
135
136 histEtaInterCalib = configDic.pop('histEtaInterCalib')
137 histAbsCalib = configDic.pop('histAbsCalib')
138
139 histAbsJMSCalib = configDic.pop('JMS',None)
140
141 histoReaderEta_vec, histoReaderAbs_vec = [], []
142
143 for infile in configDic.pop('fileInsitu'):
144 histoReaderEta_vec.append(dict(inputFile = PathResolver.FindCalibFile(infile), **histEtaInterCalib))
145 histoReaderAbs_vec.append(dict(inputFile = PathResolver.FindCalibFile(infile), **histAbsCalib))
146
147 configDic['HistoReaderEtaInter'] = [HistoInputCfg(flags, "HistToolEtaInter"+str(j), **etaDic) for j, etaDic in enumerate(histoReaderEta_vec)]
148 configDic['HistoReaderAbs'] = [HistoInputCfg(flags, "HistToolAbs"+str(j), **absDic) for j, absDic in enumerate(histoReaderAbs_vec)]
149
150 configDic['vartool1'] = VarToolCfg(flags, var=histEtaInterCalib['varX'], Tname="VarTool")
151 configDic['vartool2'] = VarToolCfg(flags, var=histEtaInterCalib['varY'], Tname="VarTool")
152 configDic['isMC'] = flags.Input.isMC
153
154 insituSteps = [CompFactory.InSituCalibStep("insitucalibstep", **configDic)]
155
156 # JMS
157 if histAbsJMSCalib:
158 histAbsJMSCalib['inputFile'] = PathResolver.FindCalibFile(histAbsJMSCalib['inputFile'])
159 insituSteps.append(
160 CompFactory.InSituJMSCalibStep("insitujmscalibstep",
161 CalibrateMC = configDic.get("CalibrateMC",False),
162 isMC = flags.Input.isMC,
163 # modifying insitu scale rather than defining a new scale
164 InScale = "JetInsituScaleMomentum",
165 OutScale = "JetInsituScaleMomentum",
166 HistoReaderAbsJMS = HistoInputCfg(flags, "HistoToolAbsJMS", **histAbsJMSCalib),
167 ))
168
169 return insituSteps
170

◆ jmsStep()

JetCalibStepsConfig.jmsStep ( flags,
** configDic )

Definition at line 120 of file JetCalibStepsConfig.py.

120def jmsStep(flags, **configDic):
121
122 histoParams = configDic.pop('histoParams')
123 histoParams['inputFile'] = PathResolver.FindCalibFile(configDic.pop('HistoFile'))
124
125 configDic["histoReaderJMS"] = HistoInputCfg(flags, "HistToolJMS", **histoParams)
126 configDic['varToolX'] = VarToolCfg(flags, var=histoParams['varX'], Tname="VarToolX_JMS")
127 configDic['varToolZ'] = VarToolCfg(flags, var=histoParams['varZ'], Tname="VarToolZ_JMS")
128
129 jmsstep = CompFactory.JMSCalibStep("JMSCalib",
130 **configDic
131 )
132 return [jmsstep]
133

◆ load_yaml_cfg()

JetCalibStepsConfig.load_yaml_cfg ( configFile)

Definition at line 385 of file JetCalibStepsConfig.py.

385def load_yaml_cfg(configFile):
386 from yaml import safe_load
387
388 path_configFile = PathResolver.FindCalibFile(configFile)
389 configDic = safe_load(open(path_configFile))
390 return configDic
391
392

◆ mc2mcStep()

JetCalibStepsConfig.mc2mcStep ( flags,
** configDic )

Definition at line 196 of file JetCalibStepsConfig.py.

196def mc2mcStep(flags, **configDic):
197
198 # Generator and version are the first item
199 for key, value in flags.Input.GeneratorsInfo.items():
200 generator = key
201 generator_version = value
202 break
203
204 # Get the shower model:
205 showerModel = ''
206 # Check first if the DSID is on the exceptions list
207 mcDSID = flags.Input.MCChannelNumber
208 with open(PathResolver.FindCalibFile("JetCalibTools/MC2MC_exceptions_DSID.json")) as read_file:
209 data = json.load(read_file)
210 for key, value in data.items():
211 if key == mcDSID:
212 showerModel = value
213
214 if showerModel == '':
215 genType, psType, hadType = generatorDic[generator]
216 version = generator_version.replace('.','')[:3]
217 if (generator == 'Pythia8' or generator == 'Pythia8B') and not version.startswith('8'):
218 version = '8'+version
219 showerModel = genType+"-"+version+"-"+psType+"-"+hadType
220
221 with open(PathResolver.FindCalibFile("JetCalibTools/MC2MC_showerRemap.json")) as read_file:
222 data = json.load(read_file)
223 foundMatch = False
224 for key, value in data.items():
225 if key == showerModel:
226 showerModel = value
227 foundMatch = True
228 break
229 if not foundMatch:
230 for key, value in data.items():
231 if key == genType+"-"+version:
232 showerModel = value+"-"+psType+"-"+hadType
233 break
234
235 # Get the settings for the histograms:
236 baseHistoParams = configDic.pop('histoParams')
237 baseHistoParams['inputFile'] = PathResolver.FindCalibFile(configDic.pop('CalibConstantFileName')+'_'+showerModel+'.root')
238
239 histNameBase = baseHistoParams.pop('histNameBase')
240 for flav in configDic.pop('flavours'):
241 if flav == 'c':
242 configDic['doCjetCorrection'] = True
243 elif flav == 'b':
244 configDic['doBjetCorrection'] = True
245 histoParams = dict(varX = baseHistoParams['varX'],varY = baseHistoParams['varY'],
246 histName=f'{histNameBase}_{flav}',
247 inputFile=baseHistoParams['inputFile'])
248 configDic['mc2mcHist_'+flav] = HistoInputCfg(flags,Tname='HistoTool_MC2MC_'+flav,**histoParams)
249
250 configDic['isMC2MCCorr'] = True
251
252 return [CompFactory.Generic4VecCorrectionStep("MC2MC", **configDic)]
253

◆ ptResidualStep()

JetCalibStepsConfig.ptResidualStep ( flags,
** configDic )

Definition at line 180 of file JetCalibStepsConfig.py.

180def ptResidualStep(flags, **configDic):
181
182 # Get the settings for the histograms:
183 histoParams = configDic.pop('histoParams')
184
185 # Define varTool to switch to bin centers
186 if configDic['useBinCenter']:
187 varYHisto = histoParams.pop('varYHisto')
188 configDic['varTool'] = VarToolCfg(flags, var=varYHisto, Tname="VarTool_for_binCenter")
189
190 histoParams['inputFile'] = PathResolver.FindCalibFile(configDic.pop('CalibConstantFile'))
191 # 2D histogram with correction factors
192 configDic["histoTool"] = HistoInputCfg(flags, "histoTool", **histoParams)
193
194 return [CompFactory.Generic4VecCorrectionStep("PtResidual", **configDic)]
195

◆ puresidualStep()

JetCalibStepsConfig.puresidualStep ( flags,
** configDict )

Definition at line 53 of file JetCalibStepsConfig.py.

53def puresidualStep(flags, **configDict):
54
55 configDict.setdefault('IsData', not flags.Input.isMC)
56 PU_step = CompFactory.Pileup1DResidualCalibStep("PUResid", **configDict)
57 return [PU_step]
58
59

◆ smearingStep()

JetCalibStepsConfig.smearingStep ( flags,
** configDict )
Configuration of the Smearing step. 

Definition at line 20 of file JetCalibStepsConfig.py.

20def smearingStep(flags, **configDict):
21 """ Configuration of the Smearing step. """
22
23 # HistoReaderMC and HistoReaderData can be specified simultaneously using a single "HistoReader" YAML block.
24 # This should contain the common configuration for both and histNameMC/histNameData entries for the histogram names.
25 # This cannot be used simultaneously with a HistoReaderMC or HistoReaderData block
26 if "HistoReader" in configDict:
27 if "HistoReaderMC" in configDict:
28 raise JetCalibConfigError("Both HistoReader and HistoReaderMC blocks included in YAML config")
29 if "HistoReaderData" in configDict:
30 raise JetCalibConfigError("Both HistoReader and HistoReaderData blocks included in YAML config")
31
32 # Build the HistoReaderMC and HistoReaderData blocks from the HistoReader block
33 histoReader = configDict.pop("HistoReader")
34 histNameMC = histoReader.pop("histNameMC")
35 histNameData = histoReader.pop("histNameData")
36 configDict["HistoReaderMC"] = dict(histoReader)
37 configDict["HistoReaderData"] = dict(histoReader)
38 configDict["HistoReaderMC"]["histName"] = histNameMC
39 configDict["HistoReaderData"]["histName"] = histNameData
40
41 configDict["HistoReaderMC"]["inputFile"] = PathResolver.FindCalibFile(configDict["HistoReaderMC"]["inputFile"])
42 configDict["HistoReaderData"]["inputFile"] = PathResolver.FindCalibFile(configDict["HistoReaderData"]["inputFile"])
43
44 histToolMC = HistoInputCfg(flags, "HistToolMC", **configDict["HistoReaderMC"])
45 histToolData = HistoInputCfg(flags, "HistToolData", **configDict["HistoReaderData"])
46 configDict["HistoReaderMC"] = histToolMC
47 configDict["HistoReaderData"] = histToolData
48
49 smearStep = CompFactory.SmearingCalibStep("SmearingCalibStep", **configDict)
50
51 return [smearStep]
52

Variable Documentation

◆ calibStepDic

JetCalibStepsConfig.calibStepDic
Initial value:
1= dict(
2 JetArea = None,
3 Residual = puresidualStep,
4 EtaJES = etajesStep,
5 JMS = jmsStep,
6 GSC = gscStep,
7 Insitu = insituStep,
8 Smear = smearingStep,
9 AF3 = af3Step,
10 PtResidual = ptResidualStep,
11 MC2MC = mc2mcStep,
12
13)

Definition at line 256 of file JetCalibStepsConfig.py.

◆ generatorDic

dict JetCalibStepsConfig.generatorDic
Initial value:
1= {
2 "Herwigpp": ["Herwigpp", "angular", "cluster"],
3 "Herwig7": ["Herwig", "angular", "cluster"],
4 "Sherpa": ["Sherpa", "dipole", "cluster"],
5 "Pythia8B": ["PythiaB", "dipole", "cluster"],
6 "Pythia8": ["Pythia", "dipole", "cluster"]
7}

Definition at line 271 of file JetCalibStepsConfig.py.

◆ jcslog

JetCalibStepsConfig.jcslog = Logging.logging.getLogger('JetCalibStepsConfig')

Definition at line 12 of file JetCalibStepsConfig.py.