819 def makeAlgs (self, config) :
821 if config.dataType()
is not DataType.Data:
822 log = logging.getLogger(
'ElectronTriggerSFConfig')
824 if self.includeAllYearsPerRun
and not self.useToolKeyAsOutput:
825 log.warning(
'`includeAllYearsPerRun` is set to True, but `useToolKeyAsOutput` is set to False. '
826 'This will cause multiple branches to be written out with the same content.')
834 version_Run2 =
"2015_2018/rel21.2/Precision_Summer2020_v1"
835 map_Run2 = f
"{version_Run2}/map4.txt"
836 version_Run3 =
"2015_2025/rel22.2/2025_Run3_Consolidated_Recommendation_v4"
837 map_Run3 =
"2015_2025/rel22.2/2025_Run3_Consolidated_Recommendation_v4/map2.txt"
839 version = version_Run2
if config.geometry()
is LHCPeriod.Run2
else version_Run3
846 def filterConfFromMap(conf, electronMapKeys):
848 raise ValueError(
"No configuration found for trigger chain.")
853 if c
in electronMapKeys:
858 if self.includeAllYearsPerRun:
859 years = [
int(year)
for year
in self.triggerChainsPerYear.
keys()]
861 from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig
import (
867 triggerChainsPerYear_Run2 = {}
868 triggerChainsPerYear_Run3 = {}
869 for year, chains
in self.triggerChainsPerYear.
items():
871 log.warning(
"No trigger chains configured for year %s. "
872 "Assuming this is intended, no Electron trigger SF will be computed.", year)
875 chains_split = [chain.replace(
"HLT_",
"").
replace(
" || ",
"_OR_")
for chain
in chains]
876 if int(year) >= 2022:
877 triggerChainsPerYear_Run3[
str(year)] =
' || '.
join(chains_split)
879 triggerChainsPerYear_Run2[
str(year)] =
' || '.
join(chains_split)
880 electronMapKeys_Run2 = ROOT.std.map(
"string",
"string")()
881 electronMapKeys_Run3 = ROOT.std.map(
"string",
"string")()
883 sc_Run2 = ROOT.TrigGlobalEfficiencyCorrectionTool.suggestElectronMapKeys(triggerChainsPerYear_Run2, version_Run2, electronMapKeys_Run2)
884 sc_Run3 = ROOT.TrigGlobalEfficiencyCorrectionTool.suggestElectronMapKeys(triggerChainsPerYear_Run3, version_Run3, electronMapKeys_Run3)
885 if sc_Run2.code() != 2
or sc_Run3.code() != 2:
886 raise RuntimeError(
"Failed to suggest electron map keys")
887 electronMapKeys = dict(electronMapKeys_Run2) | dict(electronMapKeys_Run3)
890 from TriggerAnalysisAlgorithms.TriggerAnalysisConfig
import is_year_in_current_period
896 triggerChains = self.triggerChainsPerYear.
get(
int(year), self.triggerChainsPerYear.
get(
str(year), []))
897 for chain
in triggerChains:
898 chain = chain.replace(
" || ",
"_OR_")
899 chain_noHLT = chain.replace(
"HLT_",
"")
900 chain_out = chain_noHLT
if self.removeHLTPrefix
else chain
901 legs = triggerDict[chain_noHLT]
903 if chain_noHLT[0] ==
'e' and chain_noHLT[1].isdigit:
904 chain_key = f
"{year}_{chain_noHLT}"
905 chain_conf = mapKeysDict[chain_key][0]
906 triggerConfigs[chain_conf
if self.useToolKeyAsOutput
else chain_out] = chain_conf
909 if leg[0] ==
'e' and leg[1].isdigit:
910 leg_out = leg
if self.removeHLTPrefix
else f
"HLT_{leg}"
911 leg_key = f
"{year}_{leg}"
912 leg_conf = filterConfFromMap(mapKeysDict[leg_key], electronMapKeys)
913 triggerConfigs[leg_conf
if self.useToolKeyAsOutput
else leg_out] = leg_conf
915 decorations = [self.prefixSF]
917 decorations += [self.prefixEff]
919 for label, conf
in triggerConfigs.items():
920 for deco
in decorations:
921 alg = config.createAlgorithm(
'CP::ElectronEfficiencyCorrectionAlg',
922 'EleTrigEfficiencyCorrectionsAlg' + deco +
924 config.addPrivateTool(
'efficiencyCorrectionTool',
925 'AsgElectronEfficiencyCorrectionTool' )
928 alg.efficiencyCorrectionTool.MapFilePath =
"ElectronEfficiencyCorrection/" + (map_Run3
if config.geometry()
is LHCPeriod.Run3
else map_Run2)
929 alg.efficiencyCorrectionTool.IdKey = self.electronID.
replace(
"LH",
"")
930 alg.efficiencyCorrectionTool.IsoKey = self.electronIsol
931 alg.efficiencyCorrectionTool.TriggerKey = (
932 (
"Eff_" if deco == self.prefixEff
else "") + conf)
933 alg.efficiencyCorrectionTool.CorrelationModel =
"TOTAL"
934 alg.efficiencyCorrectionTool.ForceDataType = \
935 PATCore.ParticleDataType.Full
937 alg.scaleFactorDecoration = f
"el_{deco}_{label}_%SYS%"
939 alg.outOfValidity = 2
940 alg.outOfValidityDeco = f
"bad_eff_ele{deco}_{label}"
941 alg.electrons = config.readName (self.containerName)
942 alg.preselection = config.getPreselection (self.containerName,
"")
943 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, f
"{deco}_{label}")