Classes | Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
art::RootOutputFile Class Reference

#include <RootOutputFile.h>

Classes

struct  OutputItem
 

Public Types

enum  ClosureRequestMode { ClosureRequestMode::MaxEvents = 0, ClosureRequestMode::MaxSize = 1, ClosureRequestMode::Unset = 2 }
 
using RootOutputTreePtrArray = std::array< std::unique_ptr< RootOutputTree >, NumBranchTypes >
 

Public Member Functions

 ~RootOutputFile ()
 
 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)
 
 RootOutputFile (RootOutputFile const &)=delete
 
 RootOutputFile (RootOutputFile &&)=delete
 
RootOutputFileoperator= (RootOutputFile const &)=delete
 
RootOutputFileoperator= (RootOutputFile &&)=delete
 
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>
enable_if_t<!RangeSetsSupported< BT >::value, EDProduct const * > getProduct (OutputHandle const &oh, RangeSet const &, string const &wrappedName)
 
template<BranchType BT>
enable_if_t< RangeSetsSupported< BT >::value, EDProduct const * > getProduct (OutputHandle const &oh, RangeSet const &prunedProductRS, string const &wrappedName)
 

Static Public Member Functions

static bool shouldFastClone (bool const fastCloningSet, bool const fastCloning, bool const wantAllEvents, ClosingCriteria const &cc)
 

Private Member Functions

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

Private Attributes

hep::concurrency::RecursiveMutex mutex_
 
OutputModule const * om_
 
std::string file_
 
ClosingCriteria fileSwitchCriteria_
 
OutputFileStatus status_
 
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_
 
std::unique_ptr< TFile > filePtr_
 
FileIndex fileIndex_
 
FileProperties fp_
 
TTree * metaDataTree_
 
TTree * fileIndexTree_
 
TTree * parentageTree_
 
TTree * eventHistoryTree_
 
EventAuxiliary const * pEventAux_
 
SubRunAuxiliary const * pSubRunAux_
 
RunAuxiliary const * pRunAux_
 
ResultsAuxiliary const * pResultsAux_
 
ProductProvenances eventProductProvenanceVector_
 
ProductProvenances subRunProductProvenanceVector_
 
ProductProvenances runProductProvenanceVector_
 
ProductProvenances resultsProductProvenanceVector_
 
ProductProvenancespEventProductProvenanceVector_
 
ProductProvenancespSubRunProductProvenanceVector_
 
ProductProvenancespRunProductProvenanceVector_
 
ProductProvenancespResultsProductProvenanceVector_
 
History const * pHistory_
 
RootOutputTreePtrArray treePointers_
 
bool dataTypeReported_
 
std::array< ProductDescriptionsByID, NumBranchTypesdescriptionsToPersist_
 
std::unique_ptr< cet::sqlite::ConnectionrootFileDB_
 
std::array< std::set< OutputItem >, NumBranchTypesselectedOutputItemList_
 
detail::DummyProductCache dummyProductCache_
 
unsigned subRunRSID_
 
unsigned runRSID_
 
std::chrono::steady_clock::time_point beginTime_
 

Detailed Description

Definition at line 47 of file RootOutputFile.h.

Member Typedef Documentation

Definition at line 51 of file RootOutputFile.h.

Member Enumeration Documentation

Enumerator
MaxEvents 
MaxSize 
Unset 

Definition at line 49 of file RootOutputFile.h.

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

Constructor & Destructor Documentation

art::RootOutputFile::~RootOutputFile ( )
default
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 382 of file RootOutputFile.cc.

