CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
edm::RootOutputFile Class Reference

#include <RootOutputFile.h>

Public Types

using OutputItem = PoolOutputModule::OutputItem
 
using OutputItemList = PoolOutputModule::OutputItemList
 

Public Member Functions

void beginInputFile (FileBlock const &fb, int remainingEvents)
 
std::string const & fileName () const
 
void finishEndFile ()
 
void respondToCloseInputFile (FileBlock const &fb)
 
 RootOutputFile (PoolOutputModule *om, std::string const &fileName, std::string const &logicalFileName, std::vector< std::string > const &processesWithSelectedMergeableRunProducts)
 
bool shouldWeCloseFile () const
 
void writeBranchIDListRegistry ()
 
void writeEventAuxiliary ()
 
void writeFileFormatVersion ()
 
void writeFileIdentifier ()
 
void writeIndexIntoFile ()
 
void writeLuminosityBlock (LuminosityBlockForOutput const &lb)
 
void writeOne (EventForOutput const &e)
 
void writeParameterSetRegistry ()
 
void writeParentageRegistry ()
 
void writeProcessBlock (ProcessBlockForOutput const &)
 
void writeProcessBlockHelper ()
 
void writeProcessHistoryRegistry ()
 
void writeProductDependencies ()
 
void writeProductDescriptionRegistry ()
 
void writeRun (RunForOutput const &r)
 
void writeStoredMergeableRunProductMetadata ()
 
void writeThinnedAssociationsHelper ()
 
 ~RootOutputFile ()
 

Private Member Functions

std::shared_ptr< TFile const > filePtr () const
 
std::shared_ptr< TFile > & filePtr ()
 
void fillBranches (BranchType const &branchType, OccurrenceForOutput const &occurrence, unsigned int ttreeIndex, StoredProductProvenanceVector *productProvenanceVecPtr=nullptr, ProductProvenanceRetriever const *provRetriever=nullptr)
 
void insertAncestors (ProductProvenance const &iGetParents, ProductProvenanceRetriever const *iMapper, bool produced, std::set< BranchID > const &producedBranches, std::set< StoredProductProvenance > &oToFill)
 
bool insertProductProvenance (const ProductProvenance &, std::set< StoredProductProvenance > &oToInsert)
 
StoredProductProvenanceVector
const * 
pEventEntryInfoVector () const
 
StoredProductProvenanceVector *& pEventEntryInfoVector ()
 
void setBranchAliases (TTree *tree, SelectedProducts const &branches, std::string const &processName) const
 

Private Attributes

std::set< BranchIDbranchesWithStoredHistory_
 
bool canFastCloneAux_
 
CompactEventAuxiliaryVector compactEventAuxiliary_
 
bool dataTypeReported_
 
StoredProductProvenanceVector eventEntryInfoVector_
 
IndexIntoFile::EntryNumber_t eventEntryNumber_
 
RootOutputTree eventTree_
 
FileID fid_
 
std::string file_
 
edm::propagate_const
< std::shared_ptr< TFile > > 
filePtr_
 
IndexIntoFile indexIntoFile_
 
std::string logicalFile_
 
LuminosityBlockAuxiliary lumiAux_
 
IndexIntoFile::EntryNumber_t lumiEntryNumber_
 
RootOutputTree lumiTree_
 
edm::propagate_const< TTree * > metaDataTree_
 
unsigned long nEventsInLumi_
 
edm::propagate_const
< PoolOutputModule * > 
om_
 
edm::propagate_const< TTree * > parameterSetsTree_
 
std::map< ParentageID,
unsigned int > 
parentageIDs_
 
edm::propagate_const< TTree * > parentageTree_
 
BranchListIndexes const * pBranchListIndexes_
 
EventAuxiliary const * pEventAux_
 
edm::propagate_const
< StoredProductProvenanceVector * > 
pEventEntryInfoVector_
 
EventSelectionIDVector const * pEventSelectionIDs_
 
EventToProcessBlockIndexes const * pEventToProcessBlockIndexes_
 
LuminosityBlockAuxiliary const * pLumiAux_
 
std::vector
< edm::propagate_const
< std::unique_ptr
< RootOutputTree > > > 
processBlockTrees_
 
ProcessHistoryRegistry processHistoryRegistry_
 
RunAuxiliary const * pRunAux_
 
JobReport::Token reportToken_
 
RunAuxiliary runAux_
 
IndexIntoFile::EntryNumber_t runEntryNumber_
 
RootOutputTree runTree_
 
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
 
std::vector
< edm::propagate_const
< RootOutputTree * > > 
treePointers_
 
int whyNotFastClonable_
 
edm::propagate_const< TClass * > wrapperBaseTClass_
 

Detailed Description

Definition at line 48 of file RootOutputFile.h.

Member Typedef Documentation

Definition at line 50 of file RootOutputFile.h.

Definition at line 51 of file RootOutputFile.h.

Constructor & Destructor Documentation

edm::RootOutputFile::RootOutputFile ( PoolOutputModule om,
std::string const &  fileName,
std::string const &  logicalFileName,
std::vector< std::string > const &  processesWithSelectedMergeableRunProducts 
)
explicit

Definition at line 81 of file RootOutputFile.cc.

References edm::RootOutputTree::addAuxiliary(), edm::RootOutputTree::addBranch(), branchesWithStoredHistory_, edm::poolNames::branchListIndexesBranchName(), edm::BranchDescription::branchName(), haddnano::branchNames, edm::BranchTypeToAuxiliaryBranchName(), edm::BranchTypeToProductProvenanceBranchName(), edm::errors::Configuration, edm::createGlobalIdentifier(), submitPVResolutionJobs::desc, cms::Digest::digest(), edm::PoolOutputModule::eventAutoFlushSize(), edm::poolNames::eventSelectionsBranchName(), edm::poolNames::eventToProcessBlockIndexesBranchName(), eventTree_, Exception, fid_, file_, filePtr(), filePtr_, edm::BranchDescription::fullClassName(), edm::propagate_const< T >::get(), mps_fire::i, edm::InEvent, edm::InLumi, edm::InProcess, edm::InRun, B2GTnPMonitor_cfi::item, logicalFile_, lumiTree_, edm::RootOutputTree::makeTTree(), metaDataTree_, edm::poolNames::metaDataTreeName(), edm::BranchDescription::moduleLabel(), edm::moduleName(), om_, parameterSetsTree_, edm::poolNames::parameterSetsTreeName(), parentageTree_, edm::poolNames::parentageTreeName(), pBranchListIndexes_, pEventAux_, pEventEntryInfoVector(), pEventSelectionIDs_, pEventToProcessBlockIndexes_, pLumiAux_, processBlockTrees_, edm::BranchDescription::processName(), FSQHLTOfflineSource_cfi::processName, edm::BranchDescription::productInstanceName(), pRunAux_, reportToken_, runTree_, edm::PoolOutputModule::selectedOutputItemList(), edm::RootOutputTree::setAutoFlush(), edm::sort_all(), AlCaHLTBitMon_QueryRunRegistry::string, cms::MD5Result::toString(), edm::RootOutputTree::tree(), treePointers_, and edm::BranchDescription::wrappedName().

