LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
art::RootOutputFile Class Reference

#include "RootOutputFile.h"

Classes

struct  OutputItem
 

Public Types

enum  ClosureRequestMode { ClosureRequestMode::MaxEvents, ClosureRequestMode::MaxSize, ClosureRequestMode::Unset }
 
using RootOutputTreePtrArray = std::array< std::unique_ptr< RootOutputTree >, NumBranchTypes >
 
using OutputItemList = std::set< OutputItem >
 
using OutputItemListArray = std::array< OutputItemList, NumBranchTypes >
 

Public Member Functions

 RootOutputFile (OutputModule *, std::string const &fileName, ClosingCriteria const &fileSwitchCriteria, int const compressionLevel, int64_t const saveMemoryObjectThreshold, int64_t const treeMaxVirtualSize, int const splitLevel, int const basketSize, DropMetaData dropMetaData, bool dropMetaDataForDroppedData, bool fastCloningRequested)
 
void writeTTrees ()
 
void writeOne (EventPrincipal const &)
 
void writeSubRun (SubRunPrincipal const &)
 
void writeRun (RunPrincipal const &)
 
void writeFileFormatVersion ()
 
void writeFileIndex ()
 
void writeEventHistory ()
 
void writeProcessConfigurationRegistry ()
 
void writeProcessHistoryRegistry ()
 
void writeParameterSetRegistry ()
 
void writeProductDescriptionRegistry ()
 
void writeParentageRegistry ()
 
void writeProductDependencies ()
 
void writeFileCatalogMetadata (FileStatsCollector const &stats, FileCatalogMetadata::collection_type const &, FileCatalogMetadata::collection_type const &)
 
void writeResults (ResultsPrincipal &resp)
 
void setRunAuxiliaryRangeSetID (RangeSet const &)
 
void setSubRunAuxiliaryRangeSetID (RangeSet const &)
 
void beginInputFile (RootFileBlock const *, bool fastClone)
 
void incrementInputFileNumber ()
 
void respondToCloseInputFile (FileBlock const &)
 
bool requestsToCloseFile ()
 
void setFileStatus (OutputFileStatus const ofs)
 
void selectProducts ()
 
std::string const & currentFileName () const
 
bool maxEventsPerFileReached (FileIndex::EntryNumber_t const maxEventsPerFile) const
 
bool maxSizeReached (unsigned const maxFileSize) const
 
template<BranchType BT>
std::enable_if_t<!RangeSetsSupported< BT >::value, art::EDProduct const * > getProduct (art::OutputHandle const &oh, art::RangeSet const &, std::string const &wrappedName)
 
template<BranchType BT>
std::enable_if_t< RangeSetsSupported< BT >::value, art::EDProduct const * > getProduct (art::OutputHandle const &oh, art::RangeSet const &prunedProductRS, std::string const &wrappedName)
 

Private Member Functions

void createDatabaseTables ()
 
template<BranchType >
void fillBranches (Principal const &, std::vector< ProductProvenance > *)
 
template<BranchType BT>
std::enable_if_t<!detail::RangeSetsSupported< BT >::value, art::EDProduct const * > getProduct (OutputHandle const &, RangeSet const &productRS, std::string const &wrappedName)
 
template<BranchType BT>
std::enable_if_t< detail::RangeSetsSupported< BT >::value, art::EDProduct const * > getProduct (OutputHandle const &, RangeSet const &productRS, std::string const &wrappedName)
 

Private Attributes

OutputModule const * om_
 
std::string file_
 
ClosingCriteria fileSwitchCriteria_
 
OutputFileStatus status_ {OutputFileStatus::Closed}
 
int const compressionLevel_
 
int64_t const saveMemoryObjectThreshold_
 
int64_t const treeMaxVirtualSize_
 
int const splitLevel_
 
int const basketSize_
 
DropMetaData dropMetaData_
 
bool dropMetaDataForDroppedData_
 
bool fastCloningEnabledAtConstruction_
 
bool wasFastCloned_ {false}
 
std::unique_ptr< TFile > filePtr_
 
FileIndex fileIndex_ {}
 
FileProperties fp_ {}
 
TTree * metaDataTree_ {nullptr}
 
TTree * fileIndexTree_ {nullptr}
 
TTree * parentageTree_ {nullptr}
 
TTree * eventHistoryTree_ {nullptr}
 
EventAuxiliary const * pEventAux_ {nullptr}
 
SubRunAuxiliary const * pSubRunAux_ {nullptr}
 
RunAuxiliary const * pRunAux_ {nullptr}
 
ResultsAuxiliary const * pResultsAux_ {nullptr}
 
ProductProvenances eventProductProvenanceVector_ {}
 
ProductProvenances subRunProductProvenanceVector_ {}
 
ProductProvenances runProductProvenanceVector_ {}
 
ProductProvenances resultsProductProvenanceVector_ {}
 
ProductProvenancespEventProductProvenanceVector_
 
ProductProvenancespSubRunProductProvenanceVector_
 
ProductProvenancespRunProductProvenanceVector_
 
ProductProvenancespResultsProductProvenanceVector_
 
History const * pHistory_ {nullptr}
 
RootOutputTreePtrArray treePointers_
 
bool dataTypeReported_ {false}
 
std::set< ProductIDbranchesWithStoredHistory_ {}
 
cet::sqlite::Connection rootFileDB_
 
OutputItemListArray selectedOutputItemList_ {{}}
 
detail::DummyProductCache dummyProductCache_ {}
 
unsigned subRunRSID_ {-1u}
 
unsigned runRSID_ {-1u}
 
std::chrono::steady_clock::time_point beginTime_
 

Detailed Description

Definition at line 50 of file RootOutputFile.h.

Member Typedef Documentation

Definition at line 76 of file RootOutputFile.h.

Definition at line 54 of file RootOutputFile.h.

Member Enumeration Documentation

Enumerator
MaxEvents 
MaxSize 
Unset 

Definition at line 52 of file RootOutputFile.h.

52 { MaxEvents, MaxSize, Unset };
constexpr BitMask< Storage > Unset(Flag_t< Storage > flag)
Returns a bit mask which unsets the specified flag.

Constructor & Destructor Documentation

