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, std::vector< std::string > const &processesWithSelectedMergeableRunProducts)
 
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 writeStoredMergeableRunProductMetadata ()
 
void writeThinnedAssociationsHelper ()
 
 ~RootOutputFile ()
 

Private Member Functions

std::shared_ptr< TFile const > filePtr () const
 
std::shared_ptr< TFile > & filePtr ()
 
void fillBranches (BranchType const &branchType, OccurrenceForOutput const &occurrence, 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_
 
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
 
RootOutputTreePtrArray treePointers_
 
int whyNotFastClonable_
 
edm::propagate_const< TClass * > wrapperBaseTClass_
 

Detailed Description

Definition at line 45 of file RootOutputFile.h.

Member Typedef Documentation

Definition at line 47 of file RootOutputFile.h.

Definition at line 48 of file RootOutputFile.h.

Definition at line 49 of file RootOutputFile.h.

Constructor & Destructor Documentation

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

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

82  :
83  file_(fileName),
84  logicalFile_(logicalFileName),
85  reportToken_(0),
86  om_(om),
87  whyNotFastClonable_(om_->whyNotFastClonable()),
88  canFastCloneAux_(false),
89  filePtr_(openTFile(file_.c_str(), om_->compressionLevel())),
90  fid_(),
91  eventEntryNumber_(0LL),
92  lumiEntryNumber_(0LL),
93  runEntryNumber_(0LL),
95  storedMergeableRunProductMetadata_(processesWithSelectedMergeableRunProducts),
96  nEventsInLumi_(0),
97  metaDataTree_(nullptr),
98  parameterSetsTree_(nullptr),
99  parentageTree_(nullptr),
100  lumiAux_(),
101  runAux_(),
102  pEventAux_(nullptr),
104  pRunAux_(&runAux_),
107  pBranchListIndexes_(nullptr),
108  pEventSelectionIDs_(nullptr),
109  eventTree_(filePtr(), InEvent, om_->splitLevel(), om_->treeMaxVirtualSize()),
110  lumiTree_(filePtr(), InLumi, om_->splitLevel(), om_->treeMaxVirtualSize()),
111  runTree_(filePtr(), InRun, om_->splitLevel(), om_->treeMaxVirtualSize()),
112  treePointers_(),
113  dataTypeReported_(false),
115  parentageIDs_(),
117  wrapperBaseTClass_(TClass::GetClass("edm::WrapperBase")) {
118  if (om_->compressionAlgorithm() == std::string("ZLIB")) {
119  filePtr_->SetCompressionAlgorithm(ROOT::kZLIB);
120  } else if (om_->compressionAlgorithm() == std::string("LZMA")) {
121  filePtr_->SetCompressionAlgorithm(ROOT::kLZMA);
122  } else {
123  throw Exception(errors::Configuration) << "PoolOutputModule configured with unknown compression algorithm '" << om_->compressionAlgorithm() << "'\n"
124  << "Allowed compression algorithms are ZLIB and LZMA\n";
125  }
126  if (-1 != om->eventAutoFlushSize()) {
127  eventTree_.setAutoFlush(-1*om->eventAutoFlushSize());
128  }
130  pEventAux_, om_->auxItems()[InEvent].basketSize_);
132  pEventEntryInfoVector(), om_->auxItems()[InEvent].basketSize_);
134  pEventSelectionIDs_, om_->auxItems()[InEvent].basketSize_,false);
136  pBranchListIndexes_, om_->auxItems()[InEvent].basketSize_);
137 
139  pLumiAux_, om_->auxItems()[InLumi].basketSize_);
140 
142  pRunAux_, om_->auxItems()[InRun].basketSize_);
143 
145  treePointers_[InLumi] = &lumiTree_;
146  treePointers_[InRun] = &runTree_;
147 
148  for(int i = InEvent; i < NumBranchTypes; ++i) {
149  BranchType branchType = static_cast<BranchType>(i);
150  RootOutputTree *theTree = treePointers_[branchType];
151  for(auto const& item : om_->selectedOutputItemList()[branchType]) {
152  item.product_ = nullptr;
153  BranchDescription const& desc = *item.branchDescription_;
154  theTree->addBranch(desc.branchName(),
155  desc.wrappedName(),
156  item.product_,
157  item.splitLevel_,
158  item.basketSize_,
159  item.branchDescription_->produced());
160  //make sure we always store product registry info for all branches we create
161  branchesWithStoredHistory_.insert(item.branchID());
162  }
163  }
164  // Don't split metadata tree or event description tree
168 
169  fid_ = FileID(createGlobalIdentifier());
170 
171  // For the Job Report, get a vector of branch names in the "Events" tree.
172  // Also create a hash of all the branch names in the "Events" tree
173  // in a deterministic order, except use the full class name instead of the friendly class name.
174  // To avoid extra string copies, we create a vector of pointers into the product registry,
175  // and use a custom comparison operator for sorting.
176  std::vector<std::string> branchNames;
177  std::vector<BranchDescription const*> branches;
178  branchNames.reserve(om_->selectedOutputItemList()[InEvent].size());
179  branches.reserve(om->selectedOutputItemList()[InEvent].size());
180  for(auto const& item : om_->selectedOutputItemList()[InEvent]) {
181  branchNames.push_back(item.branchDescription_->branchName());
182  branches.push_back(item.branchDescription_);
183  }
184  // Now sort the branches for the hash.
185  sort_all(branches, sorterForJobReportHash);
186  // Now, make a concatenated string.
187  std::ostringstream oss;
188  char const underscore = '_';
189  for(auto const& branch : branches) {
190  BranchDescription const& bd = *branch;
191  oss << bd.fullClassName() << underscore
192  << bd.moduleLabel() << underscore
193  << bd.productInstanceName() << underscore
194  << bd.processName() << underscore;
195  }
196  std::string stringrep = oss.str();
197  cms::Digest md5alg(stringrep);
198 
199  // Register the output file with the JobReport service
200  // and get back the token for it.
201  std::string moduleName = "PoolOutputModule";
202  Service<JobReport> reportSvc;
203  reportToken_ = reportSvc->outputFileOpened(
204  file_, logicalFile_, // PFN and LFN
205  om_->catalog(), // catalog
206  moduleName, // module class name
207  om_->moduleLabel(), // module label
208  fid_.fid(), // file id (guid)
209  std::string(), // data type (not yet known, so string is empty).
210  md5alg.digest().toString(), // branch hash
211  branchNames); // branch names being written
212  }
LuminosityBlockAuxiliary lumiAux_
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:116
std::string const & parentageTreeName()
Definition: BranchType.cc:160
edm::propagate_const< TTree * > metaDataTree_
unsigned long nEventsInLumi_
ProcessHistoryRegistry processHistoryRegistry_
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:249
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:257
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:169
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_
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
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:132
StoredProductProvenanceVector const * pEventEntryInfoVector() const
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:253
RootOutputTreePtrArray treePointers_
BranchListIndexes const * pBranchListIndexes_
IndexIntoFile::EntryNumber_t lumiEntryNumber_
RootOutputTree lumiTree_
RunAuxiliary const * pRunAux_
def branchType(schema, name)
Definition: revisionDML.py:113
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 304 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().

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

