ATLAS Offline Software
TrigTauInfo.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 TrigTauInfo::TrigTauInfo(const std::string& trigger)
8  : m_trigger{trigger}
9 {
10  parseTriggerString();
11 }
12 
13 TrigTauInfo::TrigTauInfo(const std::string& trigger, const std::map<std::string, float>& L1Phase1_thresholds)
14  : m_trigger{trigger}
15 {
16  parseTriggerString(L1Phase1_thresholds);
17 }
18 
19 TrigTauInfo::TrigTauInfo(const std::string& trigger, const std::map<std::string, float>& L1Phase1_thresholds, const std::map<std::string, uint64_t>& L1Phase1_threshold_patterns)
20  : m_trigger{trigger}
21 {
22  parseTriggerString(L1Phase1_thresholds, L1Phase1_threshold_patterns);
23 }
24 
25 TrigTauInfo::TrigTauInfo(const std::string& trigger, const std::map<int, int>& L1Phase1ThrMap_eTAU, const std::map<int, int>& L1Phase1ThrMap_jTAU)
26  : m_trigger{trigger}
27 {
28  parseTriggerString(L1Phase1ThrMap_eTAU, L1Phase1ThrMap_jTAU);
29 }
30 
31 void TrigTauInfo::parseTriggerString(bool remove_L1_phase1_thresholds)
32 {
33  std::string clean_trigger = m_trigger;
34 
35  // Change the "L1_" prefix to "L1" internally, in case the trigger being parsed is a pure L1 trigger with the usual L1 standalone naming scheme
36  if(clean_trigger.size() > 3 && clean_trigger.rfind("L1_", 0) == 0) {
37  clean_trigger = "L1" + clean_trigger.substr(3);
38  }
39 
40  std::vector<std::string> sections;
41  boost::split(sections, m_trigger, boost::is_any_of("_"));
42 
43  std::regex tau_rgx("^(\\d*)tau(\\d+)$");
44  std::regex elec_rgx("^(\\d*)e(\\d+)$");
45  std::regex muon_rgx("^(\\d*)mu(\\d+)$");
46  std::regex gamma_rgx("^(\\d*)g(\\d+)$");
47  std::regex jet_rgx("^(\\d*)j(\\d+)$");
48  std::regex met_rgx("^xe(\\d+)$");
49  std::regex noalg_rgx("^noalg$");
50  std::regex l1_rgx("^L1.*$");
51  std::regex l1_tau_rgx("(\\d*)(e|j|c|)TAU(\\d+)(L|M|T|HL|HM|HT|H|IM|I|)");
52  std::regex l1_toposeparate_rgx("^(\\d{0,2})(DETA|DPHI)(\\d{0,2})$");
53  std::regex topo_rgx("^.*(invm|dR|deta|dphi)AB.*$");
54  std::vector<std::regex*> all_regexes = {&tau_rgx, &elec_rgx, &muon_rgx, &gamma_rgx, &jet_rgx, &met_rgx, &l1_rgx};
55 
56  std::regex tau_type_rgx("^(ptonly|tracktwoMVA|tracktwoMVABDT|tracktwoLLP|trackLRT)$");
57 
58  std::smatch match;
59  std::regex_token_iterator<std::string::iterator> rend;
60 
61  // Check each leg
62  std::vector<std::string> leg;
63  for(size_t i = 0; i < sections.size(); i++) {
64  leg.push_back(sections[i]); // Attach to the current leg
65 
66  //Match the beginning of a new leg, or the end of the chain
67  if(i == sections.size() - 1 || (std::any_of(all_regexes.begin(), all_regexes.end(), [&sections, i](const std::regex* rgx) { return std::regex_match(sections[i+1], *rgx); }))) {
68  // Process the previous leg, which starts with the item, multiplicity, and threshold
69  if(std::regex_match(leg[0], match, tau_rgx)) {
70  size_t multiplicity = match[1].str() == "" ? 1 : std::stoi(match[1].str());
71  unsigned int threshold = std::stoi(match[2].str());
72  auto itr = find_if(leg.begin(), leg.end(), [tau_type_rgx](const std::string& s) { return std::regex_match(s, tau_type_rgx); });
73  std::string type = itr != leg.end() ? *itr : "";
74 
75  for(size_t j = 0; j < multiplicity; j++) {
76  m_HLTThr.push_back(threshold);
77  m_HLTTauTypes.push_back(type);
78  }
79  } else if(std::regex_match(leg[0], match, elec_rgx)) {
80  size_t multiplicity = match[1].str() == "" ? 1 : std::stoi(match[1].str());
81  unsigned int threshold = std::stoi(match[2].str());
82  for(size_t j = 0; j < multiplicity; j++) m_HLTElecThr.push_back(threshold);
83  } else if(std::regex_match(leg[0], match, muon_rgx)) {
84  size_t multiplicity = match[1].str() == "" ? 1 : std::stoi(match[1].str());
85  unsigned int threshold = std::stoi(match[2].str());
86  for(size_t j = 0; j < multiplicity; j++) m_HLTMuonThr.push_back(threshold);
87  } else if(std::regex_match(leg[0], match, gamma_rgx)) {
88  size_t multiplicity = match[1].str() == "" ? 1 : std::stoi(match[1].str());
89  unsigned int threshold = std::stoi(match[2].str());
90  for(size_t j = 0; j < multiplicity; j++) m_HLTGammaThr.push_back(threshold);
91  } else if(std::regex_match(leg[0], match, jet_rgx)) {
92  size_t multiplicity = match[1].str() == "" ? 1 : std::stoi(match[1].str());
93  unsigned int threshold = std::stoi(match[2].str());
94  for(size_t j = 0; j < multiplicity; j++) m_HLTJetThr.push_back(threshold);
95  } else if(std::regex_match(leg[0], match, met_rgx)) {
96  unsigned int threshold = std::stoi(match[2].str());
97  m_HLTMETThr.push_back(threshold);
98  } else if(std::regex_match(leg[0], match, noalg_rgx)) {
99  m_isStreamer = true;
100  } else if(std::regex_match(leg[0], l1_rgx)) { // Treat the L1 items as a leg
101  for(size_t j = 0; j < leg.size(); j++) {
102  if(std::regex_match(leg[j], topo_rgx)) continue; // Remove HLT topo sections, not part of the L1 item
103 
104  // L1Topo items (they all include a "-" in the name, or have a separate "##DETA/PHI##_" prefix):
105  if(leg[j].find('-') != std::string::npos || std::regex_match(leg[j], l1_toposeparate_rgx)) {
106  // We only keep information from the legacy L1Topo item, from which we will not always use all thresholds
107  // Since we won't be adding any more Legacy thresholds, let's hard-code it...
108  if(leg[0] == "L1TAU60" && leg[j] == "DR-TAU12ITAU12I") leg[j] = "TAU12IM"; // L1_TAU60_DR-TAU20ITAU12I, uses "TAU12IM" threshold from the L1Topo item
109  else if(leg.size() == 1 && (leg[0] == "L1DR-TAU20ITAU12I" || leg[0] == "L1DR-TAU20ITAU12I-J25")) {
110  // Uses both TAU items, in the M isolation threshold
111  leg[0] = "L1TAU20IM";
112  leg.push_back("TAU12IM");
113  // Even on combined chains using jets, we don't use the jets threshold
114  }
115  else continue; // Remove the Phase 1 L1Topo items, since we always use a multiplicity threshold
116  }
117 
118  m_L1Items.push_back(j == 0 ? leg[j].substr(2, leg[j].size()) : leg[j]); // Remove the "L1" prefix on the first L1 item
119  }
120  }
121 
122  // Start a new leg
123  leg = {};
124  }
125  }
126 
127  if(!m_L1Items.empty()) {
128  // Build the full L1 string
129  m_L1Item = m_L1Items[0];
130  for(size_t j = 1; j < m_L1Items.size(); j++) m_L1Item += "_" + m_L1Items[j];
131 
132  // Get all individual L1 TAU items
133  std::regex_token_iterator<std::string::iterator> rgx_iter(m_L1Item.begin(), m_L1Item.end(), l1_tau_rgx);
134  while(rgx_iter != rend) {
135  std::string s = *rgx_iter;
136  std::regex_match(s, match, l1_tau_rgx);
137  size_t multiplicity = match[1].str() == "" ? 1 : std::stoi(match[1].str());
138  std::string item_type = match[2].str(); // e, j, c, or ""
139  int threshold = std::stoi(match[3].str());
140  std::string item_isolation = match[4].str(); // "", L, M, T, HL, HM, HT, IM, H
141 
142  // Set the Phase 1 thresholds to -1
143  if(remove_L1_phase1_thresholds && (item_type == "e" || item_type == "j" || item_type == "c")) threshold = -1;
144 
145  for(size_t j = 0; j < multiplicity; j++) {
146  m_tauL1Items.push_back(s.substr(match[1].str().size()));
147  m_tauL1Thr.push_back(threshold);
148  m_tauL1Type.push_back(item_type + "TAU");
149  m_tauL1Iso.push_back(item_isolation);
150  m_tauL1ThresholdPattern.push_back(-1);
151  }
152  rgx_iter++;
153  }
154 
155  m_L1Item = "L1" + m_L1Items[0];
156  }
157 }
158 
159 void TrigTauInfo::parseTriggerString(const std::map<std::string, float>& L1Phase1_thresholds)
160 {
162 
163  for(size_t i = 0; i < m_tauL1Items.size(); i++) {
164  if(m_tauL1Type.at(i) == "TAU") continue; // Skip the legacy items
165 
166  const std::string& item = m_tauL1Items.at(i);
167 
168  m_tauL1Thr[i] = L1Phase1_thresholds.at(item);
169  }
170 }
171 
172 void TrigTauInfo::parseTriggerString(const std::map<std::string, float>& L1Phase1_thresholds, const std::map<std::string, uint64_t>& L1Phase1_threshold_patterns)
173 {
175 
176  for(size_t i = 0; i < m_tauL1Items.size(); i++) {
177  if(m_tauL1Type.at(i) == "TAU") continue; // Skip the legacy items
178 
179  const std::string& item = m_tauL1Items.at(i);
180 
181  m_tauL1Thr[i] = L1Phase1_thresholds.at(item);
182  m_tauL1ThresholdPattern[i] = L1Phase1_threshold_patterns.at(item);
183  }
184 }
185 
186 void TrigTauInfo::parseTriggerString(const std::map<int, int>& L1Phase1ThrMap_eTAU, const std::map<int, int>& L1Phase1ThrMap_jTAU)
187 {
188  parseTriggerString(false);
189 
190  // Correct the Phase 1 thresholds:
191  for(size_t i = 0; i < m_tauL1Items.size(); i++) {
192  const std::string& item_type = m_tauL1Type.at(i);
193  if(item_type == "eTAU" || item_type == "cTAU") {
194  m_tauL1Thr[i] = L1Phase1ThrMap_eTAU.at(m_tauL1Thr.at(i));
195  } else if(item_type == "jTAU") {
196  m_tauL1Thr[i] = L1Phase1ThrMap_jTAU.at(m_tauL1Thr.at(i));
197  }
198  }
199 }
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
TrigTauInfo::m_HLTElecThr
std::vector< float > m_HLTElecThr
Definition: TrigTauInfo.h:83
TrigTauInfo::m_L1Item
std::string m_L1Item
Definition: TrigTauInfo.h:75
TrigTauInfo::m_HLTMETThr
std::vector< float > m_HLTMETThr
Definition: TrigTauInfo.h:87
TrigTauInfo::m_isStreamer
bool m_isStreamer
Definition: TrigTauInfo.h:71
TrigTauInfo::m_L1Items
std::vector< std::string > m_L1Items
Definition: TrigTauInfo.h:76
TrigTauInfo::m_HLTMuonThr
std::vector< float > m_HLTMuonThr
Definition: TrigTauInfo.h:84
PrepareReferenceFile.regex
regex
Definition: PrepareReferenceFile.py:43
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
lumiFormat.i
int i
Definition: lumiFormat.py:85
TrigTauInfo::m_tauL1ThresholdPattern
std::vector< int64_t > m_tauL1ThresholdPattern
Definition: TrigTauInfo.h:81
TrigTauInfo::m_trigger
std::string m_trigger
Definition: TrigTauInfo.h:70
compute_lumi.leg
leg
Definition: compute_lumi.py:95
TrigTauInfo::m_HLTJetThr
std::vector< float > m_HLTJetThr
Definition: TrigTauInfo.h:86
TrigTauInfo::m_tauL1Items
std::vector< std::string > m_tauL1Items
Definition: TrigTauInfo.h:78
TrigTauInfo::m_HLTTauTypes
std::vector< std::string > m_HLTTauTypes
Definition: TrigTauInfo.h:73
threshold
Definition: chainparser.cxx:74
item
Definition: ItemListSvc.h:43
TrigTauInfo::TrigTauInfo
TrigTauInfo()
Definition: TrigTauInfo.h:17
python.CaloScaleNoiseConfig.str
str
Definition: CaloScaleNoiseConfig.py:78
TrigTauInfo::m_HLTGammaThr
std::vector< float > m_HLTGammaThr
Definition: TrigTauInfo.h:85
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
TrigTauInfo::m_tauL1Type
std::vector< std::string > m_tauL1Type
Definition: TrigTauInfo.h:79
TrigTauInfo.h
TrigTauInfo::m_tauL1Iso
std::vector< std::string > m_tauL1Iso
Definition: TrigTauInfo.h:80
python.prefilter_mask.rgx
rgx
Definition: prefilter_mask.py:14
TrigTauInfo::m_tauL1Thr
std::vector< float > m_tauL1Thr
Definition: TrigTauInfo.h:77
TrigTauInfo::parseTriggerString
void parseTriggerString(bool remove_L1_phase1_thresholds=true)
Definition: TrigTauInfo.cxx:31
TrigTauInfo::m_HLTThr
std::vector< float > m_HLTThr
Definition: TrigTauInfo.h:72
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
match
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition: hcg.cxx:356
PhysDESDM_Quirks.trigger
trigger
Definition: PhysDESDM_Quirks.py:27