art::RootOutputFile::RootOutputFile ( OutputModule om,
std::string const &  fileName,
ClosingCriteria const &  fileSwitchCriteria,
int const  compressionLevel,
int64_t const  saveMemoryObjectThreshold,
int64_t const  treeMaxVirtualSize,
int const  splitLevel,
int const  basketSize,
DropMetaData  dropMetaData,
bool  dropMetaDataForDroppedData,
bool  fastCloningRequested 
)
explicit

Definition at line 312 of file RootOutputFile.cc.

References basketSize_, compressionLevel_, createDatabaseTables(), dropMetaData_, dropMetaDataForDroppedData_, art::rootNames::eventHistoryBranchName(), eventHistoryTree_, art::rootNames::eventHistoryTreeName(), fastCloningEnabledAtConstruction_, art::errors::FatalRootError, file_, fileIndexTree_, art::rootNames::fileIndexTreeName(), filePtr_, fileSwitchCriteria_, art::ServiceHandle< T, SCOPE >::get(), art::InEvent, art::InResults, art::InRun, art::InSubRun, art::RootOutputTree::makeTTree(), metaDataTree_, art::rootNames::metaDataTreeName(), art::Open, parentageTree_, art::rootNames::parentageTreeName(), pEventAux_, pEventProductProvenanceVector_, pHistory_, pResultsAux_, pResultsProductProvenanceVector_, pRunAux_, pRunProductProvenanceVector_, pSubRunAux_, pSubRunProductProvenanceVector_, rootFileDB_, saveMemoryObjectThreshold_, splitLevel_, treeMaxVirtualSize_, and treePointers_.

323  : om_{om}
324  , file_{fileName}
325  , fileSwitchCriteria_{fileSwitchCriteria}
326  , compressionLevel_{compressionLevel}
327  , saveMemoryObjectThreshold_{saveMemoryObjectThreshold}
328  , treeMaxVirtualSize_{treeMaxVirtualSize}
329  , splitLevel_{splitLevel}
330  , basketSize_{basketSize}
331  , dropMetaData_{dropMetaData}
332  , dropMetaDataForDroppedData_{dropMetaDataForDroppedData}
333  , fastCloningEnabledAtConstruction_{fastCloningRequested}
334  , filePtr_{TFile::Open(file_.c_str(), "recreate", "", compressionLevel)}
335  , treePointers_{{// Order (and number) must match BranchTypes.h!
336  std::make_unique<RootOutputTree>(
337  filePtr_.get(),
338  InEvent,
339  pEventAux_,
341  basketSize,
342  splitLevel,
343  treeMaxVirtualSize,
344  saveMemoryObjectThreshold),
345  std::make_unique<RootOutputTree>(
346  filePtr_.get(),
347  InSubRun,
348  pSubRunAux_,
350  basketSize,
351  splitLevel,
352  treeMaxVirtualSize,
353  saveMemoryObjectThreshold),
354  std::make_unique<RootOutputTree>(
355  filePtr_.get(),
356  InRun,
357  pRunAux_,
359  basketSize,
360  splitLevel,
361  treeMaxVirtualSize,
362  saveMemoryObjectThreshold),
363  std::make_unique<RootOutputTree>(
364  filePtr_.get(),
365  InResults,
366  pResultsAux_,
368  basketSize,
369  splitLevel,
370  treeMaxVirtualSize,
371  saveMemoryObjectThreshold)}}
372  , rootFileDB_{ServiceHandle<DatabaseConnection>{}->get<TKeyVFSOpenPolicy>(
373  "RootFileDB",
374  filePtr_.get(),
375  SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE)}
376 {
377  // Don't split metadata tree or event description tree
378  metaDataTree_ =
384  // Create the tree that will carry (event) History objects.
386  filePtr_.get(), rootNames::eventHistoryTreeName(), splitLevel);
387  if (!eventHistoryTree_) {
389  << "Failed to create the tree for History objects\n";
390  }
391 
392  pHistory_ = new History;
393  if (!eventHistoryTree_->Branch(rootNames::eventHistoryBranchName().c_str(),
394  &pHistory_,
395  basketSize,
396  0)) {
398  << "Failed to create a branch for History in the output file\n";
399  }
400  delete pHistory_;
401  pHistory_ = nullptr;
402 
403  // Check that dictionaries for the auxiliaries exist
404  root::DictionaryChecker checker{};
405  checker.checkDictionaries<EventAuxiliary>();
406  checker.checkDictionaries<SubRunAuxiliary>();
407  checker.checkDictionaries<RunAuxiliary>();
408  checker.checkDictionaries<ResultsAuxiliary>();
409  checker.reportMissingDictionaries();
410 
412 }
SubRunAuxiliary const * pSubRunAux_
EventAuxiliary const * pEventAux_
int const compressionLevel_
cet::sqlite::Connection rootFileDB_
bool fastCloningEnabledAtConstruction_
ProductProvenances * pRunProductProvenanceVector_
int64_t const treeMaxVirtualSize_
std::unique_ptr< TFile > filePtr_
std::string const & parentageTreeName()
Definition: rootNames.cc:22
std::string const & eventHistoryTreeName()
Definition: rootNames.cc:55
DropMetaData dropMetaData_
ProductProvenances * pResultsProductProvenanceVector_
std::string const & metaDataTreeName()
Definition: rootNames.cc:41
RootOutputTreePtrArray treePointers_
ProductProvenances * pEventProductProvenanceVector_
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
static TTree * makeTTree(TFile *, std::string const &name, int splitLevel)
std::string const & fileIndexTreeName()
Definition: rootNames.cc:48
std::string const & eventHistoryBranchName()
Definition: rootNames.cc:62
OutputModule const * om_
int64_t const saveMemoryObjectThreshold_
ResultsAuxiliary const * pResultsAux_
ProductProvenances * pSubRunProductProvenanceVector_
RunAuxiliary const * pRunAux_
History const * pHistory_
ClosingCriteria fileSwitchCriteria_

Member Function Documentation

void art::RootOutputFile::beginInputFile ( RootFileBlock const *  rfb,
bool  fastClone 
)

Definition at line 477 of file RootOutputFile.cc.

References fastCloningEnabledAtConstruction_, art::InEvent, selectProducts(), art::detail::shouldFastClone(), treePointers_, and wasFastCloned_.

