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

typedef PoolOutputModule::OutputItem OutputItem
 
typedef PoolOutputModule::OutputItemList OutputItemList
 
typedef std::array< edm::propagate_const< RootOutputTree * >, NumBranchTypesRootOutputTreePtrArray
 

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)
 
bool shouldWeCloseFile () const
 
void writeBranchIDListRegistry ()
 
void writeFileFormatVersion ()
 
void writeFileIdentifier ()
 
void writeIndexIntoFile ()
 
void writeLuminosityBlock (LuminosityBlockForOutput const &lb)
 
void writeOne (EventForOutput const &e)
 
void writeParameterSetRegistry ()
 
void writeParentageRegistry ()
 
void writeProcessHistoryRegistry ()
 
void writeProductDependencies ()
 
void writeProductDescriptionRegistry ()
 
void writeRun (RunForOutput const &r)
 
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, StoredProductProvenanceVector *productProvenanceVecPtr=0, ProductProvenanceRetriever const *provRetriever=0)
 
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) const
 

Private Attributes

std::set< BranchIDbranchesWithStoredHistory_
 
bool canFastCloneAux_
 
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_
 
LuminosityBlockAuxiliary const * pLumiAux_
 
ProcessHistoryRegistry processHistoryRegistry_
 
RunAuxiliary const * pRunAux_
 
JobReport::Token reportToken_
 
RunAuxiliary runAux_
 
IndexIntoFile::EntryNumber_t runEntryNumber_
 
RootOutputTree runTree_
 
RootOutputTreePtrArray treePointers_
 
int whyNotFastClonable_
 
edm::propagate_const< TClass * > wrapperBaseTClass_
 

Detailed Description

Definition at line 44 of file RootOutputFile.h.

Member Typedef Documentation

Definition at line 46 of file RootOutputFile.h.

Definition at line 47 of file RootOutputFile.h.

Definition at line 48 of file RootOutputFile.h.

Constructor & Destructor Documentation

edm::RootOutputFile::RootOutputFile ( PoolOutputModule om,
std::string const &  fileName,
std::string const &  logicalFileName 
)
explicit

Definition at line 79 of file RootOutputFile.cc.

References edm::RootOutputTree::addAuxiliary(), edm::RootOutputTree::addBranch(), MicroEventContent_cff::branch, branchesWithStoredHistory_, edm::poolNames::branchListIndexesBranchName(), edm::FileBlock::BranchMismatch, edm::BranchDescription::branchName(), revisionDML::branchType(), edm::BranchTypeToAuxiliaryBranchName(), edm::BranchTypeToProductProvenanceBranchName(), edm::FileBlock::CanFastClone, edm::errors::Configuration, edm::createGlobalIdentifier(), cms::Digest::digest(), edm::FileBlock::DisabledInConfigFile, edm::FileBlock::DuplicateEventsRemoved, edm::PoolOutputModule::eventAutoFlushSize(), edm::poolNames::eventSelectionsBranchName(), edm::FileBlock::EventSelectionUsed, edm::FileBlock::EventsOrLumisSelectedByID, edm::FileBlock::EventsToBeSorted, eventTree_, Exception, fid_, file_, filePtr_, edm::FileBlock::FileTooOld, edm::BranchDescription::fullClassName(), edm::propagate_const< T >::get(), edm::FileBlock::HasSecondaryFileSequence, mps_fire::i, edm::InEvent, edm::FileBlock::InitialEventsSkipped, edm::InLumi, edm::InRun, logicalFile_, lumiTree_, edm::RootOutputTree::makeTTree(), edm::FileBlock::MaxEventsTooSmall, edm::FileBlock::MaxLumisTooSmall, python.rootplot.argparse::message, metaDataTree_, edm::poolNames::metaDataTreeName(), edm::BranchDescription::moduleLabel(), edm::moduleName(), edm::FileBlock::NoEventsInFile, edm::FileBlock::NoRootInputSource, edm::FileBlock::NotProcessingEvents, edm::NumBranchTypes, om_, edm::FileBlock::OutputMaxEventsTooSmall, edm::FileBlock::ParallelProcesses, parameterSetsTree_, edm::poolNames::parameterSetsTreeName(), parentageTree_, edm::poolNames::parentageTreeName(), pBranchListIndexes_, pEventAux_, pEventEntryInfoVector(), pEventSelectionIDs_, pLumiAux_, edm::BranchDescription::processName(), edm::BranchDescription::productInstanceName(), pRunAux_, reportToken_, edm::FileBlock::RunOrLumiNotContiguous, runTree_, edm::PoolOutputModule::selectedOutputItemList(), edm::RootOutputTree::setAutoFlush(), edm::sort_all(), edm::FileBlock::SplitLevelMismatch, AlCaHLTBitMon_QueryRunRegistry::string, cms::MD5Result::toString(), treePointers_, and edm::BranchDescription::wrappedName().

