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