References filePtr_, and edm::get_underlying_safe().

102 {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)
std::shared_ptr<TFile>& edm::RootOutputFile::filePtr ( )
inlineprivate

Definition at line 103 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

103 {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 686 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::Provenance::productProvenance(), edm::BasicHandle::provenance(), mps_fire::result, treePointers_, whyNotFastClonable_, edm::BasicHandle::wrapper(), and wrapperBaseTClass_.

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

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

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

611  {
612  metaDataTree_->SetEntries(-1);
615 
617 
618  // Create branch aliases for all the branches in the
619  // events/lumis/runs trees. The loop is over all types of data
620  // products.
621  for(int i = InEvent; i < NumBranchTypes; ++i) {
622  BranchType branchType = static_cast<BranchType>(i);
623  setBranchAliases(treePointers_[branchType]->tree(), om_->keptProducts()[branchType]);
624  treePointers_[branchType]->writeTree();
625  }
626 
627  // close the file -- mfp
628  // Just to play it safe, zero all pointers to objects in the TFile to be closed.
629  metaDataTree_ = parentageTree_ = nullptr;
630  for(auto& treePointer : treePointers_) {
631  treePointer->close();
632  treePointer = nullptr;
633  }
634  filePtr_->Close();
635  filePtr_ = nullptr; // propagate_const<T> has no reset() function
636 
637  // report that file has been closed
638  Service<JobReport> reportSvc;
639  reportSvc->outputFileClosed(reportToken_);
640 
641  }
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:113
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 663 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(), and edm::Parentage::parents().

Referenced by fileName(), and fillBranches().

667  {
668  assert(om_->dropMetaData() != PoolOutputModule::DropAll);
669  assert(produced || om_->dropMetaData() != PoolOutputModule::DropPrior);
670  if(om_->dropMetaData() == PoolOutputModule::DropDroppedPrior && !produced) return;
671  std::vector<BranchID> const& parentIDs = iGetParents.parentage().parents();
672  for(auto const& parentID : parentIDs) {
673  branchesWithStoredHistory_.insert(parentID);
674  ProductProvenance const* info = iMapper->branchIDToProvenance(parentID);
675  if(info) {
676  if(om_->dropMetaData() == PoolOutputModule::DropNone || (iProducedIDs.end() != iProducedIDs.find(info->branchID()) ) ) {
677  if(insertProductProvenance(*info,oToFill) ) {
678  //haven't seen this one yet
679  insertAncestors(*info, iMapper, produced, iProducedIDs, oToFill);
680  }
681  }
682  }
683  }
684  }
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)
bool edm::RootOutputFile::insertProductProvenance ( const ProductProvenance ,
std::set< StoredProductProvenance > &  oToInsert 
)
private

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

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