79  :
80  file_(fileName),
81  logicalFile_(logicalFileName),
82  reportToken_(0),
83  om_(om),
84  whyNotFastClonable_(om_->whyNotFastClonable()),
85  canFastCloneAux_(false),
86  filePtr_(openTFile(file_.c_str(), om_->compressionLevel())),
87  fid_(),
88  eventEntryNumber_(0LL),
89  lumiEntryNumber_(0LL),
90  runEntryNumber_(0LL),
92  nEventsInLumi_(0),
93  metaDataTree_(nullptr),
94  parameterSetsTree_(nullptr),
95  parentageTree_(nullptr),
96  lumiAux_(),
97  runAux_(),
98  pEventAux_(nullptr),
100  pRunAux_(&runAux_),
103  pBranchListIndexes_(nullptr),
104  pEventSelectionIDs_(nullptr),
105  eventTree_(filePtr(), InEvent, om_->splitLevel(), om_->treeMaxVirtualSize()),
106  lumiTree_(filePtr(), InLumi, om_->splitLevel(), om_->treeMaxVirtualSize()),
107  runTree_(filePtr(), InRun, om_->splitLevel(), om_->treeMaxVirtualSize()),
108  treePointers_(),
109  dataTypeReported_(false),
111  parentageIDs_(),
113  wrapperBaseTClass_(TClass::GetClass("edm::WrapperBase")) {
114  if (om_->compressionAlgorithm() == std::string("ZLIB")) {
115  filePtr_->SetCompressionAlgorithm(ROOT::kZLIB);
116  } else if (om_->compressionAlgorithm() == std::string("LZMA")) {
117  filePtr_->SetCompressionAlgorithm(ROOT::kLZMA);
118  } else {
119  throw Exception(errors::Configuration) << "PoolOutputModule configured with unknown compression algorithm '" << om_->compressionAlgorithm() << "'\n"
120  << "Allowed compression algorithms are ZLIB and LZMA\n";
121  }
122  if (-1 != om->eventAutoFlushSize()) {
123  eventTree_.setAutoFlush(-1*om->eventAutoFlushSize());
124  }
126  pEventAux_, om_->auxItems()[InEvent].basketSize_);
128  pEventEntryInfoVector(), om_->auxItems()[InEvent].basketSize_);
130  pEventSelectionIDs_, om_->auxItems()[InEvent].basketSize_,false);
132  pBranchListIndexes_, om_->auxItems()[InEvent].basketSize_);
133 
135  pLumiAux_, om_->auxItems()[InLumi].basketSize_);
136 
138  pRunAux_, om_->auxItems()[InRun].basketSize_);
139 
141  treePointers_[InLumi] = &lumiTree_;
142  treePointers_[InRun] = &runTree_;
143 
144  for(int i = InEvent; i < NumBranchTypes; ++i) {
145  BranchType branchType = static_cast<BranchType>(i);
146  RootOutputTree *theTree = treePointers_[branchType];
147  for(auto const& item : om_->selectedOutputItemList()[branchType]) {
148  item.product_ = nullptr;
149  BranchDescription const& desc = *item.branchDescription_;
150  theTree->addBranch(desc.branchName(),
151  desc.wrappedName(),
152  item.product_,
153  item.splitLevel_,
154  item.basketSize_,
155  item.branchDescription_->produced());
156  //make sure we always store product registry info for all branches we create
157  branchesWithStoredHistory_.insert(item.branchID());
158  }
159  }
160  // Don't split metadata tree or event description tree
164 
165  fid_ = FileID(createGlobalIdentifier());
166 
167  // For the Job Report, get a vector of branch names in the "Events" tree.
168  // Also create a hash of all the branch names in the "Events" tree
169  // in a deterministic order, except use the full class name instead of the friendly class name.
170  // To avoid extra string copies, we create a vector of pointers into the product registry,
171  // and use a custom comparison operator for sorting.
172  std::vector<std::string> branchNames;
173  std::vector<BranchDescription const*> branches;
174  branchNames.reserve(om_->selectedOutputItemList()[InEvent].size());
175  branches.reserve(om->selectedOutputItemList()[InEvent].size());
176  for(auto const& item : om_->selectedOutputItemList()[InEvent]) {
177  branchNames.push_back(item.branchDescription_->branchName());
178  branches.push_back(item.branchDescription_);
179  }
180  // Now sort the branches for the hash.
181  sort_all(branches, sorterForJobReportHash);
182  // Now, make a concatenated string.
183  std::ostringstream oss;
184  char const underscore = '_';
185  for(auto const& branch : branches) {
186  BranchDescription const& bd = *branch;
187  oss << bd.fullClassName() << underscore
188  << bd.moduleLabel() << underscore
189  << bd.productInstanceName() << underscore
190  << bd.processName() << underscore;
191  }
192  std::string stringrep = oss.str();
193  cms::Digest md5alg(stringrep);
194 
195  // Register the output file with the JobReport service
196  // and get back the token for it.
197  std::string moduleName = "PoolOutputModule";
198  Service<JobReport> reportSvc;
199  reportToken_ = reportSvc->outputFileOpened(
200  file_, logicalFile_, // PFN and LFN
201  om_->catalog(), // catalog
202  moduleName, // module class name
203  om_->moduleLabel(), // module label
204  fid_.fid(), // file id (guid)
205  std::string(), // data type (not yet known, so string is empty).
206  md5alg.digest().toString(), // branch hash
207  branchNames); // branch names being written
208  }
LuminosityBlockAuxiliary lumiAux_
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:115
std::string const & parentageTreeName()
Definition: BranchType.cc:159
edm::propagate_const< TTree * > metaDataTree_
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:243
void setAutoFlush(Long64_t size)
BranchType
Definition: BranchType.h:11
std::set< BranchID > branchesWithStoredHistory_
std::vector< EventSelectionID > EventSelectionIDVector
std::string const & parameterSetsTreeName()
Definition: BranchType.cc:251
std::string const & fileName() const
std::map< ParentageID, unsigned int > parentageIDs_
std::shared_ptr< TFile const > filePtr() const
RootOutputTree eventTree_
std::vector< BranchListIndex > BranchListIndexes
std::string moduleName(Provenance const &provenance)
Definition: Provenance.cc:27
edm::propagate_const< PoolOutputModule * > om_
IndexIntoFile::EntryNumber_t eventEntryNumber_
LuminosityBlockAuxiliary const * pLumiAux_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
std::string logicalFile_
std::string const & metaDataTreeName()
Definition: BranchType.cc:168
edm::propagate_const< TClass * > wrapperBaseTClass_
static TTree * makeTTree(TFile *filePtr, std::string const &name, int splitLevel)
element_type const * get() const
EventSelectionIDVector const * pEventSelectionIDs_
edm::propagate_const< TTree * > parameterSetsTree_
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
Definition: Algorithms.h:120
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_
RootOutputTree runTree_
StoredProductProvenanceVector eventEntryInfoVector_
edm::propagate_const< TTree * > parentageTree_
void addAuxiliary(std::string const &branchName, T const *&pAux, int bufSize, bool allowCloning=true)
std::vector< StoredProductProvenance > StoredProductProvenanceVector
IndexIntoFile indexIntoFile_
IndexIntoFile::EntryNumber_t runEntryNumber_
EventAuxiliary const * pEventAux_
RunAuxiliary runAux_
std::string const & BranchTypeToProductProvenanceBranchName(BranchType const &BranchType)
Definition: BranchType.cc:131
StoredProductProvenanceVector const * pEventEntryInfoVector() const
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:247
RootOutputTreePtrArray treePointers_
BranchListIndexes const * pBranchListIndexes_
IndexIntoFile::EntryNumber_t lumiEntryNumber_
RootOutputTree lumiTree_
RunAuxiliary const * pRunAux_
def branchType(schema, name)
Definition: revisionDML.py:112
JobReport::Token reportToken_
std::string createGlobalIdentifier()
edm::RootOutputFile::~RootOutputFile ( )
inline

