3from AnaAlgorithm.DualUseConfig
import isAthena
8 import AnaAlgorithm.AlgSequence
9 import JetRecConfig.JetAnalysisCommon
11from AthenaCommon
import Logging
12jcslog = Logging.logging.getLogger(
'JetCalibStepsConfig')
14from JetToolHelpers.HelperConfig
import VarToolCfg, HistoInputCfg
15from AthenaConfiguration.ComponentFactory
import CompFactory
16from AthenaConfiguration.AutoConfigFlags
import GetFileMD
17from PathResolver
import PathResolver
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)
55 configDict.setdefault(
'IsData',
not flags.Input.isMC)
56 PU_step = CompFactory.Pileup1DResidualCalibStep(
"PUResid", **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)
111 pVars = configDic.pop(
"ParametrizedVars")
113 jesstep = CompFactory.EtaJESCalibStep(
"EtaJESCalib",
114 VarToolE= VarToolCfg(flags, var=pVars[
'varE']),
115 VarToolEta= VarToolCfg(flags, var=pVars[
"varEta"]),
122 histoParams = configDic.pop(
'histoParams')
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")
129 jmsstep = CompFactory.JMSCalibStep(
"JMSCalib",
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),
174 histoParams = configDic.pop(
'histoParams')
176 configDic[
"histoTool"] = HistoInputCfg(flags,
"histoTool", **histoParams)
178 return [CompFactory.Generic4VecCorrectionStep(
"AF3", **configDic)]
183 histoParams = configDic.pop(
'histoParams')
186 if configDic[
'useBinCenter']:
187 varYHisto = histoParams.pop(
'varYHisto')
188 configDic[
'varTool'] = VarToolCfg(flags, var=varYHisto, Tname=
"VarTool_for_binCenter")
192 configDic[
"histoTool"] = HistoInputCfg(flags,
"histoTool", **histoParams)
194 return [CompFactory.Generic4VecCorrectionStep(
"PtResidual", **configDic)]
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
235 jcslog.info(f
'Using shower model {showerModel} for the MC-to-MC correction')
238 baseHistoParams = configDic.pop(
'histoParams')
241 histNameBase = baseHistoParams.pop(
'histNameBase')
242 for flav
in configDic.pop(
'flavours'):
244 configDic[
'doCjetCorrection'] =
True
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)
252 configDic[
'isMC2MCCorr'] =
True
254 return [CompFactory.Generic4VecCorrectionStep(
"MC2MC", **configDic)]
260 Residual = puresidualStep,
265 Smear = smearingStep,
267 PtResidual = ptResidualStep,
274 "Herwigpp": [
"Herwigpp",
"angular",
"cluster"],
275 "Herwig7": [
"Herwig",
"angular",
"cluster"],
276 "Sherpa": [
"Sherpa",
"dipole",
"cluster"],
277 "Pythia8B": [
"PythiaB",
"dipole",
"cluster"],
278 "Pythia8": [
"Pythia",
"dipole",
"cluster"]
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.
290 metaData = GetFileMD(flags.Input.Files[0])
291 simFlavour = metaData.get(
'Simulator',
'')
292 if 'ATLFAST3' in simFlavour:
296 if flags.Input.isMC
and not isFullSim
and 'AF3' in configDict:
298 for step
in configDict:
299 if configDict.get(step)[
'InScale'] ==
'JetGSCScaleMomentum' and step !=
'Insitu' and step !=
'AF3':
300 configDict.get(step)[
'InScale'] =
'JetFastSimScaleMomentum'
305 for step
in configDict:
307 configDict.get(step).pop(
'prereqs',{})
309 if configDict.get(step).pop(
'noRun',
False):
310 jcslog.warning(f
'Expert option: Skipping calib step {step}')
314 if step==
"Insitu" and flags.Input.isMC
and not configDict.get(
"Insitu").
get(
"CalibrateMC",
False):
315 jcslog.debug(
'Skipping Insitu for MC')
320 if not flags.Input.isMC:
321 jcslog.debug(
'Skipping MC2MC calibration for data')
324 for key, value
in flags.Input.GeneratorsInfo.items():
327 if 'Pythia' in generator:
328 jcslog.debug(
'Skipping MC2MC calibration for Pythia8')
333 if not flags.Input.isMC:
334 jcslog.debug(
'Skipping additional FastSimulation calibration for data')
338 jcslog.debug(
'Skipping additional FastSimulation calibration for full sim')
341 calibFunc = calibStepDic.get(step,
None)
342 if calibFunc
is None:
343 raise NotImplementedError(f
'Calibration step {step} is not found in calibStepDic')
345 calibConfig = configDict.get(step)
348 toolList = calibFunc(flags, **calibConfig)
350 toolDic[step] = toolList
351 if toolList[0].InScale ==
"JetConstitScaleMomentum":
357 def findNextSteps(ordered_tools=[], ordered_step_names=[], startScale = "JetConstitScaleMomentum", calibSeq = ""):
358 ''' Recursively add tools to ordered_tools based on in/out scale '''
361 if step
not in calibSeq:
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)
368 return ordered_tools, ordered_step_names
370 ordered_tools, ordered_step_names = findNextSteps([], [],
"JetConstitScaleMomentum", calibSeq)
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?')
377 jcslog.info(f
'Ordered jet calib steps: {"->".join(ordered_step_names)}')
383 jcslog.info(f
'Configuring JetCalibTools with {configFile}')
387 globalSettings = configDic.pop(
'Global',{})
389 calibTool = CompFactory.JetCalibTool(name, CalibSteps=
calibConfigToToolList(flags, forceCalibSeq, calibSeq, **configDic), **globalSettings)
393 from yaml
import safe_load
396 configDic = safe_load(open(path_configFile))
401 """ Exception raised for invalid jet calibration config """
static std::string FindCalibFile(const std::string &logical_file_name)
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
calibToolFromConfigFile(flags, configFile, name="jetcalib", forceCalibSeq=False, calibSeq="")
mc2mcStep(flags, **configDic)
calibConfigToToolList(flags, forceCalibSeq, calibSeq, **configDict)
af3Step(flags, **configDic)
insituStep(flags, **configDic)
smearingStep(flags, **configDict)
gscStep(flags, **configDict)
puresidualStep(flags, **configDict)
etajesStep(flags, **configDic)
ptResidualStep(flags, **configDic)
load_yaml_cfg(configFile)
jmsStep(flags, **configDic)