393  : mutex_{"RootOutputFile::mutex_"}
394  , compressionLevel_{compressionLevel}
395  , saveMemoryObjectThreshold_{saveMemoryObjectThreshold}
396  , treeMaxVirtualSize_{treeMaxVirtualSize}
397  , splitLevel_{splitLevel}
398  , basketSize_{basketSize}
399  , dropMetaData_{dropMetaData}
402  {
403  om_ = om;
404  file_ = fileName;
405  fileSwitchCriteria_ = fileSwitchCriteria;
407  dropMetaDataForDroppedData_ = dropMetaDataForDroppedData;
408  fastCloningEnabledAtConstruction_ = fastCloningRequested;
409  wasFastCloned_ = false;
410  filePtr_.reset(
411  TFile::Open(file_.c_str(), "recreate", "", compressionLevel));
412  // Don't split metadata tree or event description tree
419  // Create the tree that will carry (event) History objects.
421  filePtr_.get(), rootNames::eventHistoryTreeName(), splitLevel);
422  if (!eventHistoryTree_) {
424  << "Failed to create the tree for History objects\n";
425  }
426  pEventAux_ = nullptr;
427  pSubRunAux_ = nullptr;
428  pRunAux_ = nullptr;
429  pResultsAux_ = nullptr;
434  pHistory_ = new History;
435  if (!eventHistoryTree_->Branch(rootNames::eventHistoryBranchName().c_str(),
436  &pHistory_,
437  basketSize,
438  0)) {
440  << "Failed to create a branch for History in the output file\n";
441  }
442  delete pHistory_;
443  pHistory_ = nullptr;
444  treePointers_[0] =
445  make_unique<RootOutputTree>(filePtr_.get(),
446  InEvent,
447  pEventAux_,
449  basketSize,
450  splitLevel,
451  treeMaxVirtualSize,
452  saveMemoryObjectThreshold);
453  treePointers_[1] =
454  make_unique<RootOutputTree>(filePtr_.get(),
455  InSubRun,
456  pSubRunAux_,
458  basketSize,
459  splitLevel,
460  treeMaxVirtualSize,
461  saveMemoryObjectThreshold);
462  treePointers_[2] = make_unique<RootOutputTree>(filePtr_.get(),
463  InRun,
464  pRunAux_,
466  basketSize,
467  splitLevel,
468  treeMaxVirtualSize,
469  saveMemoryObjectThreshold);
470  treePointers_[3] =
471  make_unique<RootOutputTree>(filePtr_.get(),
472  InResults,
473  pResultsAux_,
475  basketSize,
476  splitLevel,
477  treeMaxVirtualSize,
478  saveMemoryObjectThreshold);
479  dataTypeReported_ = false;
480  rootFileDB_.reset(
481  ServiceHandle<DatabaseConnection> {}->get<TKeyVFSOpenPolicy>(
482  "RootFileDB",
483  filePtr_.get(),
484  SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE));
485  subRunRSID_ = -1U;
486  runRSID_ = -1U;
488  // Check that dictionaries for the auxiliaries exist
489  root::DictionaryChecker checker;
490  checker.checkDictionaries<EventAuxiliary>();
491  checker.checkDictionaries<SubRunAuxiliary>();
492  checker.checkDictionaries<RunAuxiliary>();
493  checker.checkDictionaries<ResultsAuxiliary>();
494  checker.reportMissingDictionaries();
495  // Event ranges
497  "EventRanges",
498  {"SubRun INTEGER",
499  "begin INTEGER",
500  "end INTEGER",
501  "UNIQUE (SubRun,begin,end) ON CONFLICT IGNORE"});
502  // SubRun range sets
503  using namespace cet::sqlite;
504  create_table(*rootFileDB_, "SubRunRangeSets", column<int>{"Run"});
506  "SubRunRangeSets_EventRanges",
507  {"RangeSetsID INTEGER",
508  "EventRangesID INTEGER",
509  "PRIMARY KEY(RangeSetsID,EventRangesID)"},
510  "WITHOUT ROWID");
511  // Run range sets
512  create_table(*rootFileDB_, "RunRangeSets", column<int>{"Run"});
514  "RunRangeSets_EventRanges",
515  {"RangeSetsID INTEGER",
516  "EventRangesID INTEGER",
517  "PRIMARY KEY(RangeSetsID,EventRangesID)"},
518  "WITHOUT ROWID");
519  }
SubRunAuxiliary const * pSubRunAux_
EventAuxiliary const * pEventAux_
int const compressionLevel_
bool fastCloningEnabledAtConstruction_
ProductProvenances * pRunProductProvenanceVector_
int64_t const treeMaxVirtualSize_
ProductProvenances resultsProductProvenanceVector_
std::chrono::steady_clock::time_point beginTime_
std::unique_ptr< TFile > filePtr_
std::string const & parentageTreeName()
Definition: rootNames.cc:21
std::array< std::set< OutputItem >, NumBranchTypes > selectedOutputItemList_
std::string const & eventHistoryTreeName()
Definition: rootNames.cc:54
DropMetaData dropMetaData_
ProductProvenances runProductProvenanceVector_
hep::concurrency::RecursiveMutex mutex_
ProductProvenances eventProductProvenanceVector_
ProductProvenances * pResultsProductProvenanceVector_
OutputFileStatus status_
ProductProvenances subRunProductProvenanceVector_
std::string const & metaDataTreeName()
Definition: rootNames.cc:40
void create_table(sqlite3 *const db, std::string const &tablename, Cols const &...cols)
Definition: create_table.h:156
RootOutputTreePtrArray treePointers_
std::unique_ptr< cet::sqlite::Connection > rootFileDB_
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:47
std::array< ProductDescriptionsByID, NumBranchTypes > descriptionsToPersist_
std::string const & eventHistoryBranchName()
Definition: rootNames.cc:61
OutputModule const * om_
int64_t const saveMemoryObjectThreshold_
ResultsAuxiliary const * pResultsAux_
ProductProvenances * pSubRunProductProvenanceVector_
RunAuxiliary const * pRunAux_
History const * pHistory_
ClosingCriteria fileSwitchCriteria_
art::RootOutputFile::RootOutputFile ( RootOutputFile const &  )
delete
art::RootOutputFile::RootOutputFile ( RootOutputFile &&  )
delete

Member Function Documentation

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

Definition at line 567 of file RootOutputFile.cc.

569  {
570  RecursiveMutexSentry sentry{mutex_, __func__};
571  // FIXME: the logic here is nasty.
573  fastCloneFromOutputModule && rfb};
574  // Create output branches, and then redo calculation to determine if
575  // fast cloning should be done.
576  selectProducts();
577  if (shouldFastClone &&
578  !treePointers_[InEvent]->checkSplitLevelAndBasketSize(rfb->tree())) {
579  mf::LogWarning("FastCloning")
580  << "Fast cloning deactivated for this input file due to "
581  << "splitting level and/or basket size.";
582  shouldFastClone = false;
583  } else if (rfb && rfb->tree() &&
584  rfb->tree()->GetCurrentFile()->GetVersion() < 60001) {
585  mf::LogWarning("FastCloning")
586  << "Fast cloning deactivated for this input file due to "
587  << "ROOT version used to write it (< 6.00/01)\n"
588  "having a different splitting policy.";
589  shouldFastClone = false;
590  }
591  if (shouldFastClone && rfb->fileFormatVersion().value_ < 10) {
592  mf::LogWarning("FastCloning")
593  << "Fast cloning deactivated for this input file due to "
594  << "reading in file that has a different ProductID schema.";
595  shouldFastClone = false;
596  }
598  mf::LogWarning("FastCloning")
599  << "Fast cloning reactivated for this input file.";
600  }
601  treePointers_[InEvent]->beginInputFile(shouldFastClone);
602  auto tree = (rfb && rfb->tree()) ? rfb->tree() : nullptr;
603  wasFastCloned_ = treePointers_[InEvent]->fastCloneTree(tree);
604  }
bool fastCloningEnabledAtConstruction_
hep::concurrency::RecursiveMutex mutex_
static bool shouldFastClone(bool const fastCloningSet, bool const fastCloning, bool const wantAllEvents, ClosingCriteria const &cc)
RootOutputTreePtrArray treePointers_
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
string const & art::RootOutputFile::currentFileName ( ) const

