815 def makeAlgs (self, config) :
817 if config.dataType()
is not DataType.Data:
818 log = logging.getLogger(
'ElectronTriggerSFConfig')
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.')
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"
835 version = version_Run2
if config.geometry()
is LHCPeriod.Run2
else version_Run3
842 def filterConfFromMap(conf, electronMapKeys):
844 raise ValueError(
"No configuration found for trigger chain.")
849 if c
in electronMapKeys:
854 if self.includeAllYearsPerRun:
855 years = [
int(year)
for year
in self.triggerChainsPerYear.
keys()]
857 from TriggerAnalysisAlgorithms.TriggerAnalysisSFConfig
import (
863 triggerChainsPerYear_Run2 = {}
864 triggerChainsPerYear_Run3 = {}
865 for year, chains
in self.triggerChainsPerYear.
items():
867 log.warning(
"No trigger chains configured for year %s. "
868 "Assuming this is intended, no Electron trigger SF will be computed.", year)
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)
875 triggerChainsPerYear_Run2[
str(year)] =
' || '.
join(chains_split)
876 electronMapKeys_Run2 = ROOT.std.map(
"string",
"string")()
877 electronMapKeys_Run3 = ROOT.std.map(
"string",
"string")()
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)
886 from TriggerAnalysisAlgorithms.TriggerAnalysisConfig
import is_year_in_current_period
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]
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
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
911 decorations = [self.prefixSF]
913 decorations += [self.prefixEff]
915 for label, conf
in triggerConfigs.items():
916 for deco
in decorations:
917 alg = config.createAlgorithm(
'CP::ElectronEfficiencyCorrectionAlg',
918 'EleTrigEfficiencyCorrectionsAlg' + deco +
920 config.addPrivateTool(
'efficiencyCorrectionTool',
921 'AsgElectronEfficiencyCorrectionTool' )
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
933 alg.scaleFactorDecoration = f
"el_{deco}_{label}_%SYS%"
935 alg.outOfValidity = 2
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}")