ATLAS Offline Software
Loading...
Searching...
No Matches
python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock Class Reference
Inheritance diagram for python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock:
Collaboration diagram for python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock:

Public Member Functions

 __init__ (self)
 instanceName (self)
 makeAlgs (self, config)

Public Attributes

 includeAllYearsPerRun
 saveSF
 saveEff
 saveEffData
 containerName

Detailed Description

Definition at line 396 of file MuonAnalysisConfig.py.

Constructor & Destructor Documentation

◆ __init__()

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.__init__ ( self)

Definition at line 398 of file MuonAnalysisConfig.py.

398 def __init__ (self) :
399 super (MuonTriggerAnalysisSFBlock, self).__init__ ()
400
401 self.addOption ('triggerChainsPerYear', {}, type=None,
402 info="a dictionary with key (string) the year and value (list of "
403 "strings) the trigger chains. The default is {} (empty dictionary).")
404 self.addOption ('muonID', '', type=str,
405 info="the muon quality WP (string) to use.")
406 self.addOption ('saveSF', True, type=bool,
407 info="define whether we decorate the trigger scale factor "
408 "The default is True.")
409 self.addOption ('saveEff', False, type=bool,
410 info="define whether we decorate the trigger MC efficiencies "
411 "The default is False.")
412 self.addOption ('saveEffData', False, type=bool,
413 info="define whether we decorate the trigger data efficiencies "
414 "The default is False.")
415 self.addOption ('prefixSF', 'trigEffSF', type=str,
416 info="the decoration prefix for trigger scale factors, "
417 "the default is 'trigEffSF'")
418 self.addOption ('prefixEff', 'trigEff', type=str,
419 info="the decoration prefix for MC trigger efficiencies, "
420 "the default is 'trigEff'")
421 self.addOption ('prefixEffData', 'trigEffData', type=str,
422 info="the decoration prefix for data trigger efficiencies, "
423 "the default is 'trigEffData'")
424 self.addOption ('includeAllYearsPerRun', False, type=bool,
425 info="if True, all configured years in the LHC run will "
426 "be included in all jobs. The default is False.")
427 self.addOption ('removeHLTPrefix', True, type=bool,
428 info="remove the HLT prefix from trigger chain names, "
429 "The default is True.")
430 self.addOption ('containerName', '', type=str,
431 info="the input muon container, with a possible selection, in "
432 "the format container or container.selection.")
433

Member Function Documentation

◆ instanceName()

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.instanceName ( self)

Definition at line 434 of file MuonAnalysisConfig.py.

434 def instanceName (self) :
435 return self.containerName + '_' + self.muonID
436

◆ makeAlgs()

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.makeAlgs ( self,
config )

Definition at line 437 of file MuonAnalysisConfig.py.

