CMS 3D CMS Logo

HLTriggerJSONMonitoring.cc
Go to the documentation of this file.
1 
7 #include <atomic>
8 #include <fstream>
9 #include <sstream>
10 #include <vector>
11 #include <string>
12 #include <memory>
13 #include <algorithm>
14 
15 #include <fmt/printf.h>
16 
35 
37  // variables accumulated event by event in each stream
38  struct stream {
39  unsigned int processed; // number of events processed
40  std::vector<unsigned int> hltWasRun; // number of events where each path was run
41  std::vector<unsigned int> hltL1s; // number of events where each path passed the L1 seed
42  std::vector<unsigned int> hltPre; // number of events where each path passed the prescale
43  std::vector<unsigned int> hltAccept; // number of events accepted by each path
44  std::vector<unsigned int> hltReject; // number of events rejected by each path
45  std::vector<unsigned int> hltErrors; // number of events with errors in each path
46  std::vector<unsigned int> datasets; // number of events accepted by each dataset
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  HLTConfigProvider hltConfig; // HLT configuration for the current run
57  std::vector<int> posL1s; // position of last L1T HLT seed filter in each path, or -1 if not present
58  std::vector<int> posPre; // position of last HLT prescale filter in each path, or -1 if not present
59  std::vector<std::vector<unsigned int>> datasets; // list of paths in each dataset
60  std::vector<unsigned int> indicesOfTriggerPaths; // indices of triggers (without DatasetPaths) in TriggerNames
61  };
62 
63  // variables accumulated over the whole lumisection
64  struct lumisection {
65  jsoncollector::HistoJ<unsigned int> processed; // number of events processed
66  jsoncollector::HistoJ<unsigned int> hltWasRun; // number of events where each path was run
67  jsoncollector::HistoJ<unsigned int> hltL1s; // number of events where each path passed the L1 seed
68  jsoncollector::HistoJ<unsigned int> hltPre; // number of events where each path passed the prescale
69  jsoncollector::HistoJ<unsigned int> hltAccept; // number of events accepted by each path
70  jsoncollector::HistoJ<unsigned int> hltReject; // number of events rejected by each path
71  jsoncollector::HistoJ<unsigned int> hltErrors; // number of events with errors in each path
72  jsoncollector::HistoJ<unsigned int> datasets; // number of events accepted by each dataset
73  };
74 };
75 
77  // per-stream information
78  edm::StreamCache<HLTriggerJSONMonitoringData::stream>,
79  // per-run accounting
80  edm::RunCache<HLTriggerJSONMonitoringData::run>,
81  // accumulate per-lumisection statistics
82  edm::LuminosityBlockSummaryCache<HLTriggerJSONMonitoringData::lumisection>> {
83 public:
84  // constructor
86 
87  // destructor
88  ~HLTriggerJSONMonitoring() override = default;
89 
90  // validate the configuration and optionally fill the default values
91  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
92 
93  // called for each Event
94  void analyze(edm::StreamID, edm::Event const&, edm::EventSetup const&) const override;
95 
96  // -- inherited from edm::StreamCache<HLTriggerJSONMonitoringData::stream>
97 
98  // called once for each Stream being used in the job to create the cache object that will be used for that particular Stream
99  std::unique_ptr<HLTriggerJSONMonitoringData::stream> beginStream(edm::StreamID) const override;
100 
101  // called when the Stream is switching from one LuminosityBlock to a new LuminosityBlock.
103 
104  // -- inherited from edm::RunCache<HLTriggerJSONMonitoringData::run>
105 
106  // called each time the Source sees a new Run, and guaranteed to finish before any Stream calls streamBeginRun for that same Run
107  std::shared_ptr<HLTriggerJSONMonitoringData::run> globalBeginRun(edm::Run const&,
108  edm::EventSetup const&) const override;
109 
110  // called after all Streams have finished processing a given Run (i.e. streamEndRun for all Streams have completed)
111  void globalEndRun(edm::Run const&, edm::EventSetup const&) const override;
112 
113  // -- inherited from edm::LuminosityBlockSummaryCache<HLTriggerJSONMonitoringData::lumisection>
114 
115  // called each time the Source sees a new LuminosityBlock
116  std::shared_ptr<HLTriggerJSONMonitoringData::lumisection> globalBeginLuminosityBlockSummary(
117  edm::LuminosityBlock const&, edm::EventSetup const&) const override;
118 
119  // called when a Stream has finished processing a LuminosityBlock, after streamEndLuminosityBlock
121  edm::LuminosityBlock const&,
122  edm::EventSetup const&,
124 
125  // called after the streamEndLuminosityBlockSummary method for all Streams have finished processing a given LuminosityBlock
127  edm::EventSetup const&,
129 
130 private:
131  static constexpr const char* streamName_ = "streamHLTRates";
132 
133  static constexpr const char* datasetPathNamePrefix_ = "Dataset_";
134 
136  static void writeIniFile(HLTriggerJSONMonitoringData::run const&, unsigned int);
137 
138  // configuration
139  const edm::InputTag triggerResults_; // InputTag for TriggerResults
141 };
142 
143 // constructor
145  : triggerResults_(config.getParameter<edm::InputTag>("triggerResults")),
146  triggerResultsToken_(consumes(triggerResults_)) {}
147 
148 // validate the configuration and optionally fill the default values
151  desc.add<edm::InputTag>("triggerResults", edm::InputTag("TriggerResults", "", "@currentProcess"));
152  descriptions.add("HLTriggerJSONMonitoring", desc);
153 }
154 
155 // called once for each Stream being used in the job to create the cache object that will be used for that particular Stream
156 std::unique_ptr<HLTriggerJSONMonitoringData::stream> HLTriggerJSONMonitoring::beginStream(edm::StreamID) const {
157  return std::make_unique<HLTriggerJSONMonitoringData::stream>();
158 }
159 
160 // called each time the Source sees a new Run, and guaranteed to finish before any Stream calls streamBeginRun for that same Run
161 std::shared_ptr<HLTriggerJSONMonitoringData::run> HLTriggerJSONMonitoring::globalBeginRun(
162  edm::Run const& run, edm::EventSetup const& setup) const {
163  auto rundata = std::make_shared<HLTriggerJSONMonitoringData::run>();
164 
165  // set the DAQ parameters
167  rundata->streamDestination = edm::Service<evf::EvFDaqDirector>()->getStreamDestinations(streamName_);
168  rundata->streamMergeType =
170  rundata->baseRunDir = edm::Service<evf::EvFDaqDirector>()->baseRunDir();
171  } else {
172  rundata->streamDestination = "";
173  rundata->streamMergeType = "";
174  rundata->baseRunDir = ".";
175  }
176 
177  // initialize HLTConfigProvider
178  bool changed = true;
179  if (not rundata->hltConfig.init(run, setup, triggerResults_.process(), changed)) {
180  edm::LogError("HLTriggerJSONMonitoring") << "HLTConfigProvider initialization failed!";
181  } else if (changed) {
182  // triggerNames from TriggerResults (includes DatasetPaths)
183  auto const& triggerNames = rundata->hltConfig.triggerNames();
184  auto const triggerNamesSize = triggerNames.size();
185 
186  // update the list of indices of the HLT Paths (without DatasetPaths) in the TriggerNames list
187  rundata->indicesOfTriggerPaths.clear();
188  rundata->indicesOfTriggerPaths.reserve(triggerNamesSize);
189  for (auto triggerNameIdx = 0u; triggerNameIdx < triggerNamesSize; ++triggerNameIdx) {
190  // skip DatasetPaths
191  if (triggerNames[triggerNameIdx].find(datasetPathNamePrefix_) != 0) {
192  rundata->indicesOfTriggerPaths.emplace_back(triggerNameIdx);
193  }
194  }
195  auto const triggersSize = rundata->indicesOfTriggerPaths.size();
196 
197  // update the list of paths in each dataset
198  auto const& datasets = rundata->hltConfig.datasetContents();
199  auto const& datasetNames = rundata->hltConfig.datasetNames();
200  auto const datasetsSize = datasetNames.size();
201  rundata->datasets.resize(datasetsSize);
202  for (auto ds = 0u; ds < datasetsSize; ++ds) {
203  auto& dataset = rundata->datasets[ds];
204  // check if TriggerNames include the DatasetPath corresponding to this Dataset
205  // - DatasetPaths are normal cms.Path objects
206  // - in Run-3 HLT menus, DatasetPaths are used to define PrimaryDatasets
207  auto const datasetPathName = datasetPathNamePrefix_ + datasetNames[ds];
208  auto const datasetPathExists =
209  std::find(triggerNames.begin(), triggerNames.end(), datasetPathName) != triggerNames.end();
210  if (datasetPathExists) {
211  // if a DatasetPath exists, only that Path is assigned to the Dataset
212  // - this way, the counts of the Dataset properly include prescales on the DatasetPath
213  // and smart-Prescales applied by the DatasetPath to its triggers
214  dataset.reserve(1);
215  auto const index = rundata->hltConfig.triggerIndex(datasetPathName);
216  if (index < triggerNamesSize)
217  dataset.push_back(index);
218  } else {
219  auto const paths = datasets[ds].size();
220  dataset.reserve(paths);
221  for (auto p = 0u; p < paths; p++) {
222  auto const index = rundata->hltConfig.triggerIndex(datasets[ds][p]);
223  if (index < triggerNamesSize)
224  dataset.push_back(index);
225  }
226  }
227  }
228 
229  // find the positions of the L1 seed and prescale filters
230  rundata->posL1s.resize(triggersSize);
231  rundata->posPre.resize(triggersSize);
232  for (auto i = 0u; i < triggersSize; ++i) {
233  rundata->posL1s[i] = -1;
234  rundata->posPre[i] = -1;
235  auto const& moduleLabels = rundata->hltConfig.moduleLabels(i);
236  for (auto j = 0u; j < moduleLabels.size(); ++j) {
237  auto const& label = rundata->hltConfig.moduleType(moduleLabels[j]);
238  if (label == "HLTL1TSeed")
239  rundata->posL1s[i] = j;
240  else if (label == "HLTPrescaler")
241  rundata->posPre[i] = j;
242  }
243  }
244  }
245 
246  // write the per-run .jsd file
247  rundata->jsdFileName = fmt::sprintf("run%06d_ls0000_streamHLTRates_pid%05d.jsd", run.run(), getpid());
248  writeJsdFile(*rundata);
249 
250  // write the per-run .ini file
251  //iniFileName = fmt::sprintf("run%06d_ls0000_streamHLTRates_pid%05d.ini", run.run(), getpid());
252  writeIniFile(*rundata, run.run());
253 
254  return rundata;
255 }
256 
257 // called after all Streams have finished processing a given Run (i.e. streamEndRun for all Streams have completed)
259 
260 // called for each Event
262  auto& stream = *streamCache(sid);
263  auto const& rundata = *runCache(event.getRun().index());
264 
265  ++stream.processed;
266 
267  // check that the HLTConfigProvider for the current run has been successfully initialised
268  if (not rundata.hltConfig.inited())
269  return;
270 
271  // get hold of TriggerResults
273  if (not event.getByToken(triggerResultsToken_, handle) or not handle.isValid()) {
274  edm::LogError("HLTriggerJSONMonitoring")
275  << "TriggerResults with label [" + triggerResults_.encode() + "] not present or invalid";
276  return;
277  }
279  assert(results.size() == rundata.hltConfig.triggerNames().size());
280 
281  // check the results for each HLT path
282  for (auto idx = 0u; idx < rundata.indicesOfTriggerPaths.size(); ++idx) {
283  auto const triggerPathIdx = rundata.indicesOfTriggerPaths[idx];
284  auto const& status = results[triggerPathIdx];
285  if (status.wasrun()) {
286  ++stream.hltWasRun[idx];
287  if (status.accept()) {
288  ++stream.hltL1s[idx];
289  ++stream.hltPre[idx];
290  ++stream.hltAccept[idx];
291  } else {
292  int const index = (int)status.index();
293  if (index > rundata.posL1s[idx])
294  ++stream.hltL1s[idx];
295  if (index > rundata.posPre[idx])
296  ++stream.hltPre[idx];
297  if (status.error())
298  ++stream.hltErrors[idx];
299  else
300  ++stream.hltReject[idx];
301  }
302  }
303  }
304 
305  // check the decision for each dataset
306  // FIXME this ignores the prescales, "smart" prescales, and event selection applied in the OutputModule itself
307  for (auto i = 0u; i < rundata.datasets.size(); ++i)
308  if (std::any_of(rundata.datasets[i].begin(), rundata.datasets[i].end(), [&](unsigned int path) {
309  return results.accept(path);
310  }))
311  ++stream.datasets[i];
312 }
313 
314 // called each time the Source sees a new LuminosityBlock
315 std::shared_ptr<HLTriggerJSONMonitoringData::lumisection> HLTriggerJSONMonitoring::globalBeginLuminosityBlockSummary(
316  edm::LuminosityBlock const& lumi, edm::EventSetup const&) const {
317  unsigned int triggers = 0;
318  unsigned int datasets = 0;
319  auto const& rundata = *runCache(lumi.getRun().index());
320  if (rundata.hltConfig.inited()) {
321  triggers = rundata.indicesOfTriggerPaths.size();
322  datasets = rundata.hltConfig.datasetNames().size();
323  };
324 
325  // the API of jsoncollector::HistoJ does not really match our use case,
326  // but it is the only vector-like object available in JsonMonitorable.h
327  auto lumidata = std::make_shared<HLTriggerJSONMonitoringData::lumisection>(HLTriggerJSONMonitoringData::lumisection{
328  jsoncollector::HistoJ<unsigned int>(1), // processed
329  jsoncollector::HistoJ<unsigned int>(triggers), // hltWasRun
330  jsoncollector::HistoJ<unsigned int>(triggers), // hltL1s
331  jsoncollector::HistoJ<unsigned int>(triggers), // hltPre
332  jsoncollector::HistoJ<unsigned int>(triggers), // hltAccept
333  jsoncollector::HistoJ<unsigned int>(triggers), // hltReject
334  jsoncollector::HistoJ<unsigned int>(triggers), // hltErrors
336  });
337  // repeated calls to `update` necessary to set the internal element counter
338  lumidata->processed.update(0);
339  for (unsigned int i = 0; i < triggers; ++i)
340  lumidata->hltWasRun.update(0);
341  for (unsigned int i = 0; i < triggers; ++i)
342  lumidata->hltL1s.update(0);
343  for (unsigned int i = 0; i < triggers; ++i)
344  lumidata->hltPre.update(0);
345  for (unsigned int i = 0; i < triggers; ++i)
346  lumidata->hltAccept.update(0);
347  for (unsigned int i = 0; i < triggers; ++i)
348  lumidata->hltReject.update(0);
349  for (unsigned int i = 0; i < triggers; ++i)
350  lumidata->hltErrors.update(0);
351  for (unsigned int i = 0; i < datasets; ++i)
352  lumidata->datasets.update(0);
353 
354  return lumidata;
355 }
356 
357 // called when the Stream is switching from one LuminosityBlock to a new LuminosityBlock.
359  edm::LuminosityBlock const& lumi,
360  edm::EventSetup const&) const {
361  auto& stream = *streamCache(sid);
362 
363  unsigned int triggers = 0;
364  unsigned int datasets = 0;
365  auto const& rundata = *runCache(lumi.getRun().index());
366  if (rundata.hltConfig.inited()) {
367  triggers = rundata.indicesOfTriggerPaths.size();
368  datasets = rundata.hltConfig.datasetNames().size();
369  };
370 
371  // reset the stream counters
372  stream.processed = 0;
373  stream.hltWasRun.assign(triggers, 0);
374  stream.hltL1s.assign(triggers, 0);
375  stream.hltPre.assign(triggers, 0);
376  stream.hltAccept.assign(triggers, 0);
377  stream.hltReject.assign(triggers, 0);
378  stream.hltErrors.assign(triggers, 0);
379  stream.datasets.assign(datasets, 0);
380 }
381 
382 // called when a Stream has finished processing a LuminosityBlock, after streamEndLuminosityBlock
384  edm::LuminosityBlock const& lumi,
385  edm::EventSetup const&,
387  auto const& stream = *streamCache(sid);
388  auto const& rundata = *runCache(lumi.getRun().index());
389  lumidata->processed.value()[0] += stream.processed;
390 
391  // check that the HLTConfigProvider for the current run has been successfully initialised
392  if (not rundata.hltConfig.inited())
393  return;
394 
395  auto const triggers = rundata.indicesOfTriggerPaths.size();
396  for (auto i = 0u; i < triggers; ++i) {
397  lumidata->hltWasRun.value()[i] += stream.hltWasRun[i];
398  lumidata->hltL1s.value()[i] += stream.hltL1s[i];
399  lumidata->hltPre.value()[i] += stream.hltPre[i];
400  lumidata->hltAccept.value()[i] += stream.hltAccept[i];
401  lumidata->hltReject.value()[i] += stream.hltReject[i];
402  lumidata->hltErrors.value()[i] += stream.hltErrors[i];
403  }
404  auto const datasets = rundata.hltConfig.datasetNames().size();
405  for (auto i = 0u; i < datasets; ++i)
406  lumidata->datasets.value()[i] += stream.datasets[i];
407 }
408 
409 // called after the streamEndLuminosityBlockSummary method for all Streams have finished processing a given LuminosityBlock
411  edm::EventSetup const&,
413  unsigned int ls = lumi.luminosityBlock();
414  unsigned int run = lumi.run();
415 
416  bool writeFiles = true;
417  if (edm::Service<evf::MicroStateService>().isAvailable()) {
420  if (fms)
421  writeFiles = fms->shouldWriteFiles(ls);
422  }
423  if (not writeFiles)
424  return;
425 
426  unsigned int processed = lumidata->processed.value().at(0);
427  auto const& rundata = *runCache(lumi.getRun().index());
429 
430  // [SIC]
431  char hostname[33];
432  gethostname(hostname, 32);
433  std::string sourceHost(hostname);
434 
435  // [SIC]
436  std::stringstream sOutDef;
437  sOutDef << rundata.baseRunDir << "/"
438  << "output_" << getpid() << ".jsd";
439 
440  std::string jsndataFileList = "";
441  unsigned int jsndataSize = 0;
442  unsigned int jsndataAdler32 = 1; // adler32 checksum for an empty file
443 
444  if (processed) {
445  // write the .jsndata files which contain the actual rates
446  Json::Value jsndata;
447  jsndata[jsoncollector::DataPoint::SOURCE] = sourceHost;
448  jsndata[jsoncollector::DataPoint::DEFINITION] = rundata.jsdFileName;
457 
458  auto jsndataFileName = fmt::sprintf("run%06d_ls%04d_streamHLTRates_pid%05d.jsndata", run, ls, getpid());
459 
460  std::string result = writer.write(jsndata);
461  std::ofstream jsndataFile(rundata.baseRunDir + "/" + jsndataFileName);
462  jsndataFile << result;
463  jsndataFile.close();
464 
465  jsndataFileList = jsndataFileName;
466  jsndataSize = result.size();
467  jsndataAdler32 = cms::Adler32(result.c_str(), result.size());
468  }
469 
470  // create a metadata json file for the "HLT rates" pseudo-stream
471  unsigned int jsnProcessed = processed;
472  unsigned int jsnAccepted = processed;
473  unsigned int jsnErrorEvents = 0;
474  unsigned int jsnRetCodeMask = 0;
475  std::string jsnInputFiles = "";
476  unsigned int jsnHLTErrorEvents = 0;
477 
478  Json::Value jsn;
479  jsn[jsoncollector::DataPoint::SOURCE] = sourceHost;
480  jsn[jsoncollector::DataPoint::DEFINITION] = sOutDef.str();
481  jsn[jsoncollector::DataPoint::DATA].append(jsnProcessed);
482  jsn[jsoncollector::DataPoint::DATA].append(jsnAccepted);
483  jsn[jsoncollector::DataPoint::DATA].append(jsnErrorEvents);
484  jsn[jsoncollector::DataPoint::DATA].append(jsnRetCodeMask);
485  jsn[jsoncollector::DataPoint::DATA].append(jsndataFileList);
486  jsn[jsoncollector::DataPoint::DATA].append(jsndataSize);
487  jsn[jsoncollector::DataPoint::DATA].append(jsnInputFiles);
488  jsn[jsoncollector::DataPoint::DATA].append(jsndataAdler32);
489  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamDestination);
490  jsn[jsoncollector::DataPoint::DATA].append(rundata.streamMergeType);
491  jsn[jsoncollector::DataPoint::DATA].append(jsnHLTErrorEvents);
492 
493  auto jsnFileName = fmt::sprintf("run%06d_ls%04d_streamHLTRates_pid%05d.jsn", run, ls, getpid());
494  std::ofstream jsnFile(rundata.baseRunDir + "/" + jsnFileName);
495  jsnFile << writer.write(jsn);
496  jsnFile.close();
497 }
498 
500  std::ofstream file(rundata.baseRunDir + "/" + rundata.jsdFileName);
501  file << R"""({
502  "data" : [
503  { "name" : "Processed", "type" : "integer", "operation" : "histo"},
504  { "name" : "Path-WasRun", "type" : "integer", "operation" : "histo"},
505  { "name" : "Path-AfterL1Seed", "type" : "integer", "operation" : "histo"},
506  { "name" : "Path-AfterPrescale", "type" : "integer", "operation" : "histo"},
507  { "name" : "Path-Accepted", "type" : "integer", "operation" : "histo"},
508  { "name" : "Path-Rejected", "type" : "integer", "operation" : "histo"},
509  { "name" : "Path-Errors", "type" : "integer", "operation" : "histo"},
510  { "name" : "Dataset-Accepted", "type" : "integer", "operation" : "histo"}
511  ]
512 }
513 )""";
514  file.close();
515 }
516 
519 
521  for (auto idx : rundata.indicesOfTriggerPaths)
522  triggerNames.append(rundata.hltConfig.triggerNames()[idx]);
523  content["Path-Names"] = triggerNames;
524 
526  for (auto const& name : rundata.hltConfig.datasetNames())
527  datasetNames.append(name);
528  content["Dataset-Names"] = datasetNames;
529 
530  std::string iniFileName = fmt::sprintf("run%06d_ls0000_streamHLTRates_pid%05d.ini", run, getpid());
531  std::ofstream file(rundata.baseRunDir + "/" + iniFileName);
533  file << writer.write(content);
534  file.close();
535 }
536 
537 // declare as a framework plugin
static constexpr const char * streamName_
void globalEndRun(edm::Run const &, edm::EventSetup const &) const override
static constexpr const char * datasetPathNamePrefix_
static const std::string SOURCE
Definition: DataPoint.h:116
std::string encode() const
Definition: InputTag.cc:159
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
~HLTriggerJSONMonitoring() override=default
std::vector< std::vector< unsigned int > > datasets
HLTriggerJSONMonitoring(const edm::ParameterSet &)
void streamBeginLuminosityBlock(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &) const override
static void writeIniFile(HLTriggerJSONMonitoringData::run const &, unsigned int)
Value & append(const Value &value)
Append value to array at the end.
Definition: config.py:1
jsoncollector::HistoJ< unsigned int > hltReject
Represents a JSON value.
Definition: value.h:99
Log< level::Error, false > LogError
uint32_t T const *__restrict__ uint32_t const *__restrict__ int32_t int Histo::index_type cudaStream_t stream
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
assert(be >=bs)
const edm::EDGetTokenT< edm::TriggerResults > triggerResultsToken_
jsoncollector::HistoJ< unsigned int > hltErrors
std::vector< T > & value()
static const std::string DATA
Definition: DataPoint.h:118
char const * label
void analyze(edm::StreamID, edm::Event const &, edm::EventSetup const &) const override
jsoncollector::HistoJ< unsigned int > hltPre
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
std::unique_ptr< HLTriggerJSONMonitoringData::stream > beginStream(edm::StreamID) const override
std::shared_ptr< HLTriggerJSONMonitoringData::lumisection > globalBeginLuminosityBlockSummary(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
virtual Json::Value toJsonValue() const
static void writeJsdFile(HLTriggerJSONMonitoringData::run const &)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
jsoncollector::HistoJ< unsigned int > hltWasRun
const std::vector< std::string > & triggerNames() const
names of trigger paths
void streamEndLuminosityBlockSummary(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &, HLTriggerJSONMonitoringData::lumisection *) const override
jsoncollector::HistoJ< unsigned int > hltL1s
HLT enums.
const edm::InputTag triggerResults_
void globalEndLuminosityBlockSummary(edm::LuminosityBlock const &, edm::EventSetup const &, HLTriggerJSONMonitoringData::lumisection *) const override
bool isAvailable() const
Definition: Service.h:40
jsoncollector::HistoJ< unsigned int > processed
std::string const & process() const
Definition: InputTag.h:40
const std::vector< std::string > & datasetNames() const
Writes a Value in JSON format in a human friendly way.
Definition: writer.h:63
bool shouldWriteFiles(unsigned int lumi, unsigned int *proc=nullptr)
static const std::string DEFINITION
Definition: DataPoint.h:117
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
jsoncollector::HistoJ< unsigned int > datasets
std::vector< unsigned int > indicesOfTriggerPaths
std::shared_ptr< HLTriggerJSONMonitoringData::run > globalBeginRun(edm::Run const &, edm::EventSetup const &) const override
Definition: event.py:1
Definition: Run.h:45
jsoncollector::HistoJ< unsigned int > hltAccept
array value (ordered list)
Definition: value.h:30