Definition at line 529 of file RootOutputFile.cc.

530  {
531  RecursiveMutexSentry sentry{mutex_, __func__};
532  return file_;
533  }
hep::concurrency::RecursiveMutex mutex_
template<BranchType BT>
void art::RootOutputFile::fillBranches ( Principal const &  principal,
std::vector< ProductProvenance > *  vpp 
)
private

Definition at line 977 of file RootOutputFile.cc.

979  {
980  RecursiveMutexSentry sentry{mutex_, __func__};
981  bool const fastCloning = ((BT == InEvent) && wasFastCloned_);
982  map<unsigned, unsigned> checksumToIndex;
983  auto const& principalRS = principal.seenRanges();
984  set<ProductProvenance> keptprv;
985  for (auto const& val : selectedOutputItemList_[BT]) {
986  auto const& bd = val.branchDescription_;
987  auto const pid = bd.productID();
988  descriptionsToPersist_[BT].emplace(pid, bd);
989  bool const produced = bd.produced();
990  bool const resolveProd = (produced || !fastCloning ||
991  treePointers_[BT]->uncloned(bd.branchName()));
992  // Update the kept provenance
993  bool const keepProvenance =
995  (produced && (dropMetaData_ == DropMetaData::DropPrior)));
996  auto const& oh = principal.getForOutput(pid, resolveProd);
997  auto prov = keptprv.begin();
998  if (keepProvenance) {
999  if (oh.productProvenance()) {
1000  prov = keptprv.insert(*oh.productProvenance()).first;
1003  {
1004  vector<ProductProvenance const*> stacked_pp;
1005  stacked_pp.push_back(&*oh.productProvenance());
1006  while (true) {
1007  if (stacked_pp.size() == 0) {
1008  break;
1009  }
1010  auto current_pp = stacked_pp.back();
1011  stacked_pp.pop_back();
1012  for (auto const parent_bid :
1013  current_pp->parentage().parents()) {
1014  // Note: Suppose the parent ProductID corresponds to
1015  // product that has been requested to be
1016  // "dropped"--i.e. someone has specified "drop
1017  // *_m1a_*_*" in their configuration, and
1018  // although a given product matching this
1019  // pattern will not be included in the
1020  // selectedProducts_ list, one of the parents of
1021  // a selected product can match the "dropping"
1022  // pattern and its BranchDescription will still
1023  // be written to disk since it is inserted into
1024  // the descriptionsToPersist_ data member.
1025  auto parent_bd = principal.getProductDescription(parent_bid);
1026  if (!parent_bd) {
1027  // FIXME: Is this an error condition?
1028  continue;
1029  }
1030  descriptionsToPersist_[BT].emplace(parent_bid, *parent_bd);
1031  if (!parent_bd->produced()) {
1032  // We got it from the input, nothing to do.
1033  continue;
1034  }
1035  auto parent_pp =
1036  principal.branchToProductProvenance(parent_bid);
1037  if (!parent_pp || (dropMetaData_ != DropMetaData::DropNone)) {
1038  continue;
1039  }
1040  if (!keptprv.insert(*parent_pp).second) {
1041  // Already there, done.
1042  continue;
1043  }
1046  stacked_pp.push_back(parent_pp.get());
1047  }
1048  }
1049  }
1050  }
1051  }
1052  } else {
1053  // No provenance: product was either not produced, or was
1054  // dropped; create provenance to remember that.
1055  auto status = productstatus::dropped();
1056  if (produced) {
1057  status = productstatus::neverCreated();
1058  }
1059  prov = keptprv.emplace(pid, status).first;
1060  }
1061  }
1062  // Resolve the product if we are going to attempt to write it out.
1063  if (resolveProd) {
1064  // Product was either produced, or we are not cloning the whole
1065  // file and the product branch was not cloned so we should be
1066  // able to get a pointer to it from the passed principal and
1067  // write it out.
1068  auto const& rs = getRangeSet<BT>(oh, principalRS, produced);
1069  if (RangeSetsSupported<BT>::value && !rs.is_valid()) {
1070  // At this point we are now going to write out a dummy product
1071  // whose Wrapper present flag is false because the range set
1072  // got invalidated to present double counting when combining
1073  // run or subrun products from multiple fragments. We change
1074  // the provenance status that we are going to write out to
1075  // dummyToPreventDoubleCount to flag this case. Note that the
1076  // requirement is only that the status not be
1077  // productstatus::present(). We use a special code to make it
1078  // easier for humans to tell what is going on.
1079  auto prov_bid = prov->productID();
1080  if (keptprv.erase(*prov) != 1ull) {
1081  throw Exception(errors::LogicError, "KeptProvenance::setStatus")
1082  << "Attempt to set product status for product whose provenance "
1083  "is not being recorded.\n";
1084  }
1085  prov =
1086  keptprv
1087  .emplace(prov_bid, productstatus::dummyToPreventDoubleCount())
1088  .first;
1089  }
1090  auto const* product = getProduct<BT>(oh, rs, bd.wrappedName());
1091  setProductRangeSetID<BT>(
1092  rs, *rootFileDB_, const_cast<EDProduct*>(product), checksumToIndex);
1093  val.product_ = product;
1094  }
1095  }
1096  vpp->assign(keptprv.begin(), keptprv.end());
1097  for (auto const& val : *vpp) {
1098  if (val.productStatus() == productstatus::uninitialized()) {
1100  "RootOutputFile::fillBranches(principal, vpp):")
1101  << "Attempt to write a product with uninitialized provenance!\n";
1102  }
1103  }
1104  treePointers_[BT]->fillTree();
1105  vpp->clear();
1106  }
std::array< std::set< OutputItem >, NumBranchTypes > selectedOutputItemList_
DropMetaData dropMetaData_
hep::concurrency::RecursiveMutex mutex_
ProductStatus uninitialized()
Definition: ProductStatus.h:42
RootOutputTreePtrArray treePointers_
std::unique_ptr< cet::sqlite::Connection > rootFileDB_
ProductStatus dropped()
Definition: ProductStatus.h:26
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
std::array< ProductDescriptionsByID, NumBranchTypes > descriptionsToPersist_
ProductStatus dummyToPreventDoubleCount()
Definition: ProductStatus.h:31
ProductStatus neverCreated()
Definition: ProductStatus.h:21
template<BranchType BT>
std::enable_if_t<!detail::RangeSetsSupported<BT>::value, EDProduct const*> art::RootOutputFile::getProduct ( OutputHandle const &  ,
RangeSet const &  productRS,
std::string const &  wrappedName 
)
private
template<BranchType BT>
std::enable_if_t<detail::RangeSetsSupported<BT>::value, EDProduct const*> art::RootOutputFile::getProduct ( OutputHandle const &  ,
RangeSet const &  productRS,
std::string const &  wrappedName 
)
private
template<BranchType BT>
enable_if_t<!RangeSetsSupported<BT>::value, EDProduct const*> art::RootOutputFile::getProduct ( OutputHandle const &  oh,
RangeSet const &  ,
string const &  wrappedName 
)

