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)
63 configDict.setdefault(
'OutScale',
'JetPileupScaleMomentum')
64 configDict.setdefault(
'IsData',
not flags.Input.isMC)
66 histoParamsMu = configDict.pop(
'histoParamsMu')
68 histoParamsMu[
'inputFile'] = inputFile
70 histoParamsNPV = configDict.pop(
'histoParamsNPV')
71 histoParamsNPV[
'inputFile'] = inputFile
73 histToolMu = HistoInputCfg(flags,
"HistToolMu", **histoParamsMu)
74 histToolNPV = HistoInputCfg(flags,
"HistToolNPV", **histoParamsNPV)
75 configDict[
"histTool_mu"] = histToolMu
76 configDict[
"histTool_NPV"] = histToolNPV
78 PU_step = CompFactory.PileupAreaResidualCalibStep(
"PUAreaResidual", **configDict)
83 configDict.setdefault(
'OutScale',
'JetGSCScaleMomentum')
88 defaultHistTools = dict(
89 histTool_EM3 = [dict(varX =
"pt", varY =
"EM3", histName=f
"AntiKt4EMPFlow_EM3_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(35)],
90 histTool_CharFrac = [dict(varX =
"pt", varY =
"ChargedFraction", histName = f
"AntiKt4EMPFlow_chargedFraction_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(25)],
91 histTool_Tile0 = [dict(varX =
"pt", varY =
"Tile0", histName=f
"AntiKt4EMPFlow_Tile0_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(18)],
92 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)],
93 histTool_trackWIDTH=[dict(varX =
"pt", varY =
"trackWIDTH", histName=f
"AntiKt4EMPFlow_trackWIDTH_interpolation_resp_eta_{j}", inputFile=defaultFileGSC)
for j
in range(25)],
94 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)],
97 gsc_steps = [
'histTool_EM3',
'histTool_CharFrac',
'histTool_Tile0',
'histTool_nTrk',
'histTool_trackWIDTH']
98 if configDict.get(
'applyPunchThrough',
False):
99 gsc_steps.append(
'histTool_PunchThrough')
102 for key
in gsc_steps:
104 if key
not in configDict:
105 toolArray = defaultHistTools[key]
109 elif isinstance(configDict[key],list):
110 toolArray = configDict[key]
111 for subDict
in toolArray:
112 subDict.setdefault(
'inputFile',defaultFileGSC)
117 baseDict = dict(configDict[key])
118 N_hist = baseDict.pop(
'N_hist')
119 histNameBase = baseDict.pop(
'histNameBase')
120 inputFile = baseDict.pop(
'inputFile', defaultFileGSC)
121 varX = baseDict.pop(
'varX',defaultHistTools[key][0][
'varX'])
122 varY = baseDict.pop(
'varY', defaultHistTools[key][0][
'varY'])
123 toolArray = [dict(varX = varX, varY = varY, histName=f
'{histNameBase}_{j}', inputFile = inputFile)
for j
in range(N_hist)]
126 configDict[key] = [HistoInputCfg(flags, Tname=f
"{key.split('_')[1]}_{j}", **toolConfig)
for j, toolConfig
in enumerate(toolArray)]
128 GSCstep = CompFactory.GSCCalibStep(
"gsccalibstep", **configDict)
133 configDic.setdefault(
'OutScale',
'JetEtaJESScaleMomentum')
134 pVars = configDic.pop(
"ParametrizedVars")
136 jesstep = CompFactory.EtaJESCalibStep(
"EtaJESCalib",
137 VarToolE= VarToolCfg(flags, var=pVars[
'varE']),
138 VarToolEta= VarToolCfg(flags, var=pVars[
"varEta"]),
145 configDic.setdefault(
'OutScale',
'JetJMSScaleMomentum')
146 histoParams = configDic.pop(
'histoParams')
149 configDic[
"histoReaderJMS"] = HistoInputCfg(flags,
"HistToolJMS", **histoParams)
150 configDic[
'varToolX'] = VarToolCfg(flags, var=histoParams[
'varX'], Tname=
"VarToolX_JMS")
151 configDic[
'varToolZ'] = VarToolCfg(flags, var=histoParams[
'varZ'], Tname=
"VarToolZ_JMS")
153 jmsstep = CompFactory.JMSCalibStep(
"JMSCalib",
159 configDic.setdefault(
'OutScale',
'JetInsituScaleMomentum')
160 histEtaInterCalib = configDic.pop(
'histEtaInterCalib')
161 histAbsCalib = configDic.pop(
'histAbsCalib')
163 histAbsJMSCalib = configDic.pop(
'JMS',
None)
165 histoReaderEta_vec, histoReaderAbs_vec = [], []
167 for infile
in configDic.pop(
'fileInsitu'):
171 configDic[
'HistoReaderEtaInter'] = [HistoInputCfg(flags,
"HistToolEtaInter"+str(j), **etaDic)
for j, etaDic
in enumerate(histoReaderEta_vec)]
172 configDic[
'HistoReaderAbs'] = [HistoInputCfg(flags,
"HistToolAbs"+str(j), **absDic)
for j, absDic
in enumerate(histoReaderAbs_vec)]
174 configDic[
'isMC'] = flags.Input.isMC
176 insituSteps = [CompFactory.InSituCalibStep(
"insitucalibstep", **configDic)]
182 CompFactory.InSituJMSCalibStep(
"insitujmscalibstep",
183 CalibrateMC = configDic.get(
"CalibrateMC",
False),
184 isMC = flags.Input.isMC,
186 InScale =
"JetInsituScaleMomentum",
187 OutScale =
"JetInsituScaleMomentum",
188 HistoReaderAbsJMS = HistoInputCfg(flags,
"HistoToolAbsJMS", **histAbsJMSCalib),
194 configDic.setdefault(
'OutScale',
'JetFastSimScaleMomentum')
196 histoParams = configDic.pop(
'histoParams')
198 configDic[
"histoTool"] = HistoInputCfg(flags,
"histoTool", **histoParams)
200 return [CompFactory.Generic4VecCorrectionStep(
"AF3", **configDic)]
203 configDic.setdefault(
'OutScale',
'JetPtResidualScaleMomentum')
205 histoParams = configDic.pop(
'histoParams')
208 if configDic[
'useBinCenter']:
209 varYHisto = histoParams.pop(
'varYHisto')
210 configDic[
'varTool'] = VarToolCfg(flags, var=varYHisto, Tname=
"VarTool_for_binCenter")
214 configDic[
"histoTool"] = HistoInputCfg(flags,
"histoTool", **histoParams)
216 return [CompFactory.Generic4VecCorrectionStep(
"PtResidual", **configDic)]
219 configDic.setdefault(
'OutScale',
'JetMC2MCScaleMomentum')
221 for key, value
in flags.Input.GeneratorsInfo.items():
223 generator_version = value
229 mcDSID = flags.Input.MCChannelNumber
231 data = json.load(read_file)
232 for key, value
in data.items():
236 if showerModel ==
'':
237 genType, psType, hadType = generatorDic[generator]
238 version = generator_version.replace(
'.',
'')[:3]
239 if (generator ==
'Pythia8' or generator ==
'Pythia8B')
and not version.startswith(
'8'):
240 version =
'8'+version
241 showerModel = genType+
"-"+version+
"-"+psType+
"-"+hadType
244 data = json.load(read_file)
246 for key, value
in data.items():
247 if key == showerModel:
252 for key, value
in data.items():
253 if key == genType+
"-"+version:
254 showerModel = value+
"-"+psType+
"-"+hadType
257 jcslog.info(f
'Using shower model {showerModel} for the MC-to-MC correction')
260 baseHistoParams = configDic.pop(
'histoParams')
263 histNameBase = baseHistoParams.pop(
'histNameBase')
264 for flav
in configDic.pop(
'flavours'):
266 configDic[
'doCjetCorrection'] =
True
268 configDic[
'doBjetCorrection'] =
True
269 histoParams = dict(varX = baseHistoParams[
'varX'],varY = baseHistoParams[
'varY'],
270 histName=f
'{histNameBase}_{flav}',
271 inputFile=baseHistoParams[
'inputFile'])
272 configDic[
'mc2mcHist_'+flav] = HistoInputCfg(flags,Tname=
'HistoTool_MC2MC_'+flav,**histoParams)
274 configDic[
'isMC2MCCorr'] =
True
276 return [CompFactory.Generic4VecCorrectionStep(
"MC2MC", **configDic)]
282 Residual = puresidualStep,
283 ResidualNew = newpuresidualStep,
288 Smear = smearingStep,
290 PtResidual = ptResidualStep,
297 "Herwigpp": [
"Herwigpp",
"angular",
"cluster"],
298 "Herwig7": [
"Herwig",
"angular",
"cluster"],
299 "Sherpa": [
"Sherpa",
"dipole",
"cluster"],
300 "Pythia8B": [
"PythiaB",
"dipole",
"cluster"],
301 "Pythia8": [
"Pythia",
"dipole",
"cluster"]
306 Returns a list of instantiated tools for each of the calibration steps.
307 Tools are instantiated by calling functions declared in the calibStepDic dictionary.
308 The order of the steps is determined by the Sequence block of the config.
309 The calibSeqOverride argument can be set to a '_'-separated string of step names,
310 which will override the step ordering set by the Sequence block.
316 metaData = GetFileMD(flags.Input.Files[0])
317 simFlavour = metaData.get(
'Simulator',
'')
318 if 'ATLFAST3' in simFlavour:
322 sampleKey =
'FullSim'
326 if flags.GeoModel.Run == LHCPeriod.Run2:
328 elif flags.GeoModel.Run == LHCPeriod.Run3:
330 elif flags.GeoModel.Run >= LHCPeriod.Run4:
333 jcslog.warning(
'LHCPeriod not recognised')
338 sequence = calibSeqOverride.split(
'_')
339 jcslog.info(
'Expert option calibSeqOverride set - overriding step sequence')
343 seqDict = configDict.pop(
'Sequence')
344 sequence = seqDict[runKey][sampleKey]
346 raise JetCalibConfigError(f
"{runKey} {sampleKey} sample identified. YAML should specify step ordering via the following block structure: \n \
349 {sampleKey}: [list of steps] ")
352 jcslog.debug(
'Configuring jet calib steps:')
353 for step
in sequence:
355 if step
not in configDict:
357 configDict.get(step).pop(
'prereqs',{})
360 if configDict.get(step).pop(
'noRun',
False):
361 jcslog.warning(f
'Expert option: Skipping calib step {step}')
365 if step==
"Insitu" and flags.Input.isMC
and not configDict.get(
"Insitu").
get(
"CalibrateMC",
False):
366 jcslog.warning(
'Insitu step included for MC but CalibrateMC is False - no calibration will be run')
370 if not flags.Input.isMC:
371 jcslog.warning(
'Running MC2MC calibration for data')
374 for key, value
in flags.Input.GeneratorsInfo.items():
377 if 'Pythia' in generator:
378 jcslog.debug(
'Skipping MC2MC calibration for Pythia8')
383 if not flags.Input.isMC:
384 jcslog.warning(
'Running FastSimulation calibration for data')
387 jcslog.warning(
'Running FastSimulation calibration for full sim')
389 calibFunc = calibStepDic.get(step,
None)
391 if calibFunc
is None:
392 raise NotImplementedError(f
'Calibration step {step} is not found in calibStepDic')
394 calibConfig = configDict.get(step)
397 for overrideKey
in [
'Run2',
'Run3',
'Run4']:
399 overrideDict = calibConfig.pop(overrideKey,{})
401 if runKey!=overrideKey
or not overrideDict:
403 jcslog.debug(f
'{step}: Applying {runKey} override settings')
405 for key
in overrideDict:
406 if key
in calibConfig:
407 jcslog.warning(f
'{key} will be overwritten by {overrideKey} settings')
408 calibConfig[key] = overrideDict[key]
412 inScale =
'JetConstitScaleMomentum'
414 inScale = toolList[-1].OutScale
416 calibConfig.setdefault(
'InScale', inScale)
418 if calibConfig[
'InScale']!=inScale:
419 jcslog.warning(f
'InScale set to {calibConfig['InScale
']} in YAML config, but expected {inScale} from Sequence ordering -- is this intentional?')
422 newToolList = calibFunc(flags, **calibConfig)
423 jcslog.debug(f
'{step}: InScale = {newToolList[0].InScale}, OutScale = {newToolList[-1].OutScale}')
425 toolList += newToolList
431 Returns a list of instantiated tools for each of the calibration steps.
432 The order of the steps is determined by the Sequence block of the config, unless calibSeqOverride is set.
437 Path to YAML configuration file
439 Internal name of the configured jet calib tool
443 calibSeqOverride: str
444 Optional '_'-separated string of step names. If provided this will override the step ordering set by the Sequence block.
446 infoMsg = f
'Configuring JetCalibTools with {configFile}'
451 globalSettings = configDic.pop(
'Global',{})
453 calibTool = CompFactory.JetCalibTool(name, CalibSteps=
calibConfigToToolList(flags, calibSeqOverride, **configDic), **globalSettings)
457 from yaml
import safe_load
460 configDic = safe_load(open(path_configFile))
465 """ 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?)
newpuresidualStep(flags, **configDict)
mc2mcStep(flags, **configDic)
af3Step(flags, **configDic)
calibToolFromConfigFile(flags, configFile, name="jetcalib", calibSeqOverride=None)
calibConfigToToolList(flags, calibSeqOverride=None, **configDict)
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)