CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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  // FIXME use this
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 trigge results
156 
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 {
167 }
168 
169 // validate the configuration and optionally fill the default values
170 void
172 {
174  desc.add<edm::InputTag>("L1Results",edm::InputTag("hltGtStage2Digis"));
175  descriptions.add("L1TriggerJSONMonitoring", desc);
176 }
177 
178 // called once for each Stream being used in the job to create the cache object that will be used for that particular Stream
179 std::unique_ptr<L1TriggerJSONMonitoringData::stream>
181 {
182  return std::make_unique<L1TriggerJSONMonitoringData::stream>();
183 }
184 
185 // called each time the Source sees a new Run, and guaranteed to finish before any Stream calls streamBeginRun for that same Run
186 std::shared_ptr<L1TriggerJSONMonitoringData::run>
188 {
189  auto rundata = std::make_shared<L1TriggerJSONMonitoringData::run>();
190 
191  // set the DAQ parameters
193  rundata->streamDestination = edm::Service<evf::EvFDaqDirector>()->getStreamDestinations("streamL1Rates");
194  rundata->streamMergeType = edm::Service<evf::EvFDaqDirector>()->getStreamMergeType("streamL1Rates", evf::MergeTypeJSNDATA);
195  rundata->baseRunDir = edm::Service<evf::EvFDaqDirector>()->baseRunDir();
196  } else {
197  rundata->streamDestination = "";
198  rundata->streamMergeType = "";
199  rundata->baseRunDir = ".";
200  }
201 
202  // read the L1 trigger names from the EventSetup
203  std::vector<std::string> triggerNames(GlobalAlgBlk::maxPhysicsTriggers, ""s);
205  setup.get<L1TUtmTriggerMenuRcd>().get(menuHandle);
206  if (menuHandle.isValid()) {
207  for (auto const& algo: menuHandle->getAlgorithmMap())
208  triggerNames[algo.second.getIndex()] = algo.first;
209  } else {
210  edm::LogWarning("L1TriggerJSONMonitoring") << "L1TUtmTriggerMenu not found in the EventSetup.\nThe Level 1 Trigger rate monitoring will not include the rigger names.";
211  }
212 
213  // write the per-run .jsd file
214  rundata->jsdFileName = (boost::format("run%06d_ls0000_streamL1Rates_pid%05d.jsd") % run.run() % getpid()).str();
216 
217  // write the per-run .ini file
218  // iniFileName = (boost::format("run%06d_ls0000_streamL1Rates_pid%05d.ini") % run.run() % getpid()).str();
219  writeIniFile(*rundata, run.run(), triggerNames);
220 
221  return rundata;
222 }
223 
224 // called after all Streams have finished processing a given Run (i.e. streamEndRun for all Streams have completed)
225 void
227 {
228 }
229 
230 // called for each Event
231 void
233 {
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()){
246  edm::LogError("L1TriggerJSONMonitoring") << "L1 trigger results with label [" + level1Results_.encode() + "] not present or invalid";
247  return;
248  }
249 
250  // The GlobalAlgBlkBxCollection is a vector of vectors, but the second layer can only ever
251  // have one entry since there can't be more than one collection per bunch crossing.
252  // The first "0" here means BX = 0, while the second "0" is used to access the first and only element.
253  auto const& results = handle->at(0, 0);
254  auto const& decision = results.getAlgoDecisionFinal();
255  assert (decision.size() == GlobalAlgBlk::maxPhysicsTriggers);
256 
257  // check the results for each HLT path
258  for (unsigned int i = 0; i < decision.size(); ++i) {
259  if (decision[i]) {
260  ++stream.l1tAccept[i];
261  switch (eventType) {
263  ++stream.l1tAcceptPhysics[i];
264  break;
266  ++stream.l1tAcceptCalibration[i];
267  break;
269  ++stream.l1tAcceptRandom[i];
270  break;
271  default:
272  break;
273  }
274  }
275  }
276 
277  // check for conflicting values in the prescale column index, and store it
278  int prescaleIndex = results.getPreScColumn();
279  if (stream.prescaleIndex == kPrescaleUndefined) {
280  stream.prescaleIndex = prescaleIndex;
281  } else if (stream.prescaleIndex == kPrescaleConflict) {
282  // do nothing
283  } else if (stream.prescaleIndex != prescaleIndex) {
284  edm::LogWarning("L1TriggerJSONMonitoring") <<
285  "Prescale index changed from " << stream.prescaleIndex << " to " << prescaleIndex << " inside lumisection " << event.luminosityBlock();
286  stream.prescaleIndex = kPrescaleConflict;
287  }
288 }
289 
290 
291 // called each time the Source sees a new LuminosityBlock
292 std::shared_ptr<L1TriggerJSONMonitoringData::lumisection>
294 {
295  // the API of jsoncollector::HistoJ does not really match our use case,
296  // but it is the only vector-like object available in JsonMonitorable.h
297  auto lumidata = std::make_shared<L1TriggerJSONMonitoringData::lumisection>(L1TriggerJSONMonitoringData::lumisection{
298  jsoncollector::HistoJ<unsigned int>(1), // processed
304  });
305  // repeated calls to `update` necessary to set the internal element counter
306  lumidata->processed.update(0);
307  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) lumidata->l1tAccept.update(0);
308  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) lumidata->l1tAcceptPhysics.update(0);
309  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) lumidata->l1tAcceptCalibration.update(0);
310  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) lumidata->l1tAcceptRandom.update(0);
311  for (unsigned int i = 0; i < tcdsTriggerTypes_.size(); ++i) lumidata->tcdsAccept.update(0);
312  lumidata->prescaleIndex = kPrescaleUndefined;
313 
314  return lumidata;
315 }
316 
317 // called when the Stream is switching from one LuminosityBlock to a new LuminosityBlock.
318 void
320 {
321  auto & stream = * streamCache(sid);
322 
323  // reset the stream counters
324  stream.processed = 0;
325  stream.l1tAccept.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
326  stream.l1tAcceptPhysics.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
327  stream.l1tAcceptCalibration.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
328  stream.l1tAcceptRandom.assign(GlobalAlgBlk::maxPhysicsTriggers, 0);
329  stream.tcdsAccept.assign(tcdsTriggerTypes_.size(), 0);
330  stream.prescaleIndex = kPrescaleUndefined;
331 }
332 
333 // called when a Stream has finished processing a LuminosityBlock, after streamEndLuminosityBlock
334 void
336 {
337  auto const& stream = * streamCache(sid);
338  lumidata->processed.value()[0] += stream.processed;
339 
340  for (unsigned int i = 0; i < GlobalAlgBlk::maxPhysicsTriggers; ++i) {
341  lumidata->l1tAccept.value()[i] += stream.l1tAccept[i];
342  lumidata->l1tAcceptPhysics.value()[i] += stream.l1tAcceptPhysics[i];
343  lumidata->l1tAcceptCalibration.value()[i] += stream.l1tAcceptCalibration[i];
344  lumidata->l1tAcceptRandom.value()[i] += stream.l1tAcceptRandom[i];
345  }
346  for (unsigned int i = 0; i < tcdsTriggerTypes_.size(); ++i)
347  lumidata->tcdsAccept.value()[i] += stream.tcdsAccept[i];
348 
349  // check for conflicting values in the prescale column index
350  if (lumidata->prescaleIndex == kPrescaleUndefined)
351  lumidata->prescaleIndex = stream.prescaleIndex;
352  else if (lumidata->prescaleIndex != stream.prescaleIndex)
353  lumidata->prescaleIndex = kPrescaleConflict;
354 }
355 
356 // called after the streamEndLuminosityBlockSummary method for all Streams have finished processing a given LuminosityBlock
357 void
359 {
360  unsigned int ls = lumi.luminosityBlock();
361  unsigned int run = lumi.run();
362 
363  bool writeFiles = true;
364  if (edm::Service<evf::MicroStateService>().isAvailable()) {
366  if (fms)
367  writeFiles = fms->shouldWriteFiles(ls);
368  }
369  if (not writeFiles)
370  return;
371 
372  unsigned int processed = lumidata->processed.value().at(0);
373  auto const& rundata = * runCache(lumi.getRun().index());
375 
376  // [SIC]
377  char hostname[33];
378  gethostname(hostname, 32);
379  std::string sourceHost(hostname);
380 
381  // [SIC]
382  std::stringstream sOutDef;
383  sOutDef << rundata.baseRunDir << "/" << "output_" << getpid() << ".jsd";
384 
385  std::string jsndataFileList = "";
386  unsigned int jsndataSize = 0;
387  unsigned int jsndataAdler32 = 1; // adler32 checksum for an empty file
388 
389  if (processed) {
390  // write the .jsndata files which contain the actual rates
391  Json::Value jsndata;
392  jsndata[jsoncollector::DataPoint::SOURCE] = sourceHost;
393  jsndata[jsoncollector::DataPoint::DEFINITION] = rundata.jsdFileName;
399 
400  // write only the number of "physics", "calibration" and "random" events
405  jsndata[jsoncollector::DataPoint::DATA].append(tcdsAccept.toJsonValue());
406  /* FIXME send information for all event types instead of only these three
407  jsndata[jsoncollector::DataPoint::DATA].append(lumidata->tcdsAccept.toJsonValue());
408  */
410 
411  auto jsndataFileName = boost::format("run%06d_ls%04d_streamL1Rates_pid%05d.jsndata") % run % ls % getpid();
412 
413  std::string result = writer.write(jsndata);
414  std::ofstream jsndataFile(rundata.baseRunDir + "/" + jsndataFileName.str());
415  jsndataFile << result;
416  jsndataFile.close();
417 
418  jsndataFileList = jsndataFileName.str();
419  jsndataSize = result.size();
420  jsndataAdler32 = cms::Adler32(result.c_str(), result.size());
421  }
422 
423  // create a metadata json file for the "HLT rates" pseudo-stream
424  unsigned int jsnProcessed = processed;
425  unsigned int jsnAccepted = processed;
426  unsigned int jsnErrorEvents = 0;
427  unsigned int jsnRetCodeMask = 0;
428  std::string jsnInputFiles = "";
429  unsigned int jsnHLTErrorEvents = 0;
430 
431  Json::Value jsn;
432  jsn[jsoncollector::DataPoint::SOURCE] = sourceHost;
433  jsn[jsoncollector::DataPoint::DEFINITION] = sOutDef.str();
434  jsn[jsoncollector::DataPoint::DATA].append(jsnProcessed);
435  jsn[jsoncollector::DataPoint::DATA].append(jsnAccepted);
436  jsn[jsoncollector::DataPoint::DATA].append(jsnErrorEvents);
437  jsn[jsoncollector::DataPoint::DATA].append(jsnRetCodeMask);
438  jsn[jsoncollector::DataPoint::DATA].append(jsndataFileList);
439  jsn[jsoncollector::DataPoint::DATA].append(jsndataSize);
440  jsn[jsoncollector::DataPoint::DATA].append(jsnInputFiles);
441  jsn[jsoncollector::DataPoint::DATA].append(jsndataAdler32);
442  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamDestination);
443  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamMergeType);
444  jsn[jsoncollector::DataPoint::DATA].append(jsnHLTErrorEvents);
445 
446  auto jsnFileName = boost::format("run%06d_ls%04d_streamL1Rates_pid%05d.jsn") % run % ls % getpid();
447  std::ofstream jsnFile( rundata.baseRunDir + "/" + jsnFileName.str() );
448  jsnFile << writer.write(jsn);
449  jsnFile.close();
450 }
451 
452 void
454 {
455  std::ofstream file(rundata.baseRunDir + "/" + rundata.jsdFileName);
456  file << R"""({
457  "data" : [
458  { "name" : "Processed", "type" : "integer", "operation" : "histo"},
459  { "name" : "L1-AlgoAccepted", "type" : "integer", "operation" : "histo"},
460  { "name" : "L1-AlgoAccepted-Physics", "type" : "integer", "operation" : "histo"},
461  { "name" : "L1-AlgoAccepted-Calibration", "type" : "integer", "operation" : "histo"},
462  { "name" : "L1-AlgoAccepted-Random", "type" : "integer", "operation" : "histo"},
463  { "name" : "L1-Global", "type" : "integer", "operation" : "histo"},
464  { "name" : "Prescale-Index", "type" : "integer", "operation" : "sample"}
465  ]
466 })""";
467  file.close();
468 }
469 
470 void
471 L1TriggerJSONMonitoring::writeIniFile(L1TriggerJSONMonitoringData::run const & rundata, unsigned int run, std::vector<std::string> const& l1TriggerNames)
472 {
474 
475  Json::Value triggerNames(Json::arrayValue);
476  for (auto const& name: l1TriggerNames)
477  triggerNames.append(name);
478  content["L1-Algo-Names"] = triggerNames;
479 
480  Json::Value eventTypes(Json::arrayValue);
484  /* FIXME send information for all event types instead of only these three
485  for (auto const& name : tcdsTriggerTypes_)
486  eventTypes.append(name);
487  */
488  content["Event-Type"] = eventTypes;
489 
490  std::string iniFileName = (boost::format("run%06d_ls0000_streamL1Rates_pid%05d.ini") % run % getpid()).str();
491  std::ofstream file(rundata.baseRunDir + "/" + iniFileName);
493  file << writer.write(content);
494  file.close();
495 }
496 
497 
498 // 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:460
def analyze(function, filename, filter=None)
Definition: Profiling.py:11
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool shouldWriteFiles(unsigned int lumi, unsigned int *proc=0)
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:1
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:165
#define constexpr
static const unsigned int maxPhysicsTriggers
Definition: GlobalAlgBlk.h:52
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 &)
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:46
RunIndex index() const
Definition: Run.cc:24
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
virtual std::string write(const Value &root)
Serialize a Value in JSON format.
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:348
void globalEndLuminosityBlockSummary(edm::LuminosityBlock const &, edm::EventSetup const &, L1TriggerJSONMonitoringData::lumisection *) const override
const T & get() const
Definition: EventSetup.h:56
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static const std::array< const char *, 16 > tcdsTriggerTypes_
const std::map< std::string, L1TUtmAlgorithm > & getAlgorithmMap() const
HLT enums.
void globalEndRun(edm::Run const &, edm::EventSetup const &) const override
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:47
const edm::EDGetTokenT< GlobalAlgBlkBxCollection > level1ResultsToken_
Writes a Value in JSON format in a human friendly way.
Definition: writer.h:65
static const std::string DEFINITION
Definition: DataPoint.h:122
Definition: event.py:1
Definition: Run.h:42
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