479 {
480  // FIXME: the logic here is nasty.
482  fastCloneFromOutputModule && rfb};
483  // Create output branches, and then redo calculation to determine if
484  // fast cloning should be done.
485  selectProducts();
486  if (shouldFastClone &&
487  !treePointers_[InEvent]->checkSplitLevelAndBasketSize(rfb->tree())) {
488  mf::LogWarning("FastCloning")
489  << "Fast cloning deactivated for this input file due to "
490  << "splitting level and/or basket size.";
491  shouldFastClone = false;
492  } else if (rfb && rfb->tree() &&
493  rfb->tree()->GetCurrentFile()->GetVersion() < 60001) {
494  mf::LogWarning("FastCloning")
495  << "Fast cloning deactivated for this input file due to "
496  << "ROOT version used to write it (< 6.00/01)\n"
497  "having a different splitting policy.";
498  shouldFastClone = false;
499  }
500 
501  if (shouldFastClone && rfb->fileFormatVersion().value_ < 10) {
502  mf::LogWarning("FastCloning")
503  << "Fast cloning deactivated for this input file due to "
504  << "reading in file that has a different ProductID schema.";
505  shouldFastClone = false;
506  }
507 
509  mf::LogWarning("FastCloning")
510  << "Fast cloning reactivated for this input file.";
511  }
512  treePointers_[InEvent]->beginInputFile(shouldFastClone);
513  auto tree = (rfb && rfb->tree()) ? rfb->tree() : nullptr;
514  wasFastCloned_ = treePointers_[InEvent]->fastCloneTree(tree);
515 }
bool fastCloningEnabledAtConstruction_
RootOutputTreePtrArray treePointers_
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
bool shouldFastClone(bool fastCloningSet, bool fastCloning, bool wantAllEvents, ClosingCriteria const &fileProperties)
void art::RootOutputFile::createDatabaseTables ( )
private

Definition at line 415 of file RootOutputFile.cc.

References rootFileDB_.

Referenced by currentFileName(), and RootOutputFile().

416 {
417  // Event ranges
418  create_table(rootFileDB_,
419  "EventRanges",
420  {"SubRun INTEGER",
421  "begin INTEGER",
422  "end INTEGER",
423  "UNIQUE (SubRun,begin,end) ON CONFLICT IGNORE"});
424 
425  // SubRun range sets
426  using namespace cet::sqlite;
427  create_table(rootFileDB_, "SubRunRangeSets", column<int>{"Run"});
428  create_table(rootFileDB_,
429  "SubRunRangeSets_EventRanges",
430  {"RangeSetsID INTEGER",
431  "EventRangesID INTEGER",
432  "PRIMARY KEY(RangeSetsID,EventRangesID)"},
433  "WITHOUT ROWID");
434 
435  // Run range sets
436  create_table(rootFileDB_, "RunRangeSets", column<int>{"Run"});
437  create_table(rootFileDB_,
438  "RunRangeSets_EventRanges",
439  {"RangeSetsID INTEGER",
440  "EventRangesID INTEGER",
441  "PRIMARY KEY(RangeSetsID,EventRangesID)"},
442  "WITHOUT ROWID");
443 }
cet::sqlite::Connection rootFileDB_
std::string const& art::RootOutputFile::currentFileName ( ) const
inline
template<art::BranchType BT>
void art::RootOutputFile::fillBranches ( Principal const &  principal,
std::vector< ProductProvenance > *  vpp 
)
private

Definition at line 833 of file RootOutputFile.cc.

References branchesWithStoredHistory_, dropMetaData_, dropMetaDataForDroppedData_, art::DropMetaData::DropNone, art::productstatus::dropped(), art::DropMetaData::DropPrior, art::Principal::getForOutput(), art::InEvent, art::RangeSet::is_valid(), art::productstatus::neverCreated(), art::OutputHandle::productProvenance(), rootFileDB_, art::Principal::seenRanges(), selectedOutputItemList_, treePointers_, art::productstatus::unknown(), fhicl::detail::atom::value(), and wasFastCloned_.

Referenced by currentFileName().

835 {
836  bool const fastCloning = (BT == InEvent) && wasFastCloned_;
837  detail::KeptProvenance keptProvenance{
839  map<unsigned, unsigned> checksumToIndex;
840 
841  auto const& principalRS = principal.seenRanges();
842 
843  for (auto const& val : selectedOutputItemList_[BT]) {
844  auto const* pd = val.branchDescription_;
845  auto const pid = pd->productID();
846  branchesWithStoredHistory_.insert(pid);
847  bool const produced{pd->produced()};
848  bool const resolveProd = (produced || !fastCloning ||
849  treePointers_[BT]->uncloned(pd->branchName()));
850 
851  // Update the kept provenance
852  bool const keepProvenance =
854  (dropMetaData_ == DropMetaData::DropPrior && produced));
855  auto const& oh = principal.getForOutput(pid, resolveProd);
856 
857  unique_ptr<ProductProvenance> prov{nullptr};
858  if (keepProvenance) {
859  if (oh.productProvenance()) {
860  prov = std::make_unique<ProductProvenance>(
861  keptProvenance.insert(*oh.productProvenance()));
862  keptProvenance.insertAncestors(*oh.productProvenance(), principal);
863  } else {
864  // No provenance, product was either not produced, or was
865  // dropped, create provenance to remember that.
866  auto const status =
867  produced ? productstatus::neverCreated() : productstatus::dropped();
868  prov = std::make_unique<ProductProvenance>(
869  keptProvenance.emplace(pid, status));
870  }
871  }
872 
873  // Resolve the product if necessary
874  if (resolveProd) {
875  auto const& rs = getRangeSet<BT>(oh, principalRS, produced);
876  if (RangeSetsSupported<BT>::value && !rs.is_valid()) {
877  // Unfortunately, 'unknown' is the only viable product status
878  // when this condition is triggered (due to the assert
879  // statement in ProductStatus::setNotPresent). Whenever the
880  // metadata revolution comes, this should be revised.
881  keptProvenance.setStatus(*prov, productstatus::unknown());
882  }
883 
884  auto const* product = getProduct<BT>(oh, rs, pd->wrappedName());
885  setProductRangeSetID<BT>(
886  rs, rootFileDB_, const_cast<EDProduct*>(product), checksumToIndex);
887  val.product_ = product;
888  }
889  }
890  vpp->assign(keptProvenance.begin(), keptProvenance.end());
891  treePointers_[BT]->fillTree();
892  vpp->clear();
893 }
std::set< ProductID > branchesWithStoredHistory_
cet::sqlite::Connection rootFileDB_
DropMetaData dropMetaData_
ProductStatus unknown()
Definition: ProductStatus.h:31
RootOutputTreePtrArray treePointers_
ProductStatus dropped()
Definition: ProductStatus.h:26
std::string value(boost::any const &)
OutputItemListArray selectedOutputItemList_
ProductStatus neverCreated()
Definition: ProductStatus.h:21
template<BranchType BT>
std::enable_if_t<!detail::RangeSetsSupported<BT>::value, art::EDProduct const*> art::RootOutputFile::getProduct ( OutputHandle const &  ,
RangeSet const &  productRS,
std::string const &  wrappedName 
)
private

