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