CMS 3D CMS Logo

HLTPrescaleProvider.cc
Go to the documentation of this file.
1 
14 
15 #include <cassert>
16 #include <sstream>
17 
18 static const bool useL1EventSetup(true);
19 static const bool useL1GtTriggerMenuLite(false);
20 static const unsigned char countMax(2);
21 
23  const edm::EventSetup& iSetup,
24  const std::string& processName,
25  bool& changed) {
26  inited_ = true;
27 
28  count_[0] = 0;
29  count_[1] = 0;
30  count_[2] = 0;
31  count_[3] = 0;
32  count_[4] = 0;
33 
34  const bool result(hltConfigProvider_.init(iRun, iSetup, processName, changed));
35 
36  const unsigned int l1tType(hltConfigProvider_.l1tType());
37  if (l1tType == 1) {
40  l1GtUtils_->getL1GtRunCache(iRun, iSetup, useL1EventSetup, useL1GtTriggerMenuLite);
41  } else if (l1tType == 2) {
43  l1tGlobalUtil_->retrieveL1Setup(iSetup);
44  } else {
45  edm::LogError("HLTPrescaleProvider") << " Unknown L1T Type " << l1tType << " - prescales will not be avaiable!";
46  }
47 
48  return result;
49 }
50 
53  return *l1GtUtils_;
54 }
55 
58  return *l1tGlobalUtil_;
59 }
60 
62  if (!inited_) {
63  throw cms::Exception("LogicError") << "HLTPrescaleProvider::prescaleSet,\n"
64  "HLTPrescaleProvider::init was not called at beginRun\n";
65  }
66  const unsigned int l1tType(hltConfigProvider_.l1tType());
67  if (l1tType == 1) {
69 
70  // return hltPrescaleTable_.set();
71  l1GtUtils_->getL1GtRunCache(iEvent, iSetup, useL1EventSetup, useL1GtTriggerMenuLite);
72  int errorTech(0);
73  const int psfsiTech(l1GtUtils_->prescaleFactorSetIndex(iEvent, L1GtUtils::TechnicalTrigger, errorTech));
74  int errorPhys(0);
75  const int psfsiPhys(l1GtUtils_->prescaleFactorSetIndex(iEvent, L1GtUtils::AlgorithmTrigger, errorPhys));
76  assert(psfsiTech == psfsiPhys);
77  if ((errorTech == 0) && (errorPhys == 0) && (psfsiTech >= 0) && (psfsiPhys >= 0) && (psfsiTech == psfsiPhys)) {
78  return psfsiPhys;
79  } else {
81  if (count_[0] < countMax) {
82  count_[0] += 1;
83  edm::LogError("HLTPrescaleProvider")
84  << " Using processName '" << hltConfigProvider_.processName() << "':"
85  << " Error in determining HLT prescale set index from L1 data using L1GtUtils:"
86  << " Tech/Phys error = " << errorTech << "/" << errorPhys << " Tech/Phys psfsi = " << psfsiTech << "/"
87  << psfsiPhys;
88  }
89  return -1;
90  }
91  } else if (l1tType == 2) {
93  l1tGlobalUtil_->retrieveL1Event(iEvent, iSetup);
94  return static_cast<int>(l1tGlobalUtil_->prescaleColumn());
95  } else {
96  if (count_[0] < countMax) {
97  count_[0] += 1;
98  edm::LogError("HLTPrescaleProvider")
99  << " Using processName '" << hltConfigProvider_.processName() << "':"
100  << " Unknown L1T Type " << l1tType << " - can not determine prescale set index!";
101  }
102  return -1;
103  }
104 }
105 
106 template <>
108  int numer = static_cast<int>(val * kL1PrescaleDenominator_ + 0.5);
109  static constexpr double kL1RoundingEpsilon = 0.001;
110  if (std::abs(numer - val * kL1PrescaleDenominator_) > kL1RoundingEpsilon) {
111  edm::LogWarning("ValueError") << " Error, L1 prescale val " << val
112  << " does not appear to precisely expressable as int / " << kL1PrescaleDenominator_
113  << ", using a FractionalPrescale is a loss of precision";
114  }
115 
116  return {numer, kL1PrescaleDenominator_};
117 }
118 
120  const edm::EventSetup& iSetup,
121  const std::string& trigger) {
122  // get L1T prescale - works only for those hlt trigger paths with
123  // exactly one L1GT seed module which has exactly one L1T name as seed
124 
125  double result = -1;
126 
127  const unsigned int l1tType(hltConfigProvider_.l1tType());
128  if (l1tType == 1) {
129  checkL1GtUtils();
130  const unsigned int nL1GTSeedModules(hltConfigProvider_.hltL1GTSeeds(trigger).size());
131  if (nL1GTSeedModules == 0) {
132  // no L1 seed module on path hence no L1 seed hence formally no L1 prescale
133  result = 1;
134  } else if (nL1GTSeedModules == 1) {
135  l1GtUtils_->getL1GtRunCache(iEvent, iSetup, useL1EventSetup, useL1GtTriggerMenuLite);
136  const std::string l1tname(hltConfigProvider_.hltL1GTSeeds(trigger).at(0).second);
137  if (l1tname == l1tGlobalDecisionKeyword_) {
138  LogDebug("HLTPrescaleProvider") << "Undefined L1T prescale for HLT path: '" << trigger << "' with L1T seed '"
139  << l1tGlobalDecisionKeyword_ << "' (keyword for global decision of L1T)";
140  result = -1;
141  } else {
142  int l1error(0);
143  result = l1GtUtils_->prescaleFactor(iEvent, l1tname, l1error);
144  if (l1error != 0) {
145  if (count_[1] < countMax) {
146  count_[1] += 1;
147  edm::LogError("HLTPrescaleProvider")
148  << " Error in determining L1T prescale for HLT path: '" << trigger << "' with L1T seed: '" << l1tname
149  << "' using L1GtUtils: error code = " << l1error << "." << std::endl
150  << " Note: for this method ('prescaleValues'), only a single L1T name (and not a bit number)"
151  << " is allowed as seed!" << std::endl
152  << " For seeds being complex logical expressions, try the new method 'prescaleValuesInDetail'."
153  << std::endl;
154  }
155  result = -1;
156  }
157  }
158  } else {
160  if (count_[2] < countMax) {
161  count_[2] += 1;
162  std::string dump("'" + hltConfigProvider_.hltL1GTSeeds(trigger).at(0).second + "'");
163  for (unsigned int i = 1; i != nL1GTSeedModules; ++i) {
164  dump += " * '" + hltConfigProvider_.hltL1GTSeeds(trigger).at(i).second + "'";
165  }
166  edm::LogError("HLTPrescaleProvider")
167  << " Error in determining L1T prescale for HLT path: '" << trigger << "' has multiple L1GTSeed modules, "
168  << nL1GTSeedModules << ", with L1 seeds: " << dump
169  << ". (Note: at most one L1GTSeed module is allowed for a proper determination of the L1T prescale!)";
170  }
171  result = -1;
172  }
173  } else if (l1tType == 2) {
175  const unsigned int nL1TSeedModules(hltConfigProvider_.hltL1TSeeds(trigger).size());
176  if (nL1TSeedModules == 0) {
177  // no L1 seed module on path hence no L1 seed hence formally no L1 prescale
178  result = 1;
179  } else if (nL1TSeedModules == 1) {
180  // l1tGlobalUtil_->retrieveL1Event(iEvent,iSetup);
181  const std::string l1tname(hltConfigProvider_.hltL1TSeeds(trigger).at(0));
182  if (l1tname == l1tGlobalDecisionKeyword_) {
183  LogDebug("HLTPrescaleProvider") << "Undefined L1T prescale for HLT path: '" << trigger << "' with L1T seed '"
184  << l1tGlobalDecisionKeyword_ << "' (keyword for global decision of L1T)";
185  result = -1;
186  } else {
187  bool l1error(!l1tGlobalUtil_->getPrescaleByName(l1tname, result));
188  if (l1error) {
189  if (count_[1] < countMax) {
190  count_[1] += 1;
191  edm::LogError("HLTPrescaleProvider")
192  << " Error in determining L1T prescale for HLT path: '" << trigger << "' with L1T seed: '" << l1tname
193  << "' using L1TGlobalUtil: error cond = " << l1error << "." << std::endl
194  << " Note: for this method ('prescaleValues'), only a single L1T name (and not a bit number)"
195  << " is allowed as seed!" << std::endl
196  << " For seeds being complex logical expressions, try the new method 'prescaleValuesInDetail'."
197  << std::endl;
198  }
199  result = -1;
200  }
201  }
202  } else {
204  if (count_[2] < countMax) {
205  count_[2] += 1;
207  for (unsigned int i = 1; i != nL1TSeedModules; ++i) {
208  dump += " * '" + hltConfigProvider_.hltL1TSeeds(trigger).at(i) + "'";
209  }
210  edm::LogError("HLTPrescaleProvider")
211  << " Error in determining L1T prescale for HLT path: '" << trigger << "' has multiple L1TSeed modules, "
212  << nL1TSeedModules << ", with L1T seeds: " << dump
213  << ". (Note: at most one L1TSeed module is allowed for a proper determination of the L1T prescale!)";
214  }
215  result = -1;
216  }
217  } else {
218  if (count_[1] < countMax) {
219  count_[1] += 1;
220  edm::LogError("HLTPrescaleProvider") << " Unknown L1T Type " << l1tType << " - can not determine L1T prescale! ";
221  }
222  result = -1;
223  }
224 
225  return result;
226 }
227 
228 std::vector<std::pair<std::string, double>> HLTPrescaleProvider::getL1PrescaleValueInDetail(
229  const edm::Event& iEvent, const edm::EventSetup& iSetup, const std::string& trigger) {
230  std::vector<std::pair<std::string, double>> result;
231 
232  const unsigned int l1tType(hltConfigProvider_.l1tType());
233  if (l1tType == 1) {
234  checkL1GtUtils();
235 
236  const unsigned int nL1GTSeedModules(hltConfigProvider_.hltL1GTSeeds(trigger).size());
237  if (nL1GTSeedModules == 0) {
238  // no L1 seed module on path hence no L1 seed hence formally no L1 prescale
239  result.clear();
240  } else if (nL1GTSeedModules == 1) {
241  l1GtUtils_->getL1GtRunCache(iEvent, iSetup, useL1EventSetup, useL1GtTriggerMenuLite);
242  const std::string l1tname(hltConfigProvider_.hltL1GTSeeds(trigger).at(0).second);
243  if (l1tname == l1tGlobalDecisionKeyword_) {
244  LogDebug("HLTPrescaleProvider") << "Undefined L1T prescales for HLT path: '" << trigger << "' with L1T seed '"
245  << l1tGlobalDecisionKeyword_ << "' (keyword for global decision of L1T)";
246  result.clear();
247  } else {
249  l1Logical.logicalExpressionRunUpdate(iEvent.getRun(), iSetup, l1tname);
250  const std::vector<std::pair<std::string, int>>& errorCodes(l1Logical.errorCodes(iEvent));
251  auto resultInt = l1Logical.prescaleFactors();
252  result.clear();
253  result.reserve(resultInt.size());
254  for (const auto& entry : resultInt) {
255  result.push_back(entry);
256  }
257  int l1error(l1Logical.isValid() ? 0 : 1);
258  for (auto const& errorCode : errorCodes) {
259  l1error += std::abs(errorCode.second);
260  }
261  if (l1error != 0) {
262  if (count_[3] < countMax) {
263  count_[3] += 1;
264  std::ostringstream message;
265  message << " Error in determining L1T prescales for HLT path: '" << trigger << "' with complex L1T seed: '"
266  << l1tname << "' using L1GtUtils: " << std::endl
267  << " isValid=" << l1Logical.isValid() << " l1tname/error/prescale " << errorCodes.size()
268  << std::endl;
269  for (unsigned int i = 0; i < errorCodes.size(); ++i) {
270  message << " " << i << ":" << errorCodes[i].first << "/" << errorCodes[i].second << "/"
271  << result[i].second;
272  }
273  message << ".";
274  edm::LogError("HLTPrescaleProvider") << message.str();
275  }
276  result.clear();
277  }
278  }
279  } else {
281  if (count_[4] < countMax) {
282  count_[4] += 1;
283  std::string dump("'" + hltConfigProvider_.hltL1GTSeeds(trigger).at(0).second + "'");
284  for (unsigned int i = 1; i != nL1GTSeedModules; ++i) {
285  dump += " * '" + hltConfigProvider_.hltL1GTSeeds(trigger).at(i).second + "'";
286  }
287  edm::LogError("HLTPrescaleProvider")
288  << " Error in determining L1T prescale for HLT path: '" << trigger << "' has multiple L1GTSeed modules, "
289  << nL1GTSeedModules << ", with L1 seeds: " << dump
290  << ". (Note: at most one L1GTSeed module is allowed for a proper determination of the L1T prescale!)";
291  }
292  result.clear();
293  }
294  } else if (l1tType == 2) {
296  const unsigned int nL1TSeedModules(hltConfigProvider_.hltL1TSeeds(trigger).size());
297  if (nL1TSeedModules == 0) {
298  // no L1 seed module on path hence no L1 seed hence formally no L1 prescale
299  result.clear();
300  } else if (nL1TSeedModules == 1) {
302  if (l1tname == l1tGlobalDecisionKeyword_) {
303  LogDebug("HLTPrescaleProvider") << "Undefined L1T prescales for HLT path: '" << trigger << "' with L1T seed '"
304  << l1tGlobalDecisionKeyword_ << "' (keyword for global decision of L1T)";
305  result.clear();
306  } else {
307  GlobalLogicParser l1tGlobalLogicParser = GlobalLogicParser(l1tname);
308  const std::vector<GlobalLogicParser::OperandToken> l1tSeeds = l1tGlobalLogicParser.expressionSeedsOperandList();
309  int l1error(0);
310  double l1tPrescale(-1);
311  result.clear();
312  result.reserve(l1tSeeds.size());
313  for (auto const& i : l1tSeeds) {
314  const string& l1tSeed = i.tokenName;
315  if (!l1tGlobalUtil_->getPrescaleByName(l1tSeed, l1tPrescale)) {
316  l1error += 1;
317  }
318  result.push_back(std::pair<std::string, double>(l1tSeed, l1tPrescale));
319  }
320  if (l1error != 0) {
321  if (count_[3] < countMax) {
322  count_[3] += 1;
323  string l1name = l1tname;
324  std::ostringstream message;
325  message << " Error in determining L1T prescales for HLT path: '" << trigger << "' with complex L1T seed: '"
326  << l1tname << "' using L1TGlobalUtil: " << std::endl
327  << " isValid=" << l1tGlobalLogicParser.checkLogicalExpression(l1name) << " l1tname/error/prescale "
328  << l1tSeeds.size() << std::endl;
329  for (unsigned int i = 0; i < l1tSeeds.size(); ++i) {
330  const string& l1tSeed = l1tSeeds[i].tokenName;
331  message << " " << i << ":" << l1tSeed << "/" << l1tGlobalUtil_->getPrescaleByName(l1tSeed, l1tPrescale)
332  << "/" << result[i].second;
333  }
334  message << ".";
335  edm::LogError("HLTPrescaleProvider") << message.str();
336  }
337  result.clear();
338  }
339  }
340  } else {
342  if (count_[4] < countMax) {
343  count_[4] += 1;
345  for (unsigned int i = 1; i != nL1TSeedModules; ++i) {
346  dump += " * '" + hltConfigProvider_.hltL1TSeeds(trigger).at(i) + "'";
347  }
348  edm::LogError("HLTPrescaleProvider")
349  << " Error in determining L1T prescale for HLT path: '" << trigger << "' has multiple L1TSeed modules, "
350  << nL1TSeedModules << ", with L1T seeds: " << dump
351  << ". (Note: at most one L1TSeed module is allowed for a proper determination of the L1T prescale!)";
352  }
353  result.clear();
354  }
355  } else {
356  if (count_[3] < countMax) {
357  count_[3] += 1;
358  edm::LogError("HLTPrescaleProvider") << " Unknown L1T Type " << l1tType << " - can not determine L1T prescale! ";
359  }
360  result.clear();
361  }
362 
363  return result;
364 }
365 
367  return hltConfigProvider_.moduleType(hltConfigProvider_.moduleLabel(i, triggerResults.index(i))) == "HLTPrescaler";
368 }
369 
371  if (!l1GtUtils_) {
372  throw cms::Exception("Configuration") << "HLTPrescaleProvider::checkL1GtUtils(),\n"
373  "Attempt to use L1GtUtils object when none was constructed.\n"
374  "Possibly the proper era is not configured or\n"
375  "the module configuration does not use the era properly\n"
376  "or input is from mixed eras";
377  }
378 }
379 
381  if (!l1tGlobalUtil_) {
382  throw cms::Exception("Configuration") << "HLTPrescaleProvider:::checkL1TGlobalUtil(),\n"
383  "Attempt to use L1TGlobalUtil object when none was constructed.\n"
384  "Possibly the proper era is not configured or\n"
385  "the module configuration does not use the era properly\n"
386  "or input is from mixed eras";
387  }
388 }
389 
391  unsigned int stageL1Trigger,
394  bool readPrescalesFromFile) {
395  desc.add<unsigned int>("stageL1Trigger", stageL1Trigger);
398 }
HLTConfigProvider hltConfigProvider_
static void fillPSetDescription(edm::ParameterSetDescription &desc, unsigned int stageL1Trigger, edm::InputTag const &l1tAlgBlkInputTag, edm::InputTag const &l1tExtBlkInputTag, bool readPrescalesFromFile)
const int logicalExpressionRunUpdate(const edm::Run &, const edm::EventSetup &, const std::string &)
Definition: L1GtUtils.cc:1895
std::unique_ptr< L1GtUtils > l1GtUtils_
const std::vector< std::vector< std::string > > & hltL1TSeeds() const
const std::vector< std::pair< std::string, int > > & prescaleFactors()
Definition: L1GtUtils.cc:2023
const std::string moduleType(const std::string &module) const
C++ class name of module.
Log< level::Error, false > LogError
assert(be >=bs)
l1t::L1TGlobalUtil const & l1tGlobalUtil() const
double getL1PrescaleValue(const edm::Event &iEvent, const edm::EventSetup &iSetup, const std::string &trigger)
std::vector< GlobalLogicParser::OperandToken > expressionSeedsOperandList()
static const unsigned char countMax(2)
unsigned int l1tType() const
L1T type (0=unknown, 1=legacy/stage-1 or 2=stage-2)
boost::rational< int > FractionalPrescale
int iEvent
Definition: GenABIO.cc:224
const std::string & moduleLabel(unsigned int trigger, unsigned int module) const
const std::vector< std::vector< std::pair< bool, std::string > > > & hltL1GTSeeds() const
static const bool useL1GtTriggerMenuLite(false)
static constexpr const char * l1tGlobalDecisionKeyword_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static std::string const triggerResults
Definition: EdmProvDump.cc:47
static void fillDescription(edm::ParameterSetDescription &desc, edm::InputTag const &iAlg, edm::InputTag const &iExt, bool readPrescalesFromFile)
int prescaleSet(const edm::Event &iEvent, const edm::EventSetup &iSetup)
bool checkLogicalExpression(std::string &)
check a logical expression for correctness - add/remove spaces if needed
bool rejectedByHLTPrescaler(const edm::TriggerResults &triggerResults, unsigned int i) const
static void fillDescription(edm::ParameterSetDescription &desc)
Definition: L1GtUtils.h:137
const std::string & processName() const
process name
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
std::unique_ptr< l1t::L1TGlobalUtil > l1tGlobalUtil_
std::vector< std::pair< std::string, double > > getL1PrescaleValueInDetail(const edm::Event &iEvent, const edm::EventSetup &iSetup, const std::string &trigger)
unsigned char count_[5]
L1GtUtils const & l1GtUtils() const
Log< level::Warning, false > LogWarning
T convertL1PS(double val) const
static const bool useL1EventSetup(true)
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
static constexpr int kL1PrescaleDenominator_
bool isValid()
return true if the logical expression is syntactically correct
Definition: L1GtUtils.h:169
Definition: Run.h:45
#define LogDebug(id)
const std::vector< std::pair< std::string, int > > & errorCodes(const edm::Event &)
Definition: L1GtUtils.cc:2047