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