CMS 3D CMS Logo

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, std::string const &overrideGUID)
 
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

◆ OutputItem

Definition at line 50 of file RootOutputFile.h.

◆ OutputItemList

Definition at line 51 of file RootOutputFile.h.

Constructor & Destructor Documentation

◆ RootOutputFile()

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

Definition at line 81 of file RootOutputFile.cc.

References edm::RootOutputTree::addAuxiliary(), edm::RootOutputTree::addBranch(), MicroEventContent_cff::branch, branchesWithStoredHistory_, edm::poolNames::branchListIndexesBranchName(), 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, edm::FileID::fid(), fid_, file_, filePtr(), filePtr_, edm::propagate_const< T >::get(), mps_fire::i, edm::InEvent, edm::InLumi, edm::InProcess, edm::InRun, edm::isValidGlobalIdentifier(), B2GTnPMonitor_cfi::item, logicalFile_, lumiTree_, edm::RootOutputTree::makeTTree(), metaDataTree_, edm::poolNames::metaDataTreeName(), edm::moduleName(), om_, parameterSetsTree_, edm::poolNames::parameterSetsTreeName(), parentageTree_, edm::poolNames::parentageTreeName(), pBranchListIndexes_, pEventAux_, pEventEntryInfoVector(), pEventSelectionIDs_, pEventToProcessBlockIndexes_, pLumiAux_, processBlockTrees_, SimL1EmulatorRepack_CalouGT_cff::processName, pRunAux_, reportToken_, runTree_, edm::PoolOutputModule::selectedOutputItemList(), edm::RootOutputTree::setAutoFlush(), edm::sort_all(), AlCaHLTBitMon_QueryRunRegistry::string, cms::MD5Result::toString(), edm::RootOutputTree::tree(), and treePointers_.

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

◆ ~RootOutputFile()

edm::RootOutputFile::~RootOutputFile ( )
inline

Definition at line 57 of file RootOutputFile.h.

57 {}

Member Function Documentation

◆ beginInputFile()

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

Definition at line 339 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, edm::FileBlock::EventsOrLumisSelectedByID, eventTree_, Exception, file_, edm::FileBlock::fileName(), filePtr_, timingPdfMaker::infile, edm::FileBlock::InitialEventsSkipped, edm::match(), edm::FileBlock::MaxEventsTooSmall, edm::FileBlock::MaxLumisTooSmall, 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_.

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

◆ fileName()

std::string const& edm::RootOutputFile::fileName ( ) const
inline

Definition at line 82 of file RootOutputFile.h.

References file_.

82 { return file_; }

◆ filePtr() [1/2]

std::shared_ptr<TFile const> edm::RootOutputFile::filePtr ( ) const
inlineprivate

Definition at line 101 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

Referenced by RootOutputFile().

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_

◆ filePtr() [2/2]

std::shared_ptr<TFile>& edm::RootOutputFile::filePtr ( )
inlineprivate

Definition at line 102 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

102 { 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_

◆ fillBranches()

void edm::RootOutputFile::fillBranches ( BranchType const &  branchType,
OccurrenceForOutput const &  occurrence,
unsigned int  ttreeIndex,
StoredProductProvenanceVector productProvenanceVecPtr = nullptr,
ProductProvenanceRetriever const *  provRetriever = nullptr 
)
private

Definition at line 847 of file RootOutputFile.cc.

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

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

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

◆ finishEndFile()

void edm::RootOutputFile::finishEndFile ( )

Definition at line 763 of file RootOutputFile.cc.

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

763  {
764  metaDataTree_->SetEntries(-1);
767 
769 
770  // Create branch aliases for all the branches in the
771  // events/lumis/runs/processblock trees. The loop is over
772  // all types of data products.
773  for (unsigned int i = 0; i < treePointers_.size(); ++i) {
775  BranchType branchType = InProcess;
776  if (i < InProcess) {
777  branchType = static_cast<BranchType>(i);
778  } else {
779  processName = om_->outputProcessBlockHelper().processesWithProcessBlockProducts()[i - InProcess];
780  }
781  setBranchAliases(treePointers_[i]->tree(), om_->keptProducts()[branchType], processName);
782  treePointers_[i]->writeTree();
783  }
784 
785  // close the file -- mfp
786  // Just to play it safe, zero all pointers to objects in the TFile to be closed.
787  metaDataTree_ = parentageTree_ = nullptr;
788  for (auto& treePointer : treePointers_) {
789  treePointer->close();
790  treePointer = nullptr;
791  }
792  filePtr_->Close();
793  filePtr_ = nullptr; // propagate_const<T> has no reset() function
794 
795  // report that file has been closed
796  Service<JobReport> reportSvc;
797  reportSvc->outputFileClosed(reportToken_);
798  }
void setBranchAliases(TTree *tree, SelectedProducts const &branches, std::string const &processName) const
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)
JobReport::Token reportToken_

