229 def makeAlgs (self, config) :
230 log = logging.getLogger('MuonWorkingPointConfig')
231
232 from xAODMuon.xAODMuonEnums import xAODMuonEnums
233 if self.quality == 'Tight' :
234 quality = xAODMuonEnums.Quality.Tight
235 elif self.quality == 'Medium' :
236 quality = xAODMuonEnums.Quality.Medium
237 elif self.quality == 'Loose' :
238 quality = xAODMuonEnums.Quality.Loose
239 elif self.quality == 'VeryLoose' :
240 quality = xAODMuonEnums.Quality.VeryLoose
241 elif self.quality == 'HighPt' :
242 quality = 4
243 elif self.quality == 'LowPt' :
244 quality = 5
245 else :
246 raise ValueError ("invalid muon quality: \"" + self.quality +
247 "\", allowed values are Tight, Medium, Loose, " +
248 "VeryLoose, HighPt, LowPt")
249
250
251 if config.geometry() is LHCPeriod.Run1:
252 raise ValueError ("Can't set up the MuonWorkingPointConfig with %s, there must be something wrong!" % config.geometry().value)
253
254 postfix = self.postfix
255 if postfix is None :
256 postfix = self.selectionName
257 if postfix != '' and postfix[0] != '_' :
258 postfix = '_' + postfix
259
260
261 if self.trackSelection:
262 alg = config.createAlgorithm( 'CP::AsgLeptonTrackSelectionAlg',
263 'MuonTrackSelectionAlg',
264 reentrant=True )
265 alg.selectionDecoration = 'trackSelection' + postfix + ',as_bits'
266 alg.maxD0Significance = self.maxD0Significance
267 alg.maxDeltaZ0SinTheta = self.maxDeltaZ0SinTheta
268 alg.particles = config.readName (self.containerName)
269 alg.preselection = config.getPreselection (self.containerName, '')
270 config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration, preselection=self.addSelectionToPreselection)
271
272
273 alg = config.createAlgorithm( 'CP::MuonSelectionAlgV2',
274 'MuonSelectionAlg' )
275 config.addPrivateTool( 'selectionTool', 'CP::MuonSelectionTool' )
276 alg.selectionTool.MuQuality = quality
277 alg.selectionTool.IsRun3Geo = config.geometry() >= LHCPeriod.Run3
278 if config.geometry() is LHCPeriod.Run4:
279 log.warning("Disabling NSW hits for Run4 geometry")
280 alg.selectionTool.ExcludeNSWFromPrecisionLayers = True
281 else:
282 alg.selectionTool.ExcludeNSWFromPrecisionLayers = self.excludeNSWFromPrecisionLayers and (config.geometry() >= LHCPeriod.Run3)
283 alg.selectionDecoration = 'good_muon' + postfix + ',as_char'
284 alg.badMuonVetoDecoration = 'is_bad' + postfix + ',as_char'
285 alg.muons = config.readName (self.containerName)
286 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
287 config.addSelection (self.containerName, self.selectionName,
288 alg.selectionDecoration,
289 preselection=self.addSelectionToPreselection)
290 if self.quality == 'HighPt':
291 config.addOutputVar (self.containerName, 'is_bad' + postfix, 'is_bad' + postfix)
292
293
294 if self.isolation != 'NonIso' :
295 alg = config.createAlgorithm( 'CP::MuonIsolationAlg',
296 'MuonIsolationAlg' )
297 config.addPrivateTool( 'isolationTool', 'CP::IsolationSelectionTool' )
298 alg.isolationTool.MuonWP = self.isolation
299 alg.isolationTool.IsoDecSuffix = self.isoDecSuffix
300 alg.isolationDecoration = 'isolated_muon' + postfix + ',as_char'
301 alg.muons = config.readName (self.containerName)
302 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
303 config.addSelection (self.containerName, self.selectionName,
304 alg.isolationDecoration,
305 preselection=self.addSelectionToPreselection)
306
307 sfList = []
308
309 if config.dataType() is not DataType.Data and (not self.noEffSF or self.onlyRecoEffSF):
310 alg = config.createAlgorithm( 'CP::MuonEfficiencyScaleFactorAlg',
311 'MuonEfficiencyScaleFactorAlgReco' )
312 config.addPrivateTool( 'efficiencyScaleFactorTool',
313 'CP::MuonEfficiencyScaleFactors' )
314 alg.scaleFactorDecoration = 'muon_reco_effSF' + postfix + "_%SYS%"
315 alg.outOfValidity = 2
316 alg.outOfValidityDeco = 'muon_reco_bad_eff' + postfix
317 alg.efficiencyScaleFactorTool.WorkingPoint = self.quality
318 if config.geometry() >= LHCPeriod.Run3:
319 alg.efficiencyScaleFactorTool.CalibrationRelease = '251211_Preliminary_r24run3'
320 else:
321 alg.efficiencyScaleFactorTool.CalibrationRelease = '230213_Preliminary_r22run2'
322 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
323 alg.muons = config.readName (self.containerName)
324 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
325 if self.saveDetailedSF:
326 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
327 'reco_effSF' + postfix)
328 sfList += [alg.scaleFactorDecoration]
329
330
331 if config.dataType() is not DataType.Data and self.quality == 'HighPt' and not self.onlyRecoEffSF and not self.noEffSF:
332 alg = config.createAlgorithm( 'CP::MuonEfficiencyScaleFactorAlg',
333 'MuonEfficiencyScaleFactorAlgBMVHighPt' )
334 config.addPrivateTool( 'efficiencyScaleFactorTool',
335 'CP::MuonEfficiencyScaleFactors' )
336 alg.scaleFactorDecoration = 'muon_BadMuonVeto_effSF' + postfix + "_%SYS%"
337 alg.outOfValidity = 2
338 alg.outOfValidityDeco = 'muon_BadMuonVeto_bad_eff' + postfix
339 alg.efficiencyScaleFactorTool.WorkingPoint = 'BadMuonVeto_HighPt'
340 if config.geometry() >= LHCPeriod.Run3:
341 alg.efficiencyScaleFactorTool.CalibrationRelease = '220817_Preliminary_r22run3'
342 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
343 alg.muons = config.readName (self.containerName)
344 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
345 if self.saveDetailedSF:
346 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
347 'BadMuonVeto_effSF' + postfix)
348 sfList += [alg.scaleFactorDecoration]
349
350
351 if config.dataType() is not DataType.Data and self.isolation != 'NonIso' and not self.onlyRecoEffSF and not self.noEffSF:
352 alg = config.createAlgorithm( 'CP::MuonEfficiencyScaleFactorAlg',
353 'MuonEfficiencyScaleFactorAlgIsol' )
354 config.addPrivateTool( 'efficiencyScaleFactorTool',
355 'CP::MuonEfficiencyScaleFactors' )
356 alg.scaleFactorDecoration = 'muon_isol_effSF' + postfix + "_%SYS%"
357 alg.outOfValidity = 2
358 alg.outOfValidityDeco = 'muon_isol_bad_eff' + postfix
359 alg.efficiencyScaleFactorTool.WorkingPoint = self.isolation + 'Iso'
360 if config.geometry() >= LHCPeriod.Run3:
361 alg.efficiencyScaleFactorTool.CalibrationRelease = '251211_Preliminary_r24run3'
362 else:
363 alg.efficiencyScaleFactorTool.CalibrationRelease = '230213_Preliminary_r22run2'
364 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
365 alg.muons = config.readName (self.containerName)
366 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
367 if self.saveDetailedSF:
368 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
369 'isol_effSF' + postfix)
370 sfList += [alg.scaleFactorDecoration]
371
372
373 if config.dataType() is not DataType.Data and self.trackSelection and not self.onlyRecoEffSF and not self.noEffSF:
374 alg = config.createAlgorithm( 'CP::MuonEfficiencyScaleFactorAlg',
375 'MuonEfficiencyScaleFactorAlgTTVA' )
376 config.addPrivateTool( 'efficiencyScaleFactorTool',
377 'CP::MuonEfficiencyScaleFactors' )
378 alg.scaleFactorDecoration = 'muon_TTVA_effSF' + postfix + "_%SYS%"
379 alg.outOfValidity = 2
380 alg.outOfValidityDeco = 'muon_TTVA_bad_eff' + postfix
381 alg.efficiencyScaleFactorTool.WorkingPoint = 'TTVA'
382 if config.geometry() >= LHCPeriod.Run3:
383 alg.efficiencyScaleFactorTool.CalibrationRelease = '251211_Preliminary_r24run3'
384 else:
385 alg.efficiencyScaleFactorTool.CalibrationRelease = '230213_Preliminary_r22run2'
386 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
387 alg.muons = config.readName (self.containerName)
388 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
389 if self.saveDetailedSF:
390 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
391 'TTVA_effSF' + postfix)
392 sfList += [alg.scaleFactorDecoration]
393
394 if config.dataType() is not DataType.Data and not self.noEffSF and self.saveCombinedSF:
395 alg = config.createAlgorithm( 'CP::AsgObjectScaleFactorAlg',
396 'MuonCombinedEfficiencyScaleFactorAlg' )
397 alg.particles = config.readName (self.containerName)
398 alg.inScaleFactors = sfList
399 alg.outScaleFactor = 'effSF' + postfix + '_%SYS%'
400 config.addOutputVar (self.containerName, alg.outScaleFactor, 'effSF' + postfix)
401