CMS 3D CMS Logo

L1TriggerJSONMonitoring.cc
Go to the documentation of this file.
1 
7 #include <atomic>
8 #include <fstream>
9 
10 #include <fmt/printf.h>
11 
33 
34 using namespace jsoncollector;
35 
37  // special values for prescale index checks
38  static constexpr const int kPrescaleUndefined = -2;
39  static constexpr const int kPrescaleConflict = -1;
40  // variables accumulated event by event in each stream
41  struct stream {
42  unsigned int processed = 0; // number of events processed
43  std::vector<unsigned int> l1tAccept; // number of events accepted by each L1 trigger
44  std::vector<unsigned int> l1tAcceptPhysics; // number of "physics" events accepted by each L1 trigger
45  std::vector<unsigned int> l1tAcceptCalibration; // number of "calibration" events accepted by each L1 trigger
46  std::vector<unsigned int> l1tAcceptRandom; // number of "random" events accepted by each L1 trigger
47  std::vector<unsigned int> tcdsAccept; // number of "physics", "calibration", "random" and other event types
48  int prescaleIndex = kPrescaleUndefined; // prescale column index
49  };
50 
51  // variables initialised for each run
52  struct run {
55  std::string baseRunDir; // base directory from EvFDaqDirector
56  std::string jsdFileName; // definition file name for JSON with rates
57  };
58 
59  // variables accumulated over the whole lumisection
60  struct lumisection {
61  jsoncollector::HistoJ<unsigned int> processed; // number of events processed
62  jsoncollector::HistoJ<unsigned int> l1tAccept; // number of events accepted by each L1 trigger
63  jsoncollector::HistoJ<unsigned int> l1tAcceptPhysics; // number of "physics" events accepted by each L1 trigger
65  l1tAcceptCalibration; // number of "calibration" events accepted by each L1 trigger
66  jsoncollector::HistoJ<unsigned int> l1tAcceptRandom; // number of "random" events accepted by each L1 trigger
67  jsoncollector::HistoJ<unsigned int> tcdsAccept; // number of "physics", "calibration", "random" and other event types
68  int prescaleIndex = kPrescaleUndefined; // prescale column index
69  };
70 };
71 
73  // per-stream information
74  edm::StreamCache<L1TriggerJSONMonitoringData::stream>,
75  // per-run accounting
76  edm::RunCache<L1TriggerJSONMonitoringData::run>,
77  // accumulate per-lumisection statistics
78  edm::LuminosityBlockSummaryCache<L1TriggerJSONMonitoringData::lumisection> > {
79 public:
80  // constructor
82 
83  // destructor
84  ~L1TriggerJSONMonitoring() override = default;
85 
86  // validate the configuration and optionally fill the default values
87  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
88 
89  // called for each Event
90  void analyze(edm::StreamID, edm::Event const&, edm::EventSetup const&) const override;
91 
92  // -- inherited from edm::StreamCache<L1TriggerJSONMonitoringData::stream>
93 
94  // called once for each Stream being used in the job to create the cache object that will be used for that particular Stream
95  std::unique_ptr<L1TriggerJSONMonitoringData::stream> beginStream(edm::StreamID) const override;
96 
97  // called when the Stream is switching from one LuminosityBlock to a new LuminosityBlock.
98  void streamBeginLuminosityBlock(edm::StreamID, edm::LuminosityBlock const&, edm::EventSetup const&) const override;
99 
100  // -- inherited from edm::RunCache<L1TriggerJSONMonitoringData::run>
101 
102  // called each time the Source sees a new Run, and guaranteed to finish before any Stream calls streamBeginRun for that same Run
103  std::shared_ptr<L1TriggerJSONMonitoringData::run> globalBeginRun(edm::Run const&,
104  edm::EventSetup const&) const override;
105 
106  // called after all Streams have finished processing a given Run (i.e. streamEndRun for all Streams have completed)
107  void globalEndRun(edm::Run const&, edm::EventSetup const&) const override;
108 
109  // -- inherited from edm::LuminosityBlockSummaryCache<L1TriggerJSONMonitoringData::lumisection>
110 
111  // called each time the Source sees a new LuminosityBlock
112  std::shared_ptr<L1TriggerJSONMonitoringData::lumisection> globalBeginLuminosityBlockSummary(
113  edm::LuminosityBlock const&, edm::EventSetup const&) const override;
114 
115  // called when a Stream has finished processing a LuminosityBlock, after streamEndLuminosityBlock
116  void streamEndLuminosityBlockSummary(edm::StreamID,
117  edm::LuminosityBlock const&,
118  edm::EventSetup const&,
120 
121  // called after the streamEndLuminosityBlockSummary method for all Streams have finished processing a given LuminosityBlock
122  void globalEndLuminosityBlockSummary(edm::LuminosityBlock const&,
123  edm::EventSetup const&,
125 
126 private:
127  // TCDS trigger types
128  // see https://twiki.cern.ch/twiki/bin/viewauth/CMS/TcdsEventRecord
129  static constexpr const std::array<const char*, 16> tcdsTriggerTypes_ = {{
130  "Error", // 0 - No trigger (DAQ error stream events may have this value)
131  "Physics", // 1 - GT trigger
132  "Calibration", // 2 - Sequence trigger (calibration)
133  "Random", // 3 - Random trigger
134  "Auxiliary", // 4 - Auxiliary (CPM front panel NIM input) trigger
135  "", // 5 - reserved
136  "", // 6 - reserved
137  "", // 7 - reserved
138  "Cyclic", // 8 - Cyclic trigger
139  "Bunch-pattern", // 9 - Bunch-pattern trigger
140  "Software", // 10 - Software trigger
141  "TTS", // 11 - TTS-sourced trigger
142  "", // 12 - reserved
143  "", // 13 - reserved
144  "", // 14 - reserved
145  "" // 15 - reserved
146  }};
147 
148  static constexpr const char* streamName_ = "streamL1Rates";
149 
150  static void writeJsdFile(L1TriggerJSONMonitoringData::run const&);
151  static void writeIniFile(L1TriggerJSONMonitoringData::run const&, unsigned int, std::vector<std::string> const&);
152 
153  // configuration
154  const edm::InputTag level1Results_; // InputTag for L1 trigger results
157 };
158 
159 // instantiate static data members
160 constexpr const std::array<const char*, 16> L1TriggerJSONMonitoring::tcdsTriggerTypes_;
161 
162 // constructor
164  : level1Results_(config.getParameter<edm::InputTag>("L1Results")),
165  level1ResultsToken_(consumes<GlobalAlgBlkBxCollection>(level1Results_)),
166  l1tUtmTriggerMenuRcdToken_(esConsumes<edm::Transition::BeginRun>()) {
167  if (edm::Service<evf::EvFDaqDirector>().isAvailable()) {
168  //output initemp file. This lets hltd know number of streams early
169  std::string initFileName = edm::Service<evf::EvFDaqDirector>()->getInitTempFilePath("streamL1Rates");
170  std::ofstream file(initFileName);
171  if (!file)
172  throw cms::Exception("L1TriggerJsonMonitoring")
173  << "Cannot create INITEMP file: " << initFileName << " error: " << strerror(errno);
174  file.close();
175  }
176 }
177 
178 // validate the configuration and optionally fill the default values
181  desc.add<edm::InputTag>("L1Results", edm::InputTag("hltGtStage2Digis"));
182  descriptions.add("L1TriggerJSONMonitoring", desc);
183 }
184 
185 // called once for each Stream being used in the job to create the cache object that will be used for that particular Stream
186 std::unique_ptr<L1TriggerJSONMonitoringData::stream> L1TriggerJSONMonitoring::beginStream(edm::StreamID) const {
187  return std::make_unique<L1TriggerJSONMonitoringData::stream>();
188 }
189 
190 // called each time the Source sees a new Run, and guaranteed to finish before any Stream calls streamBeginRun for that same Run
191 std::shared_ptr<L1TriggerJSONMonitoringData::run> L1TriggerJSONMonitoring::globalBeginRun(
192  edm::Run const& run, edm::EventSetup const& setup) const {
193  auto rundata = std::make_shared<L1TriggerJSONMonitoringData::run>();
194 
195  // set the DAQ parameters
197  rundata->streamDestination = edm::Service<evf::EvFDaqDirector>()->getStreamDestinations(streamName_);
198  rundata->streamMergeType =
200  rundata->baseRunDir = edm::Service<evf::EvFDaqDirector>()->baseRunDir();
201  } else {
202  rundata->streamDestination = "";
203  rundata->streamMergeType = "";
204  rundata->baseRunDir = ".";
205  }
206 
207  // read the L1 trigger names from the EventSetup
208  std::vector<std::string> triggerNames(GlobalAlgBlk::maxPhysicsTriggers, ""s);
209  auto const& menuHandle = setup.getHandle(l1tUtmTriggerMenuRcdToken_);
210  if (menuHandle.isValid()) {
211  for (auto const& algo : menuHandle->getAlgorithmMap())
212  triggerNames[algo.second.getIndex()] = algo.first;
213  } else {
214  edm::LogWarning("L1TriggerJSONMonitoring") << "L1TUtmTriggerMenu not found in the EventSetup.\nThe Level 1 Trigger "
215  "rate monitoring will not include the trigger names.";
216  }
217 
218  // write the per-run .jsd file
219  rundata->jsdFileName = fmt::sprintf("run%06d_ls0000_streamL1Rates_pid%05d.jsd", run.run(), getpid());
220  writeJsdFile(*rundata);
221 
222  // write the per-run .ini file
223  //iniFileName = fmt::sprintf("run%06d_ls0000_streamL1Rates_pid%05d.ini", run.run(), getpid());
224  writeIniFile(*rundata, run.run(), triggerNames);
225 
226  return rundata;
227 }
228 
229 // called after all Streams have finished processing a given Run (i.e. streamEndRun for all Streams have completed)
231 
232 // called for each Event
234  auto& stream = *streamCache(sid);
235 
236  ++stream.processed;
237  unsigned int eventType = event.experimentType();
238  if (eventType < tcdsTriggerTypes_.size())
239  ++stream.tcdsAccept[eventType];
240  else
241  edm::LogWarning("L1TriggerJSONMonitoring") << "Unexpected event type " << eventType;
242 
243  // get hold of TriggerResults
245  if (not event.getByToken(level1ResultsToken_, handle) or not handle.isValid() or handle->isEmpty(0)) {
246  edm::LogError("L1TriggerJSONMonitoring")
247  << "L1 trigger results with label [" + level1Results_.encode() + "] not present or invalid";
248  return;
249  }
250 
251  // The GlobalAlgBlkBxCollection is a vector of vectors, but the second layer can only ever
252  // have one entry since there can't be more than one collection per bunch crossing.
253  // The first "0" here means BX = 0, while the second "0" is used to access the first and only element.
254  auto const& results = handle->at(0, 0);
255  auto const& decision = results.getAlgoDecisionFinal();
256  assert(decision.size() == GlobalAlgBlk::maxPhysicsTriggers);
257 
258  // check the results for each HLT path
259  for (unsigned int i = 0; i < decision.size(); ++i) {
260  if (decision[i]) {
261  ++stream.l1tAccept[i];
262  switch (eventType) {
264  ++stream.l1tAcceptPhysics[i];
265  break;
267  ++stream.l1tAcceptCalibration[i];
268  break;
270  ++stream.l1tAcceptRandom[i];
271  break;
272  default:
273  break;
274  }
275  }
276  }
277 
278  // check for conflicting values in the prescale column index, and store it
279  int prescaleIndex = results.getPreScColumn();
281  stream.prescaleIndex = prescaleIndex;
282  } else if (stream.prescaleIndex == L1TriggerJSONMonitoringData::kPrescaleConflict) {
283  // do nothing
284  } else if (stream.prescaleIndex != prescaleIndex) {
285  edm::LogWarning("L1TriggerJSONMonitoring") << "Prescale index changed from " << stream.prescaleIndex << " to "
286  << prescaleIndex << " inside lumisection " << event.luminosityBlock();
288  }
289 }
290 
291 // called each time the Source sees a new LuminosityBlock
292 std::shared_ptr<L1TriggerJSONMonitoringData::lumisection> L1TriggerJSONMonitoring::globalBeginLuminosityBlockSummary(
293  edm::LuminosityBlock const& lumi, edm::EventSetup const&) const {
294  // the API of jsoncollector::HistoJ does not really match our use case,
295  // but it is the only vector-like object available in JsonMonitorable.h
296  auto lumidata = std::make_shared<L1TriggerJSONMonitoringData::lumisection>(L1TriggerJSONMonitoringData::lumisection{
297  jsoncollector::HistoJ<unsigned int>(1), // processed
303  });
304  // repeated calls to `update` necessary to set the internal element counter
305  lumidata->processed.update(0);
306  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i)
307  lumidata->l1tAccept.update(0);
308  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i)
309  lumidata->l1tAcceptPhysics.update(0);
310  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i)
311  lumidata->l1tAcceptCalibration.update(0);
312  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i)
313  lumidata->l1tAcceptRandom.update(0);
314  for (unsigned int i = 0; i < tcdsTriggerTypes_.size(); ++i)
315  lumidata->tcdsAccept.update(0);
316  lumidata->prescaleIndex = L1TriggerJSONMonitoringData::kPrescaleUndefined;
317 
318  return lumidata;
319 }
320 
321 // called when the Stream is switching from one LuminosityBlock to a new LuminosityBlock.
323  edm::LuminosityBlock const& lumi,
324  edm::EventSetup const&) const {
325  auto& stream = *streamCache(sid);
326 
327  // reset the stream counters
328  stream.processed = 0;
329  stream.l1tAccept.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
330  stream.l1tAcceptPhysics.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
331  stream.l1tAcceptCalibration.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
332  stream.l1tAcceptRandom.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
333  stream.tcdsAccept.assign(tcdsTriggerTypes_.size(), 0);
335 }
336 
337 // called when a Stream has finished processing a LuminosityBlock, after streamEndLuminosityBlock
339  edm::LuminosityBlock const& lumi,
340  edm::EventSetup const&,
342  auto const& stream = *streamCache(sid);
343  lumidata->processed.value()[0] += stream.processed;
344 
345  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) {
346  lumidata->l1tAccept.value()[i] += stream.l1tAccept[i];
347  lumidata->l1tAcceptPhysics.value()[i] += stream.l1tAcceptPhysics[i];
348  lumidata->l1tAcceptCalibration.value()[i] += stream.l1tAcceptCalibration[i];
349  lumidata->l1tAcceptRandom.value()[i] += stream.l1tAcceptRandom[i];
350  }
351  for (unsigned int i = 0; i < tcdsTriggerTypes_.size(); ++i)
352  lumidata->tcdsAccept.value()[i] += stream.tcdsAccept[i];
353 
354  // check for conflicting values in the prescale column index
356  lumidata->prescaleIndex = stream.prescaleIndex;
357  else if (lumidata->prescaleIndex != stream.prescaleIndex)
359 }
360 
361 // called after the streamEndLuminosityBlockSummary method for all Streams have finished processing a given LuminosityBlock
363  edm::EventSetup const&,
365  unsigned int ls = lumi.luminosityBlock();
366  unsigned int run = lumi.run();
367 
368  bool writeFiles = true;
369  if (edm::Service<evf::MicroStateService>().isAvailable()) {
372  if (fms)
373  writeFiles = fms->shouldWriteFiles(ls);
374  }
375  if (not writeFiles)
376  return;
377 
378  unsigned int processed = lumidata->processed.value().at(0);
379  auto const& rundata = *runCache(lumi.getRun().index());
381 
382  // [SIC]
383  char hostname[33];
384  gethostname(hostname, 32);
385  std::string sourceHost(hostname);
386 
387  // [SIC]
388  std::stringstream sOutDef;
389  sOutDef << rundata.baseRunDir << "/"
390  << "output_" << getpid() << ".jsd";
391 
392  std::string jsndataFileList = "";
393  unsigned int jsndataSize = 0;
394  unsigned int jsndataAdler32 = 1; // adler32 checksum for an empty file
395 
396  if (processed) {
397  // write the .jsndata files which contain the actual rates
398  Json::Value jsndata;
399  jsndata[jsoncollector::DataPoint::SOURCE] = sourceHost;
400  jsndata[jsoncollector::DataPoint::DEFINITION] = rundata.jsdFileName;
406 
407  // write only the number of "physics", "calibration" and "random" events
412  jsndata[jsoncollector::DataPoint::DATA].append(tcdsAccept.toJsonValue());
413  /* FIXME send information for all event types instead of only these three
414  jsndata[jsoncollector::DataPoint::DATA].append(lumidata->tcdsAccept.toJsonValue());
415  */
417 
418  auto jsndataFileName = fmt::sprintf("run%06d_ls%04d_streamL1Rates_pid%05d.jsndata", run, ls, getpid());
419 
420  std::string result = writer.write(jsndata);
421  std::ofstream jsndataFile(rundata.baseRunDir + "/" + jsndataFileName);
422  jsndataFile << result;
423  jsndataFile.close();
424 
425  jsndataFileList = jsndataFileName;
426  jsndataSize = result.size();
427  jsndataAdler32 = cms::Adler32(result.c_str(), result.size());
428  }
429 
430  // create a metadata json file for the "HLT rates" pseudo-stream
431  unsigned int jsnProcessed = processed;
432  unsigned int jsnAccepted = processed;
433  unsigned int jsnErrorEvents = 0;
434  unsigned int jsnRetCodeMask = 0;
435  std::string jsnInputFiles = "";
436  unsigned int jsnHLTErrorEvents = 0;
437 
438  Json::Value jsn;
439  jsn[jsoncollector::DataPoint::SOURCE] = sourceHost;
440  jsn[jsoncollector::DataPoint::DEFINITION] = sOutDef.str();
441  jsn[jsoncollector::DataPoint::DATA].append(jsnProcessed);
442  jsn[jsoncollector::DataPoint::DATA].append(jsnAccepted);
443  jsn[jsoncollector::DataPoint::DATA].append(jsnErrorEvents);
444  jsn[jsoncollector::DataPoint::DATA].append(jsnRetCodeMask);
445  jsn[jsoncollector::DataPoint::DATA].append(jsndataFileList);
446  jsn[jsoncollector::DataPoint::DATA].append(jsndataSize);
447  jsn[jsoncollector::DataPoint::DATA].append(jsnInputFiles);
448  jsn[jsoncollector::DataPoint::DATA].append(jsndataAdler32);
449  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamDestination);
450  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamMergeType);
451  jsn[jsoncollector::DataPoint::DATA].append(jsnHLTErrorEvents);
452 
453  auto jsnFileName = fmt::sprintf("run%06d_ls%04d_streamL1Rates_pid%05d.jsn", run, ls, getpid());
454  std::ofstream jsnFile(rundata.baseRunDir + "/" + jsnFileName);
455  jsnFile << writer.write(jsn);
456  jsnFile.close();
457 }
458 
460  std::ofstream file(rundata.baseRunDir + "/" + rundata.jsdFileName);
461  file << R"""({
462  "data" : [
463  { "name" : "Processed", "type" : "integer", "operation" : "histo"},
464  { "name" : "L1-AlgoAccepted", "type" : "integer", "operation" : "histo"},
465  { "name" : "L1-AlgoAccepted-Physics", "type" : "integer", "operation" : "histo"},
466  { "name" : "L1-AlgoAccepted-Calibration", "type" : "integer", "operation" : "histo"},
467  { "name" : "L1-AlgoAccepted-Random", "type" : "integer", "operation" : "histo"},
468  { "name" : "L1-Global", "type" : "integer", "operation" : "histo"},
469  { "name" : "Prescale-Index", "type" : "integer", "operation" : "sample"}
470  ]
471 })""";
472  file.close();
473 }
474 
476  unsigned int run,
477  std::vector<std::string> const& l1TriggerNames) {
479 
481  for (auto const& name : l1TriggerNames)
482  triggerNames.append(name);
483  content["L1-Algo-Names"] = triggerNames;
484 
489  /* FIXME send information for all event types instead of only these three
490  for (auto const& name : tcdsTriggerTypes_)
491  eventTypes.append(name);
492  */
493  content["Event-Type"] = eventTypes;
494 
495  std::string iniFileName = fmt::sprintf("run%06d_ls0000_streamL1Rates_pid%05d.ini", run, getpid());
496  std::ofstream file(rundata.baseRunDir + "/" + iniFileName);
498  file << writer.write(content);
499  file.close();
500 }
501 
502 // declare as a framework plugin
jsoncollector::HistoJ< unsigned int > l1tAcceptRandom
static constexpr const int kPrescaleConflict
static void writeJsdFile(L1TriggerJSONMonitoringData::run const &)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
const edm::InputTag level1Results_
jsoncollector::HistoJ< unsigned int > l1tAccept
static const std::string SOURCE
Definition: DataPoint.h:116
std::vector< unsigned int > l1tAcceptPhysics
std::string encode() const
Definition: InputTag.cc:159
void globalEndLuminosityBlockSummary(edm::LuminosityBlock const &, edm::EventSetup const &, L1TriggerJSONMonitoringData::lumisection *) const override
jsoncollector::HistoJ< unsigned int > l1tAcceptCalibration
jsoncollector::HistoJ< unsigned int > processed
Definition: config.py:1
Log< level::Error, false > LogError
uint32_t T const *__restrict__ uint32_t const *__restrict__ int32_t int Histo::index_type cudaStream_t stream
assert(be >=bs)
example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< T > & value()
static const std::string DATA
Definition: DataPoint.h:118
jsoncollector::HistoJ< unsigned int > tcdsAccept
static void writeIniFile(L1TriggerJSONMonitoringData::run const &, unsigned int, std::vector< std::string > const &)
static constexpr const int kPrescaleUndefined
std::shared_ptr< L1TriggerJSONMonitoringData::lumisection > globalBeginLuminosityBlockSummary(edm::LuminosityBlock const &, edm::EventSetup const &) const override
Writes a Value in JSON format in a human friendly way.
Definition: writer.h:64
std::vector< unsigned int > l1tAcceptRandom
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Transition
Definition: Transition.h:12
array value (ordered list)
Definition: value.h:32
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
jsoncollector::HistoJ< unsigned int > l1tAcceptPhysics
void Adler32(char const *data, size_t len, uint32_t &a, uint32_t &b)
def ls(path, rec=False)
Definition: eostools.py:349
virtual Json::Value toJsonValue() const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void globalEndRun(edm::Run const &, edm::EventSetup const &) const override
Value & append(const Value &value)
Append value to array at the end.
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static constexpr const std::array< const char *, 16 > tcdsTriggerTypes_
const edm::ESGetToken< L1TUtmTriggerMenu, L1TUtmTriggerMenuRcd > l1tUtmTriggerMenuRcdToken_
void streamEndLuminosityBlockSummary(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &, L1TriggerJSONMonitoringData::lumisection *) const override
void streamBeginLuminosityBlock(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &) const override
void analyze(edm::StreamID, edm::Event const &, edm::EventSetup const &) const override
std::unique_ptr< L1TriggerJSONMonitoringData::stream > beginStream(edm::StreamID) const override
HLT enums.
L1TriggerJSONMonitoring(const edm::ParameterSet &)
std::vector< unsigned int > l1tAcceptCalibration
results
Definition: mysort.py:8
static constexpr unsigned int maxPhysicsTriggers
Definition: GlobalAlgBlk.h:52
std::shared_ptr< L1TriggerJSONMonitoringData::run > globalBeginRun(edm::Run const &, edm::EventSetup const &) const override
bool isAvailable() const
Definition: Service.h:40
Log< level::Warning, false > LogWarning
const edm::EDGetTokenT< GlobalAlgBlkBxCollection > level1ResultsToken_
Represents a JSON value.
Definition: value.h:101
bool shouldWriteFiles(unsigned int lumi, unsigned int *proc=nullptr)
JSON (JavaScript Object Notation).
Definition: DataPoint.h:26
static const std::string DEFINITION
Definition: DataPoint.h:117
static constexpr const char * streamName_
Definition: event.py:1
Definition: Run.h:45