◆ insertAncestors()

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 822 of file RootOutputFile.cc.

References cms::cuda::assert(), branchesWithStoredHistory_, 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().

826  {
827  assert(om_->dropMetaData() != PoolOutputModule::DropAll);
828  assert(produced || om_->dropMetaData() != PoolOutputModule::DropPrior);
829  if (om_->dropMetaData() == PoolOutputModule::DropDroppedPrior && !produced)
830  return;
831  std::vector<BranchID> const& parentIDs = iGetParents.parentage().parents();
832  for (auto const& parentID : parentIDs) {
833  branchesWithStoredHistory_.insert(parentID);
834  ProductProvenance const* info = iMapper->branchIDToProvenance(parentID);
835  if (info) {
836  if (om_->dropMetaData() == PoolOutputModule::DropNone ||
837  (iProducedIDs.end() != iProducedIDs.find(info->branchID()))) {
838  if (insertProductProvenance(*info, oToFill)) {
839  //haven't seen this one yet
840  insertAncestors(*info, iMapper, produced, iProducedIDs, oToFill);
841  }
842  }
843  }
844  }
845  }
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)

◆ insertProductProvenance()

bool edm::RootOutputFile::insertProductProvenance ( const ProductProvenance ,
std::set< StoredProductProvenance > &  oToInsert 
)
private

Definition at line 924 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().

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

◆ pEventEntryInfoVector() [1/2]

StoredProductProvenanceVector const* edm::RootOutputFile::pEventEntryInfoVector ( ) const
inlineprivate

Definition at line 103 of file RootOutputFile.h.

References edm::get_underlying_safe(), and pEventEntryInfoVector_.

Referenced by RootOutputFile().

103  {
105  }
constexpr std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_

◆ pEventEntryInfoVector() [2/2]

StoredProductProvenanceVector*& edm::RootOutputFile::pEventEntryInfoVector ( )
inlineprivate

Definition at line 106 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_

◆ respondToCloseInputFile()

void edm::RootOutputFile::respondToCloseInputFile ( FileBlock const &  fb)

Definition at line 457 of file RootOutputFile.cc.

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

457  {
458  // We can't do setEntries() on the event tree if the EventAuxiliary branch is empty & disabled
459  if (not om_->compactEventAuxiliary()) {
461  }
464  }
RootOutputTree eventTree_
edm::propagate_const< PoolOutputModule * > om_
RootOutputTree runTree_
RootOutputTree lumiTree_

◆ setBranchAliases()

void edm::RootOutputFile::setBranchAliases ( TTree *  tree,
SelectedProducts const &  branches,
std::string const &  processName 
) const
private

Definition at line 800 of file RootOutputFile.cc.

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

Referenced by finishEndFile().

