CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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
40 
45 
46 #include "format.h"
47 
48 namespace {
49  class TreeHelperBase {
50  public:
51  TreeHelperBase(): m_wasFilled(false), m_firstIndex(0),m_lastIndex(0) {}
52  virtual ~TreeHelperBase(){}
53  void fill(MonitorElement* iElement) {
54  doFill(iElement);
55  if(m_wasFilled) {++m_lastIndex;}
56  m_wasFilled = true; }
57  bool wasFilled() const { return m_wasFilled;}
58  void getRangeAndReset(ULong64_t& iFirstIndex, ULong64_t& iLastIndex) {
59  iFirstIndex = m_firstIndex;
60  iLastIndex = m_lastIndex;
61  m_wasFilled = false;
62  m_firstIndex = m_lastIndex +1;
63  m_lastIndex = m_firstIndex;
64  }
65  private:
66  virtual void doFill(MonitorElement*) = 0;
67  bool m_wasFilled;
68  ULong64_t m_firstIndex;
69  ULong64_t m_lastIndex;
70  };
71 
72  template<class T>
73  class TreeHelper : public TreeHelperBase {
74  public:
75  TreeHelper(TTree* iTree, std::string* iFullNameBufferPtr ):
76  m_tree(iTree), m_flagBuffer(0),m_fullNameBufferPtr(iFullNameBufferPtr){ setup();}
77  virtual void doFill(MonitorElement* iElement) {
78  *m_fullNameBufferPtr = iElement->getFullname();
79  m_flagBuffer = iElement->getTag();
80  m_bufferPtr = dynamic_cast<T*>(iElement->getRootObject());
81  assert(0!=m_bufferPtr);
82  //std::cout <<"#entries: "<<m_bufferPtr->GetEntries()<<std::endl;
83  m_tree->Fill();
84  }
85 
86 
87  private:
88  void setup() {
89  m_tree->Branch(kFullNameBranch,&m_fullNameBufferPtr);
90  m_tree->Branch(kFlagBranch,&m_flagBuffer);
91 
92  m_bufferPtr = 0;
93  m_tree->Branch(kValueBranch,&m_bufferPtr,128*1024,0);
94  }
95  TTree* m_tree;
96  uint32_t m_flagBuffer;
97  std::string* m_fullNameBufferPtr;
98  T* m_bufferPtr;
99  };
100 
101  class IntTreeHelper: public TreeHelperBase {
102  public:
103  IntTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr):
104  m_tree(iTree), m_flagBuffer(0),m_fullNameBufferPtr(iFullNameBufferPtr)
105  {setup();}
106 
107  virtual void doFill(MonitorElement* iElement) {
108  *m_fullNameBufferPtr = iElement->getFullname();
109  m_flagBuffer = iElement->getTag();
110  m_buffer = iElement->getIntValue();
111  m_tree->Fill();
112  }
113 
114  private:
115  void setup() {
116  m_tree->Branch(kFullNameBranch,&m_fullNameBufferPtr);
117  m_tree->Branch(kFlagBranch,&m_flagBuffer);
118  m_tree->Branch(kValueBranch,&m_buffer);
119  }
120  TTree* m_tree;
121  uint32_t m_flagBuffer;
122  std::string* m_fullNameBufferPtr;
123  Long64_t m_buffer;
124  };
125 
126  class FloatTreeHelper: public TreeHelperBase {
127  public:
128  FloatTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr):
129  m_tree(iTree), m_flagBuffer(0),m_fullNameBufferPtr(iFullNameBufferPtr)
130  {setup();}
131  virtual void doFill(MonitorElement* iElement) {
132  *m_fullNameBufferPtr = iElement->getFullname();
133  m_flagBuffer = iElement->getTag();
134  m_buffer = iElement->getFloatValue();
135  m_tree->Fill();
136  }
137  private:
138  void setup() {
139  m_tree->Branch(kFullNameBranch,&m_fullNameBufferPtr);
140  m_tree->Branch(kFlagBranch,&m_flagBuffer);
141  m_tree->Branch(kValueBranch,&m_buffer);
142  }
143 
144  TTree* m_tree;
145  uint32_t m_flagBuffer;
146  std::string* m_fullNameBufferPtr;
147  double m_buffer;
148  };
149 
150  class StringTreeHelper: public TreeHelperBase {
151  public:
152  StringTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr):
153  m_tree(iTree), m_flagBuffer(0),m_fullNameBufferPtr(iFullNameBufferPtr), m_bufferPtr(&m_buffer)
154  {setup();}
155  virtual void doFill(MonitorElement* iElement) {
156  *m_fullNameBufferPtr = iElement->getFullname();
157  m_flagBuffer = iElement->getTag();
158  m_buffer = iElement->getStringValue();
159  m_tree->Fill();
160  }
161  private:
162  void setup() {
163  m_tree->Branch(kFullNameBranch,&m_fullNameBufferPtr);
164  m_tree->Branch(kFlagBranch,&m_flagBuffer);
165  m_tree->Branch(kValueBranch,&m_bufferPtr);
166  }
167 
168  TTree* m_tree;
169  uint32_t m_flagBuffer;
170  std::string* m_fullNameBufferPtr;
171  std::string m_buffer;
172  std::string* m_bufferPtr;
173  };
174 
175 }
176 
177 namespace edm {
178  class ModuleCallingContext;
179 }
180 
182 public:
183  explicit DQMRootOutputModule(edm::ParameterSet const& pset);
184  virtual ~DQMRootOutputModule();
185  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
186 
187 private:
188  virtual void write(edm::EventPrincipal const& e, edm::ModuleCallingContext const*) override;
190  virtual void writeRun(edm::RunPrincipal const&, edm::ModuleCallingContext const*) override;
191  virtual bool isFileOpen() const override;
192  virtual void openFile(edm::FileBlock const&) override;
193  virtual void reallyCloseFile() override;
194  virtual void postForkReacquireResources(unsigned int childIndex, unsigned int numberOfChildren) override;
195 
196  void startEndFile();
197  void finishEndFile();
200  std::auto_ptr<TFile> m_file;
201  std::vector<boost::shared_ptr<TreeHelperBase> > m_treeHelpers;
202 
203  unsigned int m_run;
204  unsigned int m_lumi;
205  unsigned int m_type;
206  unsigned int m_presentHistoryIndex;
207  ULong64_t m_beginTime;
208  ULong64_t m_endTime;
209  ULong64_t m_firstIndex;
210  ULong64_t m_lastIndex;
211  unsigned int m_filterOnRun;
213 
216  std::map<unsigned int, unsigned int> m_dqmKindToTypeIndex;
218 
219  std::vector<edm::ProcessHistoryID> m_seenHistories;
222 };
223 
224 //
225 // constants, enums and typedefs
226 //
227 
228 static TreeHelperBase*
229 makeHelper(unsigned int iTypeIndex,
230  TTree* iTree,
231  std::string* iFullNameBufferPtr) {
232  switch(iTypeIndex) {
233  case kIntIndex:
234  return new IntTreeHelper(iTree,iFullNameBufferPtr);
235  case kFloatIndex:
236  return new FloatTreeHelper(iTree,iFullNameBufferPtr);
237  case kStringIndex:
238  return new StringTreeHelper(iTree,iFullNameBufferPtr);
239  case kTH1FIndex:
240  return new TreeHelper<TH1F>(iTree,iFullNameBufferPtr);
241  case kTH1SIndex:
242  return new TreeHelper<TH1S>(iTree,iFullNameBufferPtr);
243  case kTH1DIndex:
244  return new TreeHelper<TH1D>(iTree,iFullNameBufferPtr);
245  case kTH2FIndex:
246  return new TreeHelper<TH2F>(iTree,iFullNameBufferPtr);
247  case kTH2SIndex:
248  return new TreeHelper<TH2S>(iTree,iFullNameBufferPtr);
249  case kTH2DIndex:
250  return new TreeHelper<TH2D>(iTree,iFullNameBufferPtr);
251  case kTH3FIndex:
252  return new TreeHelper<TH3F>(iTree,iFullNameBufferPtr);
253  case kTProfileIndex:
254  return new TreeHelper<TProfile>(iTree,iFullNameBufferPtr);
255  case kTProfile2DIndex:
256  return new TreeHelper<TProfile2D>(iTree,iFullNameBufferPtr);
257  }
258  assert(false);
259  return 0;
260 }
261 
262 //
263 // static data member definitions
264 //
265 
266 //
267 // constructors and destructor
268 //
270 edm::one::OutputModuleBase::OutputModuleBase(pset),
271 edm::one::OutputModule<>(pset),
272 m_fileName(pset.getUntrackedParameter<std::string>("fileName")),
273 m_logicalFileName(pset.getUntrackedParameter<std::string>("logicalFileName","")),
274 m_file(0),
275 m_treeHelpers(kNIndicies,boost::shared_ptr<TreeHelperBase>()),
276 m_presentHistoryIndex(0),
277 m_filterOnRun(pset.getUntrackedParameter<unsigned int>("filterOnRun",0)),
278 m_enableMultiThread(false),
279 m_fullNameBufferPtr(&m_fullNameBuffer),
280 m_indicesTree(0)
281 {
282  edm::Service<DQMStore> dstore;
284 }
285 
286 // DQMRootOutputModule::DQMRootOutputModule(const DQMRootOutputModule& rhs)
287 // {
288 // // do actual copying here;
289 // }
290 
292 {
293 }
294 
295 //
296 // assignment operators
297 //
298 // const DQMRootOutputModule& DQMRootOutputModule::operator=(const DQMRootOutputModule& rhs)
299 // {
300 // //An exception safe implementation is
301 // DQMRootOutputModule temp(rhs);
302 // swap(rhs);
303 //
304 // return *this;
305 // }
306 
307 //
308 // member functions
309 //
310 bool
312 {
313  return nullptr!=m_file.get();
314 }
315 
316 void
318 {
319  //NOTE: I need to also set the I/O performance settings
320 
321  m_file = std::auto_ptr<TFile>(new TFile(m_fileName.c_str(),"RECREATE",
322  "1" //This is the file format version number
323  ));
324 
326  cms::Digest branchHash;
329  std::string(),
330  "DQMRootOutputModule",
331  description().moduleLabel(),
333  std::string(),
334  branchHash.digest().toString(),
335  std::vector<std::string>()
336  );
337 
338 
340  m_indicesTree->Branch(kRunBranch,&m_run);
341  m_indicesTree->Branch(kLumiBranch,&m_lumi);
345  m_indicesTree->Branch(kTypeBranch,&m_type);
348  m_indicesTree->SetDirectory(m_file.get());
349 
350  unsigned int i = 0;
351  for(std::vector<boost::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
352  it != itEnd;
353  ++it,++i) {
354  //std::cout <<"making "<<kTypeNames[i]<<std::endl;
355  TTree* tree = new TTree(kTypeNames[i],kTypeNames[i]);
356  *it = boost::shared_ptr<TreeHelperBase>(makeHelper(i,tree,m_fullNameBufferPtr));
357  tree->SetDirectory(m_file.get()); //TFile takes ownership
358  }
359 
372 }
373 
374 
375 void
376 DQMRootOutputModule::postForkReacquireResources(unsigned int childIndex, unsigned int numberOfChildren) {
377  // this is copied from IOPool/Output/src/PoolOutputModule.cc, for consistency
378  unsigned int digits = 0;
379  while (numberOfChildren != 0) {
380  ++digits;
381  numberOfChildren /= 10;
382  }
383  // protect against zero numberOfChildren
384  if (digits == 0) {
385  digits = 3;
386  }
387 
388  char buffer[digits + 2];
389  snprintf(buffer, digits + 2, "_%0*d", digits, childIndex);
390 
392  m_fileName = (filename.parent_path() / (filename.stem().string() + buffer + filename.extension().string())).string();
393 }
394 
395 
396 void
398 
399 }
400 
401 
402 void
404  edm::ModuleCallingContext const*) {
405  //std::cout << "DQMRootOutputModule::writeLuminosityBlock"<< std::endl;
406  edm::Service<DQMStore> dstore;
407  m_run = iLumi.id().run();
408  m_lumi = iLumi.id().value();
409  m_beginTime = iLumi.beginTime().value();
410  m_endTime = iLumi.endTime().value();
411  bool shouldWrite = (m_filterOnRun == 0 ||
412  (m_filterOnRun != 0 && m_filterOnRun == m_run));
413 
414  if (! shouldWrite)
415  return;
416  std::vector<MonitorElement *> items(dstore->getAllContents("",
418  m_enableMultiThread ? m_lumi : 0));
419  for(std::vector<MonitorElement*>::iterator it = items.begin(), itEnd=items.end();
420  it!=itEnd;
421  ++it) {
422  if((*it)->getLumiFlag()) {
423  std::map<unsigned int,unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((*it)->kind());
424  assert(itFound !=m_dqmKindToTypeIndex.end());
425  m_treeHelpers[itFound->second]->fill(*it);
426  }
427  }
428 
430  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(),m_seenHistories.end(),id);
431  if(itFind == m_seenHistories.end()) {
434  m_seenHistories.push_back(id);
435  } else {
436  m_presentHistoryIndex = itFind - m_seenHistories.begin();
437  }
438 
439  //Now store the relationship between run/lumi and indices in the other TTrees
440  bool storedLumiIndex = false;
441  unsigned int typeIndex = 0;
442  for(std::vector<boost::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
443  it != itEnd;
444  ++it,++typeIndex) {
445  if((*it)->wasFilled()) {
446  m_type = typeIndex;
447  (*it)->getRangeAndReset(m_firstIndex,m_lastIndex);
448  storedLumiIndex = true;
449  m_indicesTree->Fill();
450  }
451  }
452  if(not storedLumiIndex) {
453  //need to record lumis even if we stored no MonitorElements since some later DQM modules
454  // look to see what lumis were processed
456  m_firstIndex=0;
457  m_lastIndex=0;
458  m_indicesTree->Fill();
459  }
460 
462  jr->reportLumiSection(m_jrToken, m_run, m_lumi);
463 }
464 
467  //std::cout << "DQMRootOutputModule::writeRun"<< std::endl;
468  edm::Service<DQMStore> dstore;
469  m_run = iRun.id().run();
470  m_lumi = 0;
471  m_beginTime = iRun.beginTime().value();
472  m_endTime = iRun.endTime().value();
473  bool shouldWrite = (m_filterOnRun == 0 ||
474  (m_filterOnRun != 0 && m_filterOnRun == m_run));
475 
476  if (! shouldWrite)
477  return;
478 
479  std::vector<MonitorElement*> items(dstore->getAllContents("",
480  m_enableMultiThread ? m_run : 0));
481  for(std::vector<MonitorElement*>::iterator it = items.begin(), itEnd=items.end();
482  it!=itEnd;
483  ++it) {
484  if(not (*it)->getLumiFlag()) {
485  std::map<unsigned int,unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((*it)->kind());
486  assert (itFound !=m_dqmKindToTypeIndex.end());
487  m_treeHelpers[itFound->second]->fill(*it);
488  }
489  }
490 
492  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(),m_seenHistories.end(),id);
493  if(itFind == m_seenHistories.end()) {
496  m_seenHistories.push_back(id);
497  } else {
498  m_presentHistoryIndex = itFind - m_seenHistories.begin();
499  }
500 
501  //Now store the relationship between run/lumi and indices in the other TTrees
502  unsigned int typeIndex = 0;
503  for(std::vector<boost::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
504  it != itEnd;
505  ++it,++typeIndex) {
506  if((*it)->wasFilled()) {
507  m_type = typeIndex;
508  (*it)->getRangeAndReset(m_firstIndex,m_lastIndex);
509  m_indicesTree->Fill();
510  }
511  }
512 
514  jr->reportRunNumber(m_jrToken, m_run);
515 }
516 
517 void
519  startEndFile();
520  finishEndFile();
521 }
522 
523 
525  //std::cout << "DQMRootOutputModule::startEndFile"<< std::endl;
526  //fill in the meta data
527  m_file->cd();
528  TDirectory* metaDataDirectory = m_file->mkdir(kMetaDataDirectory);
529 
530 
531  //Write out the Process History
532  TTree* processHistoryTree = new TTree(kProcessHistoryTree,kProcessHistoryTree);
533  processHistoryTree->SetDirectory(metaDataDirectory);
534 
535  unsigned int index = 0;
536  processHistoryTree->Branch(kPHIndexBranch,&index);
538  processHistoryTree->Branch(kProcessConfigurationProcessNameBranch,&processName);
539  std::string parameterSetID;
540  processHistoryTree->Branch(kProcessConfigurationParameterSetIDBranch,&parameterSetID);
541  std::string releaseVersion;
542  processHistoryTree->Branch(kProcessConfigurationReleaseVersion,&releaseVersion);
543  std::string passID;
544  processHistoryTree->Branch(kProcessConfigurationPassID,&passID);
545 
546  for(std::vector<edm::ProcessHistoryID>::iterator it = m_seenHistories.begin(), itEnd = m_seenHistories.end();
547  it !=itEnd;
548  ++it) {
550  assert(0!=history);
551  index = 0;
552  for(edm::ProcessHistory::collection_type::const_iterator itPC = history->begin(), itPCEnd = history->end();
553  itPC != itPCEnd;
554  ++itPC,++index) {
555  processName = itPC->processName();
556  releaseVersion = itPC->releaseVersion();
557  passID = itPC->passID();
558  parameterSetID = itPC->parameterSetID().compactForm();
559  processHistoryTree->Fill();
560  }
561  }
562 
563  //Store the ParameterSets
564  TTree* parameterSetsTree = new TTree(kParameterSetTree,kParameterSetTree);
565  parameterSetsTree->SetDirectory(metaDataDirectory);
566  std::string blob;
567  parameterSetsTree->Branch(kParameterSetBranch,&blob);
568 
570  assert(0!=psr);
571  for(edm::pset::Registry::const_iterator it = psr->begin(), itEnd = psr->end();
572  it != itEnd;
573  ++it) {
574  blob.clear();
575  it->second.toString(blob);
576  parameterSetsTree->Fill();
577  }
578 
579 }
580 
582  //std::cout << "DQMRootOutputModule::finishEndFile"<< std::endl;
583  m_file->Write();
584  m_file->Close();
587 }
588 
589 //
590 // const member functions
591 //
592 
593 //
594 // static member functions
595 //
596 void
598  //The following says we do not know what parameters are allowed so do no validation
599  // Please change this to state exactly what you do use, even if it is no parameters
601  desc.setUnknown();
602  descriptions.addDefault(desc);
603 
604  //NOTE: when actually filling this in, do not forget to add a untracked PSet 'dataset'
605  // which is used for bookkeeping by the DMWM
606 }
607 
608 
const_iterator begin() const
virtual void reallyCloseFile() override
int i
Definition: DBlmapReader.cc:9
static const char *const kProcessHistoryTree
Definition: format.h:54
static const char *const kRunBranch
Definition: format.h:41
map_type::const_iterator const_iterator
Definition: Registry.h:63
ModuleDescription const & description() const
static const char *const kTypeNames[]
Definition: format.h:28
string fill
Definition: lumiContext.py:319
Timestamp const & beginTime() const
bool getMapped(ProcessHistoryID const &key, ProcessHistory &value) const
const_iterator end() const
Definition: Registry.h:69
RunNumber_t run() const
Definition: RunID.h:43
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
static const char *const kIndicesTree
Definition: format.h:40
Timestamp const & endTime() const
unsigned int m_presentHistoryIndex
boost::uint64_t value() const
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
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:554
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
ProcessHistory const & processHistory() const
Definition: Principal.h:139
virtual void write(edm::EventPrincipal const &e, edm::ModuleCallingContext const *) override
const uint32_t getTag(void) const
static const char *const kPHIndexBranch
Definition: format.h:55
std::vector< MonitorElement * > getAllContents(const std::string &path, uint32_t runNumber=0, uint32_t lumi=0) const
Definition: DQMStore.cc:1921
static const char *const kParameterSetBranch
Definition: format.h:62
virtual bool isFileOpen() const override
std::map< unsigned int, unsigned int > m_dqmKindToTypeIndex
void addDefault(ParameterSetDescription const &psetDescription)
tuple path
else: Piece not in the list, fine.
ProcessHistoryID const & processHistoryID() const
Definition: Principal.h:143
static const char *const kMetaDataDirectory
Definition: format.h:52
Timestamp const & beginTime() const
Definition: RunPrincipal.h:73
std::auto_ptr< TFile > m_file
static const char *const kParameterSetTree
Definition: format.h:61
double getFloatValue(void) const
const_iterator begin() const
Definition: Registry.h:65
RunNumber_t run() const
Timestamp const & endTime() const
Definition: RunPrincipal.h:77
static const char *const kFlagBranch
Definition: format.h:35
virtual void writeRun(edm::RunPrincipal const &, edm::ModuleCallingContext const *) override
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:472
static const char *const kEndTimeBranch
Definition: format.h:45
const std::string getFullname(void) const
get full name of ME including Pathname
const std::string & getStringValue(void) const
std::size_t Token
Definition: JobReport.h:105
DQMRootOutputModule(edm::ParameterSet const &pset)
static const char *const kProcessConfigurationPassID
Definition: format.h:59
doFill
Definition: cuy.py:574
RunID const & id() const
Definition: RunPrincipal.h:69
std::vector< boost::shared_ptr< TreeHelperBase > > m_treeHelpers
std::string * m_fullNameBufferPtr
TObject * getRootObject(void) const
static const char *const kLastIndex
Definition: format.h:48
int64_t getIntValue(void) const
std::string toString() const
Definition: Digest.cc:87
static const char *const kProcessConfigurationReleaseVersion
Definition: format.h:58
std::string const & processName() const
static const char *const kProcessConfigurationProcessNameBranch
Definition: format.h:56
const_iterator end() const
virtual void postForkReacquireResources(unsigned int childIndex, unsigned int numberOfChildren) override
static const char *const kBeginTimeBranch
Definition: format.h:44
void outputFileClosed(Token fileToken)
Definition: JobReport.cc:518
tuple filename
Definition: lut2db_cfg.py:20
edm::JobReport::Token m_jrToken
virtual void openFile(edm::FileBlock const &) override
virtual void writeLuminosityBlock(edm::LuminosityBlockPrincipal const &, edm::ModuleCallingContext const *) override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
volatile std::atomic< bool > shutdown_flag false
long double T
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
TimeValue_t value() const
Definition: Timestamp.h:56
static Registry * instance()
Definition: Registry.cc:14
std::string createGlobalIdentifier()
static const char *const kValueBranch
Definition: format.h:36
bool enableMultiThread_
Definition: DQMStore.h:688
void reportLumiSection(JobReport::Token token, unsigned int run, unsigned int lumiSectId, unsigned long nEvents=0)
Definition: JobReport.cc:544
static const char *const kProcessConfigurationParameterSetIDBranch
Definition: format.h:57
std::vector< edm::ProcessHistoryID > m_seenHistories