133 def makeAlgs (self, config) :
134
135 if self.forceFullSimConfigForP4:
136 warnings.warn_explicit(
137 "You are running ElectronCalibrationConfig forcing full sim"
138 " config. This is only intended to be used for testing"
139 " purposes.",
140 TestingOnlyWarning, filename='', lineno=0)
141
142 inputContainer = "AnalysisElectrons" if config.isPhyslite() else "Electrons"
143 if self.inputContainer:
144 inputContainer = self.inputContainer
145 config.setSourceName (self.containerName, inputContainer)
146
147
148 if self.decorateCaloClusterEta:
149 alg = config.createAlgorithm( 'CP::EgammaCaloClusterEtaAlg',
150 'ElectronEgammaCaloClusterEtaAlg',
151 reentrant=True )
152 alg.particles = config.readName(self.containerName)
153 config.addOutputVar (self.containerName, 'caloEta2', 'caloEta2', noSys=True, auxType='float')
154
155 if self.decorateSamplingPattern:
156 config.createAlgorithm( 'CP::EgammaSamplingPatternDecoratorAlg', 'EgammaSamplingPatternDecoratorAlg' )
157
158
159 if config.wantCopy (self.containerName) :
160 alg = config.createAlgorithm( 'CP::AsgShallowCopyAlg', 'ElectronShallowCopyAlg' )
161 alg.input = config.readName (self.containerName)
162 alg.output = config.copyName (self.containerName)
163 alg.outputType = 'xAOD::ElectronContainer'
164 decorationList = ['DFCommonElectronsLHLoose',
165 'neflowisol20',
166 'ptcone20_Nonprompt_All_MaxWeightTTVALooseCone_pt500',
167 'ptvarcone30_Nonprompt_All_MaxWeightTTVALooseCone_pt500',
168 'ptcone20_Nonprompt_All_MaxWeightTTVALooseCone_pt1000_CloseByCorr',
169 'ptvarcone30_Nonprompt_All_MaxWeightTTVALooseCone_pt1000_CloseByCorr',
170 'topoetcone20_CloseByCorr','DFCommonAddAmbiguity',
171 'PLIT_PLITel_pelxpromp', 'PLIT_PLITel_pnpxall']
172 if self.addGlobalFELinksDep:
173 decorationList += ['neutralGlobalFELinks', 'chargedGlobalFELinks']
174 if config.dataType() is not DataType.Data:
175 decorationList += ['TruthLink']
176 alg.declareDecorations = decorationList
177
178
179 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'ElectronEtaCutAlg' )
180 alg.selectionDecoration = 'selectEta' + self.postfix + ',as_bits'
181 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
182 alg.selectionTool.maxEta = self.maxEta
183 if self.crackVeto:
184 alg.selectionTool.etaGapLow = 1.37
185 alg.selectionTool.etaGapHigh = 1.52
186 alg.selectionTool.useClusterEta = True
187 alg.particles = config.readName (self.containerName)
188 alg.preselection = config.getPreselection (self.containerName, '')
189 config.addSelection (self.containerName, '', alg.selectionDecoration)
190
191
192 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'ElectronObjectQualityAlg' )
193 config.setExtraInputs ({('xAOD::EventInfo', 'EventInfo.RandomRunNumber')})
194 alg.selectionDecoration = 'goodOQ' + self.postfix + ',as_bits'
195 config.addPrivateTool( 'selectionTool', 'CP::EgammaIsGoodOQSelectionTool' )
196 alg.selectionTool.Mask = xAOD.EgammaParameters.BADCLUSELECTRON
197 alg.particles = config.readName (self.containerName)
198 alg.preselection = config.getPreselection (self.containerName, '')
199 config.addSelection (self.containerName, '', alg.selectionDecoration)
200
201 if not self.splitCalibrationAndSmearing :
202
203 alg = self.makeCalibrationAndSmearingAlg (config, 'ElectronCalibrationAndSmearingAlg')
204 if config.isPhyslite() and not self.recalibratePhyslite :
205 alg.skipNominal = True
206 else:
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224 alg = self.makeCalibrationAndSmearingAlg (config, 'ElectronBaseCalibrationAlg')
225
226 alg.noToolSystematics = True
227
228 alg.calibrationAndSmearingTool.doSmearing = False
229
230
231 alg = self.makeCalibrationAndSmearingAlg (config, 'ElectronCalibrationSystematicsAlg')
232
233 alg.calibrationAndSmearingTool.doScaleCorrection = False
234 alg.calibrationAndSmearingTool.useMVACalibration = False
235 alg.calibrationAndSmearingTool.decorateEmva = False
236
237 if self.minPt > 0 :
238
239 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'ElectronPtCutAlg' )
240 alg.selectionDecoration = 'selectPt' + self.postfix + ',as_bits'
241 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
242 alg.selectionTool.minPt = self.minPt
243 alg.particles = config.readName (self.containerName)
244 alg.preselection = config.getPreselection (self.containerName, '')
245 config.addSelection (self.containerName, '', alg.selectionDecoration,
246 preselection=True)
247
248
249 if self.isolationCorrection:
250 alg = config.createAlgorithm( 'CP::EgammaIsolationCorrectionAlg',
251 'ElectronIsolationCorrectionAlg' )
252 config.addPrivateTool( 'isolationCorrectionTool',
253 'CP::IsolationCorrectionTool' )
254 alg.isolationCorrectionTool.IsMC = config.dataType() is not DataType.Data
255 alg.isolationCorrectionTool.AFII_corr = (
256 0 if self.forceFullSimConfigForIso
257 else config.dataType() is DataType.FastSim)
258 AODfixes = config.flags.Input.AODFixesDone
259 if "egammatopoIsoFix" in AODfixes:
260 alg.isolationCorrectionTool.FixTimingIssueInCore = False
261 else:
262 alg.isolationCorrectionTool.FixTimingIssueInCore = True
263 alg.isolationCorrectionTool.ToolVer = "REL22"
264 alg.isolationCorrectionTool.CorrFile = "IsolationCorrections/v6/isolation_ptcorrections_rel22_mc20.root"
265 alg.egammas = config.readName (self.containerName)
266 alg.egammasOut = config.copyName (self.containerName)
267 alg.egammasType = 'xAOD::ElectronContainer'
268 alg.preselection = config.getPreselection (self.containerName, '')
269 else:
270 warnings.warn_explicit(
271 "You are not applying the isolation corrections."
272 " This is only intended to be used for testing purposes.",
273 TestingOnlyWarning, filename='', lineno=0)
274
275 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'EnergyDecorator' )
276 alg.particles = config.readName(self.containerName)
277
278 config.addOutputVar (self.containerName, 'pt', 'pt', auxType='float')
279 config.addOutputVar (self.containerName, 'eta', 'eta', noSys=True, auxType='float')
280 config.addOutputVar (self.containerName, 'phi', 'phi', noSys=True, auxType='float')
281 config.addOutputVar (self.containerName, 'e_%SYS%', 'e', auxType='float')
282 config.addOutputVar (self.containerName, 'charge', 'charge', noSys=True, auxType='float')
283 if self.splitCalibrationAndSmearing or not (config.isPhyslite() and not self.recalibratePhyslite) :
284 config.addOutputVar (self.containerName, 'caloClusterEnergyReso_%SYS%', 'caloClusterEnergyReso', noSys=True, auxType='float')
285
286
287 if self.decorateTruth and config.dataType() is not DataType.Data:
288 config.addOutputVar (self.containerName, "truthType", "truth_type", noSys=True, auxType='int')
289 config.addOutputVar (self.containerName, "truthOrigin", "truth_origin", noSys=True, auxType='int')
290
291 config.addOutputVar (self.containerName, "firstEgMotherPdgId", "truth_firstEgMotherPdgId", noSys=True, auxType='int')
292 config.addOutputVar (self.containerName, "firstEgMotherTruthOrigin", "truth_firstEgMotherTruthOrigin", noSys=True, auxType='int')
293 config.addOutputVar (self.containerName, "firstEgMotherTruthType", "truth_firstEgMotherTruthType", noSys=True, auxType='int')
294
295