Member Function Documentation

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

Definition at line 300 of file RootOutputFile.cc.

References edm::FileBlock::BranchMismatch, edm::FileBlock::CanFastClone, canFastCloneAux_, edm::RootOutputTree::checkIfFastClonable(), edm::RootOutputTree::checkSplitLevelsAndBasketSizes(), eventTree_, Exception, file_, edm::FileBlock::fileName(), edm::match(), edm::RootOutputTree::maybeFastCloneTree(), edm::errors::MismatchedInputFiles, edm::FileBlock::NoRootInputSource, om_, edm::FileBlock::OutputMaxEventsTooSmall, reportToken_, edm::FileBlock::SplitLevelMismatch, edm::FileBlock::tree(), edm::FileBlock::whyNotFastClonable(), and whyNotFastClonable_.

Referenced by ~RootOutputFile().

300  {
301 
302  // Reset per input file information
303  whyNotFastClonable_ = om_->whyNotFastClonable();
304  canFastCloneAux_ = false;
305 
306  if(fb.tree() != nullptr) {
307 
308  whyNotFastClonable_ |= fb.whyNotFastClonable();
309 
310  if(remainingEvents >= 0 && remainingEvents < fb.tree()->GetEntries()) {
312  }
313 
315  if(!match) {
316  if(om_->overrideInputFileSplitLevels()) {
317  // We may be fast copying. We must disable fast copying if the split levels
318  // or basket sizes do not match.
320  } else {
321  // We are using the input split levels and basket sizes from the first input file
322  // for copied output branches. In this case, we throw an exception if any branches
323  // have different split levels or basket sizes in a subsequent input file.
324  // If the mismatch is in the first file, there is a bug somewhere, so we assert.
325  assert(om_->inputFileCount() > 1);
326  throw Exception(errors::MismatchedInputFiles, "RootOutputFile::beginInputFile()") <<
327  "Merge failure because input file " << file_ << " has different ROOT split levels or basket sizes\n" <<
328  "than previous files. To allow merging in splite of this, use the configuration parameter\n" <<
329  "overrideInputFileSplitLevels=cms.untracked.bool(True)\n" <<
330  "in every PoolOutputModule.\n";
331  }
332  }
333 
334  // Since this check can be time consuming, we do it only if we would otherwise fast clone.
336  if(!eventTree_.checkIfFastClonable(fb.tree())) {
338  }
339  }
340  // We now check if we can fast copy the auxiliary branches.
341  // We can do so only if we can otherwise fast copy,
342  // the input file has the current format (these branches are in the Events Tree),
343  // there are no newly dropped or produced products,
344  // no metadata has been dropped,
345  // ID's have not been modified,
346  // and the branch list indexes do not need modification.
347 
348  // Note: Fast copy of the EventProductProvenance branch is unsafe
349  // unless we can enforce that the parentage information for a fully copied
350  // output file will be the same as for the input file, with nothing dropped.
351  // This has never been enforced, and, withthe EDAlias feature, it may no longer
352  // work by accident.
353  // So, for now, we do not enable fast cloning of the non-product branches.
354 /*
355  Service<ConstProductRegistry> reg;
356  canFastCloneAux_ = (whyNotFastClonable_ == FileBlock::CanFastClone) &&
357  fb.fileFormatVersion().noMetaDataTrees() &&
358  !om_->hasNewlyDroppedBranch()[InEvent] &&
359  !fb.hasNewlyDroppedBranch()[InEvent] &&
360  om_->dropMetaData() == PoolOutputModule::DropNone &&
361  !reg->anyProductProduced() &&
362  !fb.modifiedIDs() &&
363  fb.branchListIndexesUnchanged();
364 */
365 
366  // Report the fast copying status.
367  Service<JobReport> reportSvc;
368  reportSvc->reportFastCopyingStatus(reportToken_, fb.fileName(), whyNotFastClonable_ == FileBlock::CanFastClone);
369  } else {
371  }
372 
374 
375  // Possibly issue warning or informational message if we haven't fast cloned.
376  if(fb.tree() != nullptr && whyNotFastClonable_ != FileBlock::CanFastClone) {
377  maybeIssueWarning(whyNotFastClonable_, fb.fileName(), file_);
378  }
379  }
bool checkSplitLevelsAndBasketSizes(TTree *inputTree) const
bool checkIfFastClonable(TTree *inputTree) const
RootOutputTree eventTree_
edm::propagate_const< PoolOutputModule * > om_
void maybeFastCloneTree(bool canFastClone, bool canFastCloneAux, TTree *tree, std::string const &option)
JobReport::Token reportToken_
std::string match(BranchDescription const &a, BranchDescription const &b, std::string const &fileName)
std::string const& edm::RootOutputFile::fileName ( ) const
inline
std::shared_ptr<TFile const> edm::RootOutputFile::filePtr ( ) const
inlineprivate

Definition at line 99 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

