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