85  : file_(fileName),
86  logicalFile_(logicalFileName),
87  reportToken_(0),
88  om_(om),
89  whyNotFastClonable_(om_->whyNotFastClonable()),
90  canFastCloneAux_(false),
91  filePtr_(openTFile(file_.c_str(), om_->compressionLevel())),
92  fid_(),
97  storedMergeableRunProductMetadata_(processesWithSelectedMergeableRunProducts),
98  nEventsInLumi_(0),
99  metaDataTree_(nullptr),
100  parameterSetsTree_(nullptr),
101  parentageTree_(nullptr),
102  lumiAux_(),
103  runAux_(),
104  pEventAux_(nullptr),
106  pRunAux_(&runAux_),
109  pBranchListIndexes_(nullptr),
110  pEventSelectionIDs_(nullptr),
111  eventTree_(filePtr(), InEvent, om_->splitLevel(), om_->treeMaxVirtualSize()),
112  lumiTree_(filePtr(), InLumi, om_->splitLevel(), om_->treeMaxVirtualSize()),
113  runTree_(filePtr(), InRun, om_->splitLevel(), om_->treeMaxVirtualSize()),
114  dataTypeReported_(false),
116  parentageIDs_(),
118  wrapperBaseTClass_(TClass::GetClass("edm::WrapperBase")) {
119  std::vector<std::string> const& processesWithProcessBlockProducts =
120  om_->outputProcessBlockHelper().processesWithProcessBlockProducts();
121  for (auto const& processName : processesWithProcessBlockProducts) {
122  processBlockTrees_.emplace_back(std::make_unique<RootOutputTree>(
123  filePtr(), InProcess, om_->splitLevel(), om_->treeMaxVirtualSize(), processName));
124  }
125 
126  if (om_->compressionAlgorithm() == std::string("ZLIB")) {
127  filePtr_->SetCompressionAlgorithm(ROOT::kZLIB);
128  } else if (om_->compressionAlgorithm() == std::string("LZMA")) {
129  filePtr_->SetCompressionAlgorithm(ROOT::kLZMA);
130  } else if (om_->compressionAlgorithm() == std::string("ZSTD")) {
131  filePtr_->SetCompressionAlgorithm(ROOT::kZSTD);
132  } else if (om_->compressionAlgorithm() == std::string("LZ4")) {
133  filePtr_->SetCompressionAlgorithm(ROOT::kLZ4);
134  } else {
136  << "PoolOutputModule configured with unknown compression algorithm '" << om_->compressionAlgorithm() << "'\n"
137  << "Allowed compression algorithms are ZLIB, LZMA, LZ4, and ZSTD\n";
138  }
139  if (-1 != om->eventAutoFlushSize()) {
140  eventTree_.setAutoFlush(-1 * om->eventAutoFlushSize());
141  }
142  if (om_->compactEventAuxiliary()) {
143  eventTree_.addAuxiliary<EventAuxiliary>(
144  BranchTypeToAuxiliaryBranchName(InEvent), pEventAux_, om_->auxItems()[InEvent].basketSize_, false);
145  eventTree_.tree()->SetBranchStatus(BranchTypeToAuxiliaryBranchName(InEvent).c_str(),
146  false); // see writeEventAuxiliary
147  } else {
148  eventTree_.addAuxiliary<EventAuxiliary>(
149  BranchTypeToAuxiliaryBranchName(InEvent), pEventAux_, om_->auxItems()[InEvent].basketSize_);
150  }
151 
154  om_->auxItems()[InEvent].basketSize_);
156  poolNames::eventSelectionsBranchName(), pEventSelectionIDs_, om_->auxItems()[InEvent].basketSize_, false);
159 
160  if (om_->outputProcessBlockHelper().productsFromInputKept()) {
163  om_->auxItems()[InEvent].basketSize_);
164  }
165 
166  lumiTree_.addAuxiliary<LuminosityBlockAuxiliary>(
167  BranchTypeToAuxiliaryBranchName(InLumi), pLumiAux_, om_->auxItems()[InLumi].basketSize_);
168 
169  runTree_.addAuxiliary<RunAuxiliary>(
170  BranchTypeToAuxiliaryBranchName(InRun), pRunAux_, om_->auxItems()[InRun].basketSize_);
171 
172  treePointers_.emplace_back(&eventTree_);
173  treePointers_.emplace_back(&lumiTree_);
174  treePointers_.emplace_back(&runTree_);
175  for (auto& processBlockTree : processBlockTrees_) {
176  treePointers_.emplace_back(processBlockTree.get());
177  }
178 
179  for (unsigned int i = 0; i < treePointers_.size(); ++i) {
180  RootOutputTree* theTree = treePointers_[i];
181  for (auto& item : om_->selectedOutputItemList()[i]) {
182  item.setProduct(nullptr);
183  BranchDescription const& desc = *item.branchDescription();
184  theTree->addBranch(desc.branchName(),
185  desc.wrappedName(),
186  item.product(),
187  item.splitLevel(),
188  item.basketSize(),
189  item.branchDescription()->produced());
190  //make sure we always store product registry info for all branches we create
191  branchesWithStoredHistory_.insert(item.branchID());
192  }
193  }
194  // Don't split metadata tree or event description tree
198 
199  fid_ = FileID(createGlobalIdentifier());
200 
201  // For the Job Report, get a vector of branch names in the "Events" tree.
202  // Also create a hash of all the branch names in the "Events" tree
203  // in a deterministic order, except use the full class name instead of the friendly class name.
204  // To avoid extra string copies, we create a vector of pointers into the product registry,
205  // and use a custom comparison operator for sorting.
206  std::vector<std::string> branchNames;
207  std::vector<BranchDescription const*> branches;
208  branchNames.reserve(om_->selectedOutputItemList()[InEvent].size());
209  branches.reserve(om->selectedOutputItemList()[InEvent].size());
210  for (auto const& item : om_->selectedOutputItemList()[InEvent]) {
211  branchNames.push_back(item.branchDescription()->branchName());
212  branches.push_back(item.branchDescription());
213  }
214  // Now sort the branches for the hash.
215  sort_all(branches, sorterForJobReportHash);
216  // Now, make a concatenated string.
217  std::ostringstream oss;
218  char const underscore = '_';
219  for (auto const& branch : branches) {
220  BranchDescription const& bd = *branch;
221  oss << bd.fullClassName() << underscore << bd.moduleLabel() << underscore << bd.productInstanceName()
222  << underscore << bd.processName() << underscore;
223  }
224  std::string stringrep = oss.str();
225  cms::Digest md5alg(stringrep);
226 
227  // Register the output file with the JobReport service
228  // and get back the token for it.
229  std::string moduleName = "PoolOutputModule";
230  Service<JobReport> reportSvc;
231  reportToken_ = reportSvc->outputFileOpened(file_,
232  logicalFile_, // PFN and LFN
233  om_->catalog(), // catalog
234  moduleName, // module class name
235  om_->moduleLabel(), // module label
236  fid_.fid(), // file id (guid)
237  std::string(), // data type (not yet known, so string is empty).
238  md5alg.digest().toString(), // branch hash
239  branchNames); // branch names being written
240  }
LuminosityBlockAuxiliary lumiAux_
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:116
std::string const & parentageTreeName()
Definition: BranchType.cc:154
TTree const * tree() const
std::map< ParentageID, unsigned int > parentageIDs_
edm::propagate_const< TTree * > metaDataTree_
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:210
void setAutoFlush(Long64_t size)
constexpr Matriplex::idx_t LL
Definition: Matrix.h:45
std::set< BranchID > branchesWithStoredHistory_
std::vector< edm::propagate_const< RootOutputTree * > > treePointers_
std::vector< EventSelectionID > EventSelectionIDVector
std::string const & parameterSetsTreeName()
Definition: BranchType.cc:216
std::string const & fileName() const
std::shared_ptr< TFile const > filePtr() const
RootOutputTree eventTree_
std::vector< BranchListIndex > BranchListIndexes
edm::propagate_const< PoolOutputModule * > om_
IndexIntoFile::EntryNumber_t eventEntryNumber_
LuminosityBlockAuxiliary const * pLumiAux_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
std::string logicalFile_
std::string const & metaDataTreeName()
Definition: BranchType.cc:159
edm::propagate_const< TClass * > wrapperBaseTClass_
std::string const & eventToProcessBlockIndexesBranchName()
Definition: BranchType.cc:214
static TTree * makeTTree(TFile *filePtr, std::string const &name, int splitLevel)
EventSelectionIDVector const * pEventSelectionIDs_
std::string createGlobalIdentifier(bool binary=false)
edm::propagate_const< TTree * > parameterSetsTree_
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
Definition: Algorithms.h:92
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_
RootOutputTree runTree_
StoredProductProvenanceVector eventEntryInfoVector_
edm::propagate_const< TTree * > parentageTree_
void addAuxiliary(std::string const &branchName, T const *&pAux, int bufSize, bool allowCloning=true)
std::vector< StoredProductProvenance > StoredProductProvenanceVector
IndexIntoFile indexIntoFile_
constexpr element_type const * get() const
IndexIntoFile::EntryNumber_t runEntryNumber_
std::string moduleName(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:27
EventAuxiliary const * pEventAux_
RunAuxiliary runAux_
std::string const & BranchTypeToProductProvenanceBranchName(BranchType const &BranchType)
Definition: BranchType.cc:139
StoredProductProvenanceVector const * pEventEntryInfoVector() const
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:212
BranchListIndexes const * pBranchListIndexes_
tuple branchNames
Definition: haddnano.py:54
std::vector< edm::propagate_const< std::unique_ptr< RootOutputTree > > > processBlockTrees_
IndexIntoFile::EntryNumber_t lumiEntryNumber_
RootOutputTree lumiTree_
RunAuxiliary const * pRunAux_
JobReport::Token reportToken_
EventToProcessBlockIndexes const * pEventToProcessBlockIndexes_
edm::RootOutputFile::~RootOutputFile ( )
inline

Definition at line 56 of file RootOutputFile.h.

56 {}

Member Function Documentation

void edm::RootOutputFile::beginInputFile ( FileBlock const &  fb,
int  remainingEvents 
)

Definition at line 330 of file RootOutputFile.cc.

References cms::cuda::assert(), edm::FileBlock::BranchMismatch, edm::FileBlock::CanFastClone, canFastCloneAux_, edm::RootOutputTree::checkIfFastClonable(), edm::RootOutputTree::checkSplitLevelsAndBasketSizes(), compactEventAuxiliary_, edm::FileBlock::EventSelectionUsed, eventTree_, Exception, file_, edm::FileBlock::fileName(), filePtr_, timingPdfMaker::infile, edm::match(), edm::RootOutputTree::maybeFastCloneTree(), SiStripPI::min, edm::errors::MismatchedInputFiles, edm::FileBlock::NoRootInputSource, om_, edm::FileBlock::OutputMaxEventsTooSmall, edm::FileBlock::ParallelProcesses, reportToken_, edm::CompactEventAuxiliaryVector::reserve(), edm::RootOutputTree::setSubBranchBasketSizes(), edm::CompactEventAuxiliaryVector::size(), edm::FileBlock::SplitLevelMismatch, edm::FileBlock::tree(), edm::FileBlock::whyNotFastClonable(), and whyNotFastClonable_.

330  {
331  // Reset per input file information
332  whyNotFastClonable_ = om_->whyNotFastClonable();
333  canFastCloneAux_ = false;
334 
335  if (fb.tree() != nullptr) {
336  whyNotFastClonable_ |= fb.whyNotFastClonable();
337 
338  if (remainingEvents >= 0 && remainingEvents < fb.tree()->GetEntries()) {
340  }
341 
343  if (!match) {
344  if (om_->overrideInputFileSplitLevels()) {
345  // We may be fast copying. We must disable fast copying if the split levels
346  // or basket sizes do not match.
348  } else {
349  // We are using the input split levels and basket sizes from the first input file
350  // for copied output branches. In this case, we throw an exception if any branches
351  // have different split levels or basket sizes in a subsequent input file.
352  // If the mismatch is in the first file, there is a bug somewhere, so we assert.
353  assert(om_->inputFileCount() > 1);
354  throw Exception(errors::MismatchedInputFiles, "RootOutputFile::beginInputFile()")
355  << "Merge failure because input file " << file_ << " has different ROOT split levels or basket sizes\n"
356  << "than previous files. To allow merging in spite of this, use the configuration parameter\n"
357  << "overrideInputFileSplitLevels=cms.untracked.bool(True)\n"
358  << "in every PoolOutputModule.\n";
359  }
360  }
361 
362  // Since this check can be time consuming, we do it only if we would otherwise fast clone.
364  if (!eventTree_.checkIfFastClonable(fb.tree())) {
366  }
367  }
368 
369  // reasons for whyNotFastClonable that are also inconsistent with a merge job
370  constexpr auto setSubBranchBasketConditions =
374 
375  if (om_->inputFileCount() == 1) {
376  if (om_->mergeJob()) {
377  // for merge jobs always forward the compression mode
378  auto infile = fb.tree()->GetCurrentFile();
379  if (infile != nullptr) {
380  filePtr_->SetCompressionSettings(infile->GetCompressionSettings());
381  }
382  }
383 
384  // if we aren't fast cloning, and the reason why is consistent with a
385  // merge job or is only because of parallel processes, then forward all
386  // the sub-branch basket sizes
388  ((om_->mergeJob() && (whyNotFastClonable_ & setSubBranchBasketConditions) == 0) ||
391  }
392  }
393 
394  // We now check if we can fast copy the auxiliary branches.
395  // We can do so only if we can otherwise fast copy,
396  // the input file has the current format (these branches are in the Events Tree),
397  // there are no newly dropped or produced products,
398  // no metadata has been dropped,
399  // ID's have not been modified,
400  // and the branch list indexes do not need modification.
401 
402  // Note: Fast copy of the EventProductProvenance branch is unsafe
403  // unless we can enforce that the parentage information for a fully copied
404  // output file will be the same as for the input file, with nothing dropped.
405  // This has never been enforced, and, withthe EDAlias feature, it may no longer
406  // work by accident.
407  // So, for now, we do not enable fast cloning of the non-product branches.
408  /*
409  Service<ConstProductRegistry> reg;
410  canFastCloneAux_ = (whyNotFastClonable_ == FileBlock::CanFastClone) &&
411  fb.fileFormatVersion().noMetaDataTrees() &&
412  !om_->hasNewlyDroppedBranch()[InEvent] &&
413  !fb.hasNewlyDroppedBranch()[InEvent] &&
414  om_->dropMetaData() == PoolOutputModule::DropNone &&
415  !reg->anyProductProduced() &&
416  !fb.modifiedIDs() &&
417  fb.branchListIndexesUnchanged();
418  */
419 
420  // Report the fast copying status.
421  Service<JobReport> reportSvc;
422  reportSvc->reportFastCopyingStatus(reportToken_, fb.fileName(), whyNotFastClonable_ == FileBlock::CanFastClone);
423  } else {
425  }
426 
428  whyNotFastClonable_ == FileBlock::CanFastClone, canFastCloneAux_, fb.tree(), om_->basketOrder());
429 
430  // Possibly issue warning or informational message if we haven't fast cloned.
431  if (fb.tree() != nullptr && whyNotFastClonable_ != FileBlock::CanFastClone) {
432  maybeIssueWarning(whyNotFastClonable_, fb.fileName(), file_);
433  }
434 
435  if (om_->compactEventAuxiliary() &&
438  long long int reserve = remainingEvents;
439  if (fb.tree() != nullptr) {
440  reserve = reserve > 0 ? std::min(fb.tree()->GetEntries(), reserve) : fb.tree()->GetEntries();
441  }
442  if (reserve > 0) {
444  }
445  }
446  }
bool checkSplitLevelsAndBasketSizes(TTree *inputTree) const
assert(be >=bs)
bool checkIfFastClonable(TTree *inputTree) const
RootOutputTree eventTree_
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
CompactEventAuxiliaryVector compactEventAuxiliary_
void setSubBranchBasketSizes(TTree *inputTree) const
void maybeFastCloneTree(bool canFastClone, bool canFastCloneAux, TTree *tree, std::string const &option)
JobReport::Token reportToken_
std::string match(BranchDescription const &a, BranchDescription const &b, std::string const &fileName)
std::string const& edm::RootOutputFile::fileName ( ) const
inline

