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 <string>
17 #include <map>
18 #include <memory>
19 #include <vector>
20 
21 #include <boost/filesystem.hpp>
22 #include "TFile.h"
23 #include "TTree.h"
24 #include "TString.h"
25 #include "TH1.h"
26 #include "TH2.h"
27 #include "TProfile.h"
28 
29 // user include files
40 
45 
46 #include "format.h"
47 
48 namespace {
51 
52  class TreeHelperBase {
53  public:
54  TreeHelperBase() : m_wasFilled(false), m_firstIndex(0), m_lastIndex(0) {}
55  virtual ~TreeHelperBase() {}
56  void fill(MonitorElement* iElement) {
57  doFill(iElement);
58  if (m_wasFilled) {
59  ++m_lastIndex;
60  }
61  m_wasFilled = true;
62  }
63  bool wasFilled() const { return m_wasFilled; }
64  void getRangeAndReset(ULong64_t& iFirstIndex, ULong64_t& iLastIndex) {
65  iFirstIndex = m_firstIndex;
66  iLastIndex = m_lastIndex;
67  m_wasFilled = false;
68  m_firstIndex = m_lastIndex + 1;
69  m_lastIndex = m_firstIndex;
70  }
71 
72  private:
73  virtual void doFill(MonitorElement*) = 0;
74  bool m_wasFilled;
75  ULong64_t m_firstIndex;
76  ULong64_t m_lastIndex;
77  };
78 
79  template <class T>
80  class TreeHelper : public TreeHelperBase {
81  public:
82  TreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
83  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
84  setup();
85  }
86  void doFill(MonitorElement* iElement) override {
87  *m_fullNameBufferPtr = iElement->getFullname();
88  m_flagBuffer = 0;
89  m_bufferPtr = dynamic_cast<T*>(iElement->getRootObject());
90  assert(nullptr != m_bufferPtr);
91  //std::cout <<"#entries: "<<m_bufferPtr->GetEntries()<<std::endl;
92  m_tree->Fill();
93  }
94 
95  private:
96  void setup() {
97  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
98  m_tree->Branch(kFlagBranch, &m_flagBuffer);
99 
100  m_bufferPtr = nullptr;
101  m_tree->Branch(kValueBranch, &m_bufferPtr, 128 * 1024, 0);
102  }
103  TTree* m_tree;
104  uint32_t m_flagBuffer;
105  std::string* m_fullNameBufferPtr;
106  T* m_bufferPtr;
107  };
108 
109  class IntTreeHelper : public TreeHelperBase {
110  public:
111  IntTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
112  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
113  setup();
114  }
115 
116  void doFill(MonitorElement* iElement) override {
117  *m_fullNameBufferPtr = iElement->getFullname();
118  m_flagBuffer = 0;
119  m_buffer = iElement->getIntValue();
120  m_tree->Fill();
121  }
122 
123  private:
124  void setup() {
125  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
126  m_tree->Branch(kFlagBranch, &m_flagBuffer);
127  m_tree->Branch(kValueBranch, &m_buffer);
128  }
129  TTree* m_tree;
130  uint32_t m_flagBuffer;
131  std::string* m_fullNameBufferPtr;
132  Long64_t m_buffer;
133  };
134 
135  class FloatTreeHelper : public TreeHelperBase {
136  public:
137  FloatTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
138  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
139  setup();
140  }
141  void doFill(MonitorElement* iElement) override {
142  *m_fullNameBufferPtr = iElement->getFullname();
143  m_flagBuffer = 0;
144  m_buffer = iElement->getFloatValue();
145  m_tree->Fill();
146  }
147 
148  private:
149  void setup() {
150  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
151  m_tree->Branch(kFlagBranch, &m_flagBuffer);
152  m_tree->Branch(kValueBranch, &m_buffer);
153  }
154 
155  TTree* m_tree;
156  uint32_t m_flagBuffer;
157  std::string* m_fullNameBufferPtr;
158  double m_buffer;
159  };
160 
161  class StringTreeHelper : public TreeHelperBase {
162  public:
163  StringTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
164  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr), m_bufferPtr(&m_buffer) {
165  setup();
166  }
167  void doFill(MonitorElement* iElement) override {
168  *m_fullNameBufferPtr = iElement->getFullname();
169  m_flagBuffer = 0;
170  m_buffer = iElement->getStringValue();
171  m_tree->Fill();
172  }
173 
174  private:
175  void setup() {
176  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
177  m_tree->Branch(kFlagBranch, &m_flagBuffer);
178  m_tree->Branch(kValueBranch, &m_bufferPtr);
179  }
180 
181  TTree* m_tree;
182  uint32_t m_flagBuffer;
183  std::string* m_fullNameBufferPtr;
184  std::string m_buffer;
185  std::string* m_bufferPtr;
186  };
187 
188 } // namespace
189 
190 namespace edm {
191  class ModuleCallingContext;
192 }
193 
195 public:
196  explicit DQMRootOutputModule(edm::ParameterSet const& pset);
197  void beginJob() override;
198  ~DQMRootOutputModule() override;
199  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
200 
201 private:
202  void write(edm::EventForOutput const& e) override;
203  void writeLuminosityBlock(edm::LuminosityBlockForOutput const&) override;
204  void writeRun(edm::RunForOutput const&) override;
205  bool isFileOpen() const override;
206  void openFile(edm::FileBlock const&) override;
207  void reallyCloseFile() override;
208 
209  void startEndFile();
210  void finishEndFile();
213  std::unique_ptr<TFile> m_file;
214  std::vector<std::shared_ptr<TreeHelperBase> > m_treeHelpers;
215 
216  unsigned int m_run;
217  unsigned int m_lumi;
218  unsigned int m_type;
219  unsigned int m_presentHistoryIndex;
220  ULong64_t m_beginTime;
221  ULong64_t m_endTime;
222  ULong64_t m_firstIndex;
223  ULong64_t m_lastIndex;
224  unsigned int m_filterOnRun;
226 
229  std::map<unsigned int, unsigned int> m_dqmKindToTypeIndex;
231 
232  std::vector<edm::ProcessHistoryID> m_seenHistories;
235 };
236 
237 //
238 // constants, enums and typedefs
239 //
240 
241 static TreeHelperBase* makeHelper(unsigned int iTypeIndex, TTree* iTree, std::string* iFullNameBufferPtr) {
242  switch (iTypeIndex) {
243  case kIntIndex:
244  return new IntTreeHelper(iTree, iFullNameBufferPtr);
245  case kFloatIndex:
246  return new FloatTreeHelper(iTree, iFullNameBufferPtr);
247  case kStringIndex:
248  return new StringTreeHelper(iTree, iFullNameBufferPtr);
249  case kTH1FIndex:
250  return new TreeHelper<TH1F>(iTree, iFullNameBufferPtr);
251  case kTH1SIndex:
252  return new TreeHelper<TH1S>(iTree, iFullNameBufferPtr);
253  case kTH1DIndex:
254  return new TreeHelper<TH1D>(iTree, iFullNameBufferPtr);
255  case kTH2FIndex:
256  return new TreeHelper<TH2F>(iTree, iFullNameBufferPtr);
257  case kTH2SIndex:
258  return new TreeHelper<TH2S>(iTree, iFullNameBufferPtr);
259  case kTH2DIndex:
260  return new TreeHelper<TH2D>(iTree, iFullNameBufferPtr);
261  case kTH3FIndex:
262  return new TreeHelper<TH3F>(iTree, iFullNameBufferPtr);
263  case kTProfileIndex:
264  return new TreeHelper<TProfile>(iTree, iFullNameBufferPtr);
265  case kTProfile2DIndex:
266  return new TreeHelper<TProfile2D>(iTree, iFullNameBufferPtr);
267  }
268  assert(false);
269  return nullptr;
270 }
271 
272 //
273 // static data member definitions
274 //
275 
276 //
277 // constructors and destructor
278 //
281  edm::one::OutputModule<>(pset),
282  m_fileName(pset.getUntrackedParameter<std::string>("fileName")),
283  m_logicalFileName(pset.getUntrackedParameter<std::string>("logicalFileName")),
284  m_file(nullptr),
285  m_treeHelpers(kNIndicies, std::shared_ptr<TreeHelperBase>()),
286  m_presentHistoryIndex(0),
287  m_filterOnRun(pset.getUntrackedParameter<unsigned int>("filterOnRun")),
288  m_enableMultiThread(false),
289  m_fullNameBufferPtr(&m_fullNameBuffer),
290  m_indicesTree(nullptr) {}
291 
292 // DQMRootOutputModule::DQMRootOutputModule(const DQMRootOutputModule& rhs)
293 // {
294 // // do actual copying here;
295 // }
296 
298  // Determine if we are running multithreading asking to the DQMStore. Not to be moved in the ctor
299  edm::Service<DQMStore> dstore;
300  m_enableMultiThread = dstore->enableMultiThread_;
301 }
302 
304 
305 //
306 // assignment operators
307 //
308 // const DQMRootOutputModule& DQMRootOutputModule::operator=(const DQMRootOutputModule& rhs)
309 // {
310 // //An exception safe implementation is
311 // DQMRootOutputModule temp(rhs);
312 // swap(rhs);
313 //
314 // return *this;
315 // }
316 
317 //
318 // member functions
319 //
320 bool DQMRootOutputModule::isFileOpen() const { return nullptr != m_file.get(); }
321 
323  //NOTE: I need to also set the I/O performance settings
324 
325  m_file = std::unique_ptr<TFile>(new TFile(m_fileName.c_str(),
326  "RECREATE",
327  "1" //This is the file format version number
328  ));
329 
331  cms::Digest branchHash;
334  std::string(),
335  "DQMRootOutputModule",
338  std::string(),
339  branchHash.digest().toString(),
340  std::vector<std::string>());
341 
343  m_indicesTree->Branch(kRunBranch, &m_run);
344  m_indicesTree->Branch(kLumiBranch, &m_lumi);
348  m_indicesTree->Branch(kTypeBranch, &m_type);
351  m_indicesTree->SetDirectory(m_file.get());
352 
353  unsigned int i = 0;
354  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
355  it != itEnd;
356  ++it, ++i) {
357  //std::cout <<"making "<<kTypeNames[i]<<std::endl;
358  TTree* tree = new TTree(kTypeNames[i], kTypeNames[i]);
359  *it = std::shared_ptr<TreeHelperBase>(makeHelper(i, tree, m_fullNameBufferPtr));
360  tree->SetDirectory(m_file.get()); //TFile takes ownership
361  }
362 
375 }
376 
378 
380  //std::cout << "DQMRootOutputModule::writeLuminosityBlock"<< std::endl;
381  edm::Service<DQMStore> dstore;
382  m_run = iLumi.id().run();
383  m_lumi = iLumi.id().value();
384  m_beginTime = iLumi.beginTime().value();
385  m_endTime = iLumi.endTime().value();
386  bool shouldWrite = (m_filterOnRun == 0 || (m_filterOnRun != 0 && m_filterOnRun == m_run));
387 
388  if (!shouldWrite)
389  return;
390  std::vector<MonitorElement*> items(
391  dstore->getAllContents("", m_enableMultiThread ? m_run : 0, m_enableMultiThread ? m_lumi : 0));
392  for (std::vector<MonitorElement*>::iterator it = items.begin(), itEnd = items.end(); it != itEnd; ++it) {
393  if ((*it)->getLumiFlag()) {
394  std::map<unsigned int, unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((int)(*it)->kind());
395  assert(itFound != m_dqmKindToTypeIndex.end());
396  m_treeHelpers[itFound->second]->fill(*it);
397  }
398  }
399 
400  const edm::ProcessHistoryID& id = iLumi.processHistoryID();
401  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(), m_seenHistories.end(), id);
402  if (itFind == m_seenHistories.end()) {
405  m_seenHistories.push_back(id);
406  } else {
407  m_presentHistoryIndex = itFind - m_seenHistories.begin();
408  }
409 
410  //Now store the relationship between run/lumi and indices in the other TTrees
411  bool storedLumiIndex = false;
412  unsigned int typeIndex = 0;
413  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
414  it != itEnd;
415  ++it, ++typeIndex) {
416  if ((*it)->wasFilled()) {
417  m_type = typeIndex;
418  (*it)->getRangeAndReset(m_firstIndex, m_lastIndex);
419  storedLumiIndex = true;
420  m_indicesTree->Fill();
421  }
422  }
423  if (not storedLumiIndex) {
424  //need to record lumis even if we stored no MonitorElements since some later DQM modules
425  // look to see what lumis were processed
427  m_firstIndex = 0;
428  m_lastIndex = 0;
429  m_indicesTree->Fill();
430  }
431 
433  jr->reportLumiSection(m_jrToken, m_run, m_lumi);
434 }
435 
437  //std::cout << "DQMRootOutputModule::writeRun"<< std::endl;
438  edm::Service<DQMStore> dstore;
439  m_run = iRun.id().run();
440  m_lumi = 0;
441  m_beginTime = iRun.beginTime().value();
442  m_endTime = iRun.endTime().value();
443  bool shouldWrite = (m_filterOnRun == 0 || (m_filterOnRun != 0 && m_filterOnRun == m_run));
444 
445  if (!shouldWrite)
446  return;
447 
448  std::vector<MonitorElement*> items(dstore->getAllContents("", m_enableMultiThread ? m_run : 0));
449  for (std::vector<MonitorElement*>::iterator it = items.begin(), itEnd = items.end(); it != itEnd; ++it) {
450  if (not(*it)->getLumiFlag()) {
451  std::map<unsigned int, unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((int)(*it)->kind());
452  assert(itFound != m_dqmKindToTypeIndex.end());
453  m_treeHelpers[itFound->second]->fill(*it);
454  }
455  }
456 
457  const edm::ProcessHistoryID& id = iRun.processHistoryID();
458  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(), m_seenHistories.end(), id);
459  if (itFind == m_seenHistories.end()) {
462  m_seenHistories.push_back(id);
463  } else {
464  m_presentHistoryIndex = itFind - m_seenHistories.begin();
465  }
466 
467  //Now store the relationship between run/lumi and indices in the other TTrees
468  unsigned int typeIndex = 0;
469  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
470  it != itEnd;
471  ++it, ++typeIndex) {
472  if ((*it)->wasFilled()) {
473  m_type = typeIndex;
474  (*it)->getRangeAndReset(m_firstIndex, m_lastIndex);
475  m_indicesTree->Fill();
476  }
477  }
478 
480  jr->reportRunNumber(m_jrToken, m_run);
481 }
482 
484  startEndFile();
485  finishEndFile();
486 }
487 
489  //std::cout << "DQMRootOutputModule::startEndFile"<< std::endl;
490  //fill in the meta data
491  m_file->cd();
492  TDirectory* metaDataDirectory = m_file->mkdir(kMetaDataDirectory);
493 
494  //Write out the Process History
495  TTree* processHistoryTree = new TTree(kProcessHistoryTree, kProcessHistoryTree);
496  processHistoryTree->SetDirectory(metaDataDirectory);
497 
498  unsigned int index = 0;
499  processHistoryTree->Branch(kPHIndexBranch, &index);
501  processHistoryTree->Branch(kProcessConfigurationProcessNameBranch, &processName);
502  std::string parameterSetID;
503  processHistoryTree->Branch(kProcessConfigurationParameterSetIDBranch, &parameterSetID);
504  std::string releaseVersion;
505  processHistoryTree->Branch(kProcessConfigurationReleaseVersion, &releaseVersion);
506  std::string passID;
507  processHistoryTree->Branch(kProcessConfigurationPassID, &passID);
508 
509  for (std::vector<edm::ProcessHistoryID>::iterator it = m_seenHistories.begin(), itEnd = m_seenHistories.end();
510  it != itEnd;
511  ++it) {
513  assert(nullptr != history);
514  index = 0;
515  for (edm::ProcessHistory::collection_type::const_iterator itPC = history->begin(), itPCEnd = history->end();
516  itPC != itPCEnd;
517  ++itPC, ++index) {
518  processName = itPC->processName();
519  releaseVersion = itPC->releaseVersion();
520  passID = itPC->passID();
521  parameterSetID = itPC->parameterSetID().compactForm();
522  processHistoryTree->Fill();
523  }
524  }
525 
526  //Store the ParameterSets
527  TTree* parameterSetsTree = new TTree(kParameterSetTree, kParameterSetTree);
528  parameterSetsTree->SetDirectory(metaDataDirectory);
529  std::string blob;
530  parameterSetsTree->Branch(kParameterSetBranch, &blob);
531 
533  assert(nullptr != psr);
534  for (edm::pset::Registry::const_iterator it = psr->begin(), itEnd = psr->end(); it != itEnd; ++it) {
535  blob.clear();
536  it->second.toString(blob);
537  parameterSetsTree->Fill();
538  }
539 }
540 
542  //std::cout << "DQMRootOutputModule::finishEndFile"<< std::endl;
543  m_file->Write();
544  m_file->Close();
547 }
548 
549 //
550 // const member functions
551 //
552 
553 //
554 // static member functions
555 //
558 
559  desc.addUntracked<std::string>("fileName");
560  desc.addUntracked<std::string>("logicalFileName", "");
561  desc.addUntracked<unsigned int>("filterOnRun", 0)
562  ->setComment("Only write the run with this run number. 0 means write all runs.");
563  desc.addOptionalUntracked<int>("splitLevel", 99)
564  ->setComment("UNUSED Only here to allow older configurations written for PoolOutputModule to work.");
565  const std::vector<std::string> keep = {"drop *", "keep DQMToken_*_*_*"};
567 
569  dataSet.setAllowAnything();
571  ->setComment("PSet is only used by Data Operations and not by this module.");
572 
573  descriptions.addDefault(desc);
574 }
575 
const_iterator begin() const
void reallyCloseFile() override
Timestamp const & endTime() const
Definition: RunForOutput.h:52
static const char *const kProcessHistoryTree
Definition: format.h:72
static const char *const kRunBranch
Definition: format.h:59
virtual ProcessHistory const & processHistory() const
map_type::const_iterator const_iterator
Definition: Registry.h:61
ModuleDescription const & description() const
static const char *const kTypeNames[]
Definition: format.h:39
bool getMapped(ProcessHistoryID const &key, ProcessHistory &value) const
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
const_iterator end() const
Definition: Registry.h:65
void writeLuminosityBlock(edm::LuminosityBlockForOutput const &) override
RunNumber_t run() const
Definition: RunID.h:36
void write(edm::EventForOutput const &e) override
void setAllowAnything()
allow any parameter label/value pairs
RunID const & id() const
Definition: RunForOutput.h:49
static const char *const kIndicesTree
Definition: format.h:58
unsigned int m_presentHistoryIndex
#define nullptr
bool registerProcessHistory(ProcessHistory const &processHistory)
static TreeHelperBase * makeHelper(unsigned int iTypeIndex, TTree *iTree, std::string *iFullNameBufferPtr)
virtual int64_t getIntValue() const
edm::ProcessHistoryRegistry m_processHistoryRegistry
static const char *const kFirstIndex
Definition: format.h:65
static const char *const kLumiBranch
Definition: format.h:60
static const char *const kFullNameBranch
Definition: format.h:53
MD5Result digest() const
Definition: Digest.cc:171
void reportRunNumber(JobReport::Token token, unsigned int run)
Definition: JobReport.cc:469
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
const std::string getFullname() const
get full name of ME including Pathname
dqm::dqmstoreimpl::DQMStore DQMStore
Definition: DQMStore.h:706
void beginJob()
Definition: Breakpoints.cc:14
Timestamp const & beginTime() const
Definition: RunForOutput.h:51
static const char *const kPHIndexBranch
Definition: format.h:73
const int keep
static const char *const kParameterSetBranch
Definition: format.h:80
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::map< unsigned int, unsigned int > m_dqmKindToTypeIndex
void addDefault(ParameterSetDescription const &psetDescription)
def isFileOpen(fName)
static const char *const kMetaDataDirectory
Definition: format.h:70
static void fillDescription(ParameterSetDescription &desc, std::vector< std::string > const &iDefaultOutputCommands=ProductSelectorRules::defaultSelectionStrings())
static const char *const kParameterSetTree
Definition: format.h:79
const_iterator begin() const
Definition: Registry.h:63
RunNumber_t run() const
uint64_t value() const
static const char *const kFlagBranch
Definition: format.h:54
static const char *const kTypeBranch
Definition: format.h:64
std::vector< std::shared_ptr< TreeHelperBase > > m_treeHelpers
static const char *const kProcessHistoryIndexBranch
Definition: format.h:61
Token outputFileOpened(std::string const &physicalFileName, std::string const &logicalFileName, std::string const &catalog, std::string const &outputModuleClassName, std::string const &moduleLabel, std::string const &guid, std::string const &dataType, std::string const &branchHash, std::vector< std::string > const &branchNames)
Definition: JobReport.cc:389
static const char *const kEndTimeBranch
Definition: format.h:63
Timestamp const & endTime() const
std::unique_ptr< TFile > m_file
std::size_t Token
Definition: JobReport.h:106
DQMRootOutputModule(edm::ParameterSet const &pset)
static const char *const kProcessConfigurationPassID
Definition: format.h:77
doFill
Definition: cuy.py:576
std::string * m_fullNameBufferPtr
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void writeRun(edm::RunForOutput const &) override
dqm::legacy::MonitorElement MonitorElement
static const char *const kLastIndex
Definition: format.h:66
std::string toString() const
Definition: Digest.cc:95
static const char *const kProcessConfigurationReleaseVersion
Definition: format.h:76
bool isFileOpen() const override
std::string const & processName() const
static const char *const kProcessConfigurationProcessNameBranch
Definition: format.h:74
Timestamp const & beginTime() const
const_iterator end() const
HLT enums.
static const char *const kBeginTimeBranch
Definition: format.h:62
virtual double getFloatValue() const
ProcessHistoryID const & processHistoryID() const
virtual const std::string & getStringValue() const
void outputFileClosed(Token fileToken)
Definition: JobReport.cc:433
edm::JobReport::Token m_jrToken
void openFile(edm::FileBlock const &) override
ParameterDescriptionBase * addOptionalUntracked(U const &iLabel, T const &value)
TObject * getRootObject() const override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: tree.py:1
LuminosityBlockID const & id() const
long double T
TimeValue_t value() const
Definition: Timestamp.h:45
static Registry * instance()
Definition: Registry.cc:12
std::string createGlobalIdentifier()
static const char *const kValueBranch
Definition: format.h:55
void reportLumiSection(JobReport::Token token, unsigned int run, unsigned int lumiSectId, unsigned long nEvents=0)
Definition: JobReport.cc:458
static const char *const kProcessConfigurationParameterSetIDBranch
Definition: format.h:75
std::vector< edm::ProcessHistoryID > m_seenHistories