CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups 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 <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 "tbb/task_arena.h"
31 
32 // user include files
42 
47 
49 
50 #include "format.h"
51 
52 namespace {
55 
56  class TreeHelperBase {
57  public:
58  TreeHelperBase() : m_wasFilled(false), m_firstIndex(0), m_lastIndex(0) {}
59  virtual ~TreeHelperBase() {}
60  void fill(MonitorElement* iElement) {
61  doFill(iElement);
62  if (m_wasFilled) {
63  ++m_lastIndex;
64  }
65  m_wasFilled = true;
66  }
67  bool wasFilled() const { return m_wasFilled; }
68  void getRangeAndReset(ULong64_t& iFirstIndex, ULong64_t& iLastIndex) {
69  iFirstIndex = m_firstIndex;
70  iLastIndex = m_lastIndex;
71  m_wasFilled = false;
72  m_firstIndex = m_lastIndex + 1;
73  m_lastIndex = m_firstIndex;
74  }
75 
76  private:
77  virtual void doFill(MonitorElement*) = 0;
78  bool m_wasFilled;
79  ULong64_t m_firstIndex;
80  ULong64_t m_lastIndex;
81  };
82 
83  template <class T>
84  class TreeHelper : public TreeHelperBase {
85  public:
86  TreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
87  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
88  setup();
89  }
90  void doFill(MonitorElement* iElement) override {
91  *m_fullNameBufferPtr = iElement->getFullname();
92  m_flagBuffer = 0;
93  m_bufferPtr = dynamic_cast<T*>(iElement->getRootObject());
94  assert(nullptr != m_bufferPtr);
95  //std::cout <<"#entries: "<<m_bufferPtr->GetEntries()<<std::endl;
96  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
97  }
98 
99  private:
100  void setup() {
101  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
102  m_tree->Branch(kFlagBranch, &m_flagBuffer);
103 
104  m_bufferPtr = nullptr;
105  m_tree->Branch(kValueBranch, &m_bufferPtr, 128 * 1024, 0);
106  }
107  TTree* m_tree;
108  uint32_t m_flagBuffer;
109  std::string* m_fullNameBufferPtr;
110  T* m_bufferPtr;
111  };
112 
113  class IntTreeHelper : public TreeHelperBase {
114  public:
115  IntTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
116  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
117  setup();
118  }
119 
120  void doFill(MonitorElement* iElement) override {
121  *m_fullNameBufferPtr = iElement->getFullname();
122  m_flagBuffer = 0;
123  m_buffer = iElement->getIntValue();
124  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
125  }
126 
127  private:
128  void setup() {
129  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
130  m_tree->Branch(kFlagBranch, &m_flagBuffer);
131  m_tree->Branch(kValueBranch, &m_buffer);
132  }
133  TTree* m_tree;
134  uint32_t m_flagBuffer;
135  std::string* m_fullNameBufferPtr;
136  Long64_t m_buffer;
137  };
138 
139  class FloatTreeHelper : public TreeHelperBase {
140  public:
141  FloatTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
142  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr) {
143  setup();
144  }
145  void doFill(MonitorElement* iElement) override {
146  *m_fullNameBufferPtr = iElement->getFullname();
147  m_flagBuffer = 0;
148  m_buffer = iElement->getFloatValue();
149  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
150  }
151 
152  private:
153  void setup() {
154  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
155  m_tree->Branch(kFlagBranch, &m_flagBuffer);
156  m_tree->Branch(kValueBranch, &m_buffer);
157  }
158 
159  TTree* m_tree;
160  uint32_t m_flagBuffer;
161  std::string* m_fullNameBufferPtr;
162  double m_buffer;
163  };
164 
165  class StringTreeHelper : public TreeHelperBase {
166  public:
167  StringTreeHelper(TTree* iTree, std::string* iFullNameBufferPtr)
168  : m_tree(iTree), m_flagBuffer(0), m_fullNameBufferPtr(iFullNameBufferPtr), m_bufferPtr(&m_buffer) {
169  setup();
170  }
171  void doFill(MonitorElement* iElement) override {
172  *m_fullNameBufferPtr = iElement->getFullname();
173  m_flagBuffer = 0;
174  m_buffer = iElement->getStringValue();
175  tbb::this_task_arena::isolate([&] { m_tree->Fill(); });
176  }
177 
178  private:
179  void setup() {
180  m_tree->Branch(kFullNameBranch, &m_fullNameBufferPtr);
181  m_tree->Branch(kFlagBranch, &m_flagBuffer);
182  m_tree->Branch(kValueBranch, &m_bufferPtr);
183  }
184 
185  TTree* m_tree;
186  uint32_t m_flagBuffer;
187  std::string* m_fullNameBufferPtr;
188  std::string m_buffer;
189  std::string* m_bufferPtr;
190  };
191 
192 } // namespace
193 
194 namespace edm {
195  class ModuleCallingContext;
196 }
197 
199 public:
200  explicit DQMRootOutputModule(edm::ParameterSet const& pset);
201  void beginJob() override;
202  ~DQMRootOutputModule() override;
203  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
204 
205 private:
206  void write(edm::EventForOutput const& e) override;
208  void writeRun(edm::RunForOutput const&) override;
209  bool isFileOpen() const override;
210  void openFile(edm::FileBlock const&) override;
211  void reallyCloseFile() override;
212 
213  void startEndFile();
214  void finishEndFile();
217  std::unique_ptr<TFile> m_file;
218  std::vector<std::shared_ptr<TreeHelperBase> > m_treeHelpers;
219 
220  unsigned int m_run;
221  unsigned int m_lumi;
222  unsigned int m_type;
223  unsigned int m_presentHistoryIndex;
224  ULong64_t m_beginTime;
225  ULong64_t m_endTime;
226  ULong64_t m_firstIndex;
227  ULong64_t m_lastIndex;
228  unsigned int m_filterOnRun;
229 
232  std::map<unsigned int, unsigned int> m_dqmKindToTypeIndex;
234 
235  std::vector<edm::ProcessHistoryID> m_seenHistories;
238 };
239 
240 //
241 // constants, enums and typedefs
242 //
243 
244 static TreeHelperBase* makeHelper(unsigned int iTypeIndex, TTree* iTree, std::string* iFullNameBufferPtr) {
245  switch (iTypeIndex) {
246  case kIntIndex:
247  return new IntTreeHelper(iTree, iFullNameBufferPtr);
248  case kFloatIndex:
249  return new FloatTreeHelper(iTree, iFullNameBufferPtr);
250  case kStringIndex:
251  return new StringTreeHelper(iTree, iFullNameBufferPtr);
252  case kTH1FIndex:
253  return new TreeHelper<TH1F>(iTree, iFullNameBufferPtr);
254  case kTH1SIndex:
255  return new TreeHelper<TH1S>(iTree, iFullNameBufferPtr);
256  case kTH1DIndex:
257  return new TreeHelper<TH1D>(iTree, iFullNameBufferPtr);
258  case kTH2FIndex:
259  return new TreeHelper<TH2F>(iTree, iFullNameBufferPtr);
260  case kTH2SIndex:
261  return new TreeHelper<TH2S>(iTree, iFullNameBufferPtr);
262  case kTH2DIndex:
263  return new TreeHelper<TH2D>(iTree, iFullNameBufferPtr);
264  case kTH3FIndex:
265  return new TreeHelper<TH3F>(iTree, iFullNameBufferPtr);
266  case kTProfileIndex:
267  return new TreeHelper<TProfile>(iTree, iFullNameBufferPtr);
268  case kTProfile2DIndex:
269  return new TreeHelper<TProfile2D>(iTree, iFullNameBufferPtr);
270  }
271  assert(false);
272  return nullptr;
273 }
274 
275 //
276 // static data member definitions
277 //
278 
279 //
280 // constructors and destructor
281 //
283  : edm::one::OutputModuleBase::OutputModuleBase(pset),
284  edm::one::OutputModule<>(pset),
285  m_fileName(pset.getUntrackedParameter<std::string>("fileName")),
286  m_logicalFileName(pset.getUntrackedParameter<std::string>("logicalFileName")),
287  m_file(nullptr),
288  m_treeHelpers(kNIndicies, std::shared_ptr<TreeHelperBase>()),
289  m_presentHistoryIndex(0),
290  m_filterOnRun(pset.getUntrackedParameter<unsigned int>("filterOnRun")),
291  m_fullNameBufferPtr(&m_fullNameBuffer),
292  m_indicesTree(nullptr) {
293  // Declare dependencies for all Lumi and Run tokens here. In
294  // principle could use the keep statements, but then DQMToken would
295  // have to be made persistent (transient products are ignored),
296  // which would lead to a need to (finally) remove underscores from
297  // DQM module labels.
298  consumesMany<DQMToken, edm::InLumi>();
299  consumesMany<DQMToken, edm::InRun>();
300 }
301 
302 // DQMRootOutputModule::DQMRootOutputModule(const DQMRootOutputModule& rhs)
303 // {
304 // // do actual copying here;
305 // }
306 
308 
310 
311 //
312 // assignment operators
313 //
314 // const DQMRootOutputModule& DQMRootOutputModule::operator=(const DQMRootOutputModule& rhs)
315 // {
316 // //An exception safe implementation is
317 // DQMRootOutputModule temp(rhs);
318 // swap(rhs);
319 //
320 // return *this;
321 // }
322 
323 //
324 // member functions
325 //
326 bool DQMRootOutputModule::isFileOpen() const { return nullptr != m_file.get(); }
327 
329  //NOTE: I need to also set the I/O performance settings
330 
331  m_file = std::make_unique<TFile>(m_fileName.c_str(),
332  "RECREATE",
333  "1" //This is the file format version number
334  );
335 
337  cms::Digest branchHash;
339  std::transform(guid.begin(), guid.end(), guid.begin(), (int (*)(int))std::toupper);
340 
341  m_file->WriteObject(&guid, kCmsGuid);
342  m_jrToken = jr->outputFileOpened(m_fileName,
344  std::string(),
345  "DQMRootOutputModule",
346  description().moduleLabel(),
347  guid,
348  std::string(),
349  branchHash.digest().toString(),
350  std::vector<std::string>());
351 
353  m_indicesTree->Branch(kRunBranch, &m_run);
354  m_indicesTree->Branch(kLumiBranch, &m_lumi);
358  m_indicesTree->Branch(kTypeBranch, &m_type);
361  m_indicesTree->SetDirectory(m_file.get());
362 
363  unsigned int i = 0;
364  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
365  it != itEnd;
366  ++it, ++i) {
367  //std::cout <<"making "<<kTypeNames[i]<<std::endl;
368  TTree* tree = new TTree(kTypeNames[i], kTypeNames[i]);
369  *it = std::shared_ptr<TreeHelperBase>(makeHelper(i, tree, m_fullNameBufferPtr));
370  tree->SetDirectory(m_file.get()); //TFile takes ownership
371  }
372 
385 }
386 
388 
390  //std::cout << "DQMRootOutputModule::writeLuminosityBlock"<< std::endl;
391  edm::Service<DQMStore> dstore;
392  m_run = iLumi.id().run();
393  m_lumi = iLumi.id().value();
394  m_beginTime = iLumi.beginTime().value();
395  m_endTime = iLumi.endTime().value();
396  bool shouldWrite = (m_filterOnRun == 0 || (m_filterOnRun != 0 && m_filterOnRun == m_run));
397 
398  if (!shouldWrite)
399  return;
400  std::vector<MonitorElement*> items(dstore->getAllContents("", m_run, m_lumi));
401  for (std::vector<MonitorElement*>::iterator it = items.begin(), itEnd = items.end(); it != itEnd; ++it) {
402  assert((*it)->getScope() == MonitorElementData::Scope::LUMI);
403  std::map<unsigned int, unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((int)(*it)->kind());
404  assert(itFound != m_dqmKindToTypeIndex.end());
405  m_treeHelpers[itFound->second]->fill(*it);
406  }
407 
408  const edm::ProcessHistoryID& id = iLumi.processHistoryID();
409  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(), m_seenHistories.end(), id);
410  if (itFind == m_seenHistories.end()) {
413  m_seenHistories.push_back(id);
414  } else {
415  m_presentHistoryIndex = itFind - m_seenHistories.begin();
416  }
417 
418  //Now store the relationship between run/lumi and indices in the other TTrees
419  bool storedLumiIndex = false;
420  unsigned int typeIndex = 0;
421  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
422  it != itEnd;
423  ++it, ++typeIndex) {
424  if ((*it)->wasFilled()) {
425  m_type = typeIndex;
426  (*it)->getRangeAndReset(m_firstIndex, m_lastIndex);
427  storedLumiIndex = true;
428  tbb::this_task_arena::isolate([&] { m_indicesTree->Fill(); });
429  }
430  }
431  if (not storedLumiIndex) {
432  //need to record lumis even if we stored no MonitorElements since some later DQM modules
433  // look to see what lumis were processed
435  m_firstIndex = 0;
436  m_lastIndex = 0;
437  tbb::this_task_arena::isolate([&] { m_indicesTree->Fill(); });
438  }
439 
442 }
443 
445  //std::cout << "DQMRootOutputModule::writeRun"<< std::endl;
446  edm::Service<DQMStore> dstore;
447  m_run = iRun.id().run();
448  m_lumi = 0;
449  m_beginTime = iRun.beginTime().value();
450  m_endTime = iRun.endTime().value();
451  bool shouldWrite = (m_filterOnRun == 0 || (m_filterOnRun != 0 && m_filterOnRun == m_run));
452 
453  if (!shouldWrite)
454  return;
455 
456  std::vector<MonitorElement*> items(dstore->getAllContents("", m_run, 0));
457  for (std::vector<MonitorElement*>::iterator it = items.begin(), itEnd = items.end(); it != itEnd; ++it) {
458  assert((*it)->getScope() == MonitorElementData::Scope::RUN);
459  std::map<unsigned int, unsigned int>::iterator itFound = m_dqmKindToTypeIndex.find((int)(*it)->kind());
460  assert(itFound != m_dqmKindToTypeIndex.end());
461  m_treeHelpers[itFound->second]->fill(*it);
462  }
463 
464  const edm::ProcessHistoryID& id = iRun.processHistoryID();
465  std::vector<edm::ProcessHistoryID>::iterator itFind = std::find(m_seenHistories.begin(), m_seenHistories.end(), id);
466  if (itFind == m_seenHistories.end()) {
469  m_seenHistories.push_back(id);
470  } else {
471  m_presentHistoryIndex = itFind - m_seenHistories.begin();
472  }
473 
474  //Now store the relationship between run/lumi and indices in the other TTrees
475  unsigned int typeIndex = 0;
476  for (std::vector<std::shared_ptr<TreeHelperBase> >::iterator it = m_treeHelpers.begin(), itEnd = m_treeHelpers.end();
477  it != itEnd;
478  ++it, ++typeIndex) {
479  if ((*it)->wasFilled()) {
480  m_type = typeIndex;
481  (*it)->getRangeAndReset(m_firstIndex, m_lastIndex);
482  tbb::this_task_arena::isolate([&] { m_indicesTree->Fill(); });
483  }
484  }
485 
488 }
489 
491  startEndFile();
492  finishEndFile();
493 }
494 
496  //std::cout << "DQMRootOutputModule::startEndFile"<< std::endl;
497  //fill in the meta data
498  m_file->cd();
499  TDirectory* metaDataDirectory = m_file->mkdir(kMetaDataDirectory);
500 
501  //Write out the Process History
502  TTree* processHistoryTree = new TTree(kProcessHistoryTree, kProcessHistoryTree);
503  processHistoryTree->SetDirectory(metaDataDirectory);
504 
505  unsigned int index = 0;
506  processHistoryTree->Branch(kPHIndexBranch, &index);
508  processHistoryTree->Branch(kProcessConfigurationProcessNameBranch, &processName);
509  std::string parameterSetID;
510  processHistoryTree->Branch(kProcessConfigurationParameterSetIDBranch, &parameterSetID);
511  std::string releaseVersion;
512  processHistoryTree->Branch(kProcessConfigurationReleaseVersion, &releaseVersion);
513  std::string passID;
514  processHistoryTree->Branch(kProcessConfigurationPassID, &passID);
515 
516  for (std::vector<edm::ProcessHistoryID>::iterator it = m_seenHistories.begin(), itEnd = m_seenHistories.end();
517  it != itEnd;
518  ++it) {
520  assert(nullptr != history);
521  index = 0;
522  for (edm::ProcessHistory::collection_type::const_iterator itPC = history->begin(), itPCEnd = history->end();
523  itPC != itPCEnd;
524  ++itPC, ++index) {
525  processName = itPC->processName();
526  releaseVersion = itPC->releaseVersion();
527  passID = itPC->passID();
528  parameterSetID = itPC->parameterSetID().compactForm();
529  tbb::this_task_arena::isolate([&] { processHistoryTree->Fill(); });
530  }
531  }
532 
533  //Store the ParameterSets
534  TTree* parameterSetsTree = new TTree(kParameterSetTree, kParameterSetTree);
535  parameterSetsTree->SetDirectory(metaDataDirectory);
536  std::string blob;
537  parameterSetsTree->Branch(kParameterSetBranch, &blob);
538 
540  assert(nullptr != psr);
541  for (edm::pset::Registry::const_iterator it = psr->begin(), itEnd = psr->end(); it != itEnd; ++it) {
542  blob.clear();
543  it->second.toString(blob);
544  tbb::this_task_arena::isolate([&] { parameterSetsTree->Fill(); });
545  }
546 }
547 
549  //std::cout << "DQMRootOutputModule::finishEndFile"<< std::endl;
550  m_file->Write();
551  m_file->Close();
554 }
555 
556 //
557 // const member functions
558 //
559 
560 //
561 // static member functions
562 //
565 
566  desc.addUntracked<std::string>("fileName");
567  desc.addUntracked<std::string>("logicalFileName", "");
568  desc.addUntracked<unsigned int>("filterOnRun", 0)
569  ->setComment("Only write the run with this run number. 0 means write all runs.");
570  desc.addOptionalUntracked<int>("splitLevel", 99)
571  ->setComment("UNUSED Only here to allow older configurations written for PoolOutputModule to work.");
572  const std::vector<std::string> keep = {"drop *", "keep DQMToken_*_*_*"};
574 
576  dataSet.setAllowAnything();
577  desc.addUntracked<edm::ParameterSetDescription>("dataset", dataSet)
578  ->setComment("PSet is only used by Data Operations and not by this module.");
579 
580  descriptions.addDefault(desc);
581 }
582 
const_iterator begin() const
void reallyCloseFile() override
Timestamp const & endTime() const
Definition: RunForOutput.h:58
static const char *const kProcessHistoryTree
Definition: format.h:75
static const char *const kRunBranch
Definition: format.h:59
map_type::const_iterator const_iterator
Definition: Registry.h:61
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)
uint16_t *__restrict__ id
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:55
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static const char *const kIndicesTree
Definition: format.h:58
unsigned int m_presentHistoryIndex
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
void reportRunNumber(JobReport::Token token, unsigned int run)
Definition: JobReport.cc:468
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
assert(be >=bs)
virtual std::vector< dqm::harvesting::MonitorElement * > getAllContents(std::string const &path) const
Definition: DQMStore.cc:609
Timestamp const & beginTime() const
Definition: RunForOutput.h:57
dqm::reco::DQMStore DQMStore
static const char *const kPHIndexBranch
Definition: format.h:76
const int keep
static const char *const kParameterSetBranch
Definition: format.h:83
bool isFileOpen() const override
std::map< unsigned int, unsigned int > m_dqmKindToTypeIndex
void addDefault(ParameterSetDescription const &psetDescription)
virtual ProcessHistory const & processHistory() const
MD5Result digest()
Definition: Digest.cc:171
static const char *const kMetaDataDirectory
Definition: format.h:73
ModuleDescription const & description() const
static const char *const kParameterSetTree
Definition: format.h:82
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
static const char *const kEndTimeBranch
Definition: format.h:63
Timestamp const & endTime() const
std::unique_ptr< TFile > m_file
ProcessHistoryID const & processHistoryID() const
std::size_t Token
Definition: JobReport.h:106
DQMRootOutputModule(edm::ParameterSet const &pset)
static const char *const kProcessConfigurationPassID
Definition: format.h:80
doFill
Definition: cuy.py:575
std::string createGlobalIdentifier(bool binary=false)
std::string * m_fullNameBufferPtr
void fill(std::map< std::string, TH1 * > &h, const std::string &s, double x)
void writeRun(edm::RunForOutput const &) override
std::string const & processName() const
dqm::legacy::MonitorElement MonitorElement
static const char *const kCmsGuid
Definition: format.h:69
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:79
static const char *const kProcessConfigurationProcessNameBranch
Definition: format.h:77
Timestamp const & beginTime() const
const_iterator end() const
static const char *const kBeginTimeBranch
Definition: format.h:62
virtual double getFloatValue() const
virtual const std::string & getStringValue() const
void outputFileClosed(Token fileToken)
Definition: JobReport.cc:431
std::string getFullname() const
get full name of ME including Pathname
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)
LuminosityBlockID const & id() const
long double T
static void fillDescription(ParameterSetDescription &desc, std::vector< std::string > const &iDefaultOutputCommands=ProductSelectorRules::defaultSelectionStrings())
TimeValue_t value() const
Definition: Timestamp.h:45
static Registry * instance()
Definition: Registry.cc:12
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:457
static const char *const kProcessConfigurationParameterSetIDBranch
Definition: format.h:78
std::vector< edm::ProcessHistoryID > m_seenHistories
unsigned transform(const HcalDetId &id, unsigned transformCode)