Definition at line 81 of file RootOutputFile.h.

References file_.

81 { return file_; }
std::shared_ptr<TFile const> edm::RootOutputFile::filePtr ( ) const
inlineprivate

Definition at line 100 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

Referenced by RootOutputFile().

100 { return get_underlying_safe(filePtr_); }
constexpr std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
std::shared_ptr<TFile>& edm::RootOutputFile::filePtr ( )
inlineprivate

Definition at line 101 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

101 { return get_underlying_safe(filePtr_); }
constexpr std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
void edm::RootOutputFile::fillBranches ( BranchType const &  branchType,
OccurrenceForOutput const &  occurrence,
unsigned int  ttreeIndex,
StoredProductProvenanceVector productProvenanceVecPtr = nullptr,
ProductProvenanceRetriever const *  provRetriever = nullptr 
)
private

Definition at line 838 of file RootOutputFile.cc.

References cms::cuda::assert(), branchesWithStoredHistory_, edm::ProductProvenanceLookup::branchIDToProvenance(), edm::FileBlock::CanFastClone, CommonMethods::cp(), edm::PoolOutputModule::DropAll, edm::PoolOutputModule::DropNone, edm::PoolOutputModule::DropPrior, test_L1EGCrystalClusterEmulator_cfg::fastCloning, edm::OccurrenceForOutput::getByToken(), edm::getWrapperBasePtr(), edm::InEvent, insertAncestors(), insertProductProvenance(), edm::BasicHandle::isValid(), B2GTnPMonitor_cfi::item, mps_monitormerge::items, eostools::move(), hltrates_dqm_sourceclient-live_cfg::offset, om_, AlCaHLTBitMon_ParallelJobs::p, edm::preg, edm::Provenance::productProvenance(), edm::BasicHandle::provenance(), mps_fire::result, treePointers_, whyNotFastClonable_, edm::BasicHandle::wrapper(), and wrapperBaseTClass_.

Referenced by writeLuminosityBlock(), writeOne(), writeProcessBlock(), and writeRun().