Referenced by currentFileName().

template<BranchType BT>
std::enable_if_t<detail::RangeSetsSupported<BT>::value, art::EDProduct const*> art::RootOutputFile::getProduct ( OutputHandle const &  ,
RangeSet const &  productRS,
std::string const &  wrappedName 
)
private
template<BranchType BT>
std::enable_if_t<!RangeSetsSupported<BT>::value, art::EDProduct const*> art::RootOutputFile::getProduct ( art::OutputHandle const &  oh,
art::RangeSet const &  ,
std::string const &  wrappedName 
)

Definition at line 915 of file RootOutputFile.cc.

References dummyProductCache_, art::OutputHandle::isValid(), art::detail::DummyProductCache::product(), fhicl::detail::atom::value(), and art::OutputHandle::wrapper().

918 {
919  return oh.isValid() ? oh.wrapper() : dummyProductCache_.product(wrappedName);
920 }
detail::DummyProductCache dummyProductCache_
EDProduct const * product(std::string const &wrappedName)
template<BranchType BT>
std::enable_if_t<RangeSetsSupported<BT>::value, art::EDProduct const*> art::RootOutputFile::getProduct ( art::OutputHandle const &  oh,
art::RangeSet const &  prunedProductRS,
std::string const &  wrappedName 
)

Definition at line 924 of file RootOutputFile.cc.

References dummyProductCache_, art::RangeSet::is_valid(), art::OutputHandle::isValid(), art::detail::DummyProductCache::product(), and art::OutputHandle::wrapper().

927 {
928  return (oh.isValid() && prunedProductRS.is_valid()) ?
929  oh.wrapper() :
930  dummyProductCache_.product(wrappedName);
931 }
detail::DummyProductCache dummyProductCache_
EDProduct const * product(std::string const &wrappedName)
void art::RootOutputFile::incrementInputFileNumber ( )

Definition at line 518 of file RootOutputFile.cc.

References fp_, art::Granularity::InputFile, and art::FileProperties::update().

519 {
521 }
FileProperties fp_
std::enable_if_t< B!=Granularity::InputFile > update(OutputFileStatus const status)
bool art::RootOutputFile::maxEventsPerFileReached ( FileIndex::EntryNumber_t const  maxEventsPerFile) const

Referenced by currentFileName().

bool art::RootOutputFile::maxSizeReached ( unsigned const  maxFileSize) const

Referenced by currentFileName().

bool art::RootOutputFile::requestsToCloseFile ( )

Definition at line 530 of file RootOutputFile.cc.

References beginTime_, filePtr_, fileSwitchCriteria_, fp_, art::ClosingCriteria::should_close(), art::FileProperties::updateAge(), and art::FileProperties::updateSize().

531 {
532  using namespace std::chrono;
533  unsigned int constexpr oneK{1024u};
534  fp_.updateSize(filePtr_->GetSize() / oneK);
535  fp_.updateAge(duration_cast<seconds>(steady_clock::now() - beginTime_));
537 }
std::chrono::steady_clock::time_point beginTime_
std::unique_ptr< TFile > filePtr_
bool should_close(FileProperties const &) const
void updateAge(std::chrono::seconds const age)
FileProperties fp_
ClosingCriteria fileSwitchCriteria_
void updateSize(unsigned const size)
void art::RootOutputFile::respondToCloseInputFile ( FileBlock const &  )

Definition at line 524 of file RootOutputFile.cc.

References treePointers_.

525 {
526  cet::for_all(treePointers_, [](auto const& p) { p->setEntries(); });
527 }
RootOutputTreePtrArray treePointers_
void art::RootOutputFile::selectProducts ( )

Definition at line 446 of file RootOutputFile.cc.

References art::checkDictionaries(), art::InEvent, art::InResults, art::OutputModule::keptProducts(), art::NumBranchTypes, om_, selectedOutputItemList_, and treePointers_.

Referenced by beginInputFile(), and setFileStatus().

447 {
448  for (int i = InEvent; i < NumBranchTypes; ++i) {
449  auto const bt = static_cast<BranchType>(i);
450  auto& items = selectedOutputItemList_[bt];
451 
452  for (auto const& pd : om_->keptProducts()[bt]) {
453  // Persist Results products only if they have been produced by
454  // the current process.
455  if (bt == InResults && !pd->produced())
456  continue;
457  checkDictionaries(*pd);
458 
459  // Although the transient flag is already checked when
460  // OutputModule::doSelectProducts is called, it can be flipped
461  // to 'true' after the BranchDescription transients have been
462  // fluffed, which happens during the checkDictionaries call.
463  if (pd->transient()) {
464  continue;
465  }
466 
467  items.emplace(pd);
468  }
469 
470  for (auto const& val : items) {
471  treePointers_[bt]->addOutputBranch(*val.branchDescription_, val.product_);
472  }
473  }
474 }
RootOutputTreePtrArray treePointers_
SelectionsArray const & keptProducts() const
Definition: OutputModule.h:336
void checkDictionaries(BranchDescription const &productDesc)
OutputModule const * om_
BranchType
Definition: BranchType.h:18
OutputItemListArray selectedOutputItemList_
void art::RootOutputFile::setFileStatus ( OutputFileStatus const  ofs)
inline

