89 """Create the calibration and smearing algorithm
91 Factoring this out into its own function, as we want to
92 instantiate it in multiple places"""
95 alg = config.createAlgorithm(
'CP::EgammaCalibrationAndSmearingAlg', name )
96 config.addPrivateTool(
'calibrationAndSmearingTool',
97 'CP::EgammaCalibrationAndSmearingTool' )
100 alg.calibrationAndSmearingTool.ESModel = self.
ESModel
102 if config.geometry()
is LHCPeriod.Run2:
103 alg.calibrationAndSmearingTool.ESModel =
'es2023_R22_Run2_v1'
104 elif config.geometry()
is LHCPeriod.Run3:
105 alg.calibrationAndSmearingTool.ESModel =
'es2024_Run3_v0'
106 elif config.geometry()
is LHCPeriod.Run4:
107 warnings.warn_explicit(
108 "No ESModel set for Run4, using Run3 model",
109 Run4FallbackWarning, filename=
'', lineno=0)
110 alg.calibrationAndSmearingTool.ESModel =
'es2024_Run3_v0'
112 raise ValueError (f
"Can't set up the PhotonCalibrationConfig with {config.geometry().value}, "
113 "there must be something wrong!")
115 alg.calibrationAndSmearingTool.decorrelationModel = self.decorrelationModel
116 alg.calibrationAndSmearingTool.useFastSim = (
118 else int( config.dataType()
is DataType.FastSim ))
119 alg.calibrationAndSmearingTool.decorateEmva = self.decorateEmva
121 alg.calibrationAndSmearingTool.DoElectronMVACalibration =
False
124 alg.preselection = config.getPreselection (self.
containerName,
'')
126 config.setContainerMeta (self.
containerName,
'ESModel', alg.calibrationAndSmearingTool.ESModel, allowOverwrite=
True)
127 config.setContainerMeta (self.
containerName,
'decorrelationModel', alg.calibrationAndSmearingTool.decorrelationModel, allowOverwrite=
True)
134 postfix = self.postfix
135 if postfix !=
'' and postfix[0] !=
'_' :
136 postfix =
'_' + postfix
139 warnings.warn_explicit(
140 "You are running PhotonCalibrationConfig forcing"
141 " full sim config for P4 corrections."
142 " This is only intended to be used for testing purposes.",
143 TestingOnlyWarning, filename=
'', lineno=0)
145 if config.isPhyslite() :
150 cleaningWP =
'NoTime' if self.cleaningAllowLate
else ''
154 alg = config.createAlgorithm(
'CP::EgammaCaloClusterEtaAlg',
155 'PhotonEgammaCaloClusterEtaAlg',
158 config.addOutputVar (self.
containerName,
'caloEta2',
'caloEta2', noSys=
True, auxType=
'float')
162 alg = config.createAlgorithm(
'CP::AsgShallowCopyAlg',
'PhotonShallowCopyAlg' )
165 alg.outputType =
'xAOD::PhotonContainer'
166 decorationList = [
'DFCommonPhotonsCleaning',
167 'ptcone20_CloseByCorr',
168 'topoetcone20_CloseByCorr',
169 'topoetcone40_CloseByCorr']
171 decorationList += [
'neutralGlobalFELinks',
'chargedGlobalFELinks']
172 if config.dataType()
is not DataType.Data:
173 decorationList += [
'TruthLink']
174 alg.declareDecorations = decorationList
177 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonEtaCutAlg' )
178 alg.selectionDecoration =
'selectEta' + postfix +
',as_bits'
179 config.addPrivateTool(
'selectionTool',
'CP::AsgPtEtaSelectionTool' )
180 alg.selectionTool.maxEta = self.maxEta
182 alg.selectionTool.etaGapLow = 1.37
183 alg.selectionTool.etaGapHigh = 1.52
184 alg.selectionTool.useClusterEta =
True
186 alg.preselection = config.getPreselection (self.
containerName,
'')
187 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
190 if self.recomputeIsEM
and config.dataType()
is DataType.FullSim:
191 alg = config.createAlgorithm(
'CP::PhotonShowerShapeFudgeAlg',
192 'PhotonShowerShapeFudgeAlg' )
193 config.addPrivateTool(
'showerShapeFudgeTool',
194 'ElectronPhotonVariableCorrectionTool' )
195 if config.geometry()
is LHCPeriod.Run2:
196 alg.showerShapeFudgeTool.ConfigFile = \
197 'EGammaVariableCorrection/TUNE25/ElPhVariableNominalCorrection.conf'
198 if config.geometry()
is LHCPeriod.Run3:
199 if config.campaign()
in (Campaign.MC23a, Campaign.MC23d):
200 alg.showerShapeFudgeTool.ConfigFile = \
201 'EGammaVariableCorrection/TUNE28AD/ElPhVariableNominalCorrection.conf'
203 alg.showerShapeFudgeTool.ConfigFile = \
204 'EGammaVariableCorrection/TUNE28EG/ElPhVariableNominalCorrection.conf'
207 alg.preselection = config.getPreselection (self.
containerName,
'')
210 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonObjectQualityAlg' )
211 config.setExtraInputs ({(
'xAOD::EventInfo',
'EventInfo.RandomRunNumber')})
212 alg.selectionDecoration =
'goodOQ' + postfix +
',as_bits'
213 config.addPrivateTool(
'selectionTool',
'CP::EgammaIsGoodOQSelectionTool' )
214 alg.selectionTool.Mask = xAOD.EgammaParameters.BADCLUSPHOTON
216 alg.preselection = config.getPreselection (self.
containerName,
'')
217 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
221 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonCleaningAlg' )
222 config.addPrivateTool(
'selectionTool',
'CP::AsgFlagSelectionTool' )
223 alg.selectionDecoration =
'isClean' + postfix +
',as_bits'
224 alg.selectionTool.selectionFlags = [
'DFCommonPhotonsCleaning' + cleaningWP]
226 alg.preselection = config.getPreselection (self.
containerName,
'')
227 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
232 alg = config.createAlgorithm(
'CP::PhotonOriginCorrectionAlg',
233 'PhotonOriginCorrectionAlg',
237 alg.preselection = config.getPreselection (self.
containerName,
'')
243 alg.skipNominal =
True
264 alg.noToolSystematics =
True
266 alg.calibrationAndSmearingTool.doSmearing =
False
271 alg.calibrationAndSmearingTool.doScaleCorrection =
False
272 alg.calibrationAndSmearingTool.useMVACalibration =
False
273 alg.calibrationAndSmearingTool.decorateEmva =
False
276 warnings.warn_explicit(
277 "You are not applying the isolation corrections."
278 " This is only intended to be used for testing purposes.",
279 TestingOnlyWarning, filename=
'', lineno=0)
284 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonPtCutAlg' )
285 alg.selectionDecoration =
'selectPt' + postfix +
',as_bits'
286 config.addPrivateTool(
'selectionTool',
'CP::AsgPtEtaSelectionTool' )
287 alg.selectionTool.minPt = self.minPt
289 alg.preselection = config.getPreselection (self.
containerName,
'')
290 config.addSelection (self.
containerName,
'', alg.selectionDecoration,
297 warnings.warn_explicit(
298 "You are running PhotonCalibrationConfig forcing"
299 " full sim config for isolation corrections."
300 " This is only intended to be used for testing purposes.",
301 TestingOnlyWarning, filename=
'', lineno=0)
303 alg = config.createAlgorithm(
'CP::EgammaIsolationCorrectionAlg',
304 'PhotonIsolationCorrectionAlg' )
305 config.addPrivateTool(
'isolationCorrectionTool',
306 'CP::IsolationCorrectionTool' )
307 alg.isolationCorrectionTool.IsMC = config.dataType()
is not DataType.Data
308 alg.isolationCorrectionTool.AFII_corr = (
310 else config.dataType()
is DataType.FastSim)
311 AODfixes = config.flags.Input.AODFixesDone
312 if "egammatopoIsoFix" in AODfixes:
313 alg.isolationCorrectionTool.FixTimingIssueInCore =
False
315 alg.isolationCorrectionTool.FixTimingIssueInCore =
True
318 alg.preselection = config.getPreselection (self.
containerName,
'')
321 alg = config.createAlgorithm(
'CP::AsgEnergyDecoratorAlg',
'EnergyDecorator' )
324 config.addOutputVar (self.
containerName,
'pt',
'pt', auxType=
'float')
325 config.addOutputVar (self.
containerName,
'eta',
'eta', noSys=
True, auxType=
'float')
326 config.addOutputVar (self.
containerName,
'phi',
'phi', noSys=
True, auxType=
'float')
327 config.addOutputVar (self.
containerName,
'e_%SYS%',
'e', auxType=
'float')
329 config.addOutputVar (self.
containerName,
'caloClusterEnergyReso_%SYS%',
'caloClusterEnergyReso', noSys=
True, auxType=
'float')
332 if self.decorateTruth
and config.dataType()
is not DataType.Data:
333 config.addOutputVar (self.
containerName,
"truthType",
"truth_type", noSys=
True, auxType=
'int')
334 config.addOutputVar (self.
containerName,
"truthOrigin",
"truth_origin", noSys=
True, auxType=
'int')