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