CMS 3D CMS Logo

L1TriggerJSONMonitoring.cc
Go to the documentation of this file.
1 
7 #include <atomic>
8 #include <fstream>
9 
10 #include <boost/format.hpp>
11 
34 
35 
37 
38  // variables accumulated event by event in each stream
39  struct stream {
40  unsigned int processed; // number of events processed
41  std::vector<unsigned int> l1tAccept; // number of events accepted by each L1 trigger
42  std::vector<unsigned int> l1tAcceptPhysics; // number of "physics" events accepted by each L1 trigger
43  std::vector<unsigned int> l1tAcceptCalibration; // number of "calibration" events accepted by each L1 trigger
44  std::vector<unsigned int> l1tAcceptRandom; // number of "random" events accepted by each L1 trigger
45  std::vector<unsigned int> tcdsAccept; // number of "physics", "calibration", "random" and other event types
46  int prescaleIndex; // prescale column index
47  };
48 
49  // variables initialised for each run
50  struct run {
53  std::string baseRunDir; // base directory from EvFDaqDirector
54  std::string jsdFileName; // definition file name for JSON with rates
55  };
56 
57  // variables accumulated over the whole lumisection
58  struct lumisection {
59  jsoncollector::HistoJ<unsigned int> processed; // number of events processed
60  jsoncollector::HistoJ<unsigned int> l1tAccept; // number of events accepted by each L1 trigger
61  jsoncollector::HistoJ<unsigned int> l1tAcceptPhysics; // number of "physics" events accepted by each L1 trigger
62  jsoncollector::HistoJ<unsigned int> l1tAcceptCalibration; // number of "calibration" events accepted by each L1 trigger
63  jsoncollector::HistoJ<unsigned int> l1tAcceptRandom; // number of "random" events accepted by each L1 trigger
64  jsoncollector::HistoJ<unsigned int> tcdsAccept; // number of "physics", "calibration", "random" and other event types
65  int prescaleIndex; // prescale column index
66  };
67 
68 };
69 
70 
72  // per-stream information
73  edm::StreamCache<L1TriggerJSONMonitoringData::stream>,
74  // per-run accounting
75  edm::RunCache<L1TriggerJSONMonitoringData::run>,
76  // accumulate per-lumisection statistics
77  edm::LuminosityBlockSummaryCache<L1TriggerJSONMonitoringData::lumisection>
78 > {
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&, edm::EventSetup const&) const override;
104 
105  // called after all Streams have finished processing a given Run (i.e. streamEndRun for all Streams have completed)
106  void globalEndRun(edm::Run const&, edm::EventSetup const&) const override;
107 
108  // -- inherited from edm::LuminosityBlockSummaryCache<L1TriggerJSONMonitoringData::lumisection>
109 
110  // called each time the Source sees a new LuminosityBlock
111  std::shared_ptr<L1TriggerJSONMonitoringData::lumisection> globalBeginLuminosityBlockSummary(edm::LuminosityBlock const&, edm::EventSetup const&) const override;
112 
113  // called when a Stream has finished processing a LuminosityBlock, after streamEndLuminosityBlock
114  void streamEndLuminosityBlockSummary(edm::StreamID, edm::LuminosityBlock const&, edm::EventSetup const&, L1TriggerJSONMonitoringData::lumisection*) const override;
115 
116  // called after the streamEndLuminosityBlockSummary method for all Streams have finished processing a given LuminosityBlock
117  void globalEndLuminosityBlockSummary(edm::LuminosityBlock const&, edm::EventSetup const&, L1TriggerJSONMonitoringData::lumisection*) const override;
118 
119 
120 private:
121 
122  // TCDS trigger types
123  // see https://twiki.cern.ch/twiki/bin/viewauth/CMS/TcdsEventRecord
124  static constexpr const std::array<const char *, 16> tcdsTriggerTypes_ = {{
125  "Error", // 0 - No trigger (DAQ error stream events may have this value)
126  "Physics", // 1 - GT trigger
127  "Calibration", // 2 - Sequence trigger (calibration)
128  "Random", // 3 - Random trigger
129  "Auxiliary", // 4 - Auxiliary (CPM front panel NIM input) trigger
130  "", // 5 - reserved
131  "", // 6 - reserved
132  "", // 7 - reserved
133  "Cyclic", // 8 - Cyclic trigger
134  "Bunch-pattern", // 9 - Bunch-pattern trigger
135  "Software", // 10 - Software trigger
136  "TTS", // 11 - TTS-sourced trigger
137  "", // 12 - reserved
138  "", // 13 - reserved
139  "", // 14 - reserved
140  "" // 15 - reserved
141  }};
142 
143  // special values for prescale index checks
144  static constexpr const int kPrescaleUndefined = -2;
145  static constexpr const int kPrescaleConflict = -1;
146 
147  static constexpr const char* streamName_ = "streamL1Rates";
148 
149  static void writeJsdFile(L1TriggerJSONMonitoringData::run const&);
150  static void writeIniFile(L1TriggerJSONMonitoringData::run const&, unsigned int, std::vector<std::string> const&);
151 
152  // configuration
153  const edm::InputTag level1Results_; // InputTag for L1 trigge results
155 
156 };
157 
158 // instantiate static data members
159 constexpr const std::array<const char *, 16> L1TriggerJSONMonitoring::tcdsTriggerTypes_;
160 
161 // constructor
163  level1Results_(config.getParameter<edm::InputTag>("L1Results")),
164  level1ResultsToken_(consumes<GlobalAlgBlkBxCollection>(level1Results_))
165 {
166 }
167 
168 // validate the configuration and optionally fill the default values
169 void
171 {
173  desc.add<edm::InputTag>("L1Results",edm::InputTag("hltGtStage2Digis"));
174  descriptions.add("L1TriggerJSONMonitoring", desc);
175 }
176 
177 // called once for each Stream being used in the job to create the cache object that will be used for that particular Stream
178 std::unique_ptr<L1TriggerJSONMonitoringData::stream>
180 {
181  return std::make_unique<L1TriggerJSONMonitoringData::stream>();
182 }
183 
184 // called each time the Source sees a new Run, and guaranteed to finish before any Stream calls streamBeginRun for that same Run
185 std::shared_ptr<L1TriggerJSONMonitoringData::run>
187 {
188  auto rundata = std::make_shared<L1TriggerJSONMonitoringData::run>();
189 
190  // set the DAQ parameters
192  rundata->streamDestination = edm::Service<evf::EvFDaqDirector>()->getStreamDestinations(streamName_);
193  rundata->streamMergeType = edm::Service<evf::EvFDaqDirector>()->getStreamMergeType(streamName_, evf::MergeTypeJSNDATA);
194  rundata->baseRunDir = edm::Service<evf::EvFDaqDirector>()->baseRunDir();
195  } else {
196  rundata->streamDestination = "";
197  rundata->streamMergeType = "";
198  rundata->baseRunDir = ".";
199  }
200 
201  // read the L1 trigger names from the EventSetup
202  std::vector<std::string> triggerNames(GlobalAlgBlk::maxPhysicsTriggers, ""s);
204  setup.get<L1TUtmTriggerMenuRcd>().get(menuHandle);
205  if (menuHandle.isValid()) {
206  for (auto const& algo: menuHandle->getAlgorithmMap())
207  triggerNames[algo.second.getIndex()] = algo.first;
208  } else {
209  edm::LogWarning("L1TriggerJSONMonitoring") << "L1TUtmTriggerMenu not found in the EventSetup.\nThe Level 1 Trigger rate monitoring will not include the trigger names.";
210  }
211 
212  // write the per-run .jsd file
213  rundata->jsdFileName = (boost::format("run%06d_ls0000_streamL1Rates_pid%05d.jsd") % run.run() % getpid()).str();
215 
216  // write the per-run .ini file
217  // iniFileName = (boost::format("run%06d_ls0000_streamL1Rates_pid%05d.ini") % run.run() % getpid()).str();
218  writeIniFile(*rundata, run.run(), triggerNames);
219 
220  return rundata;
221 }
222 
223 // called after all Streams have finished processing a given Run (i.e. streamEndRun for all Streams have completed)
224 void
226 {
227 }
228 
229 // called for each Event
230 void
232 {
233  auto & stream = * streamCache(sid);
234 
235  ++stream.processed;
236  unsigned int eventType = event.experimentType();
237  if (eventType < tcdsTriggerTypes_.size())
238  ++stream.tcdsAccept[eventType];
239  else
240  edm::LogWarning("L1TriggerJSONMonitoring") << "Unexpected event type " << eventType;
241 
242  // get hold of TriggerResults
244  if (not event.getByToken(level1ResultsToken_, handle) or not handle.isValid()){
245  edm::LogError("L1TriggerJSONMonitoring") << "L1 trigger results with label [" + level1Results_.encode() + "] not present or invalid";
246  return;
247  }
248 
249  // The GlobalAlgBlkBxCollection is a vector of vectors, but the second layer can only ever
250  // have one entry since there can't be more than one collection per bunch crossing.
251  // The first "0" here means BX = 0, while the second "0" is used to access the first and only element.
252  auto const& results = handle->at(0, 0);
253  auto const& decision = results.getAlgoDecisionFinal();
254  assert (decision.size() == GlobalAlgBlk::maxPhysicsTriggers);
255 
256  // check the results for each HLT path
257  for (unsigned int i = 0; i < decision.size(); ++i) {
258  if (decision[i]) {
259  ++stream.l1tAccept[i];
260  switch (eventType) {
262  ++stream.l1tAcceptPhysics[i];
263  break;
265  ++stream.l1tAcceptCalibration[i];
266  break;
268  ++stream.l1tAcceptRandom[i];
269  break;
270  default:
271  break;
272  }
273  }
274  }
275 
276  // check for conflicting values in the prescale column index, and store it
277  int prescaleIndex = results.getPreScColumn();
278  if (stream.prescaleIndex == kPrescaleUndefined) {
279  stream.prescaleIndex = prescaleIndex;
280  } else if (stream.prescaleIndex == kPrescaleConflict) {
281  // do nothing
282  } else if (stream.prescaleIndex != prescaleIndex) {
283  edm::LogWarning("L1TriggerJSONMonitoring") <<
284  "Prescale index changed from " << stream.prescaleIndex << " to " << prescaleIndex << " inside lumisection " << event.luminosityBlock();
285  stream.prescaleIndex = kPrescaleConflict;
286  }
287 }
288 
289 
290 // called each time the Source sees a new LuminosityBlock
291 std::shared_ptr<L1TriggerJSONMonitoringData::lumisection>
293 {
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) lumidata->l1tAccept.update(0);
307  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) lumidata->l1tAcceptPhysics.update(0);
308  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) lumidata->l1tAcceptCalibration.update(0);
309  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) lumidata->l1tAcceptRandom.update(0);
310  for (unsigned int i = 0; i < tcdsTriggerTypes_.size(); ++i) lumidata->tcdsAccept.update(0);
311  lumidata->prescaleIndex = kPrescaleUndefined;
312 
313  return lumidata;
314 }
315 
316 // called when the Stream is switching from one LuminosityBlock to a new LuminosityBlock.
317 void
319 {
320  auto & stream = * streamCache(sid);
321 
322  // reset the stream counters
323  stream.processed = 0;
324  stream.l1tAccept.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
325  stream.l1tAcceptPhysics.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
326  stream.l1tAcceptCalibration.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
327  stream.l1tAcceptRandom.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
328  stream.tcdsAccept.assign(tcdsTriggerTypes_.size(), 0);
329  stream.prescaleIndex = kPrescaleUndefined;
330 }
331 
332 // called when a Stream has finished processing a LuminosityBlock, after streamEndLuminosityBlock
333 void
335 {
336  auto const& stream = * streamCache(sid);
337  lumidata->processed.value()[0] += stream.processed;
338 
339  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) {
340  lumidata->l1tAccept.value()[i] += stream.l1tAccept[i];
341  lumidata->l1tAcceptPhysics.value()[i] += stream.l1tAcceptPhysics[i];
342  lumidata->l1tAcceptCalibration.value()[i] += stream.l1tAcceptCalibration[i];
343  lumidata->l1tAcceptRandom.value()[i] += stream.l1tAcceptRandom[i];
344  }
345  for (unsigned int i = 0; i < tcdsTriggerTypes_.size(); ++i)
346  lumidata->tcdsAccept.value()[i] += stream.tcdsAccept[i];
347 
348  // check for conflicting values in the prescale column index
349  if (lumidata->prescaleIndex == kPrescaleUndefined)
350  lumidata->prescaleIndex = stream.prescaleIndex;
351  else if (lumidata->prescaleIndex != stream.prescaleIndex)
352  lumidata->prescaleIndex = kPrescaleConflict;
353 }
354 
355 // called after the streamEndLuminosityBlockSummary method for all Streams have finished processing a given LuminosityBlock
356 void
358 {
359  unsigned int ls = lumi.luminosityBlock();
360  unsigned int run = lumi.run();
361 
362  bool writeFiles = true;
363  if (edm::Service<evf::MicroStateService>().isAvailable()) {
365  if (fms)
366  writeFiles = fms->shouldWriteFiles(ls);
367  }
368  if (not writeFiles)
369  return;
370 
371  unsigned int processed = lumidata->processed.value().at(0);
372  auto const& rundata = * runCache(lumi.getRun().index());
374 
375  // [SIC]
376  char hostname[33];
377  gethostname(hostname, 32);
378  std::string sourceHost(hostname);
379 
380  // [SIC]
381  std::stringstream sOutDef;
382  sOutDef << rundata.baseRunDir << "/" << "output_" << getpid() << ".jsd";
383 
384  std::string jsndataFileList = "";
385  unsigned int jsndataSize = 0;
386  unsigned int jsndataAdler32 = 1; // adler32 checksum for an empty file
387 
388  if (processed) {
389  // write the .jsndata files which contain the actual rates
390  Json::Value jsndata;
391  jsndata[jsoncollector::DataPoint::SOURCE] = sourceHost;
392  jsndata[jsoncollector::DataPoint::DEFINITION] = rundata.jsdFileName;
398 
399  // write only the number of "physics", "calibration" and "random" events
404  jsndata[jsoncollector::DataPoint::DATA].append(tcdsAccept.toJsonValue());
405  /* FIXME send information for all event types instead of only these three
406  jsndata[jsoncollector::DataPoint::DATA].append(lumidata->tcdsAccept.toJsonValue());
407  */
409 
410  auto jsndataFileName = boost::format("run%06d_ls%04d_streamL1Rates_pid%05d.jsndata") % run % ls % getpid();
411 
412  std::string result = writer.write(jsndata);
413  std::ofstream jsndataFile(rundata.baseRunDir + "/" + jsndataFileName.str());
414  jsndataFile << result;
415  jsndataFile.close();
416 
417  jsndataFileList = jsndataFileName.str();
418  jsndataSize = result.size();
419  jsndataAdler32 = cms::Adler32(result.c_str(), result.size());
420  }
421 
422  // create a metadata json file for the "HLT rates" pseudo-stream
423  unsigned int jsnProcessed = processed;
424  unsigned int jsnAccepted = processed;
425  unsigned int jsnErrorEvents = 0;
426  unsigned int jsnRetCodeMask = 0;
427  std::string jsnInputFiles = "";
428  unsigned int jsnHLTErrorEvents = 0;
429 
430  Json::Value jsn;
431  jsn[jsoncollector::DataPoint::SOURCE] = sourceHost;
432  jsn[jsoncollector::DataPoint::DEFINITION] = sOutDef.str();
433  jsn[jsoncollector::DataPoint::DATA].append(jsnProcessed);
434  jsn[jsoncollector::DataPoint::DATA].append(jsnAccepted);
435  jsn[jsoncollector::DataPoint::DATA].append(jsnErrorEvents);
436  jsn[jsoncollector::DataPoint::DATA].append(jsnRetCodeMask);
437  jsn[jsoncollector::DataPoint::DATA].append(jsndataFileList);
438  jsn[jsoncollector::DataPoint::DATA].append(jsndataSize);
439  jsn[jsoncollector::DataPoint::DATA].append(jsnInputFiles);
440  jsn[jsoncollector::DataPoint::DATA].append(jsndataAdler32);
441  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamDestination);
442  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamMergeType);
443  jsn[jsoncollector::DataPoint::DATA].append(jsnHLTErrorEvents);
444 
445  auto jsnFileName = boost::format("run%06d_ls%04d_streamL1Rates_pid%05d.jsn") % run % ls % getpid();
446  std::ofstream jsnFile( rundata.baseRunDir + "/" + jsnFileName.str() );
447  jsnFile << writer.write(jsn);
448  jsnFile.close();
449 }
450 
451 void
453 {
454  std::ofstream file(rundata.baseRunDir + "/" + rundata.jsdFileName);
455  file << R"""({
456  "data" : [
457  { "name" : "Processed", "type" : "integer", "operation" : "histo"},
458  { "name" : "L1-AlgoAccepted", "type" : "integer", "operation" : "histo"},
459  { "name" : "L1-AlgoAccepted-Physics", "type" : "integer", "operation" : "histo"},
460  { "name" : "L1-AlgoAccepted-Calibration", "type" : "integer", "operation" : "histo"},
461  { "name" : "L1-AlgoAccepted-Random", "type" : "integer", "operation" : "histo"},
462  { "name" : "L1-Global", "type" : "integer", "operation" : "histo"},
463  { "name" : "Prescale-Index", "type" : "integer", "operation" : "sample"}
464  ]
465 })""";
466  file.close();
467 }
468 
469 void
470 L1TriggerJSONMonitoring::writeIniFile(L1TriggerJSONMonitoringData::run const & rundata, unsigned int run, std::vector<std::string> const& l1TriggerNames)
471 {
473 
474  Json::Value triggerNames(Json::arrayValue);
475  for (auto const& name: l1TriggerNames)
476  triggerNames.append(name);
477  content["L1-Algo-Names"] = triggerNames;
478 
479  Json::Value eventTypes(Json::arrayValue);
483  /* FIXME send information for all event types instead of only these three
484  for (auto const& name : tcdsTriggerTypes_)
485  eventTypes.append(name);
486  */
487  content["Event-Type"] = eventTypes;
488 
489  std::string iniFileName = (boost::format("run%06d_ls0000_streamL1Rates_pid%05d.ini") % run % getpid()).str();
490  std::ofstream file(rundata.baseRunDir + "/" + iniFileName);
492  file << writer.write(content);
493  file.close();
494 }
495 
496 
497 // declare as a framework plugin
jsoncollector::HistoJ< unsigned int > l1tAcceptRandom
static void writeJsdFile(L1TriggerJSONMonitoringData::run const &)
std::shared_ptr< L1TriggerJSONMonitoringData::lumisection > globalBeginLuminosityBlockSummary(edm::LuminosityBlock const &, edm::EventSetup const &) const override
const edm::InputTag level1Results_
jsoncollector::HistoJ< unsigned int > l1tAccept
RunNumber_t run() const
Definition: RunBase.h:40
static const std::string SOURCE
Definition: DataPoint.h:121
std::vector< unsigned int > l1tAcceptPhysics
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
bool shouldWriteFiles(unsigned int lumi, unsigned int *proc=0)
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
Value & append(const Value &value)
Append value to array at the end.
void streamEndLuminosityBlockSummary(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &, L1TriggerJSONMonitoringData::lumisection *) const override
jsoncollector::HistoJ< unsigned int > l1tAcceptCalibration
jsoncollector::HistoJ< unsigned int > processed
Definition: config.py:1
Represents a JSON value.
Definition: value.h:111
virtual Json::Value toJsonValue() const
std::string encode() const
Definition: InputTag.cc:159
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:123
LuminosityBlockNumber_t luminosityBlock() const
jsoncollector::HistoJ< unsigned int > tcdsAccept
static void writeIniFile(L1TriggerJSONMonitoringData::run const &, unsigned int, std::vector< std::string > const &)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::shared_ptr< L1TriggerJSONMonitoringData::run > globalBeginRun(edm::Run const &, edm::EventSetup const &) const override
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
bool isAvailable() const
Definition: Service.h:40
RunIndex index() const
Definition: Run.cc:21
RunNumber_t run() const
format
Some error handling for the usage.
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:74
jsoncollector::HistoJ< unsigned int > l1tAcceptPhysics
void streamBeginLuminosityBlock(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &) const override
void Adler32(char const *data, size_t len, uint32_t &a, uint32_t &b)
def ls(path, rec=False)
Definition: eostools.py:349
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
static unsigned int maxPhysicsTriggers
Definition: GlobalAlgBlk.h:54
void globalEndLuminosityBlockSummary(edm::LuminosityBlock const &, edm::EventSetup const &, L1TriggerJSONMonitoringData::lumisection *) const override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static const std::array< const char *, 16 > tcdsTriggerTypes_
std::string write(const Value &root) override
Serialize a Value in JSON format.
const std::map< std::string, L1TUtmAlgorithm > & getAlgorithmMap() const
HLT enums.
void globalEndRun(edm::Run const &, edm::EventSetup const &) const override
T get() const
Definition: EventSetup.h:71
L1TriggerJSONMonitoring(const edm::ParameterSet &)
std::vector< unsigned int > l1tAcceptCalibration
void analyze(edm::StreamID, edm::Event const &, edm::EventSetup const &) const override
bool isValid() const
Definition: ESHandle.h:44
const edm::EDGetTokenT< GlobalAlgBlkBxCollection > level1ResultsToken_
Writes a Value in JSON format in a human friendly way.
Definition: writer.h:65
#define str(s)
static const std::string DEFINITION
Definition: DataPoint.h:122
#define constexpr
Definition: event.py:1
Definition: Run.h:45
std::unique_ptr< L1TriggerJSONMonitoringData::stream > beginStream(edm::StreamID) const override
array value (ordered list)
Definition: value.h:31
const T & at(int bx, unsigned i) const
Run const & getRun() const