842  {
843  std::vector<std::unique_ptr<WrapperBase> > dummies;
844 
845  OutputItemList& items = om_->selectedOutputItemList()[ttreeIndex];
846 
847  bool const doProvenance =
848  (productProvenanceVecPtr != nullptr) && (om_->dropMetaData() != PoolOutputModule::DropAll);
849  bool const keepProvenanceForPrior = doProvenance && om_->dropMetaData() != PoolOutputModule::DropPrior;
850 
851  bool const fastCloning = (branchType == InEvent) && (whyNotFastClonable_ == FileBlock::CanFastClone);
852  std::set<StoredProductProvenance> provenanceToKeep;
853  //
854  //If we are dropping some of the meta data we need to know
855  // which BranchIDs were produced in this process because
856  // we may be storing meta data for only those products
857  // We do this only for event products.
858  std::set<BranchID> producedBranches;
859  if (doProvenance && branchType == InEvent && om_->dropMetaData() != PoolOutputModule::DropNone) {
861  for (auto bd : preg->allBranchDescriptions()) {
862  if (bd->produced() && bd->branchType() == InEvent) {
863  producedBranches.insert(bd->branchID());
864  }
865  }
866  }
867 
868  // Loop over EDProduct branches, possibly fill the provenance, and write the branch.
869  for (auto& item : items) {
870  BranchID const& id = item.branchDescription()->branchID();
871  branchesWithStoredHistory_.insert(id);
872 
873  bool produced = item.branchDescription()->produced();
874  bool getProd =
875  (produced || !fastCloning || treePointers_[ttreeIndex]->uncloned(item.branchDescription()->branchName()));
876  bool keepProvenance = doProvenance && (produced || keepProvenanceForPrior);
877 
878  WrapperBase const* product = nullptr;
879  ProductProvenance const* productProvenance = nullptr;
880  if (getProd) {
881  BasicHandle result = occurrence.getByToken(item.token(), item.branchDescription()->unwrappedTypeID());
882  product = result.wrapper();
883  if (result.isValid() && keepProvenance) {
884  productProvenance = result.provenance()->productProvenance();
885  }
886  if (product == nullptr) {
887  // No product with this ID is in the event.
888  // Add a null product.
889  TClass* cp = item.branchDescription()->wrappedType().getClass();
890  assert(cp != nullptr);
891  int offset = cp->GetBaseClassOffset(wrapperBaseTClass_);
892  void* p = cp->New();
893  std::unique_ptr<WrapperBase> dummy = getWrapperBasePtr(p, offset);
894  product = dummy.get();
895  dummies.emplace_back(std::move(dummy));
896  }
897  item.setProduct(product);
898  }
899  if (keepProvenance && productProvenance == nullptr) {
900  productProvenance = provRetriever->branchIDToProvenance(item.branchDescription()->originalBranchID());
901  }
902  if (productProvenance) {
903  insertProductProvenance(*productProvenance, provenanceToKeep);
904  insertAncestors(*productProvenance, provRetriever, produced, producedBranches, provenanceToKeep);
905  }
906  }
907 
908  if (doProvenance)
909  productProvenanceVecPtr->assign(provenanceToKeep.begin(), provenanceToKeep.end());
910  treePointers_[ttreeIndex]->fillTree();
911  if (doProvenance)
912  productProvenanceVecPtr->clear();
913  }
PoolOutputModule::OutputItemList OutputItemList
void insertAncestors(ProductProvenance const &iGetParents, ProductProvenanceRetriever const *iMapper, bool produced, std::set< BranchID > const &producedBranches, std::set< StoredProductProvenance > &oToFill)
assert(be >=bs)
std::set< BranchID > branchesWithStoredHistory_
std::vector< edm::propagate_const< RootOutputTree * > > treePointers_
tuple result
Definition: mps_fire.py:311
edm::propagate_const< PoolOutputModule * > om_
def move
Definition: eostools.py:511
edm::propagate_const< TClass * > wrapperBaseTClass_
bool insertProductProvenance(const ProductProvenance &, std::set< StoredProductProvenance > &oToInsert)
std::unique_ptr< WrapperBase > getWrapperBasePtr(void *p, int offset)
preg
Definition: Schedule.cc:687
void edm::RootOutputFile::finishEndFile ( )

Definition at line 754 of file RootOutputFile.cc.

References filePtr_, mps_fire::i, edm::InProcess, metaDataTree_, om_, parameterSetsTree_, parentageTree_, FSQHLTOfflineSource_cfi::processName, reportToken_, setBranchAliases(), AlCaHLTBitMon_QueryRunRegistry::string, MainPageGenerator::tree, treePointers_, and edm::RootOutputTree::writeTTree().

754  {
755  metaDataTree_->SetEntries(-1);
758 
760 
761  // Create branch aliases for all the branches in the
762  // events/lumis/runs/processblock trees. The loop is over
763  // all types of data products.
764  for (unsigned int i = 0; i < treePointers_.size(); ++i) {
766  BranchType branchType = InProcess;
767  if (i < InProcess) {
768  branchType = static_cast<BranchType>(i);
769  } else {
770  processName = om_->outputProcessBlockHelper().processesWithProcessBlockProducts()[i - InProcess];
771  }
772  setBranchAliases(treePointers_[i]->tree(), om_->keptProducts()[branchType], processName);
773  treePointers_[i]->writeTree();
774  }
775 
776  // close the file -- mfp
777  // Just to play it safe, zero all pointers to objects in the TFile to be closed.
778  metaDataTree_ = parentageTree_ = nullptr;
779  for (auto& treePointer : treePointers_) {
780  treePointer->close();
781  treePointer = nullptr;
782  }
783  filePtr_->Close();
784  filePtr_ = nullptr; // propagate_const<T> has no reset() function
785 
786  // report that file has been closed
787  Service<JobReport> reportSvc;
788  reportSvc->outputFileClosed(reportToken_);
789  }
edm::propagate_const< TTree * > metaDataTree_
BranchType
Definition: BranchType.h:11
std::vector< edm::propagate_const< RootOutputTree * > > treePointers_
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
edm::propagate_const< TTree * > parameterSetsTree_
edm::propagate_const< TTree * > parentageTree_
static void writeTTree(TTree *tree)
void setBranchAliases(TTree *tree, SelectedProducts const &branches, std::string const &processName) const
JobReport::Token reportToken_
void edm::RootOutputFile::insertAncestors ( ProductProvenance const &  iGetParents,
ProductProvenanceRetriever const *  iMapper,
bool  produced,
std::set< BranchID > const &  producedBranches,
std::set< StoredProductProvenance > &  oToFill 
)
private

Definition at line 813 of file RootOutputFile.cc.

References cms::cuda::assert(), branchesWithStoredHistory_, edm::ProductProvenance::branchID(), edm::ProductProvenanceLookup::branchIDToProvenance(), edm::PoolOutputModule::DropAll, edm::PoolOutputModule::DropDroppedPrior, edm::PoolOutputModule::DropNone, edm::PoolOutputModule::DropPrior, info(), insertProductProvenance(), om_, edm::ProductProvenance::parentage(), and edm::Parentage::parents().

Referenced by fillBranches().

817  {
818  assert(om_->dropMetaData() != PoolOutputModule::DropAll);
819  assert(produced || om_->dropMetaData() != PoolOutputModule::DropPrior);
820  if (om_->dropMetaData() == PoolOutputModule::DropDroppedPrior && !produced)
821  return;
822  std::vector<BranchID> const& parentIDs = iGetParents.parentage().parents();
823  for (auto const& parentID : parentIDs) {
824  branchesWithStoredHistory_.insert(parentID);
825  ProductProvenance const* info = iMapper->branchIDToProvenance(parentID);
826  if (info) {
827  if (om_->dropMetaData() == PoolOutputModule::DropNone ||
828  (iProducedIDs.end() != iProducedIDs.find(info->branchID()))) {
829  if (insertProductProvenance(*info, oToFill)) {
830  //haven't seen this one yet
831  insertAncestors(*info, iMapper, produced, iProducedIDs, oToFill);
832  }
833  }
834  }
835  }
836  }
static const TGPicture * info(bool iBackgroundIsBlack)
void insertAncestors(ProductProvenance const &iGetParents, ProductProvenanceRetriever const *iMapper, bool produced, std::set< BranchID > const &producedBranches, std::set< StoredProductProvenance > &oToFill)
assert(be >=bs)
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
bool insertProductProvenance(const ProductProvenance &, std::set< StoredProductProvenance > &oToInsert)
bool edm::RootOutputFile::insertProductProvenance ( const ProductProvenance ,
std::set< StoredProductProvenance > &  oToInsert 
)
private

Definition at line 915 of file RootOutputFile.cc.

References edm::ProductProvenance::branchID(), edm::StoredProductProvenance::branchID_, Exception, mps_fire::i, edm::BranchID::id(), edm::errors::LogicError, edm::ProductProvenance::parentageID(), edm::StoredProductProvenance::parentageIDIndex_, and parentageIDs_.

Referenced by fillBranches(), and insertAncestors().

