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