Definition at line 117 of file RootOutputFile.h.

References selectProducts(), and status_.

118  {
119  status_ = ofs;
120  }
OutputFileStatus status_
void art::RootOutputFile::setRunAuxiliaryRangeSetID ( RangeSet const &  ranges)

Definition at line 905 of file RootOutputFile.cc.

References art::InRun, rootFileDB_, art::RangeSet::run(), runRSID_, and fhicl::detail::atom::value().

906 {
907  runRSID_ = getNewRangeSetID(rootFileDB_, InRun, ranges.run());
908  insertIntoEventRanges(rootFileDB_, ranges);
909  auto const& eventRangesIDs = getExistingRangeSetIDs(rootFileDB_, ranges);
910  insertIntoJoinTable(rootFileDB_, InRun, runRSID_, eventRangesIDs);
911 }
cet::sqlite::Connection rootFileDB_
void art::RootOutputFile::setSubRunAuxiliaryRangeSetID ( RangeSet const &  ranges)

Definition at line 896 of file RootOutputFile.cc.

References art::InSubRun, rootFileDB_, art::RangeSet::run(), and subRunRSID_.

897 {
898  subRunRSID_ = getNewRangeSetID(rootFileDB_, InSubRun, ranges.run());
899  insertIntoEventRanges(rootFileDB_, ranges);
900  auto const& eventRangesIDs = getExistingRangeSetIDs(rootFileDB_, ranges);
901  insertIntoJoinTable(rootFileDB_, InSubRun, subRunRSID_, eventRangesIDs);
902 }
cet::sqlite::Connection rootFileDB_
void art::RootOutputFile::writeEventHistory ( )

Definition at line 658 of file RootOutputFile.cc.

References eventHistoryTree_, and art::RootOutputTree::writeTTree().

659 {
661 }
static void writeTTree(TTree *) noexcept(false)
void art::RootOutputFile::writeFileCatalogMetadata ( FileStatsCollector const &  stats,
FileCatalogMetadata::collection_type const &  md,
FileCatalogMetadata::collection_type const &  ssmd 
)

Definition at line 690 of file RootOutputFile.cc.

References art::FileStatsCollector::eventsThisFile(), art::getFileFormatEra(), art::getFileFormatVersion(), art::FileStatsCollector::highestEventID(), art::FileStatsCollector::lowestEventID(), art::FileStatsCollector::outputFileOpenTime(), art::FileStatsCollector::parents(), rootFileDB_, art::FileStatsCollector::seenSubRuns(), and art::to_string().