916  {
917  StoredProductProvenance toStore;
918  toStore.branchID_ = iProv.branchID().id();
919  std::set<edm::StoredProductProvenance>::iterator itFound = oToInsert.find(toStore);
920  if (itFound == oToInsert.end()) {
921  //get the index to the ParentageID or insert a new value if not already present
922  std::pair<std::map<edm::ParentageID, unsigned int>::iterator, bool> i =
923  parentageIDs_.insert(std::make_pair(iProv.parentageID(), static_cast<unsigned int>(parentageIDs_.size())));
924  toStore.parentageIDIndex_ = i.first->second;
925  if (toStore.parentageIDIndex_ >= parentageIDs_.size()) {
927  << "RootOutputFile::insertProductProvenance\n"
928  << "The parentage ID index value " << toStore.parentageIDIndex_
929  << " is out of bounds. The maximum value is currently " << parentageIDs_.size() - 1 << ".\n"
930  << "This should never happen.\n"
931  << "Please report this to the framework hypernews forum 'hn-cms-edmFramework@cern.ch'.\n";
932  }
933 
934  oToInsert.insert(toStore);
935  return true;
936  }
937  return false;
938  }
std::map< ParentageID, unsigned int > parentageIDs_
StoredProductProvenanceVector const* edm::RootOutputFile::pEventEntryInfoVector ( ) const
inlineprivate

Definition at line 102 of file RootOutputFile.h.

References edm::get_underlying_safe(), and pEventEntryInfoVector_.

Referenced by RootOutputFile().

102  {
104  }
constexpr std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_
StoredProductProvenanceVector*& edm::RootOutputFile::pEventEntryInfoVector ( )
inlineprivate

Definition at line 105 of file RootOutputFile.h.

References edm::get_underlying_safe(), and pEventEntryInfoVector_.

constexpr std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_
void edm::RootOutputFile::respondToCloseInputFile ( FileBlock const &  fb)

Definition at line 448 of file RootOutputFile.cc.

References eventTree_, lumiTree_, om_, runTree_, and edm::RootOutputTree::setEntries().

448  {
449  // We can't do setEntries() on the event tree if the EventAuxiliary branch is empty & disabled
450  if (not om_->compactEventAuxiliary()) {
452  }
455  }
RootOutputTree eventTree_
edm::propagate_const< PoolOutputModule * > om_
RootOutputTree runTree_
RootOutputTree lumiTree_
void edm::RootOutputFile::setBranchAliases ( TTree *  tree,
SelectedProducts const &  branches,
std::string const &  processName 
) const
private

Definition at line 791 of file RootOutputFile.cc.

References HLT_FULL_cff::alias, edm::BranchDescription::branchAliases(), edm::BranchDescription::branchName(), edm::BranchDescription::branchType(), full, edm::InProcess, edm::BranchDescription::moduleLabel(), edm::BranchDescription::processName(), edm::BranchDescription::productInstanceName(), corrVsCorr::selection, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by finishEndFile().

793  {
794  if (tree && tree->GetNbranches() != 0) {
795  for (auto const& selection : branches) {
796  BranchDescription const& pd = *selection.first;
797  if (pd.branchType() == InProcess && processName != pd.processName()) {
798  continue;
799  }
800  std::string const& full = pd.branchName() + "obj";
801  if (pd.branchAliases().empty()) {
802  std::string const& alias = (pd.productInstanceName().empty() ? pd.moduleLabel() : pd.productInstanceName());
803  tree->SetAlias(alias.c_str(), full.c_str());
804  } else {
805  for (auto const& alias : pd.branchAliases()) {
806  tree->SetAlias(alias.c_str(), full.c_str());
807  }
808  }
809  }
810  }
811  }
selection
main part
Definition: corrVsCorr.py:100
Definition: GenABIO.cc:168
bool edm::RootOutputFile::shouldWeCloseFile ( ) const

Definition at line 457 of file RootOutputFile.cc.

References filePtr_, om_, and findQualityFiles::size.

457  {
458  unsigned int const oneK = 1024;
459  Long64_t size = filePtr_->GetSize() / oneK;
460  return (size >= om_->maxFileSize());
461  }
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
tuple size
Write out results.
void edm::RootOutputFile::writeBranchIDListRegistry ( )

Definition at line 644 of file RootOutputFile.cc.

References cms::cuda::assert(), b, edm::poolNames::branchIDListBranchName(), metaDataTree_, om_, and AlCaHLTBitMon_ParallelJobs::p.

644  {
645  BranchIDLists const* p = om_->branchIDLists();
646  TBranch* b = metaDataTree_->Branch(poolNames::branchIDListBranchName().c_str(), &p, om_->basketSize(), 0);
647  assert(b);
648  b->Fill();
649  }
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118
std::string const & branchIDListBranchName()
Definition: BranchType.cc:183
void edm::RootOutputFile::writeEventAuxiliary ( )

Definition at line 710 of file RootOutputFile.cc.

References cms::cuda::assert(), printConversionInfo::aux, b, edm::BranchTypeToAuxiliaryBranchName(), compactEventAuxiliary_, eventTree_, edm::CompactEventAuxiliaryVector::extrasSize(), edm::CompactEventAuxiliaryVector::guidsSize(), edm::InEvent, LogDebug, SiStripPI::min, om_, pEventAux_, edm::RootOutputTree::setEntries(), edm::CompactEventAuxiliaryVector::size(), edm::RootOutputTree::tree(), and MainPageGenerator::tree.

710  {
711  constexpr std::size_t maxEaBasketSize = 4 * 1024 * 1024;
712 
713  if (om_->compactEventAuxiliary()) {
714  auto tree = eventTree_.tree();
715  auto const& bname = BranchTypeToAuxiliaryBranchName(InEvent).c_str();
716 
717  tree->SetBranchStatus(bname, true);
718  auto basketsize =
719  std::min(maxEaBasketSize,
720  compactEventAuxiliary_.size() * (sizeof(EventAuxiliary) + 26)); // 26 is an empirical fudge factor
721  tree->SetBasketSize(bname, basketsize);
722  auto b = tree->GetBranch(bname);
723 
724  assert(b);
725 
726  LogDebug("writeEventAuxiliary") << "EventAuxiliary ratio extras/GUIDs/all = "
729 
730  for (auto const& aux : compactEventAuxiliary_) {
731  const auto ea = aux.eventAuxiliary();
732  pEventAux_ = &ea;
733  // Fill EventAuxiliary branch
734  b->Fill();
735  }
737  }
738  }
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:116
TTree const * tree() const
assert(be >=bs)
RootOutputTree eventTree_
edm::propagate_const< PoolOutputModule * > om_
CompactEventAuxiliaryVector compactEventAuxiliary_
double b
Definition: hdecay.h:118
EventAuxiliary const * pEventAux_
#define LogDebug(id)
void edm::RootOutputFile::writeFileFormatVersion ( )

Definition at line 598 of file RootOutputFile.cc.

References cms::cuda::assert(), b, edm::poolNames::fileFormatVersionBranchName(), edm::getFileFormatVersion(), metaDataTree_, and om_.

598  {
599  FileFormatVersion fileFormatVersion(getFileFormatVersion());
600  FileFormatVersion* pFileFmtVsn = &fileFormatVersion;
601  TBranch* b =
602  metaDataTree_->Branch(poolNames::fileFormatVersionBranchName().c_str(), &pFileFmtVsn, om_->basketSize(), 0);
603  assert(b);
604  b->Fill();
605  }
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:189
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
int getFileFormatVersion()
double b
Definition: hdecay.h:118
void edm::RootOutputFile::writeFileIdentifier ( )

Definition at line 607 of file RootOutputFile.cc.

References cms::cuda::assert(), b, fid_, edm::poolNames::fileIdentifierBranchName(), metaDataTree_, and om_.

607  {
608  FileID* fidPtr = &fid_;
609  TBranch* b = metaDataTree_->Branch(poolNames::fileIdentifierBranchName().c_str(), &fidPtr, om_->basketSize(), 0);
610  assert(b);
611  b->Fill();
612  }
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118
std::string const & fileIdentifierBranchName()
Definition: BranchType.cc:192
void edm::RootOutputFile::writeIndexIntoFile ( )

Definition at line 614 of file RootOutputFile.cc.

References cms::Exception::addContext(), cms::cuda::assert(), b, edm::RootOutputTree::checkEntriesInReadBranches(), eventEntryNumber_, eventTree_, indexIntoFile_, edm::poolNames::indexIntoFileBranchName(), metaDataTree_, om_, edm::errors::OtherCMS, and edm::IndexIntoFile::sortVector_Run_Or_Lumi_Entries().