Definition at line 951 of file RootOutputFile.cc.

954  {
955  RecursiveMutexSentry sentry{mutex_, __func__};
956  if (oh.isValid()) {
957  return oh.wrapper();
958  }
959  return dummyProductCache_.product(wrappedName);
960  }
hep::concurrency::RecursiveMutex mutex_
detail::DummyProductCache dummyProductCache_
EDProduct const * product(std::string const &wrappedName)
template<BranchType BT>
enable_if_t<RangeSetsSupported<BT>::value, EDProduct const*> art::RootOutputFile::getProduct ( OutputHandle const &  oh,
RangeSet const &  prunedProductRS,
string const &  wrappedName 
)

Definition at line 964 of file RootOutputFile.cc.

967  {
968  RecursiveMutexSentry sentry{mutex_, __func__};
969  if (oh.isValid() && prunedProductRS.is_valid()) {
970  return oh.wrapper();
971  }
972  return dummyProductCache_.product(wrappedName);
973  }
hep::concurrency::RecursiveMutex mutex_
detail::DummyProductCache dummyProductCache_
EDProduct const * product(std::string const &wrappedName)
void art::RootOutputFile::incrementInputFileNumber ( )

Definition at line 607 of file RootOutputFile.cc.

608  {
609  RecursiveMutexSentry sentry{mutex_, __func__};
611  }
hep::concurrency::RecursiveMutex mutex_
FileProperties fp_
bool art::RootOutputFile::maxEventsPerFileReached ( FileIndex::EntryNumber_t const  maxEventsPerFile) const
bool art::RootOutputFile::maxSizeReached ( unsigned const  maxFileSize) const
RootOutputFile& art::RootOutputFile::operator= ( RootOutputFile const &  )
delete
RootOutputFile& art::RootOutputFile::operator= ( RootOutputFile &&  )
delete
bool art::RootOutputFile::requestsToCloseFile ( )

Definition at line 621 of file RootOutputFile.cc.

622  {
623  RecursiveMutexSentry sentry{mutex_, __func__};
624  using namespace chrono;
625  unsigned int constexpr oneK{1024u};
626  fp_.updateSize(filePtr_->GetSize() / oneK);
627  fp_.updateAge(duration_cast<seconds>(steady_clock::now() - beginTime_));
629  }
std::chrono::steady_clock::time_point beginTime_
std::unique_ptr< TFile > filePtr_
hep::concurrency::RecursiveMutex mutex_
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 614 of file RootOutputFile.cc.

615  {
616  RecursiveMutexSentry sentry{mutex_, __func__};
617  cet::for_all(treePointers_, [](auto const& p) { p->setEntries(); });
618  }
hep::concurrency::RecursiveMutex mutex_
RootOutputTreePtrArray treePointers_
p
Definition: test.py:228
auto for_all(FwdCont &, Func)
void art::RootOutputFile::selectProducts ( )

Definition at line 536 of file RootOutputFile.cc.

537  {
538  RecursiveMutexSentry sentry{mutex_, __func__};
539  auto selectProductsToWrite = [this](BranchType const bt) {
540  auto& items = selectedOutputItemList_[bt];
541  for (auto const& pr : om_->keptProducts()[bt]) {
542  auto const& pd = pr.second;
543  // Persist Results products only if they have been produced by
544  // the current process.
545  if (bt == InResults && !pd.produced()) {
546  continue;
547  }
548  checkDictionaries(pd);
549  // Although the transient flag is already checked when
550  // OutputModule::doSelectProducts is called, it can be flipped
551  // to 'true' after the BranchDescription transients have been
552  // fluffed, which happens during the checkDictionaries call.
553  if (pd.transient()) {
554  continue;
555  }
556  items.emplace(pd);
557  }
558  for (auto const& val : items) {
559  treePointers_[bt]->addOutputBranch(val.branchDescription_,
560  val.product_);
561  }
562  };
563  for_each_branch_type(selectProductsToWrite);
564  }
std::array< std::set< OutputItem >, NumBranchTypes > selectedOutputItemList_
hep::concurrency::RecursiveMutex mutex_
RootOutputTreePtrArray treePointers_
void checkDictionaries(BranchDescription const &productDesc)
OutputModule const * om_
SelectionsArray const & keptProducts() const
BranchType
Definition: BranchType.h:18
void for_each_branch_type(F f)
Definition: BranchType.h:36
void art::RootOutputFile::setFileStatus ( OutputFileStatus const  ofs)

Definition at line 522 of file RootOutputFile.cc.