edm::propagate_const< std::shared_ptr< TFile > > filePtr_
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
std::shared_ptr<TFile>& edm::RootOutputFile::filePtr ( )
inlineprivate

Definition at line 100 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

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

Definition at line 673 of file RootOutputFile.cc.

References branchesWithStoredHistory_, edm::ProductProvenanceRetriever::branchIDToProvenance(), revisionDML::branchType(), edm::FileBlock::CanFastClone, SimDataFormats::CaloAnalysis::cp, edm::PoolOutputModule::DropAll, edm::PoolOutputModule::DropNone, edm::PoolOutputModule::DropPrior, read312RV_cfg::fastCloning, runEdmFileComparison::found, edm::OccurrenceForOutput::getByToken(), edm::getWrapperBasePtr(), edm::InEvent, insertAncestors(), insertProductProvenance(), mps_monitormerge::items, eostools::move(), PFRecoTauDiscriminationByIsolation_cfi::offset, om_, AlCaHLTBitMon_ParallelJobs::p, edm::es::produced, edm::Provenance::productProvenance(), edm::BasicHandle::provenance(), mps_fire::result, treePointers_, whyNotFastClonable_, edm::BasicHandle::wrapper(), and wrapperBaseTClass_.

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

677  {
678 
679  std::vector<std::unique_ptr<WrapperBase> > dummies;
680 
681  OutputItemList const& items = om_->selectedOutputItemList()[branchType];
682 
683  bool const doProvenance = (productProvenanceVecPtr != nullptr) && (om_->dropMetaData() != PoolOutputModule::DropAll);
684  bool const keepProvenanceForPrior = doProvenance && om_->dropMetaData() != PoolOutputModule::DropPrior;
685 
687  std::set<StoredProductProvenance> provenanceToKeep;
688  //
689  //If we are dropping some of the meta data we need to know
690  // which BranchIDs were produced in this process because
691  // we may be storing meta data for only those products
692  // We do this only for event products.
693  std::set<BranchID> producedBranches;
694  if(doProvenance && branchType == InEvent && om_->dropMetaData() != PoolOutputModule::DropNone) {
696  for(auto bd : preg->allBranchDescriptions()) {
697  if(bd->produced() && bd->branchType() == InEvent) {
698  producedBranches.insert(bd->branchID());
699  }
700  }
701  }
702 
703  // Loop over EDProduct branches, possibly fill the provenance, and write the branch.
704  for(auto const& item : items) {
705 
706  BranchID const& id = item.branchDescription_->branchID();
707  branchesWithStoredHistory_.insert(id);
708 
709  bool produced = item.branchDescription_->produced();
710  bool getProd = (produced || !fastCloning || treePointers_[branchType]->uncloned(item.branchDescription_->branchName()));
711  bool keepProvenance = doProvenance && (produced || keepProvenanceForPrior);
712 
713  WrapperBase const* product = nullptr;
714  ProductProvenance const* productProvenance = nullptr;
715  BasicHandle result;
716  if(getProd) {
717  bool found = occurrence.getByToken(item.token_, item.branchDescription_->unwrappedTypeID(), result);
718  product = result.wrapper();
719  if(found && keepProvenance) {
720  productProvenance = result.provenance()->productProvenance();
721  }
722  if(product == nullptr) {
723  // No product with this ID is in the event.
724  // Add a null product.
725  TClass* cp = item.branchDescription_->wrappedType().getClass();
726  assert(cp != nullptr);
727  int offset = cp->GetBaseClassOffset(wrapperBaseTClass_);
728  void* p = cp->New();
729  std::unique_ptr<WrapperBase> dummy = getWrapperBasePtr(p, offset);
730  product = dummy.get();
731  dummies.emplace_back(std::move(dummy));
732  }
733  item.product_ = product;
734  }
735  if (keepProvenance && productProvenance == nullptr) {
736  productProvenance = provRetriever->branchIDToProvenance(item.branchDescription_->originalBranchID());
737  }
738  if(productProvenance) {
739  insertProductProvenance(*productProvenance,provenanceToKeep);
740  insertAncestors(*productProvenance, provRetriever, produced, producedBranches, provenanceToKeep);
741  }
742  }
743 
744  if(doProvenance) productProvenanceVecPtr->assign(provenanceToKeep.begin(), provenanceToKeep.end());
745  treePointers_[branchType]->fillTree();
746  if(doProvenance) productProvenanceVecPtr->clear();
747  }
void insertAncestors(ProductProvenance const &iGetParents, ProductProvenanceRetriever const *iMapper, bool produced, std::set< BranchID > const &producedBranches, std::set< StoredProductProvenance > &oToFill)
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
PoolOutputModule::OutputItemList OutputItemList
edm::propagate_const< TClass * > wrapperBaseTClass_
bool insertProductProvenance(const ProductProvenance &, std::set< StoredProductProvenance > &oToInsert)
std::unique_ptr< WrapperBase > getWrapperBasePtr(void *p, int offset)
RootOutputTreePtrArray treePointers_
const eventsetup::produce::Produce produced
Definition: ESProducts.cc:20
def move(src, dest)
Definition: eostools.py:510
def branchType(schema, name)
Definition: revisionDML.py:112
void edm::RootOutputFile::finishEndFile ( )

Definition at line 598 of file RootOutputFile.cc.

References revisionDML::branchType(), filePtr_, mps_fire::i, edm::InEvent, metaDataTree_, edm::NumBranchTypes, om_, parameterSetsTree_, parentageTree_, reportToken_, setBranchAliases(), compare::tree, treePointers_, and edm::RootOutputTree::writeTTree().

Referenced by ~RootOutputFile().

