230 log = logging.getLogger(
'MuonWorkingPointConfig')
232 from xAODMuon.xAODMuonEnums
import xAODMuonEnums
234 quality = xAODMuonEnums.Quality.Tight
235 elif self.
quality ==
'Medium' :
236 quality = xAODMuonEnums.Quality.Medium
238 quality = xAODMuonEnums.Quality.Loose
239 elif self.
quality ==
'VeryLoose' :
240 quality = xAODMuonEnums.Quality.VeryLoose
241 elif self.
quality ==
'HighPt' :
246 raise ValueError (
"invalid muon quality: \"" + self.
quality +
247 "\", allowed values are Tight, Medium, Loose, " +
248 "VeryLoose, HighPt, LowPt")
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)
254 postfix = self.postfix
257 if postfix !=
'' and postfix[0] !=
'_' :
258 postfix =
'_' + postfix
262 alg = config.createAlgorithm(
'CP::AsgLeptonTrackSelectionAlg',
263 'MuonTrackSelectionAlg',
265 alg.selectionDecoration =
'trackSelection' + postfix +
',as_bits'
266 alg.maxD0Significance = self.maxD0Significance
267 alg.maxDeltaZ0SinTheta = self.maxDeltaZ0SinTheta
269 alg.preselection = config.getPreselection (self.
containerName,
'')
273 alg = config.createAlgorithm(
'CP::MuonSelectionAlgV2',
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
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'
288 alg.selectionDecoration,
289 preselection=self.addSelectionToPreselection)
291 config.addOutputVar (self.
containerName,
'is_bad' + postfix,
'is_bad' + postfix)
294 if self.isolation !=
'NonIso' :
295 alg = config.createAlgorithm(
'CP::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'
304 alg.isolationDecoration,
305 preselection=self.addSelectionToPreselection)
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 =
'250418_Preliminary_r24run3'
320 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
324 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
325 'reco_effSF' + postfix)
326 sfList += [alg.scaleFactorDecoration]
330 alg = config.createAlgorithm(
'CP::MuonEfficiencyScaleFactorAlg',
331 'MuonEfficiencyScaleFactorAlgBMVHighPt' )
332 config.addPrivateTool(
'efficiencyScaleFactorTool',
333 'CP::MuonEfficiencyScaleFactors' )
334 alg.scaleFactorDecoration =
'muon_BadMuonVeto_effSF' + postfix +
"_%SYS%"
335 alg.outOfValidity = 2
336 alg.outOfValidityDeco =
'muon_BadMuonVeto_bad_eff' + postfix
337 alg.efficiencyScaleFactorTool.WorkingPoint =
'BadMuonVeto_HighPt'
338 if config.geometry() >= LHCPeriod.Run3:
339 alg.efficiencyScaleFactorTool.CalibrationRelease =
'220817_Preliminary_r22run3'
340 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
344 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
345 'BadMuonVeto_effSF' + postfix)
346 sfList += [alg.scaleFactorDecoration]
349 if config.dataType()
is not DataType.Data
and self.isolation !=
'NonIso' and not self.
onlyRecoEffSF and not self.
noEffSF:
350 alg = config.createAlgorithm(
'CP::MuonEfficiencyScaleFactorAlg',
351 'MuonEfficiencyScaleFactorAlgIsol' )
352 config.addPrivateTool(
'efficiencyScaleFactorTool',
353 'CP::MuonEfficiencyScaleFactors' )
354 alg.scaleFactorDecoration =
'muon_isol_effSF' + postfix +
"_%SYS%"
355 alg.outOfValidity = 2
356 alg.outOfValidityDeco =
'muon_isol_bad_eff' + postfix
357 alg.efficiencyScaleFactorTool.WorkingPoint = self.isolation +
'Iso'
358 if config.geometry() >= LHCPeriod.Run3:
359 alg.efficiencyScaleFactorTool.CalibrationRelease =
'250418_Preliminary_r24run3'
360 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
364 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
365 'isol_effSF' + postfix)
366 sfList += [alg.scaleFactorDecoration]
370 alg = config.createAlgorithm(
'CP::MuonEfficiencyScaleFactorAlg',
371 'MuonEfficiencyScaleFactorAlgTTVA' )
372 config.addPrivateTool(
'efficiencyScaleFactorTool',
373 'CP::MuonEfficiencyScaleFactors' )
374 alg.scaleFactorDecoration =
'muon_TTVA_effSF' + postfix +
"_%SYS%"
375 alg.outOfValidity = 2
376 alg.outOfValidityDeco =
'muon_TTVA_bad_eff' + postfix
377 alg.efficiencyScaleFactorTool.WorkingPoint =
'TTVA'
378 if config.geometry() >= LHCPeriod.Run3:
379 alg.efficiencyScaleFactorTool.CalibrationRelease =
'250418_Preliminary_r24run3'
380 alg.efficiencyScaleFactorTool.BreakDownSystematics = self.systematicBreakdown
384 config.addOutputVar (self.
containerName, alg.scaleFactorDecoration,
385 'TTVA_effSF' + postfix)
386 sfList += [alg.scaleFactorDecoration]
389 alg = config.createAlgorithm(
'CP::AsgObjectScaleFactorAlg',
390 'MuonCombinedEfficiencyScaleFactorAlg' )
392 alg.inScaleFactors = sfList
393 alg.outScaleFactor =
'effSF' + postfix +
'_%SYS%'
394 config.addOutputVar (self.
containerName, alg.outScaleFactor,
'effSF' + postfix)