614  {
617  ex << "The number of entries in at least one output TBranch whose entries\n"
618  "were copied from the input does not match the number of events\n"
619  "recorded in IndexIntoFile. This might (or might not) indicate a\n"
620  "problem related to fast copy.";
621  ex.addContext("Calling RootOutputFile::writeIndexIntoFile");
622  throw ex;
623  }
625  IndexIntoFile* iifPtr = &indexIntoFile_;
626  TBranch* b = metaDataTree_->Branch(poolNames::indexIntoFileBranchName().c_str(), &iifPtr, om_->basketSize(), 0);
627  assert(b);
628  b->Fill();
629  }
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
void sortVector_Run_Or_Lumi_Entries()
RootOutputTree eventTree_
edm::propagate_const< PoolOutputModule * > om_
IndexIntoFile::EntryNumber_t eventEntryNumber_
std::string const & indexIntoFileBranchName()
Definition: BranchType.cc:198
bool checkEntriesInReadBranches(Long64_t expectedNumberOfEntries) const
double b
Definition: hdecay.h:118
IndexIntoFile indexIntoFile_
void edm::RootOutputFile::writeLuminosityBlock ( LuminosityBlockForOutput const &  lb)

Definition at line 518 of file RootOutputFile.cc.

References edm::IndexIntoFile::addEntry(), fillBranches(), edm::LuminosityBlockForOutput::id(), indexIntoFile_, edm::InLumi, lumiAux_, lumiEntryNumber_, edm::LuminosityBlockAuxiliary::luminosityBlock(), edm::LuminosityBlockID::luminosityBlock(), edm::LuminosityBlockForOutput::luminosityBlockAuxiliary(), lumiTree_, nEventsInLumi_, edm::RootOutputTree::optimizeBaskets(), edm::OccurrenceForOutput::processHistory(), edm::OccurrenceForOutput::processHistoryID(), processHistoryRegistry_, edm::ProcessHistoryRegistry::reducedProcessHistoryID(), edm::ProcessHistoryRegistry::registerProcessHistory(), reportToken_, edm::LuminosityBlockAuxiliary::run(), edm::LuminosityBlockID::run(), and edm::LuminosityBlockAuxiliary::setProcessHistoryID().

518  {
519  // Auxiliary branch
520  // NOTE: lumiAux_ must be filled before calling fillBranches since it gets written out in that routine.
521  lumiAux_ = lb.luminosityBlockAuxiliary();
522  // Use the updated process historyID
523  lumiAux_.setProcessHistoryID(lb.processHistoryID());
524  // Store the process history.
525  processHistoryRegistry_.registerProcessHistory(lb.processHistory());
526  // Store the reduced ID in the IndexIntoFile
527  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(lb.processHistoryID());
528  // Add lumi to index.
531  unsigned int ttreeIndex = InLumi;
532  fillBranches(InLumi, lb, ttreeIndex);
533  lumiTree_.optimizeBaskets(10ULL * 1024 * 1024);
534 
535  Service<JobReport> reportSvc;
536  reportSvc->reportLumiSection(reportToken_, lb.id().run(), lb.id().luminosityBlock(), nEventsInLumi_);
537  nEventsInLumi_ = 0;
538  }
LuminosityBlockAuxiliary lumiAux_
bool registerProcessHistory(ProcessHistory const &processHistory)
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, unsigned int ttreeIndex, StoredProductProvenanceVector *productProvenanceVecPtr=nullptr, ProductProvenanceRetriever const *provRetriever=nullptr)
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
void setProcessHistoryID(ProcessHistoryID const &phid)
LuminosityBlockNumber_t luminosityBlock() const
void addEntry(ProcessHistoryID const &processHistoryID, RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry)
Hash< ProcessHistoryType > ProcessHistoryID
IndexIntoFile indexIntoFile_
IndexIntoFile::EntryNumber_t lumiEntryNumber_
RootOutputTree lumiTree_
void optimizeBaskets(ULong64_t size)
JobReport::Token reportToken_
void edm::RootOutputFile::writeOne ( EventForOutput const &  e)

Definition at line 463 of file RootOutputFile.cc.

References edm::IndexIntoFile::addEntry(), cms::cuda::assert(), edm::EventForOutput::branchListIndexes(), compactEventAuxiliary_, dtTPAnalyzer_cfg::dataType, dataTypeReported_, edm::EventID::event(), edm::EventAuxiliary::event(), edm::EventForOutput::eventAuxiliary(), eventEntryNumber_, edm::EventForOutput::eventSelectionIDs(), edm::EventForOutput::eventToProcessBlockIndexes(), fillBranches(), edm::EventForOutput::id(), indexIntoFile_, edm::InEvent, edm::EventAuxiliary::isRealData(), edm::EventAuxiliary::luminosityBlock(), nEventsInLumi_, om_, pBranchListIndexes_, pEventAux_, pEventEntryInfoVector_, pEventSelectionIDs_, pEventToProcessBlockIndexes_, edm::OccurrenceForOutput::processHistory(), edm::OccurrenceForOutput::processHistoryID(), edm::EventAuxiliary::processHistoryID(), processHistoryRegistry_, edm::EventForOutput::productProvenanceRetrieverPtr(), edm::CompactEventAuxiliaryVector::push_back(), edm::ProcessHistoryRegistry::reducedProcessHistoryID(), edm::ProcessHistoryRegistry::registerProcessHistory(), reportToken_, edm::EventID::run(), edm::EventAuxiliary::run(), and AlCaHLTBitMon_QueryRunRegistry::string.

463  {
464  // Auxiliary branch
465  pEventAux_ = &e.eventAuxiliary();
466 
467  // Because getting the data may cause an exception to be thrown we want to do that
468  // first before writing anything to the file about this event
469  // NOTE: pEventAux_, pBranchListIndexes_, pEventSelectionIDs_, and pEventEntryInfoVector_
470  // must be set before calling fillBranches since they get written out in that routine.
471  assert(pEventAux_->processHistoryID() == e.processHistoryID());
472  pBranchListIndexes_ = &e.branchListIndexes();
473  pEventToProcessBlockIndexes_ = &e.eventToProcessBlockIndexes();
474 
475  // Note: The EventSelectionIDVector should have a one to one correspondence with the processes in the process history.
476  // Therefore, a new entry should be added if and only if the current process has been added to the process history,
477  // which is done if and only if there is a produced product.
479  EventSelectionIDVector esids = e.eventSelectionIDs();
480  if (reg->anyProductProduced() || !om_->wantAllEvents()) {
481  esids.push_back(om_->selectorConfig());
482  }
483  pEventSelectionIDs_ = &esids;
484  ProductProvenanceRetriever const* provRetriever = e.productProvenanceRetrieverPtr();
485  assert(provRetriever);
486  unsigned int ttreeIndex = InEvent;
487  fillBranches(InEvent, e, ttreeIndex, pEventEntryInfoVector_, provRetriever);
488 
489  // Add the dataType to the job report if it hasn't already been done
490  if (!dataTypeReported_) {
491  Service<JobReport> reportSvc;
492  std::string dataType("MC");
493  if (pEventAux_->isRealData())
494  dataType = "Data";
495  reportSvc->reportDataType(reportToken_, dataType);
496  dataTypeReported_ = true;
497  }
498 
499  // Store the process history.
501  // Store the reduced ID in the IndexIntoFile
502  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(e.processHistoryID());
503  // Add event to index
507 
508  if (om_->compactEventAuxiliary()) {
510  }
511 
512  // Report event written
513  Service<JobReport> reportSvc;
514  reportSvc->eventWrittenToFile(reportToken_, e.id().run(), e.id().event());
515  ++nEventsInLumi_;
516  }
bool isRealData() const
void push_back(const EventAuxiliary &ea)
bool registerProcessHistory(ProcessHistory const &processHistory)
RunNumber_t run() const
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
assert(be >=bs)
std::vector< EventSelectionID > EventSelectionIDVector
LuminosityBlockNumber_t luminosityBlock() const
edm::propagate_const< PoolOutputModule * > om_
IndexIntoFile::EntryNumber_t eventEntryNumber_
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, unsigned int ttreeIndex, StoredProductProvenanceVector *productProvenanceVecPtr=nullptr, ProductProvenanceRetriever const *provRetriever=nullptr)
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
CompactEventAuxiliaryVector compactEventAuxiliary_
void addEntry(ProcessHistoryID const &processHistoryID, RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry)
Hash< ProcessHistoryType > ProcessHistoryID
EventSelectionIDVector const * pEventSelectionIDs_
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_
IndexIntoFile indexIntoFile_
ProcessHistoryID const & processHistoryID() const
EventAuxiliary const * pEventAux_
BranchListIndexes const * pBranchListIndexes_
EventNumber_t event() const
JobReport::Token reportToken_
EventToProcessBlockIndexes const * pEventToProcessBlockIndexes_
void edm::RootOutputFile::writeParameterSetRegistry ( )

Definition at line 659 of file RootOutputFile.cc.

References edm::fillParameterSetBranch(), edm::propagate_const< T >::get(), om_, and parameterSetsTree_.

659  {
661  }
void fillParameterSetBranch(TTree *parameterSetsTree, int basketSize)
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< TTree * > parameterSetsTree_
constexpr element_type const * get() const
void edm::RootOutputFile::writeParentageRegistry ( )

