CMS 3D CMS Logo

DQMRootOutputModule.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: FwkIO
4 // Class : DQMRootOutputModule
5 //
6 // Implementation:
7 // [Notes on implementation]
8 //
9 // Original Author: Chris Jones
10 // Created: Fri Apr 29 13:26:29 CDT 2011
11 //
12 
13 // system include files
14 #include <algorithm>
15 #include <iostream>
16 #include <memory>
17 
18 #include <map>
19 #include <memory>
20 #include <string>
21 #include <vector>
22 
23 #include "TFile.h"
24 #include "TTree.h"
25 #include "TString.h"
26 #include "TH1.h"
27 #include "TH2.h"
28 #include "TProfile.h"
29 
30 #include "oneapi/tbb/task_arena.h"
31 
32 // user include files
45 
50 
52 
53 #include "format.h"
54 
55 namespace {
58 
59  class TreeHelperBase {
60  public:
61  TreeHelperBase() : m_wasFilled(false), m_firstIndex(0), m_lastIndex(0) {}
62  virtual ~TreeHelperBase() {}
63  void fill(MonitorElement* iElement) {
64  doFill(iElement);
65  if (m_wasFilled) {
66  ++m_lastIndex;
67  }
68  m_wasFilled = true;
69  }
70  bool wasFilled() const { return m_wasFilled; }
71  void getRangeAndReset(ULong64_t& iFirstIndex, ULong64_t& iLastIndex) {
72  iFirstIndex = m_firstIndex;
73  iLastIndex = m_lastIndex;
74  m_wasFilled = false;
75  m_firstIndex = m_lastIndex + 1;
76  m_lastIndex = m_firstIndex;
77  }
78 
79  private:
80  virtual void doFill(MonitorElement*) = 0;
81  bool m_wasFilled;
82  ULong64_t m_firstIndex;
83  ULong64_t m_lastIndex;
84  };
85 
86  template <class T>
87  class TreeHelper : public TreeHelperBase {
88  public:
89  TreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
90  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
91  setup();
92  }
93  void doFill(MonitorElement* iElement) override {
94  *m_fullNameBufferPtr = iElement->getFullname();
95  m_flagBuffer = 0;
96  m_bufferPtr = dynamic_cast<T*>(iElement->getRootObject());
97  assert(nullptr != m_bufferPtr);
98  //std::cout <<"#entries: "<<m_bufferPtr->GetEntries()<<std::endl;
99  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
100  }
101 
102  private:
103  void setup() {
104  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
105  m_tree->Branch(kFlagBranch, &m_flagBuffer);
106 
107  m_bufferPtr = nullptr;
108  m_tree->Branch(kValueBranch, &m_bufferPtr, 128 * 1024, 0);
109  }
110  TTree* m_tree;
111  uint32_t m_flagBuffer;
112  std::string* m_fullNameBufferPtr;
113  T* m_bufferPtr;
114  };
115 
116  class IntTreeHelper : public TreeHelperBase {
117  public:
118  IntTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
119  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
120  setup();
121  }
122 
123  void doFill(MonitorElement* iElement) override {
124  *m_fullNameBufferPtr = iElement->getFullname();
125  m_flagBuffer = 0;
126  m_buffer = iElement->getIntValue();
127  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
128  }
129 
130  private:
131  void setup() {
132  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
133  m_tree->Branch(kFlagBranch, &m_flagBuffer);
134  m_tree->Branch(kValueBranch, &m_buffer);
135  }
136  TTree* m_tree;
137  uint32_t m_flagBuffer;
138  std::string* m_fullNameBufferPtr;
139  Long64_t m_buffer;
140  };
141 
142  class FloatTreeHelper : public TreeHelperBase {
143  public:
144  FloatTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
145  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
146  setup();
147  }
148  void doFill(MonitorElement* iElement) override {
149  *m_fullNameBufferPtr = iElement->getFullname();
150  m_flagBuffer = 0;
151  m_buffer = iElement->getFloatValue();
152  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
153  }
154 
155  private:
156  void setup() {
157  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
158  m_tree->Branch(kFlagBranch, &m_flagBuffer);
159  m_tree->Branch(kValueBranch, &m_buffer);
160  }
161 
162  TTree* m_tree;
163  uint32_t m_flagBuffer;
164  std::string* m_fullNameBufferPtr;
165  double m_buffer;
166  };
167 
168  class StringTreeHelper : public TreeHelperBase {
169  public:
170  StringTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
171  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr), m_bufferPtr(&m_buffer) {
172  setup();
173  }
174  void doFill(MonitorElement* iElement) override {
175  *m_fullNameBufferPtr = iElement->getFullname();
176  m_flagBuffer = 0;
177  m_buffer = iElement->getStringValue();
178  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
179  }
180 
181  private:
182  void setup() {
183  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
184  m_tree->Branch(kFlagBranch, &m_flagBuffer);
185  m_tree->Branch(kValueBranch, &m_bufferPtr);
186  }
187 
188  TTree* m_tree;
189  uint32_t m_flagBuffer;
190  std::string* m_fullNameBufferPtr;
191  std::string m_buffer;
192  std::string* m_bufferPtr;
193  };
194 
195 } // namespace
196 
197 namespace edm {
198  class ModuleCallingContext;
199 }
200 
202 public:
203  explicit DQMRootOutputModule(edm::ParameterSet const& pset);
204  void beginJob() override;
205  ~DQMRootOutputModule() override;
206  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
207 
208 private:
209  void write(edm::EventForOutput const& e) override;
211  void writeRun(edm::RunForOutput const&) override;
212  bool isFileOpen() const override;
213  void openFile(edm::FileBlock const&) override;
214  void reallyCloseFile() override;
215 
216  void startEndFile();
217  void finishEndFile();
220  std::unique_ptr<TFile> m_file;
221  std::vector<std::shared_ptr<TreeHelperBase> > m_treeHelpers;
222 
223  unsigned int m_run;
224  unsigned int m_lumi;
225  unsigned int m_type;
226  unsigned int m_presentHistoryIndex;
227  ULong64_t m_beginTime;
228  ULong64_t m_endTime;
229  ULong64_t m_firstIndex;
230  ULong64_t m_lastIndex;
231  unsigned int m_filterOnRun;
232 
235  std::map<unsigned int, unsigned int> m_dqmKindToTypeIndex;
237 
238  std::vector<edm::ProcessHistoryID> m_seenHistories;
241 
244 };
245 
246 //
247 // constants, enums and typedefs
248 //
249 
250 static TreeHelperBase* makeHelper(unsigned int iTypeIndex, TTree* iTree, std::string* iFullNameBufferPtr) {
251  switch (iTypeIndex) {
252  case kIntIndex:
253  return new IntTreeHelper(iTree, iFullNameBufferPtr);
254  case kFloatIndex:
255  return new FloatTreeHelper(iTree, iFullNameBufferPtr);
256  case kStringIndex:
257  return new StringTreeHelper(iTree, iFullNameBufferPtr);
258  case kTH1FIndex:
259  return new TreeHelper<TH1F>(iTree, iFullNameBufferPtr);
260  case kTH1SIndex:
261  return new TreeHelper<TH1S>(iTree, iFullNameBufferPtr);
262  case kTH1DIndex:
263  return new TreeHelper<TH1D>(iTree, iFullNameBufferPtr);
264  case kTH1IIndex:
265  return new TreeHelper<TH1I>(iTree, iFullNameBufferPtr);
266  case kTH2FIndex:
267  return new TreeHelper<TH2F>(iTree, iFullNameBufferPtr);
268  case kTH2SIndex:
269  return new TreeHelper<TH2S>(iTree, iFullNameBufferPtr);
270  case kTH2DIndex:
271  return new TreeHelper<TH2D>(iTree, iFullNameBufferPtr);
272  case kTH2IIndex:
273  return new TreeHelper<TH2I>(iTree, iFullNameBufferPtr);
274  case kTH3FIndex:
275  return new TreeHelper<TH3F>(iTree, iFullNameBufferPtr);
276  case kTProfileIndex:
277  return new TreeHelper<TProfile>(iTree, iFullNameBufferPtr);
278  case kTProfile2DIndex:
279  return new TreeHelper<TProfile2D>(iTree, iFullNameBufferPtr);
280  }
281  assert(false);
282  return nullptr;
283 }
284 
285 //
286 // static data member definitions
287 //
288 
289 //
290 // constructors and destructor
291 //
294  edm::one::OutputModule<>(pset),
295  m_fileName(pset.getUntrackedParameter<std::string>("fileName")),
296  m_logicalFileName(pset.getUntrackedParameter<std::string>("logicalFileName")),
297  m_file(nullptr),
298  m_treeHelpers(kNIndicies, std::shared_ptr<TreeHelperBase>()),
299  m_presentHistoryIndex(0),
300  m_filterOnRun(pset.getUntrackedParameter<unsigned int>("filterOnRun")),
301  m_fullNameBufferPtr(&m_fullNameBuffer),
302  m_indicesTree(nullptr),
303  m_getterOfProductsLumi(edm::TypeMatch(), this, edm::InLumi),
304  m_getterOfProductsRun(edm::TypeMatch(), this, edm::InRun) {
305  // Declare dependencies for all Lumi and Run tokens here. In
306  // principle could use the keep statements, but then DQMToken would
307  // have to be made persistent (transient products are ignored),
308  // which would lead to a need to (finally) remove underscores from
309  // DQM module labels.
310  // This is needed to support unscheduled DQM modules now that
311  // non-consumed EDProducers are deleted from the job at beginJob.
315  });
316 }
317 
318 // DQMRootOutputModule::DQMRootOutputModule(const DQMRootOutputModule& rhs)
319 // {
320 // // do actual copying here;
321 // }
322 
324 
326 
327 //
328 // assignment operators
329 //
330 // const DQMRootOutputModule& DQMRootOutputModule::operator=(const DQMRootOutputModule& rhs)
331 // {
332 // //An exception safe implementation is
333 // DQMRootOutputModule temp(rhs);
334 // swap(rhs);
335 //
336 // return *this;
337 // }
338 
339 //
340 // member functions
341 //
342 bool DQMRootOutputModule::isFileOpen() const { return nullptr != m_file.get(); }
343 
345  //NOTE: I need to also set the I/O performance settings
346 
347  m_file = std::make_unique<TFile>(m_fileName.c_str(),
348  "RECREATE",
349  "1" //This is the file format version number
350  );
351 
353  cms::Digest branchHash;
355  std::transform(guid.begin(), guid.end(), guid.begin(), (int (*)(int))std::toupper);
356 
357  m_file->WriteObject(&guid, kCmsGuid);
358  m_jrToken = jr->outputFileOpened(m_fileName,
360  std::string(),
361  "DQMRootOutputModule",
363  guid,
364  std::string(),
365  branchHash.digest().toString(),
366  std::vector<std::string>());
367 
369  m_indicesTree->Branch(kRunBranch, &m_run);
370  m_indicesTree->Branch(kLumiBranch, &m_lumi);
374  m_indicesTree->Branch(kTypeBranch, &m_type);
377  m_indicesTree->SetDirectory(m_file.get());
378 
379  unsigned int i = 0;
380  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
381  it != itEnd;
382  ++it, ++i) {
383  //std::cout <<"making "<<kTypeNames[i]<<std::endl;
384  TTree* tree = new TTree(kTypeNames[i], kTypeNames[i]);
385  *it = std::shared_ptr<TreeHelperBase>(makeHelper(i, tree, m_fullNameBufferPtr));
386  tree->SetDirectory(m_file.get()); //TFile takes ownership
387  }
388 
403 }
404 
406 
408  //std::cout << "DQMRootOutputModule::writeLuminosityBlock"<< std::endl;
409  edm::Service<DQMStore> dstore;
410  m_run = iLumi.id().run();
411  m_lumi = iLumi.id().value();
412  m_beginTime = iLumi.beginTime().value();
413  m_endTime = iLumi.endTime().value();
414  bool shouldWrite = (m_filterOnRun == 0 || (m_filterOnRun != 0 && m_filterOnRun == m_run));
415 
416  if (!shouldWrite)
417  return;
418  std::vector<MonitorElement*> items(dstore->getAllContents("", m_run, m_lumi));
419  for (std::vector<MonitorElement*>::iterator it = items.begin(), itEnd = items.end(); it != itEnd; ++it) {
420  assert((*it)->getScope() == MonitorElementData::Scope::LUMI);
421  std::map<unsigned int, unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((int)(*it)->kind());
422  assert(itFound != m_dqmKindToTypeIndex.end());
423  m_treeHelpers[itFound->second]->fill(*it);
424  }
425 
426  const edm::ProcessHistoryID& id = iLumi.processHistoryID();
427  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(), m_seenHistories.end(), id);
428  if (itFind == m_seenHistories.end()) {
431  m_seenHistories.push_back(id);
432  } else {
433  m_presentHistoryIndex = itFind - m_seenHistories.begin();
434  }
435 
436  //Now store the relationship between run/lumi and indices in the other TTrees
437  bool storedLumiIndex = false;
438  unsigned int typeIndex = 0;
439  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
440  it != itEnd;
441  ++it, ++typeIndex) {
442  if ((*it)->wasFilled()) {
443  m_type = typeIndex;
444  (*it)->getRangeAndReset(m_firstIndex, m_lastIndex);
445  storedLumiIndex = true;
446  tbb::this_task_arena::isolate([&] { m_indicesTree->Fill(); });
447  }
448  }
449  if (not storedLumiIndex) {
450  //need to record lumis even if we stored no MonitorElements since some later DQM modules
451  // look to see what lumis were processed
453  m_firstIndex = 0;
454  m_lastIndex = 0;
455  tbb::this_task_arena::isolate([&] { m_indicesTree->Fill(); });
456  }
457 
460 }
461 
463  //std::cout << "DQMRootOutputModule::writeRun"<< std::endl;
464  edm::Service<DQMStore> dstore;
465  m_run = iRun.id().run();
466  m_lumi = 0;
467  m_beginTime = iRun.beginTime().value();
468  m_endTime = iRun.endTime().value();
469  bool shouldWrite = (m_filterOnRun == 0 || (m_filterOnRun != 0 && m_filterOnRun == m_run));
470 
471  if (!shouldWrite)
472  return;
473 
474  std::vector<MonitorElement*> items(dstore->getAllContents("", m_run, 0));
475  for (std::vector<MonitorElement*>::iterator it = items.begin(), itEnd = items.end(); it != itEnd; ++it) {
476  assert((*it)->getScope() == MonitorElementData::Scope::RUN);
477  std::map<unsigned int, unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((int)(*it)->kind());
478  assert(itFound != m_dqmKindToTypeIndex.end());
479  m_treeHelpers[itFound->second]->fill(*it);
480  }
481 
482  const edm::ProcessHistoryID& id = iRun.processHistoryID();
483  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(), m_seenHistories.end(), id);
484  if (itFind == m_seenHistories.end()) {
487  m_seenHistories.push_back(id);
488  } else {
489  m_presentHistoryIndex = itFind - m_seenHistories.begin();
490  }
491 
492  //Now store the relationship between run/lumi and indices in the other TTrees
493  unsigned int typeIndex = 0;
494  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
495  it != itEnd;
496  ++it, ++typeIndex) {
497  if ((*it)->wasFilled()) {
498  m_type = typeIndex;
499  (*it)->getRangeAndReset(m_firstIndex, m_lastIndex);
500  tbb::this_task_arena::isolate([&] { m_indicesTree->Fill(); });
501  }
502  }
503 
506 }
507 
509  startEndFile();
510  finishEndFile();
511 }
512 
514  //std::cout << "DQMRootOutputModule::startEndFile"<< std::endl;
515  //fill in the meta data
516  m_file->cd();
517  TDirectory* metaDataDirectory = m_file->mkdir(kMetaDataDirectory);
518 
519  //Write out the Process History
520  TTree* processHistoryTree = new TTree(kProcessHistoryTree, kProcessHistoryTree);
521  processHistoryTree->SetDirectory(metaDataDirectory);
522 
523  unsigned int index = 0;
524  processHistoryTree->Branch(kPHIndexBranch, &index);
526  processHistoryTree->Branch(kProcessConfigurationProcessNameBranch, &processName);
527  std::string parameterSetID;
528  processHistoryTree->Branch(kProcessConfigurationParameterSetIDBranch, &parameterSetID);
529  std::string releaseVersion;
530  processHistoryTree->Branch(kProcessConfigurationReleaseVersion, &releaseVersion);
531  std::string passID;
532  processHistoryTree->Branch(kProcessConfigurationPassID, &passID);
533 
534  for (std::vector<edm::ProcessHistoryID>::iterator it = m_seenHistories.begin(), itEnd = m_seenHistories.end();
535  it != itEnd;
536  ++it) {
538  assert(nullptr != history);
539  index = 0;
540  for (edm::ProcessHistory::collection_type::const_iterator itPC = history->begin(), itPCEnd = history->end();
541  itPC != itPCEnd;
542  ++itPC, ++index) {
543  processName = itPC->processName();
544  releaseVersion = itPC->releaseVersion();
545  passID = itPC->passID();
546  parameterSetID = itPC->parameterSetID().compactForm();
547  tbb::this_task_arena::isolate([&] { processHistoryTree->Fill(); });
548  }
549  }
550 
551  //Store the ParameterSets
552  TTree* parameterSetsTree = new TTree(kParameterSetTree, kParameterSetTree);
553  parameterSetsTree->SetDirectory(metaDataDirectory);
554  std::string blob;
555  parameterSetsTree->Branch(kParameterSetBranch, &blob);
556 
558  assert(nullptr != psr);
559  for (edm::pset::Registry::const_iterator it = psr->begin(), itEnd = psr->end(); it != itEnd; ++it) {
560  blob.clear();
561  it->second.toString(blob);
562  tbb::this_task_arena::isolate([&] { parameterSetsTree->Fill(); });
563  }
564 }
565 
567  //std::cout << "DQMRootOutputModule::finishEndFile"<< std::endl;
568  m_file->Write();
569  m_file->Close();
572 }
573 
574 //
575 // const member functions
576 //
577 
578 //
579 // static member functions
580 //
583 
584  desc.addUntracked<std::string>("fileName");
585  desc.addUntracked<std::string>("logicalFileName", "");
586  desc.addUntracked<unsigned int>("filterOnRun", 0)
587  ->setComment("Only write the run with this run number. 0 means write all runs.");
588  desc.addOptionalUntracked<int>("splitLevel", 99)
589  ->setComment("UNUSED Only here to allow older configurations written for PoolOutputModule to work.");
590  const std::vector<std::string> keep = {"drop *", "keep DQMToken_*_*_*"};
592 
594  dataSet.setAllowAnything();
595  desc.addUntracked<edm::ParameterSetDescription>("dataset", dataSet)
596  ->setComment("PSet is only used by Data Operations and not by this module.");
597 
598  descriptions.addDefault(desc);
599 }
600 
void reallyCloseFile() override
static const char *const kProcessHistoryTree
Definition: format.h:79
static const char *const kRunBranch
Definition: format.h:63
void callWhenNewProductsRegistered(std::function< void(BranchDescription const &)> const &func)
map_type::const_iterator const_iterator
Definition: Registry.h:61
edm::GetterOfProducts< DQMToken > m_getterOfProductsRun
static const char *const kTypeNames[]
Definition: format.h:41
void writeLuminosityBlock(edm::LuminosityBlockForOutput const &) override
void write(edm::EventForOutput const &e) override
Timestamp const & beginTime() const
Definition: RunForOutput.h:57
static const char *const kIndicesTree
Definition: format.h:62
unsigned int m_presentHistoryIndex
bool registerProcessHistory(ProcessHistory const &processHistory)
static TreeHelperBase * makeHelper(unsigned int iTypeIndex, TTree *iTree, std::string *iFullNameBufferPtr)
edm::ProcessHistoryRegistry m_processHistoryRegistry
static const char *const kFirstIndex
Definition: format.h:69
static const char *const kLumiBranch
Definition: format.h:64
static const char *const kFullNameBranch
Definition: format.h:57
void reportRunNumber(JobReport::Token token, unsigned int run)
Definition: JobReport.cc:505
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_iterator end() const
ModuleDescription const & description() const
const_iterator end() const
Definition: Registry.h:65
dqm::reco::DQMStore DQMStore
static const char *const kPHIndexBranch
Definition: format.h:80
static const char *const kParameterSetBranch
Definition: format.h:87
bool isFileOpen() const override
std::map< unsigned int, unsigned int > m_dqmKindToTypeIndex
void addDefault(ParameterSetDescription const &psetDescription)
MD5Result digest()
Definition: Digest.cc:171
virtual double getFloatValue() const
static const char *const kMetaDataDirectory
Definition: format.h:77
virtual std::vector< dqm::harvesting::MonitorElement * > getAllContents(std::string const &path) const
Definition: DQMStore.cc:641
static const char *const kParameterSetTree
Definition: format.h:86
static const char *const kFlagBranch
Definition: format.h:58
static const char *const kTypeBranch
Definition: format.h:68
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< std::shared_ptr< TreeHelperBase > > m_treeHelpers
static const char *const kProcessHistoryIndexBranch
Definition: format.h:65
static const char *const kEndTimeBranch
Definition: format.h:67
std::unique_ptr< TFile > m_file
RunNumber_t run() const
std::size_t Token
Definition: JobReport.h:106
ProcessHistoryID const & processHistoryID() const
DQMRootOutputModule(edm::ParameterSet const &pset)
static const char *const kProcessConfigurationPassID
Definition: format.h:84
doFill
Definition: cuy.py:575
std::string createGlobalIdentifier(bool binary=false)
std::string * m_fullNameBufferPtr
std::string getFullname() const
get full name of ME including Pathname
constexpr std::size_t typeIndex
void writeRun(edm::RunForOutput const &) override
TimeValue_t value() const
Definition: Timestamp.h:38
dqm::legacy::MonitorElement MonitorElement
static const char *const kCmsGuid
Definition: format.h:73
static const char *const kLastIndex
Definition: format.h:70
static const char *const kProcessConfigurationReleaseVersion
Definition: format.h:83
LuminosityBlockID const & id() const
Timestamp const & endTime() const
Definition: RunForOutput.h:58
bool getMapped(ProcessHistoryID const &key, ProcessHistory &value) const
virtual ProcessHistory const & processHistory() const
std::string const & processName() const
virtual const std::string & getStringValue() const
static const char *const kProcessConfigurationProcessNameBranch
Definition: format.h:81
RunID const & id() const
Definition: RunForOutput.h:55
Timestamp const & endTime() const
HLT enums.
Timestamp const & beginTime() const
static const char *const kBeginTimeBranch
Definition: format.h:66
void outputFileClosed(Token fileToken)
Definition: JobReport.cc:467
edm::JobReport::Token m_jrToken
void openFile(edm::FileBlock const &) override
TObject * getRootObject() const override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: tree.py:1
long double T
static void fillDescription(ParameterSetDescription &desc, std::vector< std::string > const &iDefaultOutputCommands=ProductSelectorRules::defaultSelectionStrings())
std::string toString() const
Definition: Digest.cc:95
const_iterator begin() const
Definition: Registry.h:63
static Registry * instance()
Definition: Registry.cc:12
RunNumber_t run() const
Definition: RunID.h:26
static const char *const kValueBranch
Definition: format.h:59
void reportLumiSection(JobReport::Token token, unsigned int run, unsigned int lumiSectId, unsigned long nEvents=0)
Definition: JobReport.cc:494
static const char *const kProcessConfigurationParameterSetIDBranch
Definition: format.h:82
edm::GetterOfProducts< DQMToken > m_getterOfProductsLumi
const_iterator begin() const
std::vector< edm::ProcessHistoryID > m_seenHistories
virtual int64_t getIntValue() const
unsigned transform(const HcalDetId &id, unsigned transformCode)