802  {
803  if (tree && tree->GetNbranches() != 0) {
804  for (auto const& selection : branches) {
805  BranchDescription const& pd = *selection.first;
806  if (pd.branchType() == InProcess && processName != pd.processName()) {
807  continue;
808  }
809  std::string const& full = pd.branchName() + "obj";
810  if (pd.branchAliases().empty()) {
811  std::string const& alias = (pd.productInstanceName().empty() ? pd.moduleLabel() : pd.productInstanceName());
812  tree->SetAlias(alias.c_str(), full.c_str());
813  } else {
814  for (auto const& alias : pd.branchAliases()) {
815  tree->SetAlias(alias.c_str(), full.c_str());
816  }
817  }
818  }
819  }
820  }
selection
main part
Definition: corrVsCorr.py:100
Definition: GenABIO.cc:168
Definition: tree.py:1

◆ shouldWeCloseFile()

bool edm::RootOutputFile::shouldWeCloseFile ( ) const

Definition at line 466 of file RootOutputFile.cc.

References filePtr_, om_, and findQualityFiles::size.

466  {
467  unsigned int const oneK = 1024;
468  Long64_t size = filePtr_->GetSize() / oneK;
469  return (size >= om_->maxFileSize());
470  }
size
Write out results.
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_

◆ writeBranchIDListRegistry()

void edm::RootOutputFile::writeBranchIDListRegistry ( )

Definition at line 653 of file RootOutputFile.cc.

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

653  {
654  BranchIDLists const* p = om_->branchIDLists();
655  TBranch* b = metaDataTree_->Branch(poolNames::branchIDListBranchName().c_str(), &p, om_->basketSize(), 0);
656  assert(b);
657  b->Fill();
658  }
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
std::string const & branchIDListBranchName()
Definition: BranchType.cc:183
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118

◆ writeEventAuxiliary()

void edm::RootOutputFile::writeEventAuxiliary ( )

Definition at line 719 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(), and edm::RootOutputTree::tree().

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

◆ writeFileFormatVersion()

void edm::RootOutputFile::writeFileFormatVersion ( )

Definition at line 607 of file RootOutputFile.cc.

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

607  {
608  FileFormatVersion fileFormatVersion(getFileFormatVersion());
609  FileFormatVersion* pFileFmtVsn = &fileFormatVersion;
610  TBranch* b =
611  metaDataTree_->Branch(poolNames::fileFormatVersionBranchName().c_str(), &pFileFmtVsn, om_->basketSize(), 0);
612  assert(b);
613  b->Fill();
614  }
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:189
edm::propagate_const< PoolOutputModule * > om_
int getFileFormatVersion()
double b
Definition: hdecay.h:118

◆ writeFileIdentifier()

void edm::RootOutputFile::writeFileIdentifier ( )

Definition at line 616 of file RootOutputFile.cc.

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

616  {
617  FileID* fidPtr = &fid_;
618  TBranch* b = metaDataTree_->Branch(poolNames::fileIdentifierBranchName().c_str(), &fidPtr, om_->basketSize(), 0);
619  assert(b);
620  b->Fill();
621  }
std::string const & fileIdentifierBranchName()
Definition: BranchType.cc:192
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118

◆ writeIndexIntoFile()

void edm::RootOutputFile::writeIndexIntoFile ( )

Definition at line 623 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().

623  {
626  ex << "The number of entries in at least one output TBranch whose entries\n"
627  "were copied from the input does not match the number of events\n"
628  "recorded in IndexIntoFile. This might (or might not) indicate a\n"
629  "problem related to fast copy.";
630  ex.addContext("Calling RootOutputFile::writeIndexIntoFile");
631  throw ex;
632  }
634  IndexIntoFile* iifPtr = &indexIntoFile_;
635  TBranch* b = metaDataTree_->Branch(poolNames::indexIntoFileBranchName().c_str(), &iifPtr, om_->basketSize(), 0);
636  assert(b);
637  b->Fill();
638  }
bool checkEntriesInReadBranches(Long64_t expectedNumberOfEntries) const
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_
double b
Definition: hdecay.h:118
IndexIntoFile indexIntoFile_
std::string const & indexIntoFileBranchName()
Definition: BranchType.cc:198

