ATLAS Offline Software
Loading...
Searching...
No Matches
TriggerListsHelper.py
Go to the documentation of this file.
1# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2# TriggerListsHelper: helper class which retrieves the full set of triggers needed for
3# trigger matching in the DAODs and can then return them when needed.
4
5from TriggerMenuMT.TriggerAPI import TriggerAPISession, TriggerType, TriggerAPI, TriggerPeriod
6from PathResolver import PathResolver
7from AthenaConfiguration.AutoConfigFlags import GetFileMD
8
10 """Read a text file containing a list of triggers
11 Returns the list of triggers held in the file
12 """
13 triggers = []
14 with open(PathResolver.FindCalibFile(fname)) as fp:
15 for line in fp:
16 line = line.strip()
17 if line == "" or line.startswith("#"):
18 continue
19 triggers.append(line)
20 return triggers
21
23 trigger_names_notau = []
24 trigger_names_tau = []
25 for chain_name in flags.Trigger.derivationsExtraChains:
26 if "tau" in chain_name:
27 trigger_names_tau.append(chain_name)
28 else:
29 trigger_names_notau.append(chain_name)
30 return (trigger_names_notau, trigger_names_tau)
31
32def getTapisSession(flags):
33 from Campaigns.Utils import Campaign
34 from AthenaConfiguration.Enums import Format
35 yearStr = str(flags.Input.DataYear) if not flags.Input.isMC else ""
36 if flags.Input.isMC:
37 if flags.Input.MCCampaign == Campaign.MC16a or flags.Input.MCCampaign == Campaign.MC20a:
38 yearStr = "2015_2016"
39 elif flags.Input.MCCampaign == Campaign.MC16d or flags.Input.MCCampaign == Campaign.MC20d:
40 yearStr = "2017"
41 elif flags.Input.MCCampaign == Campaign.MC16e or flags.Input.MCCampaign == Campaign.MC20e:
42 yearStr = "2018"
43 elif flags.Input.MCCampaign == Campaign.MC23a or flags.Input.MCCampaign == Campaign.MC21a:
44 yearStr = "2022"
45 elif flags.Input.MCCampaign == Campaign.MC23c or flags.Input.MCCampaign == Campaign.MC23d:
46 yearStr = "2023"
47 elif flags.Input.MCCampaign == Campaign.MC23e:
48 yearStr = "2024"
49 elif flags.Input.MCCampaign == Campaign.MC23g:
50 yearStr = "2025"
51
52 session_files = {
53 "2015": "TriggerAPISessions/tapis_data15_13TeV_20190708_PHYS_StandardGRL_All_Good_25ns.json",
54 "2016": "TriggerAPISessions/tapis_data16_13TeV_20190708_PHYS_StandardGRL_All_Good_25ns_WITH_IGNORES.json",
55 "2015_2016": "TriggerAPISessions/tapis_data15_13TeV_20190708_PHYS_StandardGRL_All_Good_25ns_data16_13TeV_20190708_PHYS_StandardGRL_All_Good_25ns_WITH_IGNORES.json",
56 "2017": "TriggerAPISessions/tapis_data17_13TeV_20190708_PHYS_StandardGRL_All_Good_25ns_Triggerno17e33prim.json",
57 "2018": "TriggerAPISessions/tapis_data18_13TeV_20190708_PHYS_StandardGRL_All_Good_25ns_Triggerno17e33prim.json",
58 "2022": "TriggerAPISessions/tapis_data22_13p6TeV_20230207_PHYS_StandardGRL_All_Good_25ns.json",
59 "2023": "TriggerAPISessions/tapis_data23_13p6TeV_20230828_PHYS_StandardGRL_All_Good_25ns.json",
60 "2024": "TriggerAPISessions/tapis_data24_13p6TeV_20241118_PHYS_StandardGRL_All_Good_25ns.json",
61 "2025": "TriggerAPISessions/tapis_data25_13p6TeV_20260129_PHYS_StandardGRL_All_Good_25ns.json",
62 }
63
64 if yearStr in session_files:
65 return TriggerAPISession(json=session_files[yearStr])
66
67 # Otherwise: future data/MC or phase-II. Base this on the menu from the AOD.
68 if flags.Input.Format == Format.POOL:
69 return TriggerAPISession(file=flags.Input.Files[0])
70
71 from AthenaCommon.Logging import logging
72 logging.getLogger('TriggerListHelper::GetTriggerLists::getTapisSession').error('Failed to obtain a session.')
73 return None
74
75
77 def __init__(self, flags):
78 self.flags = flags
79 TriggerAPI.setConfigFlags(flags)
83 self.GetTriggerLists()
84
85 def GetTriggerLists(self):
86
87 md = GetFileMD(self.flags.Input.Files)
88 hlt_menu = md.get('TriggerMenu', {}).get('HLTChains', None)
89
90 if self.flags.Trigger.EDMVersion <= 2:
91
92 # Trigger API for Runs 1, 2
93 #====================================================================
94 # TRIGGER CONTENT
95 #====================================================================
96
99 allperiods = TriggerPeriod.y2015 | TriggerPeriod.y2016 | TriggerPeriod.y2017 | TriggerPeriod.y2018 | TriggerPeriod.future2e34
100 trig_el = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.el, livefraction=0.8)
101 trig_mu = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.mu, livefraction=0.8)
102 trig_g = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.g, livefraction=0.8)
103 trig_tau = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.tau, livefraction=0.8)
104
105 trig_em = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.el, additionalTriggerType=TriggerType.mu, livefraction=0.8)
106 trig_et = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.el, additionalTriggerType=TriggerType.tau, livefraction=0.8)
107 trig_mt = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.mu, additionalTriggerType=TriggerType.tau, livefraction=0.8)
108 # Note that this seems to pick up both isolated and non-isolated triggers already, so no need for extra grabs
109 trig_txe = TriggerAPI.getLowestUnprescaledAnyPeriod(allperiods, triggerType=TriggerType.tau, additionalTriggerType=TriggerType.xe, livefraction=0.8)
110
111
112 extra_file_notau = read_trig_list_file("DerivationFrameworkPhys/run2ExtraMatchingTriggers.txt")
113 extra_file_tau = read_trig_list_file("DerivationFrameworkPhys/run2ExtraMatchingTauTriggers.txt")
114
115
116 extra_flag_notau, extra_flag_tau = read_trig_list_flags(self.flags)
117
118
119 trigger_names_full_notau = list(set(trig_el+trig_mu+trig_g+trig_em+trig_et+trig_mt+extra_file_notau+extra_flag_notau))
120 trigger_names_full_tau = list(set(trig_tau+trig_txe+extra_file_tau+extra_flag_tau))
121
122
123 trigger_names_notau = []
124 trigger_names_tau = []
125
126 if hlt_menu:
127 for chain_name in hlt_menu:
128 if chain_name in trigger_names_full_notau: trigger_names_notau.append(chain_name)
129 if chain_name in trigger_names_full_tau: trigger_names_tau.append(chain_name)
130 else: # No means to filter based on in-file metadata
131 trigger_names_notau = trigger_names_full_notau
132 trigger_names_tau = trigger_names_full_tau
133
134 self.Run2TriggerNamesNoTau = trigger_names_notau
135 self.Run2TriggerNamesTau = trigger_names_tau
136
137 else: # Run 3 and Run 4
138
139 # TriggerAPI Session based trigger lists
140 session = getTapisSession(self.flags)
141 lf = 0.75 # Prescale weighted life fraction of the GRL's LBs
142 api_trigger_names = set()
143 api_trigger_names = session.getLowestUnprescaled(triggerType=TriggerType.el, livefraction=lf).union(api_trigger_names)
144 api_trigger_names = session.getLowestUnprescaled(triggerType=TriggerType.mu, livefraction=lf).union(api_trigger_names)
145 api_trigger_names = session.getLowestUnprescaled(triggerType=TriggerType.g, livefraction=lf).union(api_trigger_names)
146 api_trigger_names = session.getLowestUnprescaled(triggerType=TriggerType.tau, livefraction=lf).union(api_trigger_names)
147 api_trigger_names = session.getLowestUnprescaled(triggerType=TriggerType.xe, livefraction=lf).union(api_trigger_names)
148
149 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.el, TriggerType.mu], livefraction=lf).union(api_trigger_names)
150 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.el, TriggerType.tau], livefraction=lf).union(api_trigger_names)
151 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.mu, TriggerType.tau], livefraction=lf).union(api_trigger_names)
152 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.tau, TriggerType.xe], livefraction=lf).union(api_trigger_names)
153
154 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.el, TriggerType.g], livefraction=lf).union(api_trigger_names)
155 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.el, TriggerType.xe], livefraction=lf).union(api_trigger_names)
156 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.mu, TriggerType.g], livefraction=lf).union(api_trigger_names)
157 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.g, TriggerType.xe], livefraction=lf).union(api_trigger_names)
158 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.tau, TriggerType.g], livefraction=lf).union(api_trigger_names)
159
160 # Add hadronic categories, new for Run 3
161 api_trigger_names = session.getLowestUnprescaled(triggerType=TriggerType.j, livefraction=lf).union(api_trigger_names)
162 api_trigger_names = session.getLowestUnprescaled(triggerType=TriggerType.bj, livefraction=lf).union(api_trigger_names)
163 # Add cross-triggers as well
164 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.el, TriggerType.j], livefraction=lf).union(api_trigger_names)
165 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.mu, TriggerType.j], livefraction=lf).union(api_trigger_names)
166 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.j, TriggerType.bj], livefraction=lf).union(api_trigger_names)
167 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.j, TriggerType.g], livefraction=lf).union(api_trigger_names)
168 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.j, TriggerType.tau], livefraction=lf).union(api_trigger_names)
169 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.j, TriggerType.xe], livefraction=lf).union(api_trigger_names)
170 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.j, TriggerType.ht], livefraction=lf).union(api_trigger_names)
171 api_trigger_names = session.getLowestUnprescaled(triggerType=[TriggerType.bj, TriggerType.xe], livefraction=lf).union(api_trigger_names)
172
173
174 extra_flag_notau, extra_flag_tau = read_trig_list_flags(self.flags)
175 extra_flag = extra_flag_notau + extra_flag_tau
176
177
178 extra_file = read_trig_list_file("DerivationFrameworkPhys/run3ExtraMatchingTriggers.txt")
179
180
181 self.Run3TriggerNames = list(set(extra_file + extra_flag + list(api_trigger_names)))
182
183 return
static std::string FindCalibFile(const std::string &logical_file_name)
list Run3TriggerNames
Merge and remove duplicates.
STL class.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130