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