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