3 from typing
import Optional, Callable, Any
4 from dataclasses
import dataclass, field
6 from AthenaCommon.Logging
import logging
7 log = logging.getLogger(__name__)
12 l1_prescales: dict[str, float] =
field(default_factory=dict)
13 hlt_prescales: dict[str, float] =
field(default_factory=dict)
19 This is an extremely basic prescale set generator. No "smart" optimizations (e.g. prescaling
20 all HLT chains for an L1 trigger -> prescale L1 trigger by lowest prescale) are applied.
22 The prescales are set based on the following priority: disable_* >> *_prescales >> enable_*.
23 Also, HLT chain >> group (i.e. a group can be disabled while a single chain in that group is enables).
24 If the enable_chains/groups/l1_triggers list is not set, all triggers in that category will be enabled by default.
26 This is NOT meant to be used in data-taking, only for development tests and standard reprocessings/MC productions.
28 For any more complex prescale sets, refer to the `TrigMenuRulebook` (used to create PS sets
29 for data-taking), located at: https://gitlab.cern.ch/atlas-trigger-menu/TrigMenuRulebook/
32 enable_chains: Optional[list[str]] =
None
33 disable_chains: list[str] =
field(default_factory=list)
34 chain_prescales: dict[str, float] =
field(default_factory=dict)
36 enable_groups: Optional[list[str]] =
None
37 disable_groups: list[str] =
field(default_factory=list)
38 group_prescales: dict[str, float] =
field(default_factory=dict)
40 enable_l1_triggers: Optional[list[str]] =
None
41 disable_l1_triggers: list[str] =
field(default_factory=list)
42 l1_trigger_prescales: dict[str, float] =
field(default_factory=dict)
43 disable_unused_l1_triggers: bool =
False
45 custom_rules: Optional[Callable[[AutoPrescaleSet, dict[str, dict[str, Any]]], AutoPrescaleSet]] =
None
59 def disable_unused_l1(ps_set: AutoPrescaleSet, chain_dicts: dict[str, dict[str, Any]]) -> AutoPrescaleSet:
60 '''Disable unused L1 triggers'''
61 enabled_l1_triggers =
set()
63 for chain
in ps_set.hlt_prescales:
64 l1 = chain_dicts[chain][
'L1item']
65 if ps_set.hlt_prescales[chain] > 0
and l1:
66 enabled_l1_triggers |= {l1}
if isinstance(l1, str)
else set(l1)
68 for l1_trigger
in ps_set.l1_prescales:
69 if l1_trigger
not in enabled_l1_triggers:
70 ps_set.l1_prescales[l1_trigger] = -1
78 from TrigConfigSvc.TrigConfigSvcCfg
import createL1PrescalesFileFromMenu
81 from TriggerMenuMT.HLT.Config.Utility.HLTMenuConfig
import HLTMenuConfig
82 from TriggerMenuMT.HLT.Config.JSON.HLTPrescaleJSON
import generatePrescaleJSON
86 def generate(self, flags, store: bool =
False) -> AutoPrescaleSet:
88 from TriggerMenuMT.HLT.Config.Utility.HLTMenuConfig
import HLTMenuConfig
91 from TrigConfigSvc.TriggerConfigAccess
import getL1MenuAccess
94 group_prescales_set =
set(self.group_prescales.
keys())
96 def match(s1: set, s2: set) -> bool:
return not s1.isdisjoint(s2)
102 for chain, chain_dict
in HLTMenuConfig.dicts().
items():
107 elif chain
in self.chain_prescales: ps = self.chain_prescales[chain]
110 elif match(group_prescales_set, chain_dict[
'groups']):
112 for group
in reversed(chain_dict[
'groups']):
113 if group
in self.group_prescales:
114 ps = self.group_prescales[group]
116 elif chain_dict[
'L1item']:
117 l1s = {chain_dict[
'L1item']}
if isinstance(chain_dict[
'L1item'], str)
else set(chain_dict[
'L1item'])
124 ps_set.hlt_prescales[chain] = ps
127 for l1_trigger
in l1_triggers:
131 elif l1_trigger
in self.l1_trigger_prescales: ps = self.l1_trigger_prescales[l1_trigger]
135 ps_set.l1_prescales[l1_trigger] = ps
137 if self.disable_unused_l1_triggers:
141 if self.custom_rules:
142 ps_set = self.custom_rules(ps_set, HLTMenuConfig.dicts())
146 for chain, ps
in ps_set.hlt_prescales.items():
147 if ps != 1: log.info(f
'Applying HLTPS to the chain {chain}: {ps}')
148 HLTMenuConfig.dicts()[chain][
'prescale'] = ps