Definition at line 104 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 105 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 385 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

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

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

644  {
645  if(tree && tree->GetNbranches() != 0) {
646  for(auto const& selection : branches) {
647  BranchDescription const& pd = *selection.first;
648  std::string const& full = pd.branchName() + "obj";
649  if(pd.branchAliases().empty()) {
650  std::string const& alias =
651  (pd.productInstanceName().empty() ? pd.moduleLabel() : pd.productInstanceName());
652  tree->SetAlias(alias.c_str(), full.c_str());
653  } else {
654  for(auto const& alias : pd.branchAliases()) {
655  tree->SetAlias(alias.c_str(), full.c_str());
656  }
657  }
658  }
659  }
660  }
selection
main part
Definition: corrVsCorr.py:99
Definition: GenABIO.cc:180
Definition: tree.py:1
bool edm::RootOutputFile::shouldWeCloseFile ( ) const

Definition at line 391 of file RootOutputFile.cc.

References filePtr_, om_, and findQualityFiles::size.

Referenced by ~RootOutputFile().

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

Definition at line 554 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

554  {
555  BranchIDLists const* p = om_->branchIDLists();
556  TBranch* b = metaDataTree_->Branch(poolNames::branchIDListBranchName().c_str(), &p, om_->basketSize(), 0);
557  assert(b);
558  b->Fill();
559  }
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:209
void edm::RootOutputFile::writeFileFormatVersion ( )

Definition at line 510 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

510  {
511  FileFormatVersion fileFormatVersion(getFileFormatVersion());
512  FileFormatVersion* pFileFmtVsn = &fileFormatVersion;
513  TBranch* b = metaDataTree_->Branch(poolNames::fileFormatVersionBranchName().c_str(), &pFileFmtVsn, om_->basketSize(), 0);
514  assert(b);
515  b->Fill();
516  }
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:219
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 518 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

