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