523  {
524  RecursiveMutexSentry sentry{mutex_, __func__};
525  status_ = ofs;
526  }
hep::concurrency::RecursiveMutex mutex_
OutputFileStatus status_
void art::RootOutputFile::setRunAuxiliaryRangeSetID ( RangeSet const &  ranges)

Definition at line 940 of file RootOutputFile.cc.

941  {
942  RecursiveMutexSentry sentry{mutex_, __func__};
943  runRSID_ = getNewRangeSetID(*rootFileDB_, InRun, ranges.run());
944  insertIntoEventRanges(*rootFileDB_, ranges);
945  auto const& eventRangesIDs = getExistingRangeSetIDs(*rootFileDB_, ranges);
946  insertIntoJoinTable(*rootFileDB_, InRun, runRSID_, eventRangesIDs);
947  }
hep::concurrency::RecursiveMutex mutex_
std::unique_ptr< cet::sqlite::Connection > rootFileDB_
void art::RootOutputFile::setSubRunAuxiliaryRangeSetID ( RangeSet const &  ranges)

Definition at line 930 of file RootOutputFile.cc.

931  {
932  RecursiveMutexSentry sentry{mutex_, __func__};
933  subRunRSID_ = getNewRangeSetID(*rootFileDB_, InSubRun, ranges.run());
934  insertIntoEventRanges(*rootFileDB_, ranges);
935  auto const& eventRangesIDs = getExistingRangeSetIDs(*rootFileDB_, ranges);
936  insertIntoJoinTable(*rootFileDB_, InSubRun, subRunRSID_, eventRangesIDs);
937  }
hep::concurrency::RecursiveMutex mutex_
std::unique_ptr< cet::sqlite::Connection > rootFileDB_
bool art::RootOutputFile::shouldFastClone ( bool const  fastCloningSet,
bool const  fastCloning,
bool const  wantAllEvents,
ClosingCriteria const &  cc 
)
static

Definition at line 354 of file RootOutputFile.cc.

358  {
359  bool result = fastCloning;
360  mf::LogInfo("FastCloning")
361  << "Initial fast cloning configuration "
362  << (fastCloningSet ? "(user-set): " : "(from default): ") << boolalpha
363  << fastCloning;
364  if (fastCloning && !wantAllEvents) {
365  result = false;
366  mf::LogWarning("FastCloning")
367  << "Fast cloning deactivated due to presence of\n"
368  << "event selection configuration.";
369  }
370  if (fastCloning && maxCriterionSpecified(cc) &&
371  cc.granularity() < Granularity::InputFile) {
372  result = false;
373  mf::LogWarning("FastCloning")
374  << "Fast cloning deactivated due to request to allow\n"
375  << "output file switching at an Event, SubRun, or Run boundary.";
376  }
377  return result;
378  }
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
void art::RootOutputFile::writeEventHistory ( )

Definition at line 754 of file RootOutputFile.cc.

755  {
756  RecursiveMutexSentry sentry{mutex_, __func__};
758  }
hep::concurrency::RecursiveMutex mutex_
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 788 of file RootOutputFile.cc.