518  {
519  FileID* fidPtr = &fid_;
520  TBranch* b = metaDataTree_->Branch(poolNames::fileIdentifierBranchName().c_str(), &fidPtr, om_->basketSize(), 0);
521  assert(b);
522  b->Fill();
523  }
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:120
std::string const & fileIdentifierBranchName()
Definition: BranchType.cc:224
void edm::RootOutputFile::writeIndexIntoFile ( )

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

525  {
528  ex << "The number of entries in at least one output TBranch whose entries\n"
529  "were copied from the input does not match the number of events\n"
530  "recorded in IndexIntoFile. This might (or might not) indicate a\n"
531  "problem related to fast copy.";
532  ex.addContext("Calling RootOutputFile::writeIndexIntoFile");
533  throw ex;
534  }
536  IndexIntoFile* iifPtr = &indexIntoFile_;
537  TBranch* b = metaDataTree_->Branch(poolNames::indexIntoFileBranchName().c_str(), &iifPtr, om_->basketSize(), 0);
538  assert(b);
539  b->Fill();
540  }
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:234
bool checkEntriesInReadBranches(Long64_t expectedNumberOfEntries) const
double b
Definition: hdecay.h:120
IndexIntoFile indexIntoFile_
void edm::RootOutputFile::writeLuminosityBlock ( LuminosityBlockForOutput const &  lb)

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

444  {
445  // Auxiliary branch
446  // NOTE: lumiAux_ must be filled before calling fillBranches since it gets written out in that routine.
447  lumiAux_ = lb.luminosityBlockAuxiliary();
448  // Use the updated process historyID
449  lumiAux_.setProcessHistoryID(lb.processHistoryID());
450  // Store the process history.
451  processHistoryRegistry_.registerProcessHistory(lb.processHistory());
452  // Store the reduced ID in the IndexIntoFile
453  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(lb.processHistoryID());
454  // Add lumi to index.
457  fillBranches(InLumi, lb);
458  lumiTree_.optimizeBaskets(10ULL*1024*1024);
459 
460  Service<JobReport> reportSvc;
461  reportSvc->reportLumiSection(reportToken_, lb.id().run(), lb.id().luminosityBlock(),nEventsInLumi_);
462  nEventsInLumi_ = 0;
463  }
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 397 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().

397  {
398  // Auxiliary branch
399  pEventAux_ = &e.eventAuxiliary();
400 
401  // Because getting the data may cause an exception to be thrown we want to do that
402  // first before writing anything to the file about this event
403  // NOTE: pEventAux_, pBranchListIndexes_, pEventSelectionIDs_, and pEventEntryInfoVector_
404  // must be set before calling fillBranches since they get written out in that routine.
405  assert(pEventAux_->processHistoryID() == e.processHistoryID());
406  pBranchListIndexes_ = &e.branchListIndexes();
407 
408  // Note: The EventSelectionIDVector should have a one to one correspondence with the processes in the process history.
409  // Therefore, a new entry should be added if and only if the current process has been added to the process history,
410  // which is done if and only if there is a produced product.
412  EventSelectionIDVector esids = e.eventSelectionIDs();
413  if (reg->anyProductProduced() || !om_->wantAllEvents()) {
414  esids.push_back(om_->selectorConfig());
415  }
416  pEventSelectionIDs_ = &esids;
417  ProductProvenanceRetriever const* provRetriever = e.productProvenanceRetrieverPtr();
418  assert(provRetriever);
419  fillBranches(InEvent, e, pEventEntryInfoVector_, provRetriever);
420 
421  // Add the dataType to the job report if it hasn't already been done
422  if(!dataTypeReported_) {
423  Service<JobReport> reportSvc;
424  std::string dataType("MC");
425  if(pEventAux_->isRealData()) dataType = "Data";
426  reportSvc->reportDataType(reportToken_, dataType);
427  dataTypeReported_ = true;
428  }
429 
430  // Store the process history.
432  // Store the reduced ID in the IndexIntoFile
433  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(e.processHistoryID());
434  // Add event to index
437 
438  // Report event written
439  Service<JobReport> reportSvc;
440  reportSvc->eventWrittenToFile(reportToken_, e.id().run(), e.id().event());
441  ++nEventsInLumi_;
442  }
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 568 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