437 def makeAlgs (self, config) :
438
439 if config.dataType() is not DataType.Data:
440
441 # Dictionary from TrigGlobalEfficiencyCorrection/Triggers.cfg
442 # Key is trigger chain (w/o HLT prefix)
443 # Value is empty for single leg trigger or list of legs
444 triggerDict = TriggerDict()
445
446 if self.includeAllYearsPerRun:
447 years = [int(year) for year in self.triggerChainsPerYear.keys()]
448 else:
449 from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig import (
450 get_input_years)
451 years = get_input_years(config)
452
453 triggerYearStartBoundaries = {
454 2015: 260000,
455 2016: 290000,
456 2017: 324000,
457 2018: 348000,
458 2022: 410000,
459 2023: 450000,
460 2024: 470000,
461 }
462
463 triggerConfigs = {}
464 triggerConfigYears = {}
465 from TriggerAnalysisAlgorithms.TriggerAnalysisConfig import is_year_in_current_period
466 for year in years:
467 if not is_year_in_current_period(config, year):
468 continue
469
470 triggerChains = self.triggerChainsPerYear.get(int(year), self.triggerChainsPerYear.get(str(year), []))
471 for chain in triggerChains:
472 chain = chain.replace(" || ", "_OR_")
473 chain_noHLT = chain.replace("HLT_", "")
474 chain_out = chain_noHLT if self.removeHLTPrefix else chain
475 legs = triggerDict[chain_noHLT]
476 if not legs:
477 if chain_noHLT.startswith('mu') and chain_noHLT[2].isdigit:
478 # Need to support HLT_mu26_ivarmedium_OR_HLT_mu50
479 triggerConfigs[chain_out] = chain
480 if chain_out in triggerConfigYears.keys():
481 triggerConfigYears[chain_out].append(year)
482 else:
483 triggerConfigYears[chain_out] = [year]
484 else:
485 for leg in legs:
486 if leg.startswith('mu') and leg[2].isdigit:
487 # Need to support HLT_mu14_ivarloose
488 leg_out = leg if self.removeHLTPrefix else f"HLT_{leg}"
489 triggerConfigs[leg_out] = f"HLT_{leg}"
490 if leg_out in triggerConfigYears.keys():
491 triggerConfigYears[leg_out].append(year)
492 else:
493 triggerConfigYears[leg_out] = [year]
494
495 for trig_short, trig in triggerConfigs.items():
496 alg = config.createAlgorithm('CP::MuonTriggerEfficiencyScaleFactorAlg',
497 'MuonTrigEfficiencyCorrectionsAlg_' + trig_short)
498 config.addPrivateTool( 'efficiencyScaleFactorTool',
499 'CP::MuonTriggerScaleFactors' )
500
501 # Reproduce config from TrigGlobalEfficiencyAlg
502 alg.efficiencyScaleFactorTool.MuonQuality = self.muonID
503 alg.efficiencyScaleFactorTool.AllowZeroSF = True
504
505 # Avoid warnings for missing triggers
506 if self.includeAllYearsPerRun:
507 alg.minRunNumber = 0
508 alg.maxRunNumber = 999999
509
510 if triggerConfigYears[trig_short][0] != years[0]:
511 alg.minRunNumber = triggerYearStartBoundaries.get(triggerConfigYears[trig_short][0], 999999)
512 if triggerConfigYears[trig_short][-1] != years[-1]:
513 alg.maxRunNumber = triggerYearStartBoundaries.get(triggerConfigYears[trig_short][-1] + 1, 999999)
514 elif config.campaign() is Campaign.MC20a: # to avoid potential corner-cases keep the default config unchanged
515 if triggerConfigYears[trig_short] == [2015]:
516 alg.maxRunNumber = 290000
517 elif triggerConfigYears[trig_short] == [2016]:
518 alg.minRunNumber = 290000
519
520 alg.trigger = trig
521
522 # Some triggers in `250731_SummerUpdate` recommendations are not supported in 2022 period F
523 if config.campaign() is Campaign.MC23a and (trig_short == "HLT_mu8noL1_FSNOSEED" or trig_short == "HLT_mu22_L1MU14FCH"):
524 alg.minRunNumber = 435816 # Start of 2022 period H
525
526 if self.saveSF:
527 alg.scaleFactorDecoration = f"muon_{self.prefixSF}_{trig_short}_%SYS%"
528 if self.saveEff:
529 alg.mcEfficiencyDecoration = f"muon_{self.prefixEff}_{trig_short}_%SYS%"
530 if self.saveEffData:
531 alg.dataEfficiencyDecoration = f"muon_{self.prefixEffData}_{trig_short}_%SYS%"
532 alg.outOfValidity = 2 #silent
533 alg.outOfValidityDeco = f"bad_eff_muontrig_{trig_short}"
534 alg.muons = config.readName (self.containerName)
535 alg.preselection = config.getPreselection (self.containerName, '')
536 if self.saveSF:
537 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, f"{self.prefixSF}_{trig_short}")
538 if self.saveEff:
539 config.addOutputVar (self.containerName, alg.mcEfficiencyDecoration, f"{self.prefixEff}_{trig_short}")
540 if self.saveEffData:
541 config.addOutputVar (self.containerName, alg.dataEfficiencyDecoration, f"{self.prefixEffData}_{trig_short}")
542
543
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130

Member Data Documentation

◆ containerName

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.containerName

Definition at line 537 of file MuonAnalysisConfig.py.

◆ includeAllYearsPerRun

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.includeAllYearsPerRun

Definition at line 446 of file MuonAnalysisConfig.py.

◆ saveEff

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.saveEff

Definition at line 528 of file MuonAnalysisConfig.py.

◆ saveEffData

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.saveEffData

Definition at line 530 of file MuonAnalysisConfig.py.

◆ saveSF

python.MuonAnalysisConfig.MuonTriggerAnalysisSFBlock.saveSF

Definition at line 526 of file MuonAnalysisConfig.py.


The documentation for this class was generated from the following file: