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