Definition at line 576 of file RootOutputFile.cc.

References submitPVResolutionJobs::desc, Exception, edm::errors::FatalRootError, edm::ParentageRegistry::getMapped(), edm::ParentageRegistry::instance(), om_, edm::poolNames::parentageBranchName(), parentageIDs_, and parentageTree_.

576  {
577  Parentage const* desc(nullptr);
578 
579  if (!parentageTree_->Branch(poolNames::parentageBranchName().c_str(), &desc, om_->basketSize(), 0))
580  throw Exception(errors::FatalRootError) << "Failed to create a branch for Parentages in the output file";
581 
582  ParentageRegistry& ptReg = *ParentageRegistry::instance();
583 
584  std::vector<ParentageID> orderedIDs(parentageIDs_.size());
585  for (auto const& parentageID : parentageIDs_) {
586  orderedIDs[parentageID.second] = parentageID.first;
587  }
588  //now put them into the TTree in the correct order
589  for (auto const& orderedID : orderedIDs) {
590  desc = ptReg.getMapped(orderedID);
591  //NOTE: some old format files have missing Parentage info
592  // so a null value of desc can't be fatal.
593  // Root will default construct an object in that case.
594  parentageTree_->Fill();
595  }
596  }
std::map< ParentageID, unsigned int > parentageIDs_
edm::propagate_const< PoolOutputModule * > om_
std::string const & parentageBranchName()
Definition: BranchType.cc:156
edm::propagate_const< TTree * > parentageTree_
static ParentageRegistry * instance()
void edm::RootOutputFile::writeProcessBlock ( ProcessBlockForOutput const &  pb)

Definition at line 562 of file RootOutputFile.cc.

References HLT_FULL_cff::distance, fillBranches(), spr::find(), edm::InProcess, om_, edm::ProcessBlockForOutput::processName(), FSQHLTOfflineSource_cfi::processName, AlCaHLTBitMon_QueryRunRegistry::string, and treePointers_.

562  {
563  std::string const& processName = pb.processName();
564  std::vector<std::string> const& processesWithProcessBlockProducts =
565  om_->outputProcessBlockHelper().processesWithProcessBlockProducts();
566  std::vector<std::string>::const_iterator it =
567  std::find(processesWithProcessBlockProducts.cbegin(), processesWithProcessBlockProducts.cend(), processName);
568  if (it == processesWithProcessBlockProducts.cend()) {
569  return;
570  }
571  unsigned int ttreeIndex = InProcess + std::distance(processesWithProcessBlockProducts.cbegin(), it);
572  fillBranches(InProcess, pb, ttreeIndex);
573  treePointers_[ttreeIndex]->optimizeBaskets(10ULL * 1024 * 1024);
574  }
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
std::vector< edm::propagate_const< RootOutputTree * > > treePointers_
edm::propagate_const< PoolOutputModule * > om_
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, unsigned int ttreeIndex, StoredProductProvenanceVector *productProvenanceVecPtr=nullptr, ProductProvenanceRetriever const *provRetriever=nullptr)
void edm::RootOutputFile::writeProcessBlockHelper ( )

Definition at line 740 of file RootOutputFile.cc.

References cms::cuda::assert(), b, metaDataTree_, om_, and edm::poolNames::processBlockHelperBranchName().

740  {
741  if (!om_->outputProcessBlockHelper().processesWithProcessBlockProducts().empty()) {
742  StoredProcessBlockHelper storedProcessBlockHelper(
743  om_->outputProcessBlockHelper().processesWithProcessBlockProducts());
744  om_->outputProcessBlockHelper().fillCacheIndices(storedProcessBlockHelper);
745 
746  StoredProcessBlockHelper* pStoredProcessBlockHelper = &storedProcessBlockHelper;
747  TBranch* b = metaDataTree_->Branch(
748  poolNames::processBlockHelperBranchName().c_str(), &pStoredProcessBlockHelper, om_->basketSize(), 0);
749  assert(b);
750  b->Fill();
751  }
752  }
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118
std::string const & processBlockHelperBranchName()
Definition: BranchType.cc:204
void edm::RootOutputFile::writeProcessHistoryRegistry ( )

Definition at line 640 of file RootOutputFile.cc.

References edm::fillProcessHistoryBranch(), edm::propagate_const< T >::get(), metaDataTree_, om_, and processHistoryRegistry_.

640  {
642  }
void fillProcessHistoryBranch(TTree *metaDataTree, int basketSize, ProcessHistoryRegistry const &processHistoryRegistry)
edm::propagate_const< TTree * > metaDataTree_
ProcessHistoryRegistry processHistoryRegistry_
edm::propagate_const< PoolOutputModule * > om_
constexpr element_type const * get() const
void edm::RootOutputFile::writeProductDependencies ( )

Definition at line 694 of file RootOutputFile.cc.

References cms::cuda::assert(), b, metaDataTree_, om_, and edm::poolNames::productDependenciesBranchName().

694  {
695  BranchChildren& pDeps = const_cast<BranchChildren&>(om_->branchChildren());
696  BranchChildren* ppDeps = &pDeps;
697  TBranch* b =
698  metaDataTree_->Branch(poolNames::productDependenciesBranchName().c_str(), &ppDeps, om_->basketSize(), 0);
699  assert(b);
700  b->Fill();
701  }
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118
std::string const & productDependenciesBranchName()
Definition: BranchType.cc:165
void edm::RootOutputFile::writeProductDescriptionRegistry ( )

Definition at line 663 of file RootOutputFile.cc.

References cms::cuda::assert(), b, branchesWithStoredHistory_, dataset::end, metaDataTree_, om_, and edm::poolNames::productDescriptionBranchName().

663  {
664  // Make a local copy of the ProductRegistry, removing any transient or pruned products.
665  using ProductList = ProductRegistry::ProductList;
667  ProductRegistry pReg(reg->productList());
668  ProductList& pList = const_cast<ProductList&>(pReg.productList());
669  for (auto const& prod : pList) {
670  if (prod.second.branchID() != prod.second.originalBranchID()) {
671  if (branchesWithStoredHistory_.find(prod.second.branchID()) != branchesWithStoredHistory_.end()) {
672  branchesWithStoredHistory_.insert(prod.second.originalBranchID());
673  }
674  }
675  }
676  std::set<BranchID>::iterator end = branchesWithStoredHistory_.end();
677  for (ProductList::iterator it = pList.begin(); it != pList.end();) {
678  if (branchesWithStoredHistory_.find(it->second.branchID()) == end) {
679  // avoid invalidating iterator on deletion
680  ProductList::iterator itCopy = it;
681  ++it;
682  pList.erase(itCopy);
683 
684  } else {
685  ++it;
686  }
687  }
688 
689  ProductRegistry* ppReg = &pReg;
690  TBranch* b = metaDataTree_->Branch(poolNames::productDescriptionBranchName().c_str(), &ppReg, om_->basketSize(), 0);
691  assert(b);
692  b->Fill();
693  }
std::map< BranchKey, BranchDescription > ProductList
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:162
string end
Definition: dataset.py:937
void edm::RootOutputFile::writeRun ( RunForOutput const &  r)

Definition at line 540 of file RootOutputFile.cc.

References edm::IndexIntoFile::addEntry(), edm::MergeableRunProductMetadata::addEntryToStoredMetadata(), fillBranches(), indexIntoFile_, edm::InRun, edm::RunForOutput::mergeableRunProductMetadata(), edm::RootOutputTree::optimizeBaskets(), edm::OccurrenceForOutput::processHistory(), edm::OccurrenceForOutput::processHistoryID(), processHistoryRegistry_, edm::ProcessHistoryRegistry::reducedProcessHistoryID(), edm::ProcessHistoryRegistry::registerProcessHistory(), reportToken_, edm::RunAuxiliary::run(), edm::RunForOutput::run(), runAux_, edm::RunForOutput::runAuxiliary(), runEntryNumber_, runTree_, edm::RunAuxiliary::setProcessHistoryID(), and storedMergeableRunProductMetadata_.

