ATLAS Offline Software
Public Member Functions | List of all members
python.ElectronAnalysisConfig.ElectronTriggerAnalysisSFBlock Class Reference
Inheritance diagram for python.ElectronAnalysisConfig.ElectronTriggerAnalysisSFBlock:
Collaboration diagram for python.ElectronAnalysisConfig.ElectronTriggerAnalysisSFBlock:

Public Member Functions

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

Detailed Description

Definition at line 777 of file ElectronAnalysisConfig.py.

Constructor & Destructor Documentation

◆ __init__()

def python.ElectronAnalysisConfig.ElectronTriggerAnalysisSFBlock.__init__ (   self)

Definition at line 779 of file ElectronAnalysisConfig.py.

779  def __init__ (self) :
780  super (ElectronTriggerAnalysisSFBlock, self).__init__ ()
781 
782  self.addOption ('triggerChainsPerYear', {}, type=None,
783  info="a dictionary with key (string) the year and value (list of "
784  "strings) the trigger chains. The default is {} (empty dictionary).")
785  self.addOption ('electronID', '', type=str,
786  info="the electron ID WP (string) to use.")
787  self.addOption ('electronIsol', '', type=str,
788  info="the electron isolation WP (string) to use.")
789  self.addOption ('saveEff', False, type=bool,
790  info="define whether we decorate also the trigger scale efficiency "
791  "The default is false.")
792  self.addOption ('prefixSF', 'trigEffSF', type=str,
793  info="the decoration prefix for trigger scale factors, "
794  "the default is 'trigEffSF'")
795  self.addOption ('prefixEff', 'trigEff', type=str,
796  info="the decoration prefix for MC trigger efficiencies, "
797  "the default is 'trigEff'")
798  self.addOption ('includeAllYearsPerRun', False, type=bool,
799  info="if True, all configured years in the LHC run will "
800  "be included in all jobs. The default is False.")
801  self.addOption ('removeHLTPrefix', True, type=bool,
802  info="remove the HLT prefix from trigger chain names, "
803  "The default is True.")
804  self.addOption ('useToolKeyAsOutput', False, type=bool,
805  info="use tool trigger key as output, "
806  "The default is False.")
807  self.addOption ('containerName', '', type=str,
808  info="the input electron container, with a possible selection, in "
809  "the format container or container.selection.")
810 

Member Function Documentation

◆ instanceName()

def python.ElectronAnalysisConfig.ElectronTriggerAnalysisSFBlock.instanceName (   self)
Return the instance name for this block

Definition at line 811 of file ElectronAnalysisConfig.py.

811  def instanceName (self) :
812  """Return the instance name for this block"""
813  return self.containerName
814 

◆ makeAlgs()

def python.ElectronAnalysisConfig.ElectronTriggerAnalysisSFBlock.makeAlgs (   self,
  config 
)

Definition at line 815 of file ElectronAnalysisConfig.py.