694 {
695  using namespace cet::sqlite;
696  Ntuple<std::string, std::string> fileCatalogMetadata{
697  rootFileDB_, "FileCatalog_metadata", {{"Name", "Value"}}, true};
698  Transaction txn{rootFileDB_};
699  for (auto const& kv : md) {
700  fileCatalogMetadata.insert(kv.first, kv.second);
701  }
702  // Add our own specific information: File format and friends.
703  fileCatalogMetadata.insert("file_format", "\"artroot\"");
704  fileCatalogMetadata.insert("file_format_era",
705  cet::canonical_string(getFileFormatEra()));
706  fileCatalogMetadata.insert("file_format_version",
708 
709  // File start time.
710  namespace bpt = boost::posix_time;
711  auto formatted_time = [](auto const& t) {
712  return cet::canonical_string(bpt::to_iso_extended_string(t));
713  };
714  fileCatalogMetadata.insert("start_time",
715  formatted_time(stats.outputFileOpenTime()));
716  // File "end" time: now, since file is not actually closed yet.
717  fileCatalogMetadata.insert(
718  "end_time",
719  formatted_time(boost::posix_time::second_clock::universal_time()));
720 
721  // Run/subRun information.
722  if (!stats.seenSubRuns().empty()) {
723 
724  auto I = find_if(md.crbegin(), md.crend(), [](auto const& p) {
725  return p.first == "run_type";
726  });
727 
728  if (I != md.crend()) {
729  ostringstream buf;
730  buf << "[ ";
731  for (auto const& srid : stats.seenSubRuns()) {
732  buf << "[ " << srid.run() << ", " << srid.subRun() << ", "
733  << cet::canonical_string(I->second) << " ], ";
734  }
735  // Rewind over last delimiter.
736  buf.seekp(-2, ios_base::cur);
737  buf << " ]";
738  fileCatalogMetadata.insert("runs", buf.str());
739  }
740  }
741  // Number of events.
742  fileCatalogMetadata.insert("event_count", to_string(stats.eventsThisFile()));
743  // first_event and last_event.
744  auto eidToTuple = [](EventID const& eid) -> string {
745  ostringstream eidStr;
746  eidStr << "[ " << eid.run() << ", " << eid.subRun() << ", " << eid.event()
747  << " ]";
748  return eidStr.str();
749  };
750  fileCatalogMetadata.insert("first_event", eidToTuple(stats.lowestEventID()));
751  fileCatalogMetadata.insert("last_event", eidToTuple(stats.highestEventID()));
752  // File parents.
753  if (!stats.parents().empty()) {
754  ostringstream pstring;
755  pstring << "[ ";
756  for (auto const& parent : stats.parents()) {
757  pstring << cet::canonical_string(parent) << ", ";
758  }
759  // Rewind over last delimiter.
760  pstring.seekp(-2, ios_base::cur);
761  pstring << " ]";
762  fileCatalogMetadata.insert("parents", pstring.str());
763  }
764  // Incoming stream-specific metadata overrides.
765  for (auto const& kv : ssmd) {
766  fileCatalogMetadata.insert(kv.first, kv.second);
767  }
768  txn.commit();
769 }
cet::sqlite::Connection rootFileDB_
int getFileFormatVersion()
std::string const & getFileFormatEra()
std::string to_string(ModuleType mt)
Definition: ModuleType.h:32
void art::RootOutputFile::writeFileFormatVersion ( )

Definition at line 629 of file RootOutputFile.cc.

References basketSize_, art::getFileFormatEra(), art::getFileFormatVersion(), and metaDataTree_.

630 {
631  FileFormatVersion const ver{getFileFormatVersion(), getFileFormatEra()};
632  auto const* pver = &ver;
633  TBranch* b = metaDataTree_->Branch(
634  metaBranchRootName<FileFormatVersion>(), &pver, basketSize_, 0);
635  // FIXME: Turn this into a throw!
636  assert(b);
637  b->Fill();
638 }
int getFileFormatVersion()
std::string const & getFileFormatEra()
void art::RootOutputFile::writeFileIndex ( )

Definition at line 641 of file RootOutputFile.cc.

References basketSize_, fileIndex_, fileIndexTree_, and art::FileIndex::sortBy_Run_SubRun_Event().

642 {
644  FileIndex::Element elem{};
645  auto const* findexElemPtr = &elem;
646  TBranch* b = fileIndexTree_->Branch(
647  metaBranchRootName<FileIndex::Element>(), &findexElemPtr, basketSize_, 0);
648  // FIXME: Turn this into a throw!
649  assert(b);
650  for (auto& entry : fileIndex_) {
651  findexElemPtr = &entry;
652  b->Fill();
653  }
654  b->SetAddress(0);
655 }
void sortBy_Run_SubRun_Event()
Definition: FileIndex.cc:44
void art::RootOutputFile::writeOne ( EventPrincipal const &  e)

Definition at line 540 of file RootOutputFile.cc.

References art::FileIndex::addEntry(), art::History::addEventSelectionEntry(), art::EventPrincipal::aux(), dataTypeReported_, e, art::Granularity::Event, art::FileProperties::eventEntryNumber(), eventHistoryTree_, art::errors::FatalRootError, fileIndex_, fp_, art::EventAuxiliary::id(), art::EventAuxiliary::isRealData(), om_, pEventAux_, pEventProductProvenanceVector_, pHistory_, art::EventObserverBase::selectorConfig(), status_, and art::FileProperties::update().

541 {
542  // Auxiliary branch.
543  // Note: pEventAux_ must be set before calling fillBranches
544  // since it gets written out in that routine.
545  pEventAux_ = &e.aux();
546  // Because getting the data may cause an exception to be
547  // thrown we want to do that first before writing anything
548  // to the file about this event.
549  fillBranches<InEvent>(e, pEventProductProvenanceVector_);
550  // History branch.
551  History historyForOutput{e.history()};
552  historyForOutput.addEventSelectionEntry(om_->selectorConfig());
553  pHistory_ = &historyForOutput;
554  int sz = eventHistoryTree_->Fill();
555  if (sz <= 0) {
557  << "Failed to fill the History tree for event: " << e.id()
558  << "\nTTree::Fill() returned " << sz << " bytes written." << endl;
559  }
560  // Add the dataType to the job report if it hasn't already been done
561  if (!dataTypeReported_) {
562  string dataType{"MC"};
563  if (pEventAux_->isRealData()) {
564  dataType = "Data";
565  }
566  dataTypeReported_ = true;
567  }
568  pHistory_ = &e.history();
569  // Add event to index
572 }
bool isRealData() const
EventAuxiliary const * pEventAux_
OutputFileStatus status_
FileProperties fp_
auto eventEntryNumber() const
void addEntry(EventID const &eID, EntryNumber_t entry)
Definition: FileIndex.cc:29
ProductProvenances * pEventProductProvenanceVector_
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
std::enable_if_t< B!=Granularity::InputFile > update(OutputFileStatus const status)
fhicl::ParameterSetID selectorConfig() const
OutputModule const * om_
Float_t e
Definition: plot.C:34
History const * pHistory_
EventID const & id() const
void art::RootOutputFile::writeParameterSetRegistry ( )

Definition at line 772 of file RootOutputFile.cc.

References fhicl::ParameterSetRegistry::exportTo(), and rootFileDB_.

773 {
775 }
cet::sqlite::Connection rootFileDB_
static void exportTo(sqlite3 *db)
void art::RootOutputFile::writeParentageRegistry ( )

Definition at line 597 of file RootOutputFile.cc.

References basketSize_, art::errors::FatalRootError, art::thread_safe_registry_via_id< K, M >::get(), art::rootNames::parentageBranchName(), art::rootNames::parentageIDBranchName(), and parentageTree_.

598 {
599  auto pid = root::getObjectRequireDict<ParentageID>();
600  ParentageID const* hash = &pid;
601  if (!parentageTree_->Branch(
602  rootNames::parentageIDBranchName().c_str(), &hash, basketSize_, 0)) {
604  << "Failed to create a branch for ParentageIDs in the output file";
605  }
606  hash = nullptr;
607 
608  auto par = root::getObjectRequireDict<Parentage>();
609  Parentage const* desc = &par;
610  if (!parentageTree_->Branch(
611  rootNames::parentageBranchName().c_str(), &desc, basketSize_, 0)) {
613  << "Failed to create a branch for Parentages in the output file";
614  }
615  desc = nullptr;
616 
617  for (auto const& pr : ParentageRegistry::get()) {
618  hash = &pr.first;
619  desc = &pr.second;
620  parentageTree_->Fill();
621  }
622  parentageTree_->SetBranchAddress(rootNames::parentageIDBranchName().c_str(),
623  nullptr);
624  parentageTree_->SetBranchAddress(rootNames::parentageBranchName().c_str(),
625  nullptr);
626 }
static collection_type const & get()
std::string const & parentageBranchName()
Definition: rootNames.cc:34
Hash< ParentageType > ParentageID
Definition: ParentageID.h:8
std::string const & parentageIDBranchName()
Definition: rootNames.cc:28
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
void art::RootOutputFile::writeProcessConfigurationRegistry ( )

Definition at line 664 of file RootOutputFile.cc.

665 {
666  // We don't do this yet; currently we're storing a slightly
667  // bloated ProcessHistoryRegistry.
668 }
void art::RootOutputFile::writeProcessHistoryRegistry ( )

Definition at line 671 of file RootOutputFile.cc.

References basketSize_, art::thread_safe_registry_via_id< K, M >::get(), art::errors::LogicError, and metaDataTree_.

672 {
673  ProcessHistoryMap pHistMap;
674  for (auto const& pr : ProcessHistoryRegistry::get()) {
675  pHistMap.emplace(pr);
676  }
677  auto const* p = &pHistMap;
678  TBranch* b = metaDataTree_->Branch(
679  metaBranchRootName<ProcessHistoryMap>(), &p, basketSize_, 0);
680  if (b != nullptr) {
681  b->Fill();
682  } else {
683  throw Exception(errors::LogicError) << "Unable to locate required "
684  "ProcessHistoryMap branch in output "
685  "metadata tree.\n";
686  }
687 }
std::map< ProcessHistoryID const, ProcessHistory > ProcessHistoryMap
static collection_type const & get()
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
void art::RootOutputFile::writeProductDependencies ( )

Definition at line 801 of file RootOutputFile.cc.

References basketSize_, art::OutputModule::branchChildren(), metaDataTree_, and om_.

802 {
803  BranchChildren const* ppDeps = &om_->branchChildren();
804  TBranch* b = metaDataTree_->Branch(
805  metaBranchRootName<BranchChildren>(), &ppDeps, basketSize_, 0);
806  // FIXME: Turn this into a throw!
807  assert(b);
808  b->Fill();
809 }
BranchChildren const & branchChildren() const
Definition: OutputModule.h:349
OutputModule const * om_
void art::RootOutputFile::writeProductDescriptionRegistry ( )

Definition at line 778 of file RootOutputFile.cc.

References basketSize_, branchesWithStoredHistory_, evd::details::end(), art::ProductMetaData::instance(), metaDataTree_, and art::ProductRegistry::productList_.

779 {
780  // Make a local copy of the MasterProductRegistry's ProductList,
781  // removing any transient or pruned products.
782  auto end = branchesWithStoredHistory_.end();
783 
784  ProductRegistry reg;
785  for (auto const& pr : ProductMetaData::instance().productList()) {
786  if (branchesWithStoredHistory_.find(pr.second.productID()) == end) {
787  continue;
788  }
789  reg.productList_.emplace_hint(reg.productList_.end(), pr);
790  }
791 
792  ProductRegistry const* regp = &reg;
793  TBranch* b = metaDataTree_->Branch(
794  metaBranchRootName<ProductRegistry>(), &regp, basketSize_, 0);
795  // FIXME: Turn this into a throw!
796  assert(b);
797  b->Fill();
798 }
std::set< ProductID > branchesWithStoredHistory_
static ProductMetaData const & instance()
std::vector< evd::details::RawDigitInfo_t >::const_iterator end(RawDigitCacheDataClass const &cache)
void art::RootOutputFile::writeResults ( ResultsPrincipal resp)

Definition at line 812 of file RootOutputFile.cc.

References art::ResultsPrincipal::aux(), pResultsAux_, and pResultsProductProvenanceVector_.

813 {
814  pResultsAux_ = &resp.aux();
815  fillBranches<InResults>(resp, pResultsProductProvenanceVector_);
816 }
ProductProvenances * pResultsProductProvenanceVector_
ResultsAuxiliary const * pResultsAux_
void art::RootOutputFile::writeRun ( RunPrincipal const &  r)

Definition at line 586 of file RootOutputFile.cc.

References art::FileIndex::addEntry(), art::RunPrincipal::aux(), fileIndex_, fp_, art::RunAuxiliary::id(), art::EventID::invalidEvent(), pRunAux_, pRunProductProvenanceVector_, art::Granularity::Run, art::FileProperties::runEntryNumber(), runRSID_, art::RunAuxiliary::setRangeSetID(), status_, and art::FileProperties::update().

587 {
588  pRunAux_ = &r.aux();
590  fillBranches<InRun>(r, pRunProductProvenanceVector_);
592  fp_.runEntryNumber());
594 }
RunID const & id() const
Definition: RunAuxiliary.h:51
static constexpr EventID invalidEvent()
Definition: EventID.h:203
ProductProvenances * pRunProductProvenanceVector_
OutputFileStatus status_
FileProperties fp_
auto runEntryNumber() const
void addEntry(EventID const &eID, EntryNumber_t entry)
Definition: FileIndex.cc:29
std::enable_if_t< B!=Granularity::InputFile > update(OutputFileStatus const status)
RunAuxiliary const * pRunAux_
void setRangeSetID(unsigned const id) const
Definition: RunAuxiliary.h:87
void art::RootOutputFile::writeSubRun ( SubRunPrincipal const &  sr)