598  {
599  metaDataTree_->SetEntries(-1);
602 
604 
605  // Create branch aliases for all the branches in the
606  // events/lumis/runs trees. The loop is over all types of data
607  // products.
608  for(int i = InEvent; i < NumBranchTypes; ++i) {
609  BranchType branchType = static_cast<BranchType>(i);
610  setBranchAliases(treePointers_[branchType]->tree(), om_->keptProducts()[branchType]);
611  treePointers_[branchType]->writeTree();
612  }
613 
614  // close the file -- mfp
615  // Just to play it safe, zero all pointers to objects in the TFile to be closed.
616  metaDataTree_ = parentageTree_ = nullptr;
617  for(auto& treePointer : treePointers_) {
618  treePointer->close();
619  treePointer = nullptr;
620  }
621  filePtr_->Close();
622  filePtr_ = nullptr; // propagate_const<T> has no reset() function
623 
624  // report that file has been closed
625  Service<JobReport> reportSvc;
626  reportSvc->outputFileClosed(reportToken_);
627 
628  }
edm::propagate_const< TTree * > metaDataTree_
BranchType
Definition: BranchType.h:11
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
edm::propagate_const< TTree * > parameterSetsTree_
void setBranchAliases(TTree *tree, SelectedProducts const &branches) const
edm::propagate_const< TTree * > parentageTree_
static void writeTTree(TTree *tree)
RootOutputTreePtrArray treePointers_
def branchType(schema, name)
Definition: revisionDML.py:112
JobReport::Token reportToken_
void edm::RootOutputFile::insertAncestors ( ProductProvenance const &  iGetParents,
ProductProvenanceRetriever const *  iMapper,
bool  produced,
std::set< BranchID > const &  producedBranches,
std::set< StoredProductProvenance > &  oToFill 
)
private

Definition at line 650 of file RootOutputFile.cc.

References branchesWithStoredHistory_, edm::ProductProvenance::branchID(), edm::ProductProvenanceRetriever::branchIDToProvenance(), edm::PoolOutputModule::DropAll, edm::PoolOutputModule::DropDroppedPrior, edm::PoolOutputModule::DropNone, edm::PoolOutputModule::DropPrior, info(), insertProductProvenance(), om_, edm::ProductProvenance::parentage(), edm::Parentage::parents(), and edm::es::produced.

Referenced by fileName(), and fillBranches().

654  {
655  assert(om_->dropMetaData() != PoolOutputModule::DropAll);
656  assert(produced || om_->dropMetaData() != PoolOutputModule::DropPrior);
657  if(om_->dropMetaData() == PoolOutputModule::DropDroppedPrior && !produced) return;
658  std::vector<BranchID> const& parentIDs = iGetParents.parentage().parents();
659  for(auto const& parentID : parentIDs) {
660  branchesWithStoredHistory_.insert(parentID);
661  ProductProvenance const* info = iMapper->branchIDToProvenance(parentID);
662  if(info) {
663  if(om_->dropMetaData() == PoolOutputModule::DropNone || (iProducedIDs.end() != iProducedIDs.find(info->branchID()) ) ) {
664  if(insertProductProvenance(*info,oToFill) ) {
665  //haven't seen this one yet
666  insertAncestors(*info, iMapper, produced, iProducedIDs, oToFill);
667  }
668  }
669  }
670  }
671  }
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)
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
bool insertProductProvenance(const ProductProvenance &, std::set< StoredProductProvenance > &oToInsert)
const eventsetup::produce::Produce produced
Definition: ESProducts.cc:20
bool edm::RootOutputFile::insertProductProvenance ( const ProductProvenance ,
std::set< StoredProductProvenance > &  oToInsert 
)
private

Definition at line 750 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 fileName(), fillBranches(), and insertAncestors().

751  {
752  StoredProductProvenance toStore;
753  toStore.branchID_ = iProv.branchID().id();
754  std::set<edm::StoredProductProvenance>::iterator itFound = oToInsert.find(toStore);
755  if(itFound == oToInsert.end()) {
756  //get the index to the ParentageID or insert a new value if not already present
757  std::pair<std::map<edm::ParentageID,unsigned int>::iterator,bool> i = parentageIDs_.insert(std::make_pair(iProv.parentageID(),static_cast<unsigned int>(parentageIDs_.size())));
758  toStore.parentageIDIndex_ = i.first->second;
759  if(toStore.parentageIDIndex_ >= parentageIDs_.size()) {
761  << "RootOutputFile::insertProductProvenance\n"
762  << "The parentage ID index value " << toStore.parentageIDIndex_ << " is out of bounds. The maximum value is currently " << parentageIDs_.size()-1 << ".\n"
763  << "This should never happen.\n"
764  << "Please report this to the framework hypernews forum 'hn-cms-edmFramework@cern.ch'.\n";
765  }
766 
767  oToInsert.insert(toStore);
768  return true;
769  }
770  return false;
771  }
std::map< ParentageID, unsigned int > parentageIDs_
StoredProductProvenanceVector const* edm::RootOutputFile::pEventEntryInfoVector ( ) const
inlineprivate

Definition at line 101 of file RootOutputFile.h.

References edm::get_underlying_safe(), and pEventEntryInfoVector_.

Referenced by RootOutputFile().

std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_
StoredProductProvenanceVector*& edm::RootOutputFile::pEventEntryInfoVector ( )
inlineprivate

Definition at line 102 of file RootOutputFile.h.

References edm::get_underlying_safe(), and pEventEntryInfoVector_.

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

Definition at line 381 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

381  {
385  }
RootOutputTree eventTree_
RootOutputTree runTree_
RootOutputTree lumiTree_
void edm::RootOutputFile::setBranchAliases ( TTree *  tree,
SelectedProducts const &  branches 
) const
private

Definition at line 631 of file RootOutputFile.cc.

References met_cff::alias, edm::BranchDescription::branchAliases(), edm::BranchDescription::branchName(), full, edm::BranchDescription::moduleLabel(), edm::BranchDescription::productInstanceName(), corrVsCorr::selection, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by fileName(), and finishEndFile().

