225 log = logging.getLogger(
'MuonWorkingPointConfig')
227 from xAODMuon.xAODMuonEnums
import xAODMuonEnums
229 quality = xAODMuonEnums.Quality.Tight
230 elif self.
quality ==
'Medium' :
231 quality = xAODMuonEnums.Quality.Medium
233 quality = xAODMuonEnums.Quality.Loose
234 elif self.
quality ==
'VeryLoose' :
235 quality = xAODMuonEnums.Quality.VeryLoose
236 elif self.
quality ==
'HighPt' :
241 raise ValueError (
"invalid muon quality: \"" + self.
quality +
242 "\", allowed values are Tight, Medium, Loose, " +
243 "VeryLoose, HighPt, LowPt")
246 if config.geometry()
is LHCPeriod.Run1:
247 raise ValueError (
"Can't set up the MuonWorkingPointConfig with %s, there must be something wrong!" % config.geometry().value)
249 postfix = self.postfix
252 if postfix !=
'' and postfix[0] !=
'_' :
253 postfix =
'_' + postfix
257 alg = config.createAlgorithm(
'CP::AsgLeptonTrackSelectionAlg',
258 'MuonTrackSelectionAlg',
260 alg.selectionDecoration =
'trackSelection' + postfix +
',as_bits'
261 alg.maxD0Significance = self.maxD0Significance
262 alg.maxDeltaZ0SinTheta = self.maxDeltaZ0SinTheta
264 alg.preselection = config.getPreselection (self.
containerName,
'')
268 alg = config.createAlgorithm(
'CP::MuonSelectionAlgV2',
270 config.addPrivateTool(
'selectionTool',
'CP::MuonSelectionTool' )
271 alg.selectionTool.MuQuality = quality
272 alg.selectionTool.IsRun3Geo = config.geometry() >= LHCPeriod.Run3
273 if config.geometry()
is LHCPeriod.Run4:
274 log.warning(
"Disabling NSW hits for Run4 geometry")
275 alg.selectionTool.ExcludeNSWFromPrecisionLayers =
True
277 alg.selectionTool.ExcludeNSWFromPrecisionLayers = self.excludeNSWFromPrecisionLayers
and (config.geometry() >= LHCPeriod.Run3)
278 alg.selectionDecoration =
'good_muon' + postfix +
',as_char'
279 alg.badMuonVetoDecoration =
'is_bad' + postfix +
',as_char'
283 alg.selectionDecoration,
284 preselection=self.addSelectionToPreselection)
286 config.addOutputVar (self.
containerName,
'is_bad' + postfix,
'is_bad' + postfix)
289 if self.isolation !=
'NonIso' :
290 alg = config.createAlgorithm(
'CP::MuonIsolationAlg',
292 config.addPrivateTool(
'isolationTool',
'CP::IsolationSelectionTool' )
293 alg.isolationTool.MuonWP = self.isolation
294 alg.isolationTool.IsoDecSuffix = self.isoDecSuffix
295 alg.isolationDecoration =
'isolated_muon' + postfix +
',as_char'
299 alg.isolationDecoration,
300 preselection=self.addSelectionToPreselection)
305 alg = config.createAlgorithm(
'CP::MuonEfficiencyScaleFactorAlg',
306 'MuonEfficiencyScaleFactorAlgReco' )
307 config.addPrivateTool(
'efficiencyScaleFactorTool',
308 'CP::MuonEfficiencyScaleFactors' )
309 alg.scaleFactorDecoration =
'muon_reco_effSF' + postfix +
"_%SYS%"
310 alg.outOfValidity = 2
311 alg.outOfValidityDeco =
'muon_reco_bad_eff' + postfix
312 alg.efficiencyScaleFactorTool.WorkingPoint = self.
quality
313 if config.geometry() >= LHCPeriod.Run3:
314 alg.efficiencyScaleFactorTool.CalibrationRelease =
'251211_Preliminary_r24run3'
316 alg.efficiencyScaleFactorTool.CalibrationRelease =
'230213_Preliminary_r22run2'
317 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
321 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
322 'reco_effSF' + postfix)
323 sfList += [alg.scaleFactorDecoration]
327 alg = config.createAlgorithm(
'CP::MuonEfficiencyScaleFactorAlg',
328 'MuonEfficiencyScaleFactorAlgBMVHighPt' )
329 config.addPrivateTool(
'efficiencyScaleFactorTool',
330 'CP::MuonEfficiencyScaleFactors' )
331 alg.scaleFactorDecoration =
'muon_BadMuonVeto_effSF' + postfix +
"_%SYS%"
332 alg.outOfValidity = 2
333 alg.outOfValidityDeco =
'muon_BadMuonVeto_bad_eff' + postfix
334 alg.efficiencyScaleFactorTool.WorkingPoint =
'BadMuonVeto_HighPt'
335 if config.geometry() >= LHCPeriod.Run3:
336 alg.efficiencyScaleFactorTool.CalibrationRelease =
'220817_Preliminary_r22run3'
338 alg.efficiencyScaleFactorTool.CalibrationRelease =
'230213_Preliminary_r22run2'
339 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
343 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
344 'BadMuonVeto_effSF' + postfix)
345 sfList += [alg.scaleFactorDecoration]
348 if config.dataType()
is not DataType.Data
and self.isolation !=
'NonIso' and not self.
onlyRecoEffSF and not self.
noEffSF:
349 alg = config.createAlgorithm(
'CP::MuonEfficiencyScaleFactorAlg',
350 'MuonEfficiencyScaleFactorAlgIsol' )
351 config.addPrivateTool(
'efficiencyScaleFactorTool',
352 'CP::MuonEfficiencyScaleFactors' )
353 alg.scaleFactorDecoration =
'muon_isol_effSF' + postfix +
"_%SYS%"
354 alg.outOfValidity = 2
355 alg.outOfValidityDeco =
'muon_isol_bad_eff' + postfix
356 alg.efficiencyScaleFactorTool.WorkingPoint = self.isolation +
'Iso'
357 if config.geometry() >= LHCPeriod.Run3:
358 alg.efficiencyScaleFactorTool.CalibrationRelease =
'251211_Preliminary_r24run3'
360 alg.efficiencyScaleFactorTool.CalibrationRelease =
'230213_Preliminary_r22run2'
361 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
365 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
366 'isol_effSF' + postfix)
367 sfList += [alg.scaleFactorDecoration]
371 alg = config.createAlgorithm(
'CP::MuonEfficiencyScaleFactorAlg',
372 'MuonEfficiencyScaleFactorAlgTTVA' )
373 config.addPrivateTool(
'efficiencyScaleFactorTool',
374 'CP::MuonEfficiencyScaleFactors' )
375 alg.scaleFactorDecoration =
'muon_TTVA_effSF' + postfix +
"_%SYS%"
376 alg.outOfValidity = 2
377 alg.outOfValidityDeco =
'muon_TTVA_bad_eff' + postfix
378 alg.efficiencyScaleFactorTool.WorkingPoint =
'TTVA'
379 if config.geometry() >= LHCPeriod.Run3:
380 alg.efficiencyScaleFactorTool.CalibrationRelease =
'251211_Preliminary_r24run3'
382 alg.efficiencyScaleFactorTool.CalibrationRelease =
'230213_Preliminary_r22run2'
383 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
387 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
388 'TTVA_effSF' + postfix)
389 sfList += [alg.scaleFactorDecoration]
392 alg = config.createAlgorithm(
'CP::AsgObjectScaleFactorAlg',
393 'MuonCombinedEfficiencyScaleFactorAlg' )
395 alg.inScaleFactors = sfList
396 alg.outScaleFactor =
'effSF' + postfix +
'_%SYS%'
397 config.addOutputVar (self.
containerName, alg.outScaleFactor,
'effSF' + postfix)