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 AthenaConfiguration.Enums
import LHCPeriod
18from PathResolver
import PathResolver
22 """ Configuration of the Smearing step. """
24 configDict.setdefault(
'OutScale',
'JetSmearedMomentum')
29 if "HistoReader" in configDict:
30 if "HistoReaderMC" in configDict:
31 raise JetCalibConfigError(
"Both HistoReader and HistoReaderMC blocks included in YAML config")
32 if "HistoReaderData" in configDict:
33 raise JetCalibConfigError(
"Both HistoReader and HistoReaderData blocks included in YAML config")
36 histoReader = configDict.pop(
"HistoReader")
37 histNameMC = histoReader.pop(
"histNameMC")
38 histNameData = histoReader.pop(
"histNameData")
39 configDict[
"HistoReaderMC"] = dict(histoReader)
40 configDict[
"HistoReaderData"] = dict(histoReader)
41 configDict[
"HistoReaderMC"][
"histName"] = histNameMC
42 configDict[
"HistoReaderData"][
"histName"] = histNameData
47 histToolMC = HistoInputCfg(flags,
"HistToolMC", **configDict[
"HistoReaderMC"])
48 histToolData = HistoInputCfg(flags,
"HistToolData", **configDict[
"HistoReaderData"])
49 configDict[
"HistoReaderMC"] = histToolMC
50 configDict[
"HistoReaderData"] = histToolData
52 smearStep = CompFactory.SmearingCalibStep(
"SmearingCalibStep", **configDict)
57 configDict.setdefault(
'OutScale',
'JetPileupScaleMomentum')
58 configDict.setdefault(
'IsData',
not flags.Input.isMC)
59 PU_step = CompFactory.Pileup1DResidualCalibStep(
"PUResid", **configDict)
64 configDict.setdefault(
'OutScale',
'JetPileupScaleMomentum')
65 configDict.setdefault(
'IsData',
not flags.Input.isMC)
67 histoParamsMu = configDict.pop(
'histoParamsMu')
69 histoParamsMu[
'inputFile'] = inputFile
71 histoParamsNPV = configDict.pop(
'histoParamsNPV')
72 histoParamsNPV[
'inputFile'] = inputFile
74 histToolMu = HistoInputCfg(flags,
"HistToolMu", **histoParamsMu)
75 histToolNPV = HistoInputCfg(flags,
"HistToolNPV", **histoParamsNPV)
76 configDict[
"histTool_mu"] = histToolMu
77 configDict[
"histTool_NPV"] = histToolNPV
79 PU_step = CompFactory.PileupCalibStep(
"PileUpCorrection", **configDict)
84 configDict.setdefault(
'OutScale',
'JetGSCScaleMomentum')
89 defaultHistTools = dict(
90 histTool_EM3 = [dict(varX =
"pt", varY =
"EM3", histName=f
"AntiKt4EMPFlow_EM3_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(35)],
91 histTool_CharFrac = [dict(varX =
"pt", varY =
"ChargedFraction", histName = f
"AntiKt4EMPFlow_chargedFraction_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(25)],
92 histTool_Tile0 = [dict(varX =
"pt", varY =
"Tile0", histName=f
"AntiKt4EMPFlow_Tile0_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(18)],
93 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)],
94 histTool_trackWIDTH=[dict(varX =
"pt", varY =
"trackWIDTH", histName=f
"AntiKt4EMPFlow_trackWIDTH_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(25)],
95 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)],
99 if configDict.get(
'applyChargedFraction',
True):
100 gsc_steps.append(
'histTool_CharFrac')
101 if configDict.get(
'applyEM3',
True):
102 gsc_steps.append(
'histTool_EM3')
103 if configDict.get(
'applyTile0',
True):
104 gsc_steps.append(
'histTool_Tile0')
105 if configDict.get(
'applyNtrk',
True):
106 gsc_steps.append(
'histTool_nTrk')
107 if configDict.get(
'applyTrackWidth',
True):
108 gsc_steps.append(
'histTool_trackWIDTH')
109 if configDict.get(
'applyPunchThrough',
False):
110 gsc_steps.append(
'histTool_PunchThrough')
113 for key
in gsc_steps:
115 if key
not in configDict:
116 toolArray = defaultHistTools[key]
120 elif isinstance(configDict[key],list):
121 toolArray = configDict[key]
122 for subDict
in toolArray:
123 subDict.setdefault(
'inputFile',defaultFileGSC)
128 baseDict = dict(configDict[key])
129 N_hist = baseDict.pop(
'N_hist')
130 histNameBase = baseDict.pop(
'histNameBase')
131 inputFile = baseDict.pop(
'inputFile', defaultFileGSC)
132 varX = baseDict.pop(
'varX',defaultHistTools[key][0][
'varX'])
133 varY = baseDict.pop(
'varY', defaultHistTools[key][0][
'varY'])
134 toolArray = [dict(varX = varX, varY = varY, histName=f
'{histNameBase}_{j}', inputFile = inputFile)
for j
in range(N_hist)]
137 configDict[key] = [HistoInputCfg(flags, Tname=f
"{key.split('_')[1]}_{j}", **toolConfig)
for j, toolConfig
in enumerate(toolArray)]
139 GSCstep = CompFactory.GSCCalibStep(
"gsccalibstep", **configDict)
144 configDic.setdefault(
'OutScale',
'JetEtaJESScaleMomentum')
145 pVars = configDic.pop(
"ParametrizedVars")
147 jesstep = CompFactory.EtaJESCalibStep(
"EtaJESCalib",
148 VarToolE= VarToolCfg(flags, var=pVars[
'varE']),
149 VarToolEta= VarToolCfg(flags, var=pVars[
"varEta"]),
156 configDic.setdefault(
'OutScale',
'JetJMSScaleMomentum')
157 histoParams = configDic.pop(
'histoParams')
160 configDic[
"histoReaderJMS"] = HistoInputCfg(flags,
"HistToolJMS", **histoParams)
161 configDic[
'varToolX'] = VarToolCfg(flags, var=histoParams[
'varX'], Tname=
"VarToolX_JMS")
162 configDic[
'varToolZ'] = VarToolCfg(flags, var=histoParams[
'varZ'], Tname=
"VarToolZ_JMS")
164 jmsstep = CompFactory.JMSCalibStep(
"JMSCalib",
170 configDic.setdefault(
'OutScale',
'JetInsituScaleMomentum')
171 histEtaInterCalib = configDic.pop(
'histEtaInterCalib')
172 histAbsCalib = configDic.pop(
'histAbsCalib')
174 histAbsJMSCalib = configDic.pop(
'JMS',
None)
176 histoReaderEta_vec, histoReaderAbs_vec = [], []
178 for infile
in configDic.pop(
'fileInsitu'):
182 configDic[
'HistoReaderEtaInter'] = [HistoInputCfg(flags,
"HistToolEtaInter"+str(j), **etaDic)
for j, etaDic
in enumerate(histoReaderEta_vec)]
183 configDic[
'HistoReaderAbs'] = [HistoInputCfg(flags,
"HistToolAbs"+str(j), **absDic)
for j, absDic
in enumerate(histoReaderAbs_vec)]
185 configDic[
'isMC'] = flags.Input.isMC
187 insituSteps = [CompFactory.InSituCalibStep(
"insitucalibstep", **configDic)]
193 CompFactory.InSituJMSCalibStep(
"insitujmscalibstep",
194 CalibrateMC = configDic.get(
"CalibrateMC",
False),
195 isMC = flags.Input.isMC,
197 InScale =
"JetInsituScaleMomentum",
198 OutScale =
"JetInsituScaleMomentum",
199 HistoReaderAbsJMS = HistoInputCfg(flags,
"HistoToolAbsJMS", **histAbsJMSCalib),
205 configDic.setdefault(
'OutScale',
'JetFastSimScaleMomentum')
207 histoParams = configDic.pop(
'histoParams')
209 configDic[
"histoTool"] = HistoInputCfg(flags,
"histoTool", **histoParams)
211 return [CompFactory.Generic4VecCorrectionStep(
"AF3", **configDic)]
214 configDic.setdefault(
'OutScale',
'JetPtResidualScaleMomentum')
216 histoParams = configDic.pop(
'histoParams')
219 if configDic[
'useBinCenter']:
220 varYHisto = histoParams.pop(
'varYHisto')
221 configDic[
'varTool'] = VarToolCfg(flags, var=varYHisto, Tname=
"VarTool_for_binCenter")
225 configDic[
"histoTool"] = HistoInputCfg(flags,
"histoTool", **histoParams)
227 return [CompFactory.Generic4VecCorrectionStep(
"PtResidual", **configDic)]
230 configDic.setdefault(
'OutScale',
'JetMC2MCScaleMomentum')
232 for key, value
in flags.Input.GeneratorsInfo.items():
234 generator_version = value
240 mcDSID = flags.Input.MCChannelNumber
242 data = json.load(read_file)
243 for key, value
in data.items():
247 if showerModel ==
'':
248 genType, psType, hadType = generatorDic[generator]
249 version = generator_version.replace(
'.',
'')[:3]
250 if (generator ==
'Pythia8' or generator ==
'Pythia8B')
and not version.startswith(
'8'):
251 version =
'8'+version
252 showerModel = genType+
"-"+version+
"-"+psType+
"-"+hadType
255 data = json.load(read_file)
257 for key, value
in data.items():
258 if key == showerModel:
263 for key, value
in data.items():
264 if key == genType+
"-"+version:
265 showerModel = value+
"-"+psType+
"-"+hadType
268 jcslog.info(f
'Using shower model {showerModel} for the MC-to-MC correction')
271 baseHistoParams = configDic.pop(
'histoParams')
274 histNameBase = baseHistoParams.pop(
'histNameBase')
275 for flav
in configDic.pop(
'flavours'):
277 configDic[
'doCjetCorrection'] =
True
279 configDic[
'doBjetCorrection'] =
True
280 histoParams = dict(varX = baseHistoParams[
'varX'],varY = baseHistoParams[
'varY'],
281 histName=f
'{histNameBase}_{flav}',
282 inputFile=baseHistoParams[
'inputFile'])
283 configDic[
'mc2mcHist_'+flav] = HistoInputCfg(flags,Tname=
'HistoTool_MC2MC_'+flav,**histoParams)
285 configDic[
'isMC2MCCorr'] =
True
287 return [CompFactory.Generic4VecCorrectionStep(
"MC2MC", **configDic)]
290 configDic.setdefault(
'OutScale',
'JetDNNScaleMomentum')
295 inputVarArray = configDic.pop(
'InputVars')
296 eScales = configDic.pop(
'EScales')
298 list_of_inputVarTools = []
300 for i, v
in enumerate(inputVarArray):
301 if v
in [
"NPV",
"mu"]:
302 list_of_inputVarTools.append(VarToolCfg(flags, v, f
'{v}', isJetVar=
False))
303 elif v
in [
"log_e",
"log_m"]:
306 list_of_inputVarTools.append(VarToolCfg(flags, v, f
'{v}', isJetVar=
True, Scale=eScales[i]))
308 list_of_inputVarTools.append(VarToolCfg(flags, v, f
'{v}', isJetVar=
True))
311 configDic[
"InputVarTool"] = list_of_inputVarTools
312 configDic[
"EScales"] = eScales
313 configDic[
"NormOffsets"] = configDic.pop(
'NormOffsets')
314 configDic[
"NormScales"] = configDic.pop(
'NormScales')
315 configDic[
"onnxInputShape"] = configDic.pop(
'onnxInputShape')
316 configDic[
"onnxOutputShape"] = configDic.pop(
'onnxOutputShape')
324 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
325 from AthOnnxComps.OnnxRuntimeInferenceConfig
import OnnxRuntimeInferenceToolCfg
326 onnxAcc = ComponentAccumulator()
327 configDic[
"ORTInferenceTool"] = onnxAcc.popToolsAndMerge(
328 OnnxRuntimeInferenceToolCfg(flags, model_fname=onnxModelPath, name=
"ORTInferenceTool_DNN")
332 DNNCalibStep = CompFactory.JetDNNCalibStep(
"JetDNNCalib", **configDic)
333 return [DNNCalibStep]
339 Residual = puresidualStep,
340 Pileup = puCorrectionStep,
345 Smear = smearingStep,
347 PtResidual = ptResidualStep,
349 DNNCalib = jetDNNCalibStep
355 "Herwigpp": [
"Herwigpp",
"angular",
"cluster"],
356 "Herwig7": [
"Herwig",
"angular",
"cluster"],
357 "Sherpa": [
"Sherpa",
"dipole",
"cluster"],
358 "Pythia8B": [
"PythiaB",
"dipole",
"cluster"],
359 "Pythia8": [
"Pythia",
"dipole",
"cluster"]
363 ''' Returns sample type (AF3/FullSim/Data) and run (Run2/Run3/Run4) '''
366 metaData = GetFileMD(flags.Input.Files[0])
367 simFlavour = metaData.get(
'Simulator',
'')
368 if 'ATLFAST3' in simFlavour:
371 sampleType =
'FullSim'
375 if flags.GeoModel.Run == LHCPeriod.Run2:
377 elif flags.GeoModel.Run == LHCPeriod.Run3:
379 elif flags.GeoModel.Run >= LHCPeriod.Run4:
382 jcslog.warning(
'LHCPeriod not recognised')
385 return sampleType, run
389 Returns (sequence, matched sample key) for a Sequence sub-block, which is either a plain
390 list of steps (matched key None) or a dict keyed by sample type. sampleKeys is the list of
391 accepted sample keys, in order of preference. Returns (None, None) if nothing matches.
393 if isinstance(seqBlock, list):
394 return seqBlock,
None
395 if isinstance(seqBlock, dict):
396 for key
in sampleKeys:
398 return seqBlock[key], key
403 Returns a list of instantiated tools for each of the calibration steps.
404 Tools are instantiated by calling functions declared in the calibStepDic dictionary.
405 The order of the steps is determined by the Sequence block of the config.
410 Specifies which sub-block of Sequence to take the calibration sequence from (e.g. Default/T0/Run3 etc.).
411 If not set, Default is used unless a "RunX" sub-block exists matching the metadata of the sample.
412 Default is also used if the requested sub-block has no entry for this sample type.
414 A dictionary of config options (usually extracted from a YAML config file).
420 sampleKeys = [sampleKey]
if sampleKey==
'Data' else [sampleKey,
'MC']
423 if 'Sequence' not in configDict:
425 seqDict = configDict.pop(
'Sequence')
428 if calibSeqKey
is None:
429 calibSeqKey = runKey
if sequenceForSample(seqDict.get(runKey), sampleKeys)[0]
else 'Default'
431 if calibSeqKey
not in seqDict:
438 if sequence
is None and calibSeqKey!=
'Default':
439 jcslog.warning(f
'No {sampleKey} sequence in Sequence[{calibSeqKey}] - falling back on Default')
440 calibSeqKey =
'Default'
445 raise JetCalibConfigError(f
'No sequence for sample type "{sampleKey}" found in Sequence[{calibSeqKey}] YAML sub-block')
447 jcslog.info(f
'Using {calibSeqKey} step sequence' + (f
' for {matchedKey}' if matchedKey
else ''))
450 jcslog.debug(
'Configuring jet calib steps:')
451 for step
in sequence:
453 if step
not in configDict:
456 calibConfig = configDict[step]
457 calibConfig.pop(
'prereqs',{})
460 if calibConfig.pop(
'noRun',
False):
461 jcslog.warning(f
'Expert option: Skipping calib step {step}')
465 if step==
"Insitu" and flags.Input.isMC
and not calibConfig.get(
"CalibrateMC",
False):
466 jcslog.warning(
'Insitu step included for MC but CalibrateMC is False - no calibration will be run')
470 if not flags.Input.isMC:
471 jcslog.warning(
'Running MC2MC calibration for data')
474 generator = next(iter(flags.Input.GeneratorsInfo),
'')
475 if 'Pythia' in generator:
476 jcslog.debug(
'Skipping MC2MC calibration for Pythia8')
481 if not flags.Input.isMC:
482 jcslog.warning(
'Running FastSimulation calibration for data')
484 if sampleKey==
'FullSim':
485 jcslog.warning(
'Running FastSimulation calibration for full sim')
487 calibFunc = calibStepDic.get(step,
None)
489 if calibFunc
is None:
490 raise NotImplementedError(f
'Calibration step {step} is not found in calibStepDic')
494 runOverrides = {key: calibConfig.pop(key)
for key
in [
'Run2',
'Run3',
'Run4']
if key
in calibConfig}
495 for key, value
in runOverrides.get(runKey,{}).items():
496 jcslog.debug(f
'{step}: Applying {runKey} override for {key}')
497 if key
in calibConfig:
498 jcslog.warning(f
'{key} will be overwritten by {runKey} settings')
499 calibConfig[key] = value
503 inScale =
'JetConstitScaleMomentum'
505 inScale = toolList[-1].OutScale
507 configInScale = calibConfig.setdefault(
'InScale', inScale)
509 if configInScale!=inScale:
510 jcslog.warning(f
'InScale set to {configInScale} in YAML config, but expected {inScale} from Sequence ordering -- is this intentional?')
514 newToolList = calibFunc(flags, **calibConfig)
515 jcslog.debug(f
'{step}: InScale = {newToolList[0].InScale}, OutScale = {newToolList[-1].OutScale}')
517 toolList += newToolList
523 Returns a list of instantiated tools for each of the calibration steps.
524 The order of the steps is determined by the Sequence block of the config.
529 Path to YAML configuration file
531 Internal name of the configured jet calib tool
533 Specifies which sub-block of Sequence to take the calibration sequence from (e.g. Default/T0/Run3 etc.).
534 If not set, Default is used unless a "RunX" sub-block exists matching the metadata of the sample.
535 Default is also used if the requested sub-block has no entry for this sample type.
537 infoMsg = f
'Configuring JetCalibTools with {configFile}'
542 globalSettings = configDic.pop(
'Global',{})
544 calibTool = CompFactory.JetCalibTool(name, CalibSteps=
calibConfigToToolList(flags, calibSeqKey, **configDic), **globalSettings)
548 ''' Return baseDict with keys recursively overwritten by extendDict '''
549 merged = dict(baseDict)
550 for key, value
in extendDict.items():
551 if isinstance(merged.get(key), dict)
and isinstance(value, dict):
552 merged[key] =
combine(merged[key], value)
559 from yaml
import safe_load
562 configDic = safe_load(open(path_configFile))
565 baseConfigFile = configDic.pop(
'BaseConfig',
None)
566 if not baseConfigFile:
569 jcslog.info(f
'Extending base config file {baseConfigFile} with supplied overrides')
572 combinedConfig =
combine(baseConfigDic, configDic)
573 return combinedConfig
576 """ Exception raised for invalid jet calibration config """
static std::string FindCalibFile(const std::string &logical_file_name)
smearingStep(flags, **configDict)
jmsStep(flags, **configDic)
combine(baseDict, extendDict)
puresidualStep(flags, **configDict)
load_yaml_cfg(configFile)
insituStep(flags, **configDic)
ptResidualStep(flags, **configDic)
af3Step(flags, **configDic)
calibToolFromConfigFile(flags, configFile, name="jetcalib", calibSeqKey=None)
mc2mcStep(flags, **configDic)
sequenceForSample(seqBlock, sampleKeys)
puCorrectionStep(flags, **configDict)
calibConfigToToolList(flags, calibSeqKey=None, **configDict)
etajesStep(flags, **configDic)
jetDNNCalibStep(flags, **configDic)
gscStep(flags, **configDict)