Definition at line 575 of file RootOutputFile.cc.

References art::FileIndex::addEntry(), art::SubRunPrincipal::aux(), fileIndex_, fp_, art::SubRunAuxiliary::id(), art::EventID::invalidEvent(), pSubRunAux_, pSubRunProductProvenanceVector_, art::SubRunAuxiliary::setRangeSetID(), status_, art::Granularity::SubRun, art::FileProperties::subRunEntryNumber(), subRunRSID_, and art::FileProperties::update().

576 {
577  pSubRunAux_ = &sr.aux();
579  fillBranches<InSubRun>(sr, pSubRunProductProvenanceVector_);
583 }
SubRunAuxiliary const * pSubRunAux_
static constexpr EventID invalidEvent()
Definition: EventID.h:203
SubRunID const & id() const
OutputFileStatus status_
FileProperties fp_
void addEntry(EventID const &eID, EntryNumber_t entry)
Definition: FileIndex.cc:29
void setRangeSetID(unsigned const id) const
std::enable_if_t< B!=Granularity::InputFile > update(OutputFileStatus const status)
auto subRunEntryNumber() const
ProductProvenances * pSubRunProductProvenanceVector_
void art::RootOutputFile::writeTTrees ( )

Definition at line 819 of file RootOutputFile.cc.

References fileIndexTree_, art::InEvent, metaDataTree_, art::NumBranchTypes, parentageTree_, treePointers_, and art::RootOutputTree::writeTTree().

820 {
824  // Write out the tree corresponding to each BranchType
825  for (int i = InEvent; i < NumBranchTypes; ++i) {
826  auto const branchType = static_cast<BranchType>(i);
827  treePointers_[branchType]->writeTree();
828  }
829 }
static void writeTTree(TTree *) noexcept(false)
RootOutputTreePtrArray treePointers_
BranchType
Definition: BranchType.h:18

Member Data Documentation

std::chrono::steady_clock::time_point art::RootOutputFile::beginTime_
private
Initial value:
{
std::chrono::steady_clock::now()}