568  {
570  }
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 486 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().

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

Definition at line 550 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

550  {
552  }
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 603 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

603  {
604  BranchChildren& pDeps = const_cast<BranchChildren&>(om_->branchChildren());
605  BranchChildren* ppDeps = &pDeps;
606  TBranch* b = metaDataTree_->Branch(poolNames::productDependenciesBranchName().c_str(), &ppDeps, om_->basketSize(), 0);
607  assert(b);
608  b->Fill();
609  }
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:120
std::string const & productDependenciesBranchName()
Definition: BranchType.cc:179
void edm::RootOutputFile::writeProductDescriptionRegistry ( )

Definition at line 572 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

572  {
573  // Make a local copy of the ProductRegistry, removing any transient or pruned products.
574  typedef ProductRegistry::ProductList ProductList;
576  ProductRegistry pReg(reg->productList());
577  ProductList& pList = const_cast<ProductList &>(pReg.productList());
578  for(auto const& prod : pList) {
579  if(prod.second.branchID() != prod.second.originalBranchID()) {
580  if(branchesWithStoredHistory_.find(prod.second.branchID()) != branchesWithStoredHistory_.end()) {
581  branchesWithStoredHistory_.insert(prod.second.originalBranchID());
582  }
583  }
584  }
585  std::set<BranchID>::iterator end = branchesWithStoredHistory_.end();
586  for(ProductList::iterator it = pList.begin(); it != pList.end();) {
587  if(branchesWithStoredHistory_.find(it->second.branchID()) == end) {
588  // avoid invalidating iterator on deletion
589  ProductList::iterator itCopy = it;
590  ++it;
591  pList.erase(itCopy);
592 
593  } else {
594  ++it;
595  }
596  }
597 
598  ProductRegistry* ppReg = &pReg;
599  TBranch* b = metaDataTree_->Branch(poolNames::productDescriptionBranchName().c_str(), &ppReg, om_->basketSize(), 0);
600  assert(b);
601  b->Fill();
602  }
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:174
void edm::RootOutputFile::writeRun ( RunForOutput const &  r)

Definition at line 465 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

465  {
466  // Auxiliary branch
467  // NOTE: runAux_ must be filled before calling fillBranches since it gets written out in that routine.
468  runAux_ = r.runAuxiliary();
469  // Use the updated process historyID
470  runAux_.setProcessHistoryID(r.processHistoryID());
471  // Store the process history.
473  // Store the reduced ID in the IndexIntoFile
474  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(r.processHistoryID());
475  // Add run to index.
476  indexIntoFile_.addEntry(reducedPHID, runAux_.run(), 0U, 0U, runEntryNumber_);
477  r.mergeableRunProductMetadata()->addEntryToStoredMetadata(storedMergeableRunProductMetadata_);
478  ++runEntryNumber_;
479  fillBranches(InRun, r);
480  runTree_.optimizeBaskets(10ULL*1024*1024);
481 
482  Service<JobReport> reportSvc;
483  reportSvc->reportRunNumber(reportToken_, r.run());
484  }
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
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
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::writeStoredMergeableRunProductMetadata ( )

Definition at line 542 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

542  {
544  StoredMergeableRunProductMetadata* ptr = &storedMergeableRunProductMetadata_;
545  TBranch* b = metaDataTree_->Branch(poolNames::mergeableRunProductMetadataBranchName().c_str(), &ptr, om_->basketSize(), 0);
546  assert(b);
547  b->Fill();
548  }
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
std::string const & mergeableRunProductMetadataBranchName()
Definition: BranchType.cc:239
StoredMergeableRunProductMetadata storedMergeableRunProductMetadata_
double b
Definition: hdecay.h:120
void edm::RootOutputFile::writeThinnedAssociationsHelper ( )