631  {
632  if(tree && tree->GetNbranches() != 0) {
633  for(auto const& selection : branches) {
634  BranchDescription const& pd = *selection.first;
635  std::string const& full = pd.branchName() + "obj";
636  if(pd.branchAliases().empty()) {
637  std::string const& alias =
638  (pd.productInstanceName().empty() ? pd.moduleLabel() : pd.productInstanceName());
639  tree->SetAlias(alias.c_str(), full.c_str());
640  } else {
641  for(auto const& alias : pd.branchAliases()) {
642  tree->SetAlias(alias.c_str(), full.c_str());
643  }
644  }
645  }
646  }
647  }
selection
main part
Definition: corrVsCorr.py:98
Definition: GenABIO.cc:180
Definition: tree.py:1
bool edm::RootOutputFile::shouldWeCloseFile ( ) const

Definition at line 387 of file RootOutputFile.cc.

References filePtr_, om_, and findQualityFiles::size.

Referenced by ~RootOutputFile().

387  {
388  unsigned int const oneK = 1024;
389  Long64_t size = filePtr_->GetSize()/oneK;
390  return(size >= om_->maxFileSize());
391  }
size
Write out results.
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< std::shared_ptr< TFile > > filePtr_
void edm::RootOutputFile::writeBranchIDListRegistry ( )

Definition at line 541 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

541  {
542  BranchIDLists const* p = om_->branchIDLists();
543  TBranch* b = metaDataTree_->Branch(poolNames::branchIDListBranchName().c_str(), &p, om_->basketSize(), 0);
544  assert(b);
545  b->Fill();
546  }
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:120
std::string const & branchIDListBranchName()
Definition: BranchType.cc:208
void edm::RootOutputFile::writeFileFormatVersion ( )

Definition at line 505 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

505  {
506  FileFormatVersion fileFormatVersion(getFileFormatVersion());
507  FileFormatVersion* pFileFmtVsn = &fileFormatVersion;
508  TBranch* b = metaDataTree_->Branch(poolNames::fileFormatVersionBranchName().c_str(), &pFileFmtVsn, om_->basketSize(), 0);
509  assert(b);
510  b->Fill();
511  }
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:218
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
int getFileFormatVersion()
double b
Definition: hdecay.h:120
void edm::RootOutputFile::writeFileIdentifier ( )

Definition at line 513 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

513  {
514  FileID* fidPtr = &fid_;
515  TBranch* b = metaDataTree_->Branch(poolNames::fileIdentifierBranchName().c_str(), &fidPtr, om_->basketSize(), 0);
516  assert(b);
517  b->Fill();
518  }
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:120
std::string const & fileIdentifierBranchName()
Definition: BranchType.cc:223
void edm::RootOutputFile::writeIndexIntoFile ( )

Definition at line 520 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

520  {
523  ex << "The number of entries in at least one output TBranch whose entries\n"
524  "were copied from the input does not match the number of events\n"
525  "recorded in IndexIntoFile. This might (or might not) indicate a\n"
526  "problem related to fast copy.";
527  ex.addContext("Calling RootOutputFile::writeIndexIntoFile");
528  throw ex;
529  }
531  IndexIntoFile* iifPtr = &indexIntoFile_;
532  TBranch* b = metaDataTree_->Branch(poolNames::indexIntoFileBranchName().c_str(), &iifPtr, om_->basketSize(), 0);
533  assert(b);
534  b->Fill();
535  }
edm::propagate_const< TTree * > metaDataTree_
void sortVector_Run_Or_Lumi_Entries()
RootOutputTree eventTree_
edm::propagate_const< PoolOutputModule * > om_
IndexIntoFile::EntryNumber_t eventEntryNumber_
std::string const & indexIntoFileBranchName()
Definition: BranchType.cc:233
bool checkEntriesInReadBranches(Long64_t expectedNumberOfEntries) const
double b
Definition: hdecay.h:120
IndexIntoFile indexIntoFile_
void edm::RootOutputFile::writeLuminosityBlock ( LuminosityBlockForOutput const &  lb)

Definition at line 440 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

440  {
441  // Auxiliary branch
442  // NOTE: lumiAux_ must be filled before calling fillBranches since it gets written out in that routine.
443  lumiAux_ = lb.luminosityBlockAuxiliary();
444  // Use the updated process historyID
445  lumiAux_.setProcessHistoryID(lb.processHistoryID());
446  // Store the process history.
447  processHistoryRegistry_.registerProcessHistory(lb.processHistory());
448  // Store the reduced ID in the IndexIntoFile
449  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(lb.processHistoryID());
450  // Add lumi to index.
453  fillBranches(InLumi, lb);
454  lumiTree_.optimizeBaskets(10ULL*1024*1024);
455 
456  Service<JobReport> reportSvc;
457  reportSvc->reportLumiSection(reportToken_, lb.id().run(), lb.id().luminosityBlock(),nEventsInLumi_);
458  nEventsInLumi_ = 0;
459  }
LuminosityBlockAuxiliary lumiAux_
bool registerProcessHistory(ProcessHistory const &processHistory)
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
void setProcessHistoryID(ProcessHistoryID const &phid)
LuminosityBlockNumber_t luminosityBlock() const
void addEntry(ProcessHistoryID const &processHistoryID, RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry)
Hash< ProcessHistoryType > ProcessHistoryID
IndexIntoFile indexIntoFile_
IndexIntoFile::EntryNumber_t lumiEntryNumber_
RootOutputTree lumiTree_
void optimizeBaskets(ULong64_t size)
JobReport::Token reportToken_
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, StoredProductProvenanceVector *productProvenanceVecPtr=0, ProductProvenanceRetriever const *provRetriever=0)
void edm::RootOutputFile::writeOne ( EventForOutput const &  e)

Definition at line 393 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

