130 def makeAlgs (self, config) :
131
132 postfix = self.postfix
133 if postfix != '' and postfix[0] != '_' :
134 postfix = '_' + postfix
135
136 if self.forceFullSimConfigForP4:
137 warnings.warn_explicit(
138 "You are running PhotonCalibrationConfig forcing"
139 " full sim config for P4 corrections."
140 " This is only intended to be used for testing purposes.",
141 TestingOnlyWarning, filename='', lineno=0)
142
143 if config.isPhyslite() :
144 config.setSourceName (self.containerName, "AnalysisPhotons")
145 else :
146 config.setSourceName (self.containerName, "Photons")
147
148 cleaningWP = 'NoTime' if self.cleaningAllowLate else ''
149
150
151 if self.decorateCaloClusterEta:
152 alg = config.createAlgorithm( 'CP::EgammaCaloClusterEtaAlg',
153 'PhotonEgammaCaloClusterEtaAlg',
154 reentrant=True )
155 alg.particles = config.readName(self.containerName)
156 config.addOutputVar (self.containerName, 'caloEta2', 'caloEta2', noSys=True)
157
158
159 if config.wantCopy (self.containerName) :
160 alg = config.createAlgorithm( 'CP::AsgShallowCopyAlg', 'PhotonShallowCopyAlg' )
161 alg.input = config.readName (self.containerName)
162 alg.output = config.copyName (self.containerName)
163 alg.outputType = 'xAOD::PhotonContainer'
164 decorationList = ['DFCommonPhotonsCleaning',
165 'ptcone20_CloseByCorr',
166 'topoetcone20_CloseByCorr',
167 'topoetcone40_CloseByCorr']
168 if self.addGlobalFELinksDep:
169 decorationList += ['neutralGlobalFELinks', 'chargedGlobalFELinks']
170 if config.dataType() is not DataType.Data:
171 decorationList += ['TruthLink']
172 alg.declareDecorations = decorationList
173
174
175 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonEtaCutAlg' )
176 alg.selectionDecoration = 'selectEta' + postfix + ',as_bits'
177 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
178 alg.selectionTool.maxEta = self.maxEta
179 if self.crackVeto:
180 alg.selectionTool.etaGapLow = 1.37
181 alg.selectionTool.etaGapHigh = 1.52
182 alg.selectionTool.useClusterEta = True
183 alg.particles = config.readName (self.containerName)
184 alg.preselection = config.getPreselection (self.containerName, '')
185 config.addSelection (self.containerName, '', alg.selectionDecoration)
186
187
188 if self.recomputeIsEM and config.dataType() is DataType.FullSim:
189 alg = config.createAlgorithm( 'CP::PhotonShowerShapeFudgeAlg',
190 'PhotonShowerShapeFudgeAlg' )
191 config.addPrivateTool( 'showerShapeFudgeTool',
192 'ElectronPhotonVariableCorrectionTool' )
193 if config.geometry() is LHCPeriod.Run2:
194 alg.showerShapeFudgeTool.ConfigFile = \
195 'EGammaVariableCorrection/TUNE25/ElPhVariableNominalCorrection.conf'
196 if config.geometry() is LHCPeriod.Run3:
197 if config.campaign() in (Campaign.MC23a, Campaign.MC23d):
198 alg.showerShapeFudgeTool.ConfigFile = \
199 'EGammaVariableCorrection/TUNE28AD/ElPhVariableNominalCorrection.conf'
200 else:
201 alg.showerShapeFudgeTool.ConfigFile = \
202 'EGammaVariableCorrection/TUNE28EG/ElPhVariableNominalCorrection.conf'
203 alg.photons = config.readName (self.containerName)
204 alg.photonsOut = config.copyName (self.containerName)
205 alg.preselection = config.getPreselection (self.containerName, '')
206
207
208 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonObjectQualityAlg' )
209 config.setExtraInputs ({('xAOD::EventInfo', 'EventInfo.RandomRunNumber')})
210 alg.selectionDecoration = 'goodOQ' + postfix + ',as_bits'
211 config.addPrivateTool( 'selectionTool', 'CP::EgammaIsGoodOQSelectionTool' )
212 alg.selectionTool.Mask = xAOD.EgammaParameters.BADCLUSPHOTON
213 alg.particles = config.readName (self.containerName)
214 alg.preselection = config.getPreselection (self.containerName, '')
215 config.addSelection (self.containerName, '', alg.selectionDecoration)
216
217
218 if self.enableCleaning:
219 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonCleaningAlg' )
220 config.addPrivateTool( 'selectionTool', 'CP::AsgFlagSelectionTool' )
221 alg.selectionDecoration = 'isClean' + postfix + ',as_bits'
222 alg.selectionTool.selectionFlags = ['DFCommonPhotonsCleaning' + cleaningWP]
223 alg.particles = config.readName (self.containerName)
224 alg.preselection = config.getPreselection (self.containerName, '')
225 config.addSelection (self.containerName, '', alg.selectionDecoration)
226
227
228
229
230 alg = config.createAlgorithm( 'CP::PhotonOriginCorrectionAlg',
231 'PhotonOriginCorrectionAlg',
232 reentrant=True )
233 alg.photons = config.readName (self.containerName)
234 alg.photonsOut = config.copyName (self.containerName)
235 alg.preselection = config.getPreselection (self.containerName, '')
236
237 if not self.splitCalibrationAndSmearing :
238
239 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationAndSmearingAlg')
240 if config.isPhyslite() and not self.recalibratePhyslite :
241 alg.skipNominal = True
242 else:
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonBaseCalibrationAlg')
261
262 alg.noToolSystematics = True
263
264 alg.calibrationAndSmearingTool.doSmearing = False
265
266
267 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationSystematicsAlg')
268
269 alg.calibrationAndSmearingTool.doScaleCorrection = False
270 alg.calibrationAndSmearingTool.useMVACalibration = False
271 alg.calibrationAndSmearingTool.decorateEmva = False
272
273 if not self.applyIsolationCorrection:
274 warnings.warn_explicit(
275 "You are not applying the isolation corrections."
276 " This is only intended to be used for testing purposes.",
277 TestingOnlyWarning, filename='', lineno=0)
278
279 if self.minPt > 0:
280
281
282 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonPtCutAlg' )
283 alg.selectionDecoration = 'selectPt' + postfix + ',as_bits'
284 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
285 alg.selectionTool.minPt = self.minPt
286 alg.particles = config.readName (self.containerName)
287 alg.preselection = config.getPreselection (self.containerName, '')
288 config.addSelection (self.containerName, '', alg.selectionDecoration,
289 preselection=True)
290
291
292 if self.applyIsolationCorrection:
293
294 if self.forceFullSimConfigForIso:
295 warnings.warn_explicit(
296 "You are running PhotonCalibrationConfig forcing"
297 " full sim config for isolation corrections."
298 " This is only intended to be used for testing purposes.",
299 TestingOnlyWarning, filename='', lineno=0)
300
301 alg = config.createAlgorithm( 'CP::EgammaIsolationCorrectionAlg',
302 'PhotonIsolationCorrectionAlg' )
303 config.addPrivateTool( 'isolationCorrectionTool',
304 'CP::IsolationCorrectionTool' )
305 alg.isolationCorrectionTool.IsMC = config.dataType() is not DataType.Data
306 alg.isolationCorrectionTool.AFII_corr = (
307 0 if self.forceFullSimConfigForIso
308 else config.dataType() is DataType.FastSim)
309 AODfixes = config.flags.Input.AODFixesDone
310 if "egammatopoIsoFix" in AODfixes:
311 alg.isolationCorrectionTool.FixTimingIssueInCore = False
312 else:
313 alg.isolationCorrectionTool.FixTimingIssueInCore = True
314 alg.egammas = config.readName (self.containerName)
315 alg.egammasOut = config.copyName (self.containerName)
316 alg.preselection = config.getPreselection (self.containerName, '')
317
318
319 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'EnergyDecorator' )
320 alg.particles = config.readName (self.containerName)
321
322 config.addOutputVar (self.containerName, 'pt', 'pt')
323 config.addOutputVar (self.containerName, 'eta', 'eta', noSys=True)
324 config.addOutputVar (self.containerName, 'phi', 'phi', noSys=True)
325 config.addOutputVar (self.containerName, 'e_%SYS%', 'e')
326 if self.splitCalibrationAndSmearing or not (config.isPhyslite() and not self.recalibratePhyslite) :
327 config.addOutputVar (self.containerName, 'caloClusterEnergyReso_%SYS%', 'caloClusterEnergyReso', noSys=True)
328
329
330 if self.decorateTruth and config.dataType() is not DataType.Data:
331 config.addOutputVar (self.containerName, "truthType", "truth_type", noSys=True)
332 config.addOutputVar (self.containerName, "truthOrigin", "truth_origin", noSys=True)
333
334