Definition at line 203 of file RootOutputFile.h.

Referenced by requestsToCloseFile().

std::set<ProductID> art::RootOutputFile::branchesWithStoredHistory_ {}
private

Definition at line 194 of file RootOutputFile.h.

Referenced by fillBranches(), and writeProductDescriptionRegistry().

int const art::RootOutputFile::compressionLevel_
private

Definition at line 159 of file RootOutputFile.h.

Referenced by RootOutputFile().

bool art::RootOutputFile::dataTypeReported_ {false}
private

Definition at line 193 of file RootOutputFile.h.

Referenced by writeOne().

DropMetaData art::RootOutputFile::dropMetaData_
private

Definition at line 164 of file RootOutputFile.h.

Referenced by fillBranches(), and RootOutputFile().

bool art::RootOutputFile::dropMetaDataForDroppedData_
private

Definition at line 165 of file RootOutputFile.h.

Referenced by fillBranches(), and RootOutputFile().

detail::DummyProductCache art::RootOutputFile::dummyProductCache_ {}
private

Definition at line 200 of file RootOutputFile.h.

Referenced by getProduct().

TTree* art::RootOutputFile::eventHistoryTree_ {nullptr}
private

Definition at line 174 of file RootOutputFile.h.

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

ProductProvenances art::RootOutputFile::eventProductProvenanceVector_ {}
private

Definition at line 179 of file RootOutputFile.h.

bool art::RootOutputFile::fastCloningEnabledAtConstruction_
private

Definition at line 166 of file RootOutputFile.h.

Referenced by beginInputFile(), and RootOutputFile().

std::string art::RootOutputFile::file_
private

Definition at line 156 of file RootOutputFile.h.

Referenced by currentFileName(), and RootOutputFile().

FileIndex art::RootOutputFile::fileIndex_ {}
private

Definition at line 169 of file RootOutputFile.h.

Referenced by writeFileIndex(), writeOne(), writeRun(), and writeSubRun().

TTree* art::RootOutputFile::fileIndexTree_ {nullptr}
private

Definition at line 172 of file RootOutputFile.h.

Referenced by RootOutputFile(), writeFileIndex(), and writeTTrees().

std::unique_ptr<TFile> art::RootOutputFile::filePtr_
private

Definition at line 168 of file RootOutputFile.h.

Referenced by requestsToCloseFile(), and RootOutputFile().

ClosingCriteria art::RootOutputFile::fileSwitchCriteria_
private

Definition at line 157 of file RootOutputFile.h.

Referenced by requestsToCloseFile(), and RootOutputFile().

FileProperties art::RootOutputFile::fp_ {}
private
TTree* art::RootOutputFile::metaDataTree_ {nullptr}
private
OutputModule const* art::RootOutputFile::om_
private

Definition at line 155 of file RootOutputFile.h.

Referenced by selectProducts(), writeOne(), and writeProductDependencies().

TTree* art::RootOutputFile::parentageTree_ {nullptr}
private

Definition at line 173 of file RootOutputFile.h.

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

EventAuxiliary const* art::RootOutputFile::pEventAux_ {nullptr}
private

Definition at line 175 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

ProductProvenances* art::RootOutputFile::pEventProductProvenanceVector_
private
Initial value:

Definition at line 183 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

History const* art::RootOutputFile::pHistory_ {nullptr}
private

Definition at line 191 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

ResultsAuxiliary const* art::RootOutputFile::pResultsAux_ {nullptr}
private

Definition at line 178 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeResults().

ProductProvenances* art::RootOutputFile::pResultsProductProvenanceVector_
private
Initial value:

Definition at line 189 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeResults().

RunAuxiliary const* art::RootOutputFile::pRunAux_ {nullptr}
private

Definition at line 177 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeRun().

ProductProvenances* art::RootOutputFile::pRunProductProvenanceVector_
private
Initial value:

Definition at line 187 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeRun().

SubRunAuxiliary const* art::RootOutputFile::pSubRunAux_ {nullptr}
private

Definition at line 176 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeSubRun().

ProductProvenances* art::RootOutputFile::pSubRunProductProvenanceVector_
private
Initial value:

Definition at line 185 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeSubRun().

ProductProvenances art::RootOutputFile::resultsProductProvenanceVector_ {}
private

Definition at line 182 of file RootOutputFile.h.

cet::sqlite::Connection art::RootOutputFile::rootFileDB_
private
ProductProvenances art::RootOutputFile::runProductProvenanceVector_ {}
private

Definition at line 181 of file RootOutputFile.h.

unsigned art::RootOutputFile::runRSID_ {-1u}
private

Definition at line 202 of file RootOutputFile.h.

Referenced by setRunAuxiliaryRangeSetID(), and writeRun().

int64_t const art::RootOutputFile::saveMemoryObjectThreshold_
private

Definition at line 160 of file RootOutputFile.h.

Referenced by RootOutputFile().

OutputItemListArray art::RootOutputFile::selectedOutputItemList_ {{}}
private

Definition at line 199 of file RootOutputFile.h.

Referenced by fillBranches(), and selectProducts().

int const art::RootOutputFile::splitLevel_
private

Definition at line 162 of file RootOutputFile.h.

Referenced by RootOutputFile().

OutputFileStatus art::RootOutputFile::status_ {OutputFileStatus::Closed}
private

Definition at line 158 of file RootOutputFile.h.

Referenced by setFileStatus(), writeOne(), writeRun(), and writeSubRun().

ProductProvenances art::RootOutputFile::subRunProductProvenanceVector_ {}
private

Definition at line 180 of file RootOutputFile.h.

unsigned art::RootOutputFile::subRunRSID_ {-1u}
private

Definition at line 201 of file RootOutputFile.h.

Referenced by setSubRunAuxiliaryRangeSetID(), and writeSubRun().

int64_t const art::RootOutputFile::treeMaxVirtualSize_
private

Definition at line 161 of file RootOutputFile.h.

Referenced by RootOutputFile().

RootOutputTreePtrArray art::RootOutputFile::treePointers_
private
bool art::RootOutputFile::wasFastCloned_ {false}
private

Definition at line 167 of file RootOutputFile.h.

Referenced by beginInputFile(), and fillBranches().


The documentation for this class was generated from the following files: