811 def makeAlgs (self, config) :
813 if config.dataType()
is not DataType.Data:
814 log = logging.getLogger(
'ElectronTriggerSFConfig')
816 if self.includeAllYearsPerRun
and not self.useToolKeyAsOutput:
817 log.warning(
'`includeAllYearsPerRun` is set to True, but `useToolKeyAsOutput` is set to False. '
818 'This will cause multiple branches to be written out with the same content.')
826 version_Run2 =
"2015_2018/rel21.2/Precision_Summer2020_v1"
827 map_Run2 = f
"{version_Run2}/map4.txt"
828 version_Run3 =
"2015_2025/rel22.2/2025_Run3_Consolidated_Recommendation_v4"
829 map_Run3 =
"2015_2025/rel22.2/2025_Run3_Consolidated_Recommendation_v4/map2.txt"
831 version = version_Run2
if config.geometry()
is LHCPeriod.Run2
else version_Run3
838 def filterConfFromMap(conf, electronMapKeys):
840 raise ValueError(
"No configuration found for trigger chain.")
845 if c
in electronMapKeys:
850 if self.includeAllYearsPerRun:
851 years = [
int(year)
for year
in self.triggerChainsPerYear.
keys()]
853 from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig
import (
859 triggerChainsPerYear_Run2 = {}
860 triggerChainsPerYear_Run3 = {}
861 for year, chains
in self.triggerChainsPerYear.
items():
863 log.warning(
"No trigger chains configured for year %s. "
864 "Assuming this is intended, no Electron trigger SF will be computed.", year)
867 chains_split = [chain.replace(
"HLT_",
"").
replace(
" || ",
"_OR_")
for chain
in chains]
868 if int(year) >= 2022:
869 triggerChainsPerYear_Run3[
str(year)] =
' || '.
join(chains_split)
871 triggerChainsPerYear_Run2[
str(year)] =
' || '.
join(chains_split)
872 electronMapKeys_Run2 = ROOT.std.map(
"string",
"string")()
873 electronMapKeys_Run3 = ROOT.std.map(
"string",
"string")()
875 sc_Run2 = ROOT.TrigGlobalEfficiencyCorrectionTool.suggestElectronMapKeys(triggerChainsPerYear_Run2, version_Run2, electronMapKeys_Run2)
876 sc_Run3 = ROOT.TrigGlobalEfficiencyCorrectionTool.suggestElectronMapKeys(triggerChainsPerYear_Run3, version_Run3, electronMapKeys_Run3)
877 if sc_Run2.code() != 2
or sc_Run3.code() != 2:
878 raise RuntimeError(
"Failed to suggest electron map keys")
879 electronMapKeys = dict(electronMapKeys_Run2) | dict(electronMapKeys_Run3)
882 from TriggerAnalysisAlgorithms.TriggerAnalysisConfig
import is_year_in_current_period
888 triggerChains = self.triggerChainsPerYear.
get(
int(year), self.triggerChainsPerYear.
get(
str(year), []))
889 for chain
in triggerChains:
890 chain = chain.replace(
" || ",
"_OR_")
891 chain_noHLT = chain.replace(
"HLT_",
"")
892 chain_out = chain_noHLT
if self.removeHLTPrefix
else chain
893 legs = triggerDict[chain_noHLT]
895 if chain_noHLT[0] ==
'e' and chain_noHLT[1].isdigit:
896 chain_key = f
"{year}_{chain_noHLT}"
897 chain_conf = mapKeysDict[chain_key][0]
898 triggerConfigs[chain_conf
if self.useToolKeyAsOutput
else chain_out] = chain_conf
901 if leg[0] ==
'e' and leg[1].isdigit:
902 leg_out = leg
if self.removeHLTPrefix
else f
"HLT_{leg}"
903 leg_key = f
"{year}_{leg}"
904 leg_conf = filterConfFromMap(mapKeysDict[leg_key], electronMapKeys)
905 triggerConfigs[leg_conf
if self.useToolKeyAsOutput
else leg_out] = leg_conf
907 decorations = [self.prefixSF]
909 decorations += [self.prefixEff]
911 for label, conf
in triggerConfigs.items():
912 for deco
in decorations:
913 alg = config.createAlgorithm(
'CP::ElectronEfficiencyCorrectionAlg',
914 'EleTrigEfficiencyCorrectionsAlg' + deco +
916 config.addPrivateTool(
'efficiencyCorrectionTool',
917 'AsgElectronEfficiencyCorrectionTool' )
920 alg.efficiencyCorrectionTool.MapFilePath =
"ElectronEfficiencyCorrection/" + (map_Run3
if config.geometry()
is LHCPeriod.Run3
else map_Run2)
921 alg.efficiencyCorrectionTool.IdKey = self.electronID.
replace(
"LH",
"")
922 alg.efficiencyCorrectionTool.IsoKey = self.electronIsol
923 alg.efficiencyCorrectionTool.TriggerKey = (
924 (
"Eff_" if deco == self.prefixEff
else "") + conf)
925 alg.efficiencyCorrectionTool.CorrelationModel =
"TOTAL"
926 alg.efficiencyCorrectionTool.ForceDataType = \
927 PATCore.ParticleDataType.Full
929 alg.scaleFactorDecoration = f
"el_{deco}_{label}_%SYS%"
931 alg.outOfValidity = 2
932 alg.outOfValidityDeco = f
"bad_eff_ele{deco}_{label}"
933 alg.electrons = config.readName (self.containerName)
934 alg.preselection = config.getPreselection (self.containerName,
"")
935 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, f
"{deco}_{label}")