◆ writeLuminosityBlock()

void edm::RootOutputFile::writeLuminosityBlock ( LuminosityBlockForOutput const &  lb)

Definition at line 527 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(), edm::LuminosityBlockAuxiliary::setProcessHistoryID(), and mitigatedMETSequence_cff::U.

527  {
528  // Auxiliary branch
529  // NOTE: lumiAux_ must be filled before calling fillBranches since it gets written out in that routine.
530  lumiAux_ = lb.luminosityBlockAuxiliary();
531  // Use the updated process historyID
532  lumiAux_.setProcessHistoryID(lb.processHistoryID());
533  // Store the process history.
534  processHistoryRegistry_.registerProcessHistory(lb.processHistory());
535  // Store the reduced ID in the IndexIntoFile
536  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(lb.processHistoryID());
537  // Add lumi to index.
540  unsigned int ttreeIndex = InLumi;
541  fillBranches(InLumi, lb, ttreeIndex);
542  lumiTree_.optimizeBaskets(10ULL * 1024 * 1024);
543 
544  Service<JobReport> reportSvc;
545  reportSvc->reportLumiSection(reportToken_, lb.id().run(), lb.id().luminosityBlock(), nEventsInLumi_);
546  nEventsInLumi_ = 0;
547  }
LuminosityBlockAuxiliary lumiAux_
bool registerProcessHistory(ProcessHistory const &processHistory)
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
LuminosityBlockNumber_t luminosityBlock() const
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, unsigned int ttreeIndex, StoredProductProvenanceVector *productProvenanceVecPtr=nullptr, ProductProvenanceRetriever const *provRetriever=nullptr)
void setProcessHistoryID(ProcessHistoryID const &phid)
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_

◆ writeOne()

void edm::RootOutputFile::writeOne ( EventForOutput const &  e)

Definition at line 472 of file RootOutputFile.cc.

References edm::IndexIntoFile::addEntry(), cms::cuda::assert(), compactEventAuxiliary_, DTskim_cfg::dataType, dataTypeReported_, MillePedeFileConverter_cfg::e, edm::EventAuxiliary::event(), eventEntryNumber_, fillBranches(), indexIntoFile_, edm::InEvent, edm::EventAuxiliary::isRealData(), edm::EventAuxiliary::luminosityBlock(), nEventsInLumi_, om_, pBranchListIndexes_, pEventAux_, pEventEntryInfoVector_, pEventSelectionIDs_, pEventToProcessBlockIndexes_, edm::EventAuxiliary::processHistoryID(), processHistoryRegistry_, edm::CompactEventAuxiliaryVector::push_back(), edm::ProcessHistoryRegistry::reducedProcessHistoryID(), edm::ProcessHistoryRegistry::registerProcessHistory(), reportToken_, edm::EventAuxiliary::run(), and AlCaHLTBitMon_QueryRunRegistry::string.

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

◆ writeParameterSetRegistry()

void edm::RootOutputFile::writeParameterSetRegistry ( )

Definition at line 668 of file RootOutputFile.cc.

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

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

◆ writeParentageRegistry()

void edm::RootOutputFile::writeParentageRegistry ( )

Definition at line 585 of file RootOutputFile.cc.

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

585  {
586  Parentage const* desc(nullptr);
587 
588  if (!parentageTree_->Branch(poolNames::parentageBranchName().c_str(), &desc, om_->basketSize(), 0))
589  throw Exception(errors::FatalRootError) << "Failed to create a branch for Parentages in the output file";
590 
591  ParentageRegistry& ptReg = *ParentageRegistry::instance();
592 
593  std::vector<ParentageID> orderedIDs(parentageIDs_.size());
594  for (auto const& parentageID : parentageIDs_) {
595  orderedIDs[parentageID.second] = parentageID.first;
596  }
597  //now put them into the TTree in the correct order
598  for (auto const& orderedID : orderedIDs) {
599  desc = ptReg.getMapped(orderedID);
600  //NOTE: some old format files have missing Parentage info
601  // so a null value of desc can't be fatal.
602  // Root will default construct an object in that case.
603  parentageTree_->Fill();
604  }
605  }
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()

