132 def makeAlgs (self, config) :
133
134 postfix = self.postfix
135 if postfix != '' and postfix[0] != '_' :
136 postfix = '_' + postfix
137
138 if self.forceFullSimConfigForP4:
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)
144
145 if config.isPhyslite() :
146 config.setSourceName (self.containerName, "AnalysisPhotons")
147 else :
148 config.setSourceName (self.containerName, "Photons")
149
150 cleaningWP = 'NoTime' if self.cleaningAllowLate else ''
151
152
153 if self.decorateCaloClusterEta:
154 alg = config.createAlgorithm( 'CP::EgammaCaloClusterEtaAlg',
155 'PhotonEgammaCaloClusterEtaAlg',
156 reentrant=True )
157 alg.particles = config.readName(self.containerName)
158 config.addOutputVar (self.containerName, 'caloEta2', 'caloEta2', noSys=True, auxType='float')
159
160
161 if config.wantCopy (self.containerName) :
162 alg = config.createAlgorithm( 'CP::AsgShallowCopyAlg', 'PhotonShallowCopyAlg' )
163 alg.input = config.readName (self.containerName)
164 alg.output = config.copyName (self.containerName)
165 alg.outputType = 'xAOD::PhotonContainer'
166 decorationList = ['DFCommonPhotonsCleaning',
167 'ptcone20_CloseByCorr',
168 'topoetcone20_CloseByCorr',
169 'topoetcone40_CloseByCorr']
170 if self.addGlobalFELinksDep:
171 decorationList += ['neutralGlobalFELinks', 'chargedGlobalFELinks']
172 if config.dataType() is not DataType.Data:
173 decorationList += ['TruthLink']
174 alg.declareDecorations = decorationList
175
176
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
181 if self.crackVeto:
182 alg.selectionTool.etaGapLow = 1.37
183 alg.selectionTool.etaGapHigh = 1.52
184 alg.selectionTool.useClusterEta = True
185 alg.particles = config.readName (self.containerName)
186 alg.preselection = config.getPreselection (self.containerName, '')
187 config.addSelection (self.containerName, '', alg.selectionDecoration)
188
189
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'
202 else:
203 alg.showerShapeFudgeTool.ConfigFile = \
204 'EGammaVariableCorrection/TUNE28EG/ElPhVariableNominalCorrection.conf'
205 alg.photons = config.readName (self.containerName)
206 alg.photonsOut = config.copyName (self.containerName)
207 alg.preselection = config.getPreselection (self.containerName, '')
208
209
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
215 alg.particles = config.readName (self.containerName)
216 alg.preselection = config.getPreselection (self.containerName, '')
217 config.addSelection (self.containerName, '', alg.selectionDecoration)
218
219
220 if self.enableCleaning:
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]
225 alg.particles = config.readName (self.containerName)
226 alg.preselection = config.getPreselection (self.containerName, '')
227 config.addSelection (self.containerName, '', alg.selectionDecoration)
228
229
230
231
232 alg = config.createAlgorithm( 'CP::PhotonOriginCorrectionAlg',
233 'PhotonOriginCorrectionAlg',
234 reentrant=True )
235 alg.photons = config.readName (self.containerName)
236 alg.photonsOut = config.copyName (self.containerName)
237 alg.preselection = config.getPreselection (self.containerName, '')
238
239 if not self.splitCalibrationAndSmearing :
240
241 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationAndSmearingAlg')
242 if config.isPhyslite() and not self.recalibratePhyslite :
243 alg.skipNominal = True
244 else:
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonBaseCalibrationAlg')
263
264 alg.noToolSystematics = True
265
266 alg.calibrationAndSmearingTool.doSmearing = False
267
268
269 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationSystematicsAlg')
270
271 alg.calibrationAndSmearingTool.doScaleCorrection = False
272 alg.calibrationAndSmearingTool.useMVACalibration = False
273 alg.calibrationAndSmearingTool.decorateEmva = False
274
275 if not self.applyIsolationCorrection:
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)
280
281 if self.minPt > 0:
282
283
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
288 alg.particles = config.readName (self.containerName)
289 alg.preselection = config.getPreselection (self.containerName, '')
290 config.addSelection (self.containerName, '', alg.selectionDecoration,
291 preselection=True)
292
293
294 if self.applyIsolationCorrection:
295
296 if self.forceFullSimConfigForIso:
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)
302
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 = (
309 0 if self.forceFullSimConfigForIso
310 else config.dataType() is DataType.FastSim)
311 AODfixes = config.flags.Input.AODFixesDone
312 if "egammatopoIsoFix" in AODfixes:
313 alg.isolationCorrectionTool.FixTimingIssueInCore = False
314 else:
315 alg.isolationCorrectionTool.FixTimingIssueInCore = True
316 alg.egammas = config.readName (self.containerName)
317 alg.egammasOut = config.copyName (self.containerName)
318 alg.preselection = config.getPreselection (self.containerName, '')
319
320
321 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'EnergyDecorator' )
322 alg.particles = config.readName (self.containerName)
323
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')
328 if self.splitCalibrationAndSmearing or not (config.isPhyslite() and not self.recalibratePhyslite) :
329 config.addOutputVar (self.containerName, 'caloClusterEnergyReso_%SYS%', 'caloClusterEnergyReso', noSys=True, auxType='float')
330
331
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')
335
336