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