◆ writeProcessBlock()

void edm::RootOutputFile::writeProcessBlock ( ProcessBlockForOutput const &  pb)

Definition at line 571 of file RootOutputFile.cc.

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

571  {
572  std::string const& processName = pb.processName();
573  std::vector<std::string> const& processesWithProcessBlockProducts =
574  om_->outputProcessBlockHelper().processesWithProcessBlockProducts();
575  std::vector<std::string>::const_iterator it =
576  std::find(processesWithProcessBlockProducts.cbegin(), processesWithProcessBlockProducts.cend(), processName);
577  if (it == processesWithProcessBlockProducts.cend()) {
578  return;
579  }
580  unsigned int ttreeIndex = InProcess + std::distance(processesWithProcessBlockProducts.cbegin(), it);
581  fillBranches(InProcess, pb, ttreeIndex);
582  treePointers_[ttreeIndex]->optimizeBaskets(10ULL * 1024 * 1024);
583  }
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)

◆ writeProcessBlockHelper()

void edm::RootOutputFile::writeProcessBlockHelper ( )

Definition at line 749 of file RootOutputFile.cc.

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

749  {
750  if (!om_->outputProcessBlockHelper().processesWithProcessBlockProducts().empty()) {
751  StoredProcessBlockHelper storedProcessBlockHelper(
752  om_->outputProcessBlockHelper().processesWithProcessBlockProducts());
753  om_->outputProcessBlockHelper().fillCacheIndices(storedProcessBlockHelper);
754 
755  StoredProcessBlockHelper* pStoredProcessBlockHelper = &storedProcessBlockHelper;
756  TBranch* b = metaDataTree_->Branch(
757  poolNames::processBlockHelperBranchName().c_str(), &pStoredProcessBlockHelper, om_->basketSize(), 0);
758  assert(b);
759  b->Fill();
760  }
761  }
std::string const & processBlockHelperBranchName()
Definition: BranchType.cc:204
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118

◆ writeProcessHistoryRegistry()

void edm::RootOutputFile::writeProcessHistoryRegistry ( )

Definition at line 649 of file RootOutputFile.cc.

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

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

◆ writeProductDependencies()

void edm::RootOutputFile::writeProductDependencies ( )

Definition at line 703 of file RootOutputFile.cc.

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

703  {
704  BranchChildren& pDeps = const_cast<BranchChildren&>(om_->branchChildren());
705  BranchChildren* ppDeps = &pDeps;
706  TBranch* b =
707  metaDataTree_->Branch(poolNames::productDependenciesBranchName().c_str(), &ppDeps, om_->basketSize(), 0);
708  assert(b);
709  b->Fill();
710  }
edm::propagate_const< TTree * > metaDataTree_
std::string const & productDependenciesBranchName()
Definition: BranchType.cc:165
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:118

◆ writeProductDescriptionRegistry()

void edm::RootOutputFile::writeProductDescriptionRegistry ( )

Definition at line 672 of file RootOutputFile.cc.

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

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

◆ writeRun()

void edm::RootOutputFile::writeRun ( RunForOutput const &  r)

Definition at line 549 of file RootOutputFile.cc.

References edm::IndexIntoFile::addEntry(), fillBranches(), indexIntoFile_, edm::InRun, edm::RootOutputTree::optimizeBaskets(), processHistoryRegistry_, alignCSCRings::r, edm::ProcessHistoryRegistry::reducedProcessHistoryID(), edm::ProcessHistoryRegistry::registerProcessHistory(), reportToken_, edm::RunAuxiliary::run(), runAux_, runEntryNumber_, runTree_, edm::RunAuxiliary::setProcessHistoryID(), storedMergeableRunProductMetadata_, and mitigatedMETSequence_cff::U.