815  def makeAlgs (self, config) :
816 
817  if config.dataType() is not DataType.Data:
818  log = logging.getLogger('ElectronTriggerSFConfig')
819 
820  if self.includeAllYearsPerRun and not self.useToolKeyAsOutput:
821  log.warning('`includeAllYearsPerRun` is set to True, but `useToolKeyAsOutput` is set to False. '
822  'This will cause multiple branches to be written out with the same content.')
823 
824  # Dictionary from TrigGlobalEfficiencyCorrection/Triggers.cfg
825  # Key is trigger chain (w/o HLT prefix)
826  # Value is empty for single leg trigger or list of legs
827  triggerDict = TriggerDict()
828 
829  # currently recommended versions
830  version_Run2 = "2015_2018/rel21.2/Precision_Summer2020_v1"
831  map_Run2 = f"{version_Run2}/map4.txt"
832  version_Run3 = "2015_2025/rel22.2/2025_Run3_Consolidated_Recommendation_v4"
833  map_Run3 = "2015_2025/rel22.2/2025_Run3_Consolidated_Recommendation_v4/map2.txt"
834 
835  version = version_Run2 if config.geometry() is LHCPeriod.Run2 else version_Run3
836  # Dictionary from TrigGlobalEfficiencyCorrection/MapKeys.cfg
837  # Key is year_leg
838  # Value is list of configs available, first one will be used
839  mapKeysDict = MapKeysDict(version)
840 
841  # helper function for leg filtering, very hardcoded but allows autoconfiguration
842  def filterConfFromMap(conf, electronMapKeys):
843  if not conf:
844  raise ValueError("No configuration found for trigger chain.")
845  if len(conf) == 1:
846  return conf[0]
847 
848  for c in conf:
849  if c in electronMapKeys:
850  return c
851 
852  return conf[0]
853 
854  if self.includeAllYearsPerRun:
855  years = [int(year) for year in self.triggerChainsPerYear.keys()]
856  else:
857  from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig import (
858  get_input_years)
859  years = get_input_years(config)
860 
861  # prepare keys
862  import ROOT
863  triggerChainsPerYear_Run2 = {}
864  triggerChainsPerYear_Run3 = {}
865  for year, chains in self.triggerChainsPerYear.items():
866  if not chains:
867  log.warning("No trigger chains configured for year %s. "
868  "Assuming this is intended, no Electron trigger SF will be computed.", year)
869  continue
870 
871  chains_split = [chain.replace("HLT_", "").replace(" || ", "_OR_") for chain in chains]
872  if int(year) >= 2022:
873  triggerChainsPerYear_Run3[str(year)] = ' || '.join(chains_split)
874  else:
875  triggerChainsPerYear_Run2[str(year)] = ' || '.join(chains_split)
876  electronMapKeys_Run2 = ROOT.std.map("string", "string")()
877  electronMapKeys_Run3 = ROOT.std.map("string", "string")()
878 
879  sc_Run2 = ROOT.TrigGlobalEfficiencyCorrectionTool.suggestElectronMapKeys(triggerChainsPerYear_Run2, version_Run2, electronMapKeys_Run2)
880  sc_Run3 = ROOT.TrigGlobalEfficiencyCorrectionTool.suggestElectronMapKeys(triggerChainsPerYear_Run3, version_Run3, electronMapKeys_Run3)
881  if sc_Run2.code() != 2 or sc_Run3.code() != 2:
882  raise RuntimeError("Failed to suggest electron map keys")
883  electronMapKeys = dict(electronMapKeys_Run2) | dict(electronMapKeys_Run3)
884 
885  # collect configurations
886  from TriggerAnalysisAlgorithms.TriggerAnalysisConfig import is_year_in_current_period
887  triggerConfigs = {}
888  for year in years:
889  if not is_year_in_current_period(config, year):
890  continue
891 
892  triggerChains = self.triggerChainsPerYear.get(int(year), self.triggerChainsPerYear.get(str(year), []))
893  for chain in triggerChains:
894  chain = chain.replace(" || ", "_OR_")
895  chain_noHLT = chain.replace("HLT_", "")
896  chain_out = chain_noHLT if self.removeHLTPrefix else chain
897  legs = triggerDict[chain_noHLT]
898  if not legs:
899  if chain_noHLT[0] == 'e' and chain_noHLT[1].isdigit:
900  chain_key = f"{year}_{chain_noHLT}"
901  chain_conf = mapKeysDict[chain_key][0]
902  triggerConfigs[chain_conf if self.useToolKeyAsOutput else chain_out] = chain_conf
903  else:
904  for leg in legs:
905  if leg[0] == 'e' and leg[1].isdigit:
906  leg_out = leg if self.removeHLTPrefix else f"HLT_{leg}"
907  leg_key = f"{year}_{leg}"
908  leg_conf = filterConfFromMap(mapKeysDict[leg_key], electronMapKeys)
909  triggerConfigs[leg_conf if self.useToolKeyAsOutput else leg_out] = leg_conf
910 
911  decorations = [self.prefixSF]
912  if self.saveEff:
913  decorations += [self.prefixEff]
914 
915  for label, conf in triggerConfigs.items():
916  for deco in decorations:
917  alg = config.createAlgorithm('CP::ElectronEfficiencyCorrectionAlg',
918  'EleTrigEfficiencyCorrectionsAlg' + deco +
919  '_' + label)
920  config.addPrivateTool( 'efficiencyCorrectionTool',
921  'AsgElectronEfficiencyCorrectionTool' )
922 
923  # Reproduce config from TrigGlobalEfficiencyAlg
924  alg.efficiencyCorrectionTool.MapFilePath = "ElectronEfficiencyCorrection/" + (map_Run3 if config.geometry() is LHCPeriod.Run3 else map_Run2)
925  alg.efficiencyCorrectionTool.IdKey = self.electronID.replace("LH","")
926  alg.efficiencyCorrectionTool.IsoKey = self.electronIsol
927  alg.efficiencyCorrectionTool.TriggerKey = (
928  ("Eff_" if deco == self.prefixEff else "") + conf)
929  alg.efficiencyCorrectionTool.CorrelationModel = "TOTAL"
930  alg.efficiencyCorrectionTool.ForceDataType = \
931  PATCore.ParticleDataType.Full
932 
933  alg.scaleFactorDecoration = f"el_{deco}_{label}_%SYS%"
934 
935  alg.outOfValidity = 2 #silent
936  alg.outOfValidityDeco = f"bad_eff_ele{deco}_{label}"
937  alg.electrons = config.readName (self.containerName)
938  alg.preselection = config.getPreselection (self.containerName, "")
939  config.addOutputVar (self.containerName, alg.scaleFactorDecoration, f"{deco}_{label}")
940 
941 

The documentation for this class was generated from the following file:
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
python.processes.powheg.ZZj_MiNNLO.ZZj_MiNNLO.__init__
def __init__(self, base_directory, **kwargs)
Constructor: all process options are set here.
Definition: ZZj_MiNNLO.py:18
TriggerLeg_DictHelpers.MapKeysDict
def MapKeysDict(target_version)
Definition: TriggerLeg_DictHelpers.py:37
python.TriggerAnalysisConfig.is_year_in_current_period
bool is_year_in_current_period(ConfigAccumulator config, int|str year)
Definition: TriggerAnalysisConfig.py:9
python.TriggerAnalysisSFConfig.get_input_years
list[int] get_input_years(ConfigAccumulator config)
Definition: TriggerAnalysisSFConfig.py:35
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
TriggerLeg_DictHelpers.TriggerDict
def TriggerDict()
Definition: TriggerLeg_DictHelpers.py:8
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:71
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
str
Definition: BTagTrackIpAccessor.cxx:11
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:801