792  {
793  RecursiveMutexSentry sentry{mutex_, __func__};
794  using namespace cet::sqlite;
795  Ntuple<string, string> fileCatalogMetadata{
796  *rootFileDB_, "FileCatalog_metadata", {{"Name", "Value"}}, true};
797  Transaction txn{*rootFileDB_};
798  for (auto const& kv : md) {
799  fileCatalogMetadata.insert(kv.first, kv.second);
800  }
801  // Add our own specific information: File format and friends.
802  fileCatalogMetadata.insert("file_format", "\"artroot\"");
803  fileCatalogMetadata.insert("file_format_era",
805  fileCatalogMetadata.insert("file_format_version",
807  // File start time.
808  namespace bpt = boost::posix_time;
809  auto formatted_time = [](auto const& t) {
810  return cet::canonical_string(bpt::to_iso_extended_string(t));
811  };
812  fileCatalogMetadata.insert("start_time",
813  formatted_time(stats.outputFileOpenTime()));
814  // File "end" time: now, since file is not actually closed yet.
815  fileCatalogMetadata.insert(
816  "end_time",
817  formatted_time(boost::posix_time::second_clock::universal_time()));
818  // Run/subRun information.
819  if (!stats.seenSubRuns().empty()) {
820  auto I = find_if(md.crbegin(), md.crend(), [](auto const& p) {
821  return p.first == "run_type";
822  });
823  if (I != md.crend()) {
824  ostringstream buf;
825  buf << "[ ";
826  for (auto const& srid : stats.seenSubRuns()) {
827  buf << "[ " << srid.run() << ", " << srid.subRun() << ", "
828  << cet::canonical_string(I->second) << " ], ";
829  }
830  // Rewind over last delimiter.
831  buf.seekp(-2, ios_base::cur);
832  buf << " ]";
833  fileCatalogMetadata.insert("runs", buf.str());
834  }
835  }
836  // Number of events.
837  fileCatalogMetadata.insert("event_count",
838  std::to_string(stats.eventsThisFile()));
839  // first_event and last_event.
840  auto eidToTuple = [](EventID const& eid) -> string {
841  ostringstream eidStr;
842  eidStr << "[ " << eid.run() << ", " << eid.subRun() << ", " << eid.event()
843  << " ]";
844  return eidStr.str();
845  };
846  fileCatalogMetadata.insert("first_event",
847  eidToTuple(stats.lowestEventID()));
848  fileCatalogMetadata.insert("last_event",
849  eidToTuple(stats.highestEventID()));
850  // File parents.
851  if (!stats.parents().empty()) {
852  ostringstream pstring;
853  pstring << "[ ";
854  for (auto const& parent : stats.parents()) {
855  pstring << cet::canonical_string(parent) << ", ";
856  }
857  // Rewind over last delimiter.
858  pstring.seekp(-2, ios_base::cur);
859  pstring << " ]";
860  fileCatalogMetadata.insert("parents", pstring.str());
861  }
862  // Incoming stream-specific metadata overrides.
863  for (auto const& kv : ssmd) {
864  fileCatalogMetadata.insert(kv.first, kv.second);
865  }
866  txn.commit();
867  }
cur
Definition: dbjson.py:21
hep::concurrency::RecursiveMutex mutex_
int getFileFormatVersion()
std::unique_ptr< cet::sqlite::Connection > rootFileDB_
std::string const & getFileFormatEra()
p
Definition: test.py:228
bool canonical_string(std::string const &str, std::string &result)
std::string to_string(ModuleType const mt)
Definition: ModuleType.h:34
void art::RootOutputFile::writeFileFormatVersion ( )

Definition at line 723 of file RootOutputFile.cc.

724  {
725  RecursiveMutexSentry sentry{mutex_, __func__};
726  FileFormatVersion const ver{getFileFormatVersion(), getFileFormatEra()};
727  auto const* pver = &ver;
728  TBranch* b = metaDataTree_->Branch(
729  metaBranchRootName<FileFormatVersion>(), &pver, basketSize_, 0);
730  // FIXME: Turn this into a throw!
731  assert(b);
732  b->Fill();
733  }
hep::concurrency::RecursiveMutex mutex_
int getFileFormatVersion()
std::string const & getFileFormatEra()
void art::RootOutputFile::writeFileIndex ( )

Definition at line 736 of file RootOutputFile.cc.

737  {
738  RecursiveMutexSentry sentry{mutex_, __func__};
740  FileIndex::Element elem{};
741  auto const* findexElemPtr = &elem;
742  TBranch* b = fileIndexTree_->Branch(
743  metaBranchRootName<FileIndex::Element>(), &findexElemPtr, basketSize_, 0);
744  // FIXME: Turn this into a throw!
745  assert(b);
746  for (auto& entry : fileIndex_) {
747  findexElemPtr = &entry;
748  b->Fill();
749  }
750  b->SetAddress(0);
751  }
hep::concurrency::RecursiveMutex mutex_
void sortBy_Run_SubRun_Event()
Definition: FileIndex.cc:161
void art::RootOutputFile::writeOne ( EventPrincipal const &  e)

Definition at line 632 of file RootOutputFile.cc.

633  {
634  RecursiveMutexSentry sentry{mutex_, __func__};
635  // Auxiliary branch.
636  // Note: pEventAux_ must be set before calling fillBranches
637  // since it gets written out in that routine.
638  pEventAux_ = &e.eventAux();
639  // Because getting the data may cause an exception to be
640  // thrown we want to do that first before writing anything
641  // to the file about this event.
642  fillBranches<InEvent>(e, pEventProductProvenanceVector_);
643  // History branch.
644  History historyForOutput{e.history()};
645  historyForOutput.addEventSelectionEntry(om_->selectorConfig());
646  pHistory_ = &historyForOutput;
647  int sz = eventHistoryTree_->Fill();
648  if (sz <= 0) {
650  << "Failed to fill the History tree for event: " << e.eventID()
651  << "\nTTree::Fill() returned " << sz << " bytes written." << endl;
652  }
653  // Add the dataType to the job report if it hasn't already been done
654  if (!dataTypeReported_) {
655  string dataType{"MC"};
656  if (pEventAux_->isRealData()) {
657  dataType = "Data";
658  }
659  dataTypeReported_ = true;
660  }
661  pHistory_ = &e.history();
662  // Add event to index
664  fp_.update_event();
665  }
EventAuxiliary const * pEventAux_
EventID const & eventID() const noexcept
hep::concurrency::RecursiveMutex mutex_
FileIndex::EntryNumber_t eventEntryNumber() const
const double e
FileProperties fp_
void addEntry(EventID const &eID, EntryNumber_t entry)
Definition: FileIndex.cc:146
ProductProvenances * pEventProductProvenanceVector_
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
OutputModule const * om_
History const * pHistory_
bool isRealData() const noexcept
fhicl::ParameterSetID selectorConfig() const
Definition: Observer.cc:84
void art::RootOutputFile::writeParameterSetRegistry ( )

Definition at line 870 of file RootOutputFile.cc.

871  {
872  RecursiveMutexSentry sentry{mutex_, __func__};
874  }
hep::concurrency::RecursiveMutex mutex_
std::unique_ptr< cet::sqlite::Connection > rootFileDB_
static void exportTo(sqlite3 *db)
void art::RootOutputFile::writeParentageRegistry ( )

Definition at line 692 of file RootOutputFile.cc.

693  {
694  RecursiveMutexSentry sentry{mutex_, __func__};
695  auto pid = root::getObjectRequireDict<ParentageID>();
696  ParentageID const* hash = &pid;
697  if (!parentageTree_->Branch(
698  rootNames::parentageIDBranchName().c_str(), &hash, basketSize_, 0)) {
700  << "Failed to create a branch for ParentageIDs in the output file";
701  }
702  hash = nullptr;
703  auto par = root::getObjectRequireDict<Parentage>();
704  Parentage const* desc = &par;
705  if (!parentageTree_->Branch(
706  rootNames::parentageBranchName().c_str(), &desc, basketSize_, 0)) {
708  << "Failed to create a branch for Parentages in the output file";
709  }
710  desc = nullptr;
711  for (auto const& pr : ParentageRegistry::get()) {
712  hash = &pr.first;
713  desc = &pr.second;
714  parentageTree_->Fill();
715  }
716  parentageTree_->SetBranchAddress(rootNames::parentageIDBranchName().c_str(),
717  nullptr);
718  parentageTree_->SetBranchAddress(rootNames::parentageBranchName().c_str(),
719  nullptr);
720  }
hep::concurrency::RecursiveMutex mutex_
static collection_type const & get()
std::string const & parentageBranchName()
Definition: rootNames.cc:33
Hash< ParentageType > ParentageID
Definition: ParentageID.h:8
std::string const & parentageIDBranchName()
Definition: rootNames.cc:27
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
void art::RootOutputFile::writeProcessConfigurationRegistry ( )

Definition at line 761 of file RootOutputFile.cc.

762  {
763  // We don't do this yet; currently we're storing a slightly
764  // bloated ProcessHistoryRegistry.
765  }
void art::RootOutputFile::writeProcessHistoryRegistry ( )

Definition at line 768 of file RootOutputFile.cc.

769  {
770  RecursiveMutexSentry sentry{mutex_, __func__};
771  ProcessHistoryMap pHistMap;
772  for (auto const& pr : ProcessHistoryRegistry::get()) {
773  pHistMap.emplace(pr);
774  }
775  auto const* p = &pHistMap;
776  TBranch* b = metaDataTree_->Branch(
777  metaBranchRootName<ProcessHistoryMap>(), &p, basketSize_, 0);
778  if (b == nullptr) {
780  << "Unable to locate required "
781  "ProcessHistoryMap branch in output "
782  "metadata tree.\n";
783  }
784  b->Fill();
785  }
hep::concurrency::RecursiveMutex mutex_
std::map< ProcessHistoryID const, ProcessHistory > ProcessHistoryMap
static collection_type const & get()
p
Definition: test.py:228
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
void art::RootOutputFile::writeProductDependencies ( )

Definition at line 899 of file RootOutputFile.cc.

900  {
901  RecursiveMutexSentry sentry{mutex_, __func__};
902  BranchChildren const* ppDeps = &om_->branchChildren();
903  TBranch* b = metaDataTree_->Branch(
904  metaBranchRootName<BranchChildren>(), &ppDeps, basketSize_, 0);
905  // FIXME: Turn this into a throw!
906  assert(b);
907  b->Fill();
908  }
hep::concurrency::RecursiveMutex mutex_
OutputModule const * om_
BranchChildren const & branchChildren() const
void art::RootOutputFile::writeProductDescriptionRegistry ( )

Definition at line 877 of file RootOutputFile.cc.

878  {
879  RecursiveMutexSentry sentry{mutex_, __func__};
880  // Make a local copy of the UpdateOutputCallbacks's ProductList,
881  // removing any transient or pruned products.
882  ProductRegistry reg;
883  auto productDescriptionsToWrite = [this, &reg](BranchType const bt) {
884  for (auto const& pr : descriptionsToPersist_[bt]) {
885  auto const& desc = pr.second;
886  reg.productList_.emplace(BranchKey{desc}, desc);
887  }
888  };
889  for_each_branch_type(productDescriptionsToWrite);
890  ProductRegistry const* regp = &reg;
891  TBranch* b = metaDataTree_->Branch(
892  metaBranchRootName<ProductRegistry>(), &regp, basketSize_, 0);
893  // FIXME: Turn this into a throw!
894  assert(b);
895  b->Fill();
896  }
hep::concurrency::RecursiveMutex mutex_
std::array< ProductDescriptionsByID, NumBranchTypes > descriptionsToPersist_
BranchType
Definition: BranchType.h:18
void for_each_branch_type(F f)
Definition: BranchType.h:36
cet::registry_via_id< success_t, val > reg
void art::RootOutputFile::writeResults ( ResultsPrincipal resp)

Definition at line 911 of file RootOutputFile.cc.

912  {
913  RecursiveMutexSentry sentry{mutex_, __func__};
914  pResultsAux_ = &resp.resultsAux();
915  fillBranches<InResults>(resp, pResultsProductProvenanceVector_);
916  }
hep::concurrency::RecursiveMutex mutex_
ProductProvenances * pResultsProductProvenanceVector_
ResultsAuxiliary const * pResultsAux_
void art::RootOutputFile::writeRun ( RunPrincipal const &  r)

Definition at line 680 of file RootOutputFile.cc.

681  {
682  RecursiveMutexSentry sentry{mutex_, __func__};
683  pRunAux_ = &r.runAux();
685  fillBranches<InRun>(r, pRunProductProvenanceVector_);
687  fp_.runEntryNumber());
689  }
FileIndex::EntryNumber_t runEntryNumber() const
RunID const & runID() const noexcept
ProductProvenances * pRunProductProvenanceVector_
hep::concurrency::RecursiveMutex mutex_
OutputFileStatus status_
FileProperties fp_
void addEntry(EventID const &eID, EntryNumber_t entry)
Definition: FileIndex.cc:146
static constexpr EventID invalidEvent() noexcept
Definition: EventID.h:203
void update_run(OutputFileStatus const status)
RunAuxiliary const * pRunAux_
void setRangeSetID(unsigned const id) const
void art::RootOutputFile::writeSubRun ( SubRunPrincipal const &  sr)

Definition at line 668 of file RootOutputFile.cc.

669  {
670  RecursiveMutexSentry sentry{mutex_, __func__};
671  pSubRunAux_ = &sr.subRunAux();
673  fillBranches<InSubRun>(sr, pSubRunProductProvenanceVector_);
677  }
SubRunAuxiliary const * pSubRunAux_
hep::concurrency::RecursiveMutex mutex_
OutputFileStatus status_
SubRunID const & subRunID() const noexcept
FileProperties fp_
void update_subRun(OutputFileStatus const status)
void addEntry(EventID const &eID, EntryNumber_t entry)
Definition: FileIndex.cc:146
void setRangeSetID(unsigned const id) const
static constexpr EventID invalidEvent() noexcept
Definition: EventID.h:203
ProductProvenances * pSubRunProductProvenanceVector_
FileIndex::EntryNumber_t subRunEntryNumber() const
static const double sr
Definition: Units.h:167
void art::RootOutputFile::writeTTrees ( )

Definition at line 919 of file RootOutputFile.cc.

920  {
921  RecursiveMutexSentry sentry{mutex_, __func__};
926  [this](BranchType const bt) { treePointers_[bt]->writeTree(); });
927  }
hep::concurrency::RecursiveMutex mutex_
static void writeTTree(TTree *) noexcept(false)
RootOutputTreePtrArray treePointers_
BranchType
Definition: BranchType.h:18
void for_each_branch_type(F f)
Definition: BranchType.h:36