393  {
394  // Auxiliary branch
395  pEventAux_ = &e.eventAuxiliary();
396 
397  // Because getting the data may cause an exception to be thrown we want to do that
398  // first before writing anything to the file about this event
399  // NOTE: pEventAux_, pBranchListIndexes_, pEventSelectionIDs_, and pEventEntryInfoVector_
400  // must be set before calling fillBranches since they get written out in that routine.
401  assert(pEventAux_->processHistoryID() == e.processHistoryID());
402  pBranchListIndexes_ = &e.branchListIndexes();
403 
404  // Note: The EventSelectionIDVector should have a one to one correspondence with the processes in the process history.
405  // Therefore, a new entry should be added if and only if the current process has been added to the process history,
406  // which is done if and only if there is a produced product.
408  EventSelectionIDVector esids = e.eventSelectionIDs();
409  if (reg->anyProductProduced() || !om_->wantAllEvents()) {
410  esids.push_back(om_->selectorConfig());
411  }
412  pEventSelectionIDs_ = &esids;
413  ProductProvenanceRetriever const* provRetriever = e.productProvenanceRetrieverPtr();
414  assert(provRetriever);
415  fillBranches(InEvent, e, pEventEntryInfoVector_, provRetriever);
416 
417  // Add the dataType to the job report if it hasn't already been done
418  if(!dataTypeReported_) {
419  Service<JobReport> reportSvc;
420  std::string dataType("MC");
421  if(pEventAux_->isRealData()) dataType = "Data";
422  reportSvc->reportDataType(reportToken_, dataType);
423  dataTypeReported_ = true;
424  }
425 
426  // Store the process history.
428  // Store the reduced ID in the IndexIntoFile
429  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(e.processHistoryID());
430  // Add event to index
433 
434  // Report event written
435  Service<JobReport> reportSvc;
436  reportSvc->eventWrittenToFile(reportToken_, e.id().run(), e.id().event());
437  ++nEventsInLumi_;
438  }
bool isRealData() const
bool registerProcessHistory(ProcessHistory const &processHistory)
RunNumber_t run() const
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
std::vector< EventSelectionID > EventSelectionIDVector
LuminosityBlockNumber_t luminosityBlock() const
edm::propagate_const< PoolOutputModule * > om_
IndexIntoFile::EntryNumber_t eventEntryNumber_
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
void addEntry(ProcessHistoryID const &processHistoryID, RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry)
Hash< ProcessHistoryType > ProcessHistoryID
EventSelectionIDVector const * pEventSelectionIDs_
edm::propagate_const< StoredProductProvenanceVector * > pEventEntryInfoVector_
IndexIntoFile indexIntoFile_
ProcessHistoryID const & processHistoryID() const
EventAuxiliary const * pEventAux_
BranchListIndexes const * pBranchListIndexes_
EventNumber_t event() const
JobReport::Token reportToken_
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, StoredProductProvenanceVector *productProvenanceVecPtr=0, ProductProvenanceRetriever const *provRetriever=0)
void edm::RootOutputFile::writeParameterSetRegistry ( )

Definition at line 555 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

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

Definition at line 481 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

481  {
482  Parentage const* desc(nullptr);
483 
484  if(!parentageTree_->Branch(poolNames::parentageBranchName().c_str(),
485  &desc, om_->basketSize(), 0))
487  << "Failed to create a branch for Parentages in the output file";
488 
489  ParentageRegistry& ptReg = *ParentageRegistry::instance();
490 
491  std::vector<ParentageID> orderedIDs(parentageIDs_.size());
492  for(auto const& parentageID : parentageIDs_) {
493  orderedIDs[parentageID.second] = parentageID.first;
494  }
495  //now put them into the TTree in the correct order
496  for(auto const& orderedID : orderedIDs) {
497  desc = ptReg.getMapped(orderedID);
498  //NOTE: some old format files have missing Parentage info
499  // so a null value of desc can't be fatal.
500  // Root will default construct an object in that case.
501  parentageTree_->Fill();
502  }
503  }
std::map< ParentageID, unsigned int > parentageIDs_
edm::propagate_const< PoolOutputModule * > om_
std::string const & parentageBranchName()
Definition: BranchType.cc:163
edm::propagate_const< TTree * > parentageTree_
static ParentageRegistry * instance()
void edm::RootOutputFile::writeProcessHistoryRegistry ( )

Definition at line 537 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

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

Definition at line 590 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

590  {
591  BranchChildren& pDeps = const_cast<BranchChildren&>(om_->branchChildren());
592  BranchChildren* ppDeps = &pDeps;
593  TBranch* b = metaDataTree_->Branch(poolNames::productDependenciesBranchName().c_str(), &ppDeps, om_->basketSize(), 0);
594  assert(b);
595  b->Fill();
596  }
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:120
std::string const & productDependenciesBranchName()
Definition: BranchType.cc:178
void edm::RootOutputFile::writeProductDescriptionRegistry ( )

Definition at line 559 of file RootOutputFile.cc.

References b, branchesWithStoredHistory_, end, metaDataTree_, om_, parseEventContent::prod, and edm::poolNames::productDescriptionBranchName().

Referenced by ~RootOutputFile().

559  {
560  // Make a local copy of the ProductRegistry, removing any transient or pruned products.
561  typedef ProductRegistry::ProductList ProductList;
563  ProductRegistry pReg(reg->productList());
564  ProductList& pList = const_cast<ProductList &>(pReg.productList());
565  for(auto const& prod : pList) {
566  if(prod.second.branchID() != prod.second.originalBranchID()) {
567  if(branchesWithStoredHistory_.find(prod.second.branchID()) != branchesWithStoredHistory_.end()) {
568  branchesWithStoredHistory_.insert(prod.second.originalBranchID());
569  }
570  }
571  }
572  std::set<BranchID>::iterator end = branchesWithStoredHistory_.end();
573  for(ProductList::iterator it = pList.begin(); it != pList.end();) {
574  if(branchesWithStoredHistory_.find(it->second.branchID()) == end) {
575  // avoid invalidating iterator on deletion
576  ProductList::iterator itCopy = it;
577  ++it;
578  pList.erase(itCopy);
579 
580  } else {
581  ++it;
582  }
583  }
584 
585  ProductRegistry* ppReg = &pReg;
586  TBranch* b = metaDataTree_->Branch(poolNames::productDescriptionBranchName().c_str(), &ppReg, om_->basketSize(), 0);
587  assert(b);
588  b->Fill();
589  }
std::map< BranchKey, BranchDescription > ProductList
edm::propagate_const< TTree * > metaDataTree_
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
#define end
Definition: vmac.h:39
double b
Definition: hdecay.h:120
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:173
void edm::RootOutputFile::writeRun ( RunForOutput const &  r)