549  {
550  // Auxiliary branch
551  // NOTE: runAux_ must be filled before calling fillBranches since it gets written out in that routine.
552  runAux_ = r.runAuxiliary();
553  // Use the updated process historyID
554  runAux_.setProcessHistoryID(r.processHistoryID());
555  // Store the process history.
557  // Store the reduced ID in the IndexIntoFile
558  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(r.processHistoryID());
559  // Add run to index.
560  indexIntoFile_.addEntry(reducedPHID, runAux_.run(), 0U, 0U, runEntryNumber_);
561  r.mergeableRunProductMetadata()->addEntryToStoredMetadata(storedMergeableRunProductMetadata_);
562  ++runEntryNumber_;
563  unsigned int ttreeIndex = InRun;
564  fillBranches(InRun, r, ttreeIndex);
565  runTree_.optimizeBaskets(10ULL * 1024 * 1024);
566 
567  Service<JobReport> reportSvc;
568  reportSvc->reportRunNumber(reportToken_, r.run());
569  }
bool registerProcessHistory(ProcessHistory const &processHistory)
ProcessHistoryRegistry processHistoryRegistry_
RunNumber_t run() const
Definition: RunAuxiliary.h:31
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, unsigned int ttreeIndex, StoredProductProvenanceVector *productProvenanceVecPtr=nullptr, ProductProvenanceRetriever const *provRetriever=nullptr)
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)
JobReport::Token reportToken_

◆ writeStoredMergeableRunProductMetadata()

void edm::RootOutputFile::writeStoredMergeableRunProductMetadata ( )

Definition at line 640 of file RootOutputFile.cc.

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

640  {
642  StoredMergeableRunProductMetadata* ptr = &storedMergeableRunProductMetadata_;
643  TBranch* b =
644  metaDataTree_->Branch(poolNames::mergeableRunProductMetadataBranchName().c_str(), &ptr, om_->basketSize(), 0);
645  assert(b);
646  b->Fill();
647  }
std::string const & mergeableRunProductMetadataBranchName()
Definition: BranchType.cc:201
edm::propagate_const< TTree * > metaDataTree_
assert(be >=bs)
edm::propagate_const< PoolOutputModule * > om_
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
double b
Definition: hdecay.h:118

◆ writeThinnedAssociationsHelper()

void edm::RootOutputFile::writeThinnedAssociationsHelper ( )

Definition at line 660 of file RootOutputFile.cc.

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

660  {
661  ThinnedAssociationsHelper const* p = om_->thinnedAssociationsHelper();
662  TBranch* b =
663  metaDataTree_->Branch(poolNames::thinnedAssociationsHelperBranchName().c_str(), &p, om_->basketSize(), 0);
664  assert(b);
665  b->Fill();
666  }
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

◆ branchesWithStoredHistory_

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

◆ canFastCloneAux_

bool edm::RootOutputFile::canFastCloneAux_
private

Definition at line 116 of file RootOutputFile.h.

Referenced by beginInputFile().

◆ compactEventAuxiliary_

CompactEventAuxiliaryVector edm::RootOutputFile::compactEventAuxiliary_
private

Definition at line 148 of file RootOutputFile.h.

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

◆ dataTypeReported_

bool edm::RootOutputFile::dataTypeReported_
private

Definition at line 143 of file RootOutputFile.h.

Referenced by writeOne().

◆ eventEntryInfoVector_

StoredProductProvenanceVector edm::RootOutputFile::eventEntryInfoVector_
private

Definition at line 133 of file RootOutputFile.h.

◆ eventEntryNumber_

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

Definition at line 119 of file RootOutputFile.h.

Referenced by writeIndexIntoFile(), and writeOne().

◆ eventTree_

RootOutputTree edm::RootOutputFile::eventTree_
private

◆ fid_

FileID edm::RootOutputFile::fid_
private

Definition at line 118 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeFileIdentifier().

◆ file_

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

Definition at line 111 of file RootOutputFile.h.

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