Definition at line 561 of file RootOutputFile.cc.

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

Referenced by ~RootOutputFile().

561  {
562  ThinnedAssociationsHelper const* p = om_->thinnedAssociationsHelper();
563  TBranch* b = metaDataTree_->Branch(poolNames::thinnedAssociationsHelperBranchName().c_str(), &p, om_->basketSize(), 0);
564  assert(b);
565  b->Fill();
566  }
edm::propagate_const< TTree * > metaDataTree_
edm::propagate_const< PoolOutputModule * > om_
double b
Definition: hdecay.h:120
std::string const & thinnedAssociationsHelperBranchName()
Definition: BranchType.cc:214

Member Data Documentation

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

Definition at line 115 of file RootOutputFile.h.

Referenced by beginInputFile().

bool edm::RootOutputFile::dataTypeReported_
private

Definition at line 140 of file RootOutputFile.h.

Referenced by writeOne().

StoredProductProvenanceVector edm::RootOutputFile::eventEntryInfoVector_
private

Definition at line 132 of file RootOutputFile.h.

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

Definition at line 118 of file RootOutputFile.h.

Referenced by writeIndexIntoFile(), and writeOne().

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

Definition at line 117 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeFileIdentifier().

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

Definition at line 110 of file RootOutputFile.h.

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

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

Definition at line 116 of file RootOutputFile.h.

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

IndexIntoFile edm::RootOutputFile::indexIntoFile_
private

Definition at line 121 of file RootOutputFile.h.

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

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

Definition at line 111 of file RootOutputFile.h.

Referenced by RootOutputFile().

LuminosityBlockAuxiliary edm::RootOutputFile::lumiAux_
private

Definition at line 127 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

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

Definition at line 119 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

RootOutputTree edm::RootOutputFile::lumiTree_
private

Definition at line 137 of file RootOutputFile.h.

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

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

Definition at line 123 of file RootOutputFile.h.

Referenced by writeLuminosityBlock(), and writeOne().

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

Definition at line 125 of file RootOutputFile.h.

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

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

Definition at line 142 of file RootOutputFile.h.

Referenced by insertProductProvenance(), and writeParentageRegistry().

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

Definition at line 126 of file RootOutputFile.h.

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

BranchListIndexes const* edm::RootOutputFile::pBranchListIndexes_
private

Definition at line 134 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

EventAuxiliary const* edm::RootOutputFile::pEventAux_
private

Definition at line 129 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

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

Definition at line 133 of file RootOutputFile.h.

Referenced by pEventEntryInfoVector(), and writeOne().

EventSelectionIDVector const* edm::RootOutputFile::pEventSelectionIDs_
private

Definition at line 135 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

LuminosityBlockAuxiliary const* edm::RootOutputFile::pLumiAux_
private

Definition at line 130 of file RootOutputFile.h.

Referenced by RootOutputFile().

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

Definition at line 131 of file RootOutputFile.h.

Referenced by RootOutputFile().

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

Definition at line 128 of file RootOutputFile.h.

Referenced by writeRun().

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

Definition at line 120 of file RootOutputFile.h.

Referenced by writeRun().

RootOutputTree edm::RootOutputFile::runTree_
private

Definition at line 138 of file RootOutputFile.h.

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

StoredMergeableRunProductMetadata edm::RootOutputFile::storedMergeableRunProductMetadata_
private

Definition at line 122 of file RootOutputFile.h.

Referenced by writeRun(), and writeStoredMergeableRunProductMetadata().

RootOutputTreePtrArray edm::RootOutputFile::treePointers_
private

Definition at line 139 of file RootOutputFile.h.

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

int edm::RootOutputFile::whyNotFastClonable_
private

Definition at line 114 of file RootOutputFile.h.

Referenced by beginInputFile(), and fillBranches().

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

Definition at line 144 of file RootOutputFile.h.

Referenced by fillBranches().