Definition at line 461 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

461  {
462  // Auxiliary branch
463  // NOTE: runAux_ must be filled before calling fillBranches since it gets written out in that routine.
464  runAux_ = r.runAuxiliary();
465  // Use the updated process historyID
466  runAux_.setProcessHistoryID(r.processHistoryID());
467  // Store the process history.
469  // Store the reduced ID in the IndexIntoFile
470  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(r.processHistoryID());
471  // Add run to index.
472  indexIntoFile_.addEntry(reducedPHID, runAux_.run(), 0U, 0U, runEntryNumber_);
473  ++runEntryNumber_;
474  fillBranches(InRun, r);
475  runTree_.optimizeBaskets(10ULL*1024*1024);
476 
477  Service<JobReport> reportSvc;
478  reportSvc->reportRunNumber(reportToken_, r.run());
479  }
bool registerProcessHistory(ProcessHistory const &processHistory)
ProcessHistoryRegistry processHistoryRegistry_
ProcessHistoryID const & reducedProcessHistoryID(ProcessHistoryID const &fullID) const
void addEntry(ProcessHistoryID const &processHistoryID, RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry)
Hash< ProcessHistoryType > ProcessHistoryID
RootOutputTree runTree_
IndexIntoFile indexIntoFile_
IndexIntoFile::EntryNumber_t runEntryNumber_
RunAuxiliary runAux_
void setProcessHistoryID(ProcessHistoryID const &phid)
Definition: RunAuxiliary.h:36
void optimizeBaskets(ULong64_t size)
RunNumber_t run() const
Definition: RunAuxiliary.h:41
JobReport::Token reportToken_
void fillBranches(BranchType const &branchType, OccurrenceForOutput const &occurrence, StoredProductProvenanceVector *productProvenanceVecPtr=0, ProductProvenanceRetriever const *provRetriever=0)
void edm::RootOutputFile::writeThinnedAssociationsHelper ( )

Definition at line 548 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

548  {
549  ThinnedAssociationsHelper const* p = om_->thinnedAssociationsHelper();
550  TBranch* b = metaDataTree_->Branch(poolNames::thinnedAssociationsHelperBranchName().c_str(), &p, om_->basketSize(), 0);
551  assert(b);
552  b->Fill();
553  }
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:120
std::string const & thinnedAssociationsHelperBranchName()
Definition: BranchType.cc:213

Member Data Documentation

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

Definition at line 112 of file RootOutputFile.h.

Referenced by beginInputFile().

bool edm::RootOutputFile::dataTypeReported_
private

Definition at line 136 of file RootOutputFile.h.

Referenced by writeOne().

StoredProductProvenanceVector edm::RootOutputFile::eventEntryInfoVector_
private

Definition at line 128 of file RootOutputFile.h.

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

Definition at line 115 of file RootOutputFile.h.

Referenced by writeIndexIntoFile(), and writeOne().

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

Definition at line 114 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeFileIdentifier().

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

Definition at line 107 of file RootOutputFile.h.

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

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

Definition at line 113 of file RootOutputFile.h.

Referenced by filePtr(), finishEndFile(), RootOutputFile(), and shouldWeCloseFile().

IndexIntoFile edm::RootOutputFile::indexIntoFile_
private

Definition at line 118 of file RootOutputFile.h.

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

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

Definition at line 108 of file RootOutputFile.h.

Referenced by RootOutputFile().

LuminosityBlockAuxiliary edm::RootOutputFile::lumiAux_
private

Definition at line 123 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

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

Definition at line 116 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

RootOutputTree edm::RootOutputFile::lumiTree_
private

Definition at line 133 of file RootOutputFile.h.

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

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

Definition at line 119 of file RootOutputFile.h.

Referenced by writeLuminosityBlock(), and writeOne().

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

Definition at line 121 of file RootOutputFile.h.

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

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

Definition at line 138 of file RootOutputFile.h.

Referenced by insertProductProvenance(), and writeParentageRegistry().

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

Definition at line 122 of file RootOutputFile.h.

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

BranchListIndexes const* edm::RootOutputFile::pBranchListIndexes_
private

Definition at line 130 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

EventAuxiliary const* edm::RootOutputFile::pEventAux_
private

Definition at line 125 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

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

Definition at line 129 of file RootOutputFile.h.

Referenced by pEventEntryInfoVector(), and writeOne().

EventSelectionIDVector const* edm::RootOutputFile::pEventSelectionIDs_
private

Definition at line 131 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

LuminosityBlockAuxiliary const* edm::RootOutputFile::pLumiAux_
private

Definition at line 126 of file RootOutputFile.h.

Referenced by RootOutputFile().

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

Definition at line 127 of file RootOutputFile.h.

Referenced by RootOutputFile().

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

Definition at line 124 of file RootOutputFile.h.

Referenced by writeRun().

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

Definition at line 117 of file RootOutputFile.h.

Referenced by writeRun().

RootOutputTree edm::RootOutputFile::runTree_
private

Definition at line 134 of file RootOutputFile.h.

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

RootOutputTreePtrArray edm::RootOutputFile::treePointers_
private

Definition at line 135 of file RootOutputFile.h.

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

int edm::RootOutputFile::whyNotFastClonable_
private

Definition at line 111 of file RootOutputFile.h.

Referenced by beginInputFile(), and fillBranches().

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

Definition at line 140 of file RootOutputFile.h.

Referenced by fillBranches().