540  {
541  // Auxiliary branch
542  // NOTE: runAux_ must be filled before calling fillBranches since it gets written out in that routine.
543  runAux_ = r.runAuxiliary();
544  // Use the updated process historyID
545  runAux_.setProcessHistoryID(r.processHistoryID());
546  // Store the process history.
548  // Store the reduced ID in the IndexIntoFile
549  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(r.processHistoryID());
550  // Add run to index.
551  indexIntoFile_.addEntry(reducedPHID, runAux_.run(), 0U, 0U, runEntryNumber_);
552  r.mergeableRunProductMetadata()->addEntryToStoredMetadata(storedMergeableRunProductMetadata_);
553  ++runEntryNumber_;
554  unsigned int ttreeIndex = InRun;
555  fillBranches(InRun, r, ttreeIndex);
556  runTree_.optimizeBaskets(10ULL * 1024 * 1024);
557 
558  Service<JobReport> reportSvc;
559  reportSvc->reportRunNumber(reportToken_, r.run());
560  }
bool registerProcessHistory(ProcessHistory const &processHistory)
ProcessHistoryRegistry processHistoryRegistry_
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, unsigned int ttreeIndex, StoredProductProvenanceVector *productProvenanceVecPtr=nullptr, ProductProvenanceRetriever const *provRetriever=nullptr)
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
void addEntry(ProcessHistoryID const &processHistoryID, RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry)
Hash< ProcessHistoryType > ProcessHistoryID
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
RootOutputTree runTree_
IndexIntoFile indexIntoFile_
IndexIntoFile::EntryNumber_t runEntryNumber_
RunAuxiliary runAux_
void setProcessHistoryID(ProcessHistoryID const &phid)
Definition: RunAuxiliary.h:26
void optimizeBaskets(ULong64_t size)
RunNumber_t run() const
Definition: RunAuxiliary.h:31
JobReport::Token reportToken_
void edm::RootOutputFile::writeStoredMergeableRunProductMetadata ( )

Definition at line 631 of file RootOutputFile.cc.

References cms::cuda::assert(), b, edm::poolNames::mergeableRunProductMetadataBranchName(), metaDataTree_, om_, edm::StoredMergeableRunProductMetadata::optimizeBeforeWrite(), and storedMergeableRunProductMetadata_.

631  {
633  StoredMergeableRunProductMetadata* ptr = &storedMergeableRunProductMetadata_;
634  TBranch* b =
635  metaDataTree_->Branch(poolNames::mergeableRunProductMetadataBranchName().c_str(), &ptr, om_->basketSize(), 0);
636  assert(b);
637  b->Fill();
638  }
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
std::string const & mergeableRunProductMetadataBranchName()
Definition: BranchType.cc:201
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
double b
Definition: hdecay.h:118
void edm::RootOutputFile::writeThinnedAssociationsHelper ( )

Definition at line 651 of file RootOutputFile.cc.

References cms::cuda::assert(), b, metaDataTree_, om_, AlCaHLTBitMon_ParallelJobs::p, and edm::poolNames::thinnedAssociationsHelperBranchName().

651  {
652  ThinnedAssociationsHelper const* p = om_->thinnedAssociationsHelper();
653  TBranch* b =
654  metaDataTree_->Branch(poolNames::thinnedAssociationsHelperBranchName().c_str(), &p, om_->basketSize(), 0);
655  assert(b);
656  b->Fill();
657  }
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118
std::string const & thinnedAssociationsHelperBranchName()
Definition: BranchType.cc:186

Member Data Documentation

std::set<BranchID> edm::RootOutputFile::branchesWithStoredHistory_
private
bool edm::RootOutputFile::canFastCloneAux_
private

Definition at line 115 of file RootOutputFile.h.

Referenced by beginInputFile().

CompactEventAuxiliaryVector edm::RootOutputFile::compactEventAuxiliary_
private

Definition at line 147 of file RootOutputFile.h.

Referenced by beginInputFile(), writeEventAuxiliary(), and writeOne().

bool edm::RootOutputFile::dataTypeReported_
private

Definition at line 142 of file RootOutputFile.h.

Referenced by writeOne().

StoredProductProvenanceVector edm::RootOutputFile::eventEntryInfoVector_
private

Definition at line 132 of file RootOutputFile.h.

IndexIntoFile::EntryNumber_t edm::RootOutputFile::eventEntryNumber_
private

Definition at line 118 of file RootOutputFile.h.

Referenced by writeIndexIntoFile(), and writeOne().

RootOutputTree edm::RootOutputFile::eventTree_
private
FileID edm::RootOutputFile::fid_
private

Definition at line 117 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeFileIdentifier().

std::string edm::RootOutputFile::file_
private

Definition at line 110 of file RootOutputFile.h.

Referenced by beginInputFile(), fileName(), and RootOutputFile().

edm::propagate_const<std::shared_ptr<TFile> > edm::RootOutputFile::filePtr_
private
IndexIntoFile edm::RootOutputFile::indexIntoFile_
private

Definition at line 121 of file RootOutputFile.h.

Referenced by writeIndexIntoFile(), writeLuminosityBlock(), writeOne(), and writeRun().

std::string edm::RootOutputFile::logicalFile_
private

Definition at line 111 of file RootOutputFile.h.

Referenced by RootOutputFile().

LuminosityBlockAuxiliary edm::RootOutputFile::lumiAux_
private

Definition at line 127 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

IndexIntoFile::EntryNumber_t edm::RootOutputFile::lumiEntryNumber_
private

Definition at line 119 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

RootOutputTree edm::RootOutputFile::lumiTree_
private

Definition at line 138 of file RootOutputFile.h.

Referenced by respondToCloseInputFile(), RootOutputFile(), and writeLuminosityBlock().

edm::propagate_const<TTree*> edm::RootOutputFile::metaDataTree_
private
unsigned long edm::RootOutputFile::nEventsInLumi_
private

Definition at line 123 of file RootOutputFile.h.

Referenced by writeLuminosityBlock(), and writeOne().

edm::propagate_const<PoolOutputModule*> edm::RootOutputFile::om_
private
edm::propagate_const<TTree*> edm::RootOutputFile::parameterSetsTree_
private

Definition at line 125 of file RootOutputFile.h.

Referenced by finishEndFile(), RootOutputFile(), and writeParameterSetRegistry().

std::map<ParentageID, unsigned int> edm::RootOutputFile::parentageIDs_
private

Definition at line 144 of file RootOutputFile.h.

Referenced by insertProductProvenance(), and writeParentageRegistry().

edm::propagate_const<TTree*> edm::RootOutputFile::parentageTree_
private

Definition at line 126 of file RootOutputFile.h.

Referenced by finishEndFile(), RootOutputFile(), and writeParentageRegistry().

BranchListIndexes const* edm::RootOutputFile::pBranchListIndexes_
private

Definition at line 134 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

EventAuxiliary const* edm::RootOutputFile::pEventAux_
private

Definition at line 129 of file RootOutputFile.h.

Referenced by RootOutputFile(), writeEventAuxiliary(), and writeOne().

edm::propagate_const<StoredProductProvenanceVector*> edm::RootOutputFile::pEventEntryInfoVector_
private

Definition at line 133 of file RootOutputFile.h.

Referenced by pEventEntryInfoVector(), and writeOne().

EventSelectionIDVector const* edm::RootOutputFile::pEventSelectionIDs_
private

Definition at line 136 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

EventToProcessBlockIndexes const* edm::RootOutputFile::pEventToProcessBlockIndexes_
private

Definition at line 135 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

LuminosityBlockAuxiliary const* edm::RootOutputFile::pLumiAux_
private

Definition at line 130 of file RootOutputFile.h.

Referenced by RootOutputFile().

std::vector<edm::propagate_const<std::unique_ptr<RootOutputTree> > > edm::RootOutputFile::processBlockTrees_
private

Definition at line 140 of file RootOutputFile.h.

Referenced by RootOutputFile().

ProcessHistoryRegistry edm::RootOutputFile::processHistoryRegistry_
private
RunAuxiliary const* edm::RootOutputFile::pRunAux_
private

Definition at line 131 of file RootOutputFile.h.

Referenced by RootOutputFile().

JobReport::Token edm::RootOutputFile::reportToken_
private
RunAuxiliary edm::RootOutputFile::runAux_
private

Definition at line 128 of file RootOutputFile.h.

Referenced by writeRun().

IndexIntoFile::EntryNumber_t edm::RootOutputFile::runEntryNumber_
private

Definition at line 120 of file RootOutputFile.h.

Referenced by writeRun().

RootOutputTree edm::RootOutputFile::runTree_
private

Definition at line 139 of file RootOutputFile.h.

Referenced by respondToCloseInputFile(), RootOutputFile(), and writeRun().

StoredMergeableRunProductMetadata edm::RootOutputFile::storedMergeableRunProductMetadata_
private

Definition at line 122 of file RootOutputFile.h.

Referenced by writeRun(), and writeStoredMergeableRunProductMetadata().

std::vector<edm::propagate_const<RootOutputTree*> > edm::RootOutputFile::treePointers_
private

Definition at line 141 of file RootOutputFile.h.

Referenced by fillBranches(), finishEndFile(), RootOutputFile(), and writeProcessBlock().

int edm::RootOutputFile::whyNotFastClonable_
private

Definition at line 114 of file RootOutputFile.h.

Referenced by beginInputFile(), and fillBranches().

edm::propagate_const<TClass*> edm::RootOutputFile::wrapperBaseTClass_
private

Definition at line 146 of file RootOutputFile.h.

Referenced by fillBranches().