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, forceCalibSeq, calibSeq, **configDict)
 calibToolFromConfigFile (flags, configFile, name="jetcalib", forceCalibSeq=False, calibSeq="")
 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,
forceCalibSeq,
calibSeq,
** 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 281 of file JetCalibStepsConfig.py.

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

◆ calibToolFromConfigFile()

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

Definition at line 381 of file JetCalibStepsConfig.py.

381def calibToolFromConfigFile(flags, configFile, name = "jetcalib", forceCalibSeq = False, calibSeq = ""):
382
383 jcslog.info(f'Configuring JetCalibTools with {configFile}')
384
385 configDic = load_yaml_cfg(configFile)
386
387 globalSettings = configDic.pop('Global',{})
388
389 calibTool = CompFactory.JetCalibTool(name, CalibSteps=calibConfigToToolList(flags, forceCalibSeq, calibSeq, **configDic), **globalSettings)
390 return calibTool
391

◆ 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 392 of file JetCalibStepsConfig.py.

392def load_yaml_cfg(configFile):
393 from yaml import safe_load
394
395 path_configFile = PathResolver.FindCalibFile(configFile)
396 configDic = safe_load(open(path_configFile))
397 return configDic
398
399

◆ 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 jcslog.info(f'Using shower model {showerModel} for the MC-to-MC correction')
236
237 # Get the settings for the histograms:
238 baseHistoParams = configDic.pop('histoParams')
239 baseHistoParams['inputFile'] = PathResolver.FindCalibFile(configDic.pop('CalibConstantFileName')+'_'+showerModel+'.root')
240
241 histNameBase = baseHistoParams.pop('histNameBase')
242 for flav in configDic.pop('flavours'):
243 if flav == 'c':
244 configDic['doCjetCorrection'] = True
245 elif flav == 'b':
246 configDic['doBjetCorrection'] = True
247 histoParams = dict(varX = baseHistoParams['varX'],varY = baseHistoParams['varY'],
248 histName=f'{histNameBase}_{flav}',
249 inputFile=baseHistoParams['inputFile'])
250 configDic['mc2mcHist_'+flav] = HistoInputCfg(flags,Tname='HistoTool_MC2MC_'+flav,**histoParams)
251
252 configDic['isMC2MCCorr'] = True
253
254 return [CompFactory.Generic4VecCorrectionStep("MC2MC", **configDic)]
255

◆ 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 258 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 273 of file JetCalibStepsConfig.py.

◆ jcslog

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

Definition at line 12 of file JetCalibStepsConfig.py.