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