Member Data Documentation

int const art::RootOutputFile::basketSize_
private

Definition at line 145 of file RootOutputFile.h.

std::chrono::steady_clock::time_point art::RootOutputFile::beginTime_
private

Definition at line 178 of file RootOutputFile.h.

int const art::RootOutputFile::compressionLevel_
private

Definition at line 141 of file RootOutputFile.h.

bool art::RootOutputFile::dataTypeReported_
private

Definition at line 171 of file RootOutputFile.h.

std::array<ProductDescriptionsByID, NumBranchTypes> art::RootOutputFile::descriptionsToPersist_
private

Definition at line 172 of file RootOutputFile.h.

DropMetaData art::RootOutputFile::dropMetaData_
private

Definition at line 146 of file RootOutputFile.h.

bool art::RootOutputFile::dropMetaDataForDroppedData_
private

Definition at line 147 of file RootOutputFile.h.

detail::DummyProductCache art::RootOutputFile::dummyProductCache_
private

Definition at line 175 of file RootOutputFile.h.

TTree* art::RootOutputFile::eventHistoryTree_
private

Definition at line 156 of file RootOutputFile.h.

ProductProvenances art::RootOutputFile::eventProductProvenanceVector_
private

Definition at line 161 of file RootOutputFile.h.

bool art::RootOutputFile::fastCloningEnabledAtConstruction_
private