◆ filePtr_

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

◆ indexIntoFile_

IndexIntoFile edm::RootOutputFile::indexIntoFile_
private

Definition at line 122 of file RootOutputFile.h.

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

◆ logicalFile_

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

Definition at line 112 of file RootOutputFile.h.

Referenced by RootOutputFile().

◆ lumiAux_

LuminosityBlockAuxiliary edm::RootOutputFile::lumiAux_
private

Definition at line 128 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

◆ lumiEntryNumber_

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

Definition at line 120 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

◆ lumiTree_

RootOutputTree edm::RootOutputFile::lumiTree_
private

Definition at line 139 of file RootOutputFile.h.

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

◆ metaDataTree_

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

◆ nEventsInLumi_

unsigned long edm::RootOutputFile::nEventsInLumi_
private

Definition at line 124 of file RootOutputFile.h.

Referenced by writeLuminosityBlock(), and writeOne().

◆ om_

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

◆ parameterSetsTree_

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

Definition at line 126 of file RootOutputFile.h.

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

◆ parentageIDs_

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

Definition at line 145 of file RootOutputFile.h.

Referenced by insertProductProvenance(), and writeParentageRegistry().

◆ parentageTree_

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

Definition at line 127 of file RootOutputFile.h.

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

◆ pBranchListIndexes_

BranchListIndexes const* edm::RootOutputFile::pBranchListIndexes_
private

Definition at line 135 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

◆ pEventAux_

EventAuxiliary const* edm::RootOutputFile::pEventAux_
private

Definition at line 130 of file RootOutputFile.h.

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

◆ pEventEntryInfoVector_

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

Definition at line 134 of file RootOutputFile.h.

Referenced by pEventEntryInfoVector(), and writeOne().

◆ pEventSelectionIDs_

EventSelectionIDVector const* edm::RootOutputFile::pEventSelectionIDs_
private

Definition at line 137 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

◆ pEventToProcessBlockIndexes_

EventToProcessBlockIndexes const* edm::RootOutputFile::pEventToProcessBlockIndexes_
private

Definition at line 136 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

◆ pLumiAux_

LuminosityBlockAuxiliary const* edm::RootOutputFile::pLumiAux_
private

Definition at line 131 of file RootOutputFile.h.

Referenced by RootOutputFile().

◆ processBlockTrees_

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

Definition at line 141 of file RootOutputFile.h.

Referenced by RootOutputFile().

◆ processHistoryRegistry_

ProcessHistoryRegistry edm::RootOutputFile::processHistoryRegistry_
private

◆ pRunAux_

RunAuxiliary const* edm::RootOutputFile::pRunAux_
private

Definition at line 132 of file RootOutputFile.h.

Referenced by RootOutputFile().

◆ reportToken_

JobReport::Token edm::RootOutputFile::reportToken_
private

◆ runAux_

RunAuxiliary edm::RootOutputFile::runAux_
private

Definition at line 129 of file RootOutputFile.h.

Referenced by writeRun().

◆ runEntryNumber_

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

Definition at line 121 of file RootOutputFile.h.

Referenced by writeRun().

◆ runTree_

RootOutputTree edm::RootOutputFile::runTree_
private

Definition at line 140 of file RootOutputFile.h.

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

◆ storedMergeableRunProductMetadata_

StoredMergeableRunProductMetadata edm::RootOutputFile::storedMergeableRunProductMetadata_
private

Definition at line 123 of file RootOutputFile.h.

Referenced by writeRun(), and writeStoredMergeableRunProductMetadata().

◆ treePointers_

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

Definition at line 142 of file RootOutputFile.h.

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

◆ whyNotFastClonable_

int edm::RootOutputFile::whyNotFastClonable_
private

Definition at line 115 of file RootOutputFile.h.

Referenced by beginInputFile(), and fillBranches().

◆ wrapperBaseTClass_

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

Definition at line 147 of file RootOutputFile.h.

Referenced by fillBranches().