14from JetToolHelpers.HelperConfig
import VarToolCfg, HistoInputCfg
21 """ Configuration of the Smearing step. """
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")
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
44 histToolMC = HistoInputCfg(flags,
"HistToolMC", **configDict[
"HistoReaderMC"])
45 histToolData = HistoInputCfg(flags,
"HistToolData", **configDict[
"HistoReaderData"])
46 configDict[
"HistoReaderMC"] = histToolMC
47 configDict[
"HistoReaderData"] = histToolData
49 smearStep = CompFactory.SmearingCalibStep(
"SmearingCalibStep", **configDict)
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)],
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')
81 if key
not in configDict:
82 toolArray = defaultHistTools[key]
86 elif isinstance(configDict[key],list):
87 toolArray = configDict[key]
88 for subDict
in toolArray:
89 subDict.setdefault(
'inputFile',defaultFileGSC)
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)]
103 configDict[key] = [HistoInputCfg(flags, Tname=f
"{key.split('_')[1]}_{j}", **toolConfig)
for j, toolConfig
in enumerate(toolArray)]
105 GSCstep = CompFactory.GSCCalibStep(
"gsccalibstep", **configDict)
136 histEtaInterCalib = configDic.pop(
'histEtaInterCalib')
137 histAbsCalib = configDic.pop(
'histAbsCalib')
139 histAbsJMSCalib = configDic.pop(
'JMS',
None)
141 histoReaderEta_vec, histoReaderAbs_vec = [], []
143 for infile
in configDic.pop(
'fileInsitu'):
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)]
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
154 insituSteps = [CompFactory.InSituCalibStep(
"insitucalibstep", **configDic)]
160 CompFactory.InSituJMSCalibStep(
"insitujmscalibstep",
161 CalibrateMC = configDic.get(
"CalibrateMC",
False),
162 isMC = flags.Input.isMC,
164 InScale =
"JetInsituScaleMomentum",
165 OutScale =
"JetInsituScaleMomentum",
166 HistoReaderAbsJMS = HistoInputCfg(flags,
"HistoToolAbsJMS", **histAbsJMSCalib),
199 for key, value
in flags.Input.GeneratorsInfo.items():
201 generator_version = value
207 mcDSID = flags.Input.MCChannelNumber
209 data = json.load(read_file)
210 for key, value
in data.items():
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
222 data = json.load(read_file)
224 for key, value
in data.items():
225 if key == showerModel:
230 for key, value
in data.items():
231 if key == genType+
"-"+version:
232 showerModel = value+
"-"+psType+
"-"+hadType
236 baseHistoParams = configDic.pop(
'histoParams')
239 histNameBase = baseHistoParams.pop(
'histNameBase')
240 for flav
in configDic.pop(
'flavours'):
242 configDic[
'doCjetCorrection'] =
True
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)
250 configDic[
'isMC2MCCorr'] =
True
252 return [CompFactory.Generic4VecCorrectionStep(
"MC2MC", **configDic)]
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.
288 metaData = GetFileMD(flags.Input.Files[0])
289 simFlavour = metaData.get(
'Simulator',
'')
290 if 'ATLFAST3' in simFlavour:
294 if flags.Input.isMC
and not isFullSim
and 'AF3' in configDict:
296 for step
in configDict:
297 if configDict.get(step)[
'InScale'] ==
'JetGSCScaleMomentum' and step !=
'Insitu' and step !=
'AF3':
298 configDict.get(step)[
'InScale'] =
'JetFastSimScaleMomentum'
303 for step
in configDict:
305 configDict.get(step).pop(
'prereqs',{})
307 if configDict.get(step).pop(
'noRun',
False):
308 jcslog.warning(f
'Expert option: Skipping calib step {step}')
312 if step==
"Insitu" and flags.Input.isMC
and not configDict.get(
"Insitu").
get(
"CalibrateMC",
False):
313 jcslog.info(
'Skipping Insitu for MC')
318 if not flags.Input.isMC:
319 jcslog.info(
'Skipping MC2MC calibration for data')
322 for key, value
in flags.Input.GeneratorsInfo.items():
325 if 'Pythia' in generator:
326 jcslog.info(
'Skipping MC2MC calibration for Pythia8')
331 if not flags.Input.isMC:
332 jcslog.info(
'Skipping additional FastSimulation calibration for data')
336 jcslog.info(
'Skipping additional FastSimulation calibration for full sim')
339 calibFunc = calibStepDic.get(step,
None)
340 if calibFunc
is None:
341 raise NotImplementedError(f
'Calibration step {step} is not found in calibStepDic')
343 calibConfig = configDict.get(step)
346 toolList = calibFunc(flags, **calibConfig)
348 toolDic[step] = toolList
349 if toolList[0].InScale ==
"JetConstitScaleMomentum":
355 def findNextSteps(ordered_tools=[], ordered_step_names=[], startScale = "JetConstitScaleMomentum"):
356 ''' Recursively add tools to ordered_tools based on in/out scale '''
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)
363 return ordered_tools, ordered_step_names
365 ordered_tools, ordered_step_names = findNextSteps([], [])
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?')
372 jcslog.info(f
'Ordered jet calib steps: {"->".join(ordered_step_names)}')