Definition at line 148 of file RootOutputFile.h.

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

Definition at line 138 of file RootOutputFile.h.

FileIndex art::RootOutputFile::fileIndex_
private

Definition at line 151 of file RootOutputFile.h.

TTree* art::RootOutputFile::fileIndexTree_
private

Definition at line 154 of file RootOutputFile.h.

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

Definition at line 150 of file RootOutputFile.h.

ClosingCriteria art::RootOutputFile::fileSwitchCriteria_
private

Definition at line 139 of file RootOutputFile.h.

FileProperties art::RootOutputFile::fp_
private

Definition at line 152 of file RootOutputFile.h.

TTree* art::RootOutputFile::metaDataTree_
private

Definition at line 153 of file RootOutputFile.h.

hep::concurrency::RecursiveMutex art::RootOutputFile::mutex_
mutableprivate

Definition at line 136 of file RootOutputFile.h.

OutputModule const* art::RootOutputFile::om_
private

Definition at line 137 of file RootOutputFile.h.

TTree* art::RootOutputFile::parentageTree_
private

Definition at line 155 of file RootOutputFile.h.

EventAuxiliary const* art::RootOutputFile::pEventAux_
private

Definition at line 157 of file RootOutputFile.h.

ProductProvenances* art::RootOutputFile::pEventProductProvenanceVector_
private

Definition at line 165 of file RootOutputFile.h.

History const* art::RootOutputFile::pHistory_
private

Definition at line 169 of file RootOutputFile.h.

ResultsAuxiliary const* art::RootOutputFile::pResultsAux_
private

Definition at line 160 of file RootOutputFile.h.

ProductProvenances* art::RootOutputFile::pResultsProductProvenanceVector_
private

Definition at line 168 of file RootOutputFile.h.

RunAuxiliary const* art::RootOutputFile::pRunAux_
private

Definition at line 159 of file RootOutputFile.h.

ProductProvenances* art::RootOutputFile::pRunProductProvenanceVector_
private

Definition at line 167 of file RootOutputFile.h.

SubRunAuxiliary const* art::RootOutputFile::pSubRunAux_
private

Definition at line 158 of file RootOutputFile.h.

ProductProvenances* art::RootOutputFile::pSubRunProductProvenanceVector_
private

Definition at line 166 of file RootOutputFile.h.

ProductProvenances art::RootOutputFile::resultsProductProvenanceVector_
private

Definition at line 164 of file RootOutputFile.h.

std::unique_ptr<cet::sqlite::Connection> art::RootOutputFile::rootFileDB_
private

Definition at line 173 of file RootOutputFile.h.

ProductProvenances art::RootOutputFile::runProductProvenanceVector_
private

Definition at line 163 of file RootOutputFile.h.

unsigned art::RootOutputFile::runRSID_
private

Definition at line 177 of file RootOutputFile.h.

int64_t const art::RootOutputFile::saveMemoryObjectThreshold_
private

Definition at line 142 of file RootOutputFile.h.

std::array<std::set<OutputItem>, NumBranchTypes> art::RootOutputFile::selectedOutputItemList_
private

Definition at line 174 of file RootOutputFile.h.

int const art::RootOutputFile::splitLevel_
private

Definition at line 144 of file RootOutputFile.h.

OutputFileStatus art::RootOutputFile::status_
private

Definition at line 140 of file RootOutputFile.h.

ProductProvenances art::RootOutputFile::subRunProductProvenanceVector_
private

Definition at line 162 of file RootOutputFile.h.

unsigned art::RootOutputFile::subRunRSID_
private

Definition at line 176 of file RootOutputFile.h.

int64_t const art::RootOutputFile::treeMaxVirtualSize_
private

Definition at line 143 of file RootOutputFile.h.

RootOutputTreePtrArray art::RootOutputFile::treePointers_
private

Definition at line 170 of file RootOutputFile.h.

bool art::RootOutputFile::wasFastCloned_
private

Definition at line 149 of file RootOutputFile.h.


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