CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 * >
, NumBranchTypes
RootOutputTreePtrArray
 

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 (LuminosityBlockPrincipal const &lb, ModuleCallingContext const *)
 
void writeOne (EventPrincipal const &e, ModuleCallingContext const *)
 
void writeParameterSetRegistry ()
 
void writeParentageRegistry ()
 
void writeProcessHistoryRegistry ()
 
void writeProductDependencies ()
 
void writeProductDescriptionRegistry ()
 
void writeRun (RunPrincipal const &r, ModuleCallingContext const *)
 
void writeThinnedAssociationsHelper ()
 
 ~RootOutputFile ()
 

Private Member Functions

std::shared_ptr< TFile const > filePtr () const
 
std::shared_ptr< TFile > & filePtr ()
 
void fillBranches (BranchType const &branchType, Principal const &principal, StoredProductProvenanceVector *productProvenanceVecPtr, ModuleCallingContext const *)
 
void insertAncestors (ProductProvenance const &iGetParents, EventPrincipal const &principal, bool produced, std::set< StoredProductProvenance > &oToFill, ModuleCallingContext const *)
 
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 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 
)
explicit

Definition at line 77 of file RootOutputFile.cc.

References edm::RootOutputTree::addAuxiliary(), edm::RootOutputTree::addBranch(), branchesWithStoredHistory_, edm::poolNames::branchListIndexesBranchName(), edm::BranchDescription::branchName(), revisionDML::branchType(), edm::BranchTypeToAuxiliaryBranchName(), edm::BranchTypeToProductProvenanceBranchName(), edm::errors::Configuration, edm::createGlobalIdentifier(), cms::Digest::digest(), edm::PoolOutputModule::eventAutoFlushSize(), edm::poolNames::eventSelectionsBranchName(), eventTree_, Exception, fid_, file_, filePtr_, edm::BranchDescription::fullClassName(), edm::propagate_const< T >::get(), i, edm::InEvent, edm::InLumi, edm::InRun, logicalFile_, lumiTree_, edm::RootOutputTree::makeTTree(), metaDataTree_, edm::poolNames::metaDataTreeName(), edm::BranchDescription::moduleLabel(), edm::moduleName(), edm::NumBranchTypes, om_, parameterSetsTree_, edm::poolNames::parameterSetsTreeName(), parentageTree_, edm::poolNames::parentageTreeName(), pBranchListIndexes_, pEventAux_, pEventEntryInfoVector(), pEventSelectionIDs_, pLumiAux_, edm::BranchDescription::processName(), edm::BranchDescription::productInstanceName(), pRunAux_, reportToken_, runTree_, edm::PoolOutputModule::selectedOutputItemList(), edm::RootOutputTree::setAutoFlush(), edm::sort_all(), AlCaHLTBitMon_QueryRunRegistry::string, cms::MD5Result::toString(), treePointers_, and edm::BranchDescription::wrappedName().

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

Definition at line 52 of file RootOutputFile.h.

52 {}

Member Function Documentation

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

Definition at line 298 of file RootOutputFile.cc.

References assert(), 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_.

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

Definition at line 73 of file RootOutputFile.h.

References file_.

73 {return file_;}
std::shared_ptr<TFile const> edm::RootOutputFile::filePtr ( ) const
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)
std::shared_ptr<TFile>& edm::RootOutputFile::filePtr ( )
inlineprivate

Definition at line 101 of file RootOutputFile.h.

References filePtr_, and edm::get_underlying_safe().

101 {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,
Principal const &  principal,
StoredProductProvenanceVector productProvenanceVecPtr,
ModuleCallingContext const *  mcc 
)
private

Definition at line 688 of file RootOutputFile.cc.

References assert(), branchesWithStoredHistory_, revisionDML::branchType(), edm::FileBlock::CanFastClone, compareJSON::const, CommonMethods::cp(), edm::PoolOutputModule::DropDroppedPrior, edm::PoolOutputModule::DropNone, edm::PoolOutputModule::DropPrior, read312RV_cfg::fastCloning, edm::Principal::getForOutput(), edm::getWrapperBasePtr(), edm::InEvent, insertAncestors(), insertProductProvenance(), mps_monitormerge::items, eostools::move(), hltrates_dqm_sourceclient-live_cfg::offset, om_, AlCaHLTBitMon_ParallelJobs::p, cmsRelvalreport::principal(), edm::es::produced, edm::OutputHandle::productProvenance(), treePointers_, whyNotFastClonable_, edm::OutputHandle::wrapper(), and wrapperBaseTClass_.

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

692  {
693 
694  std::vector<std::unique_ptr<WrapperBase> > dummies;
695 
697 
698  OutputItemList const& items = om_->selectedOutputItemList()[branchType];
699 
700  std::set<StoredProductProvenance> provenanceToKeep;
701 
702  // Loop over EDProduct branches, fill the provenance, and write the branch.
703  for(auto const& item : items) {
704 
705  BranchID const& id = item.branchDescription_->branchID();
706  branchesWithStoredHistory_.insert(id);
707 
708  bool produced = item.branchDescription_->produced();
709  bool keepProvenance = productProvenanceVecPtr != nullptr &&
710  (om_->dropMetaData() == PoolOutputModule::DropNone ||
711  om_->dropMetaData() == PoolOutputModule::DropDroppedPrior ||
712  (om_->dropMetaData() == PoolOutputModule::DropPrior && produced));
713  bool getProd = (produced || !fastCloning ||
714  treePointers_[branchType]->uncloned(item.branchDescription_->branchName()));
715 
716  WrapperBase const* product = nullptr;
717  OutputHandle const oh = principal.getForOutput(id, getProd, mcc);
718  if(keepProvenance && oh.productProvenance()) {
719  insertProductProvenance(*oh.productProvenance(),provenanceToKeep);
720  //provenanceToKeep.insert(*oh.productProvenance());
721  EventPrincipal const& eventPrincipal = dynamic_cast<EventPrincipal const&>(principal);
722  assert(eventPrincipal.productProvenanceRetrieverPtr());
723  insertAncestors(*oh.productProvenance(), eventPrincipal, produced, provenanceToKeep, mcc);
724  }
725  product = oh.wrapper();
726  if(getProd) {
727  if(product == nullptr) {
728  // No product with this ID is in the event.
729  // Add a null product.
730  TClass* cp = TClass::GetClass(item.branchDescription_->wrappedName().c_str());
731  int offset = cp->GetBaseClassOffset(wrapperBaseTClass_);
732  void* p = cp->New();
733  std::unique_ptr<WrapperBase> dummy = getWrapperBasePtr(p, offset);
734  product = dummy.get();
735  dummies.emplace_back(std::move(dummy));
736  }
737  item.product_ = product;
738  }
739  }
740 
741  if(productProvenanceVecPtr != nullptr) productProvenanceVecPtr->assign(provenanceToKeep.begin(), provenanceToKeep.end());
742  treePointers_[branchType]->fillTree();
743  if(productProvenanceVecPtr != nullptr) productProvenanceVecPtr->clear();
744  }
assert(m_qm.get())
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
void insertAncestors(ProductProvenance const &iGetParents, EventPrincipal const &principal, bool produced, std::set< StoredProductProvenance > &oToFill, ModuleCallingContext const *)
def move
Definition: eostools.py:510
PoolOutputModule::OutputItemList OutputItemList
edm::propagate_const< TClass * > wrapperBaseTClass_
eventsetup::produce::Produce produced
Definition: ESProducts.cc:20
string const
Definition: compareJSON.py:14
bool insertProductProvenance(const ProductProvenance &, std::set< StoredProductProvenance > &oToInsert)
std::unique_ptr< WrapperBase > getWrapperBasePtr(void *p, int offset)
RootOutputTreePtrArray treePointers_
void edm::RootOutputFile::finishEndFile ( )

Definition at line 611 of file RootOutputFile.cc.

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

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  }
int i
Definition: DBlmapReader.cc:9
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_
JobReport::Token reportToken_
void edm::RootOutputFile::insertAncestors ( ProductProvenance const &  iGetParents,
EventPrincipal const &  principal,
bool  produced,
std::set< StoredProductProvenance > &  oToFill,
ModuleCallingContext const *  mcc 
)
private

Definition at line 663 of file RootOutputFile.cc.

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

Referenced by fillBranches().

667  {
668  assert(om_->dropMetaData() != PoolOutputModule::DropAll);
669  assert(produced || om_->dropMetaData() != PoolOutputModule::DropPrior);
670  if(om_->dropMetaData() == PoolOutputModule::DropDroppedPrior && !produced) return;
671  ProductProvenanceRetriever const& iMapper = *principal.productProvenanceRetrieverPtr();
672  std::vector<BranchID> const& parentIDs = iGetParents.parentage().parents();
673  for(auto const& parentID : parentIDs) {
674  branchesWithStoredHistory_.insert(parentID);
675  ProductProvenance const* info = iMapper.branchIDToProvenance(parentID);
676  if(info) {
677  if(om_->dropMetaData() == PoolOutputModule::DropNone ||
678  principal.getProvenance(info->branchID(), mcc).product().produced()) {
679  if(insertProductProvenance(*info,oToFill) ) {
680  //haven't seen this one yet
681  insertAncestors(*info, principal, produced, oToFill, mcc);
682  }
683  }
684  }
685  }
686  }
static const TGPicture * info(bool iBackgroundIsBlack)
assert(m_qm.get())
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
void insertAncestors(ProductProvenance const &iGetParents, EventPrincipal const &principal, bool produced, std::set< StoredProductProvenance > &oToFill, ModuleCallingContext const *)
eventsetup::produce::Produce produced
Definition: ESProducts.cc:20
bool insertProductProvenance(const ProductProvenance &, std::set< StoredProductProvenance > &oToInsert)
bool edm::RootOutputFile::insertProductProvenance ( const ProductProvenance ,
std::set< StoredProductProvenance > &  oToInsert 
)
private

Definition at line 747 of file RootOutputFile.cc.

References edm::ProductProvenance::branchID(), edm::StoredProductProvenance::branchID_, Exception, i, edm::BranchID::id(), edm::errors::LogicError, edm::ProductProvenance::parentageID(), edm::StoredProductProvenance::parentageIDIndex_, and parentageIDs_.

Referenced by fillBranches(), and insertAncestors().

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

Definition at line 102 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 103 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 379 of file RootOutputFile.cc.

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

379  {
383  }
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 HLT_25ns10e33_v2_cff::alias, edm::BranchDescription::branchAliases(), edm::BranchDescription::branchName(), full, edm::BranchDescription::moduleLabel(), edm::BranchDescription::productInstanceName(), corrVsCorr::selection, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by finishEndFile().

644  {
645  if(tree && tree->GetNbranches() != 0) {
646  for(auto const& selection : branches) {
647  BranchDescription const& pd = *selection;
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:98
Definition: GenABIO.cc:180
bool edm::RootOutputFile::shouldWeCloseFile ( ) const

Definition at line 385 of file RootOutputFile.cc.

References filePtr_, om_, and findQualityFiles::size.

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

Definition at line 545 of file RootOutputFile.cc.

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

545  {
546  BranchIDLists const* p = om_->branchIDLists();
547  TBranch* b = metaDataTree_->Branch(poolNames::branchIDListBranchName().c_str(), &p, om_->basketSize(), 0);
548  assert(b);
549  b->Fill();
550  }
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
assert(m_qm.get())
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 502 of file RootOutputFile.cc.

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

502  {
503  FileFormatVersion fileFormatVersion(getFileFormatVersion());
504  FileFormatVersion* pFileFmtVsn = &fileFormatVersion;
505  TBranch* b = metaDataTree_->Branch(poolNames::fileFormatVersionBranchName().c_str(), &pFileFmtVsn, om_->basketSize(), 0);
506  assert(b);
507  b->Fill();
508  }
assert(m_qm.get())
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 510 of file RootOutputFile.cc.

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

510  {
511  FileID* fidPtr = &fid_;
512  TBranch* b = metaDataTree_->Branch(poolNames::fileIdentifierBranchName().c_str(), &fidPtr, om_->basketSize(), 0);
513  assert(b);
514  b->Fill();
515  }
assert(m_qm.get())
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 517 of file RootOutputFile.cc.

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

517  {
520  ex << "The number of entries in at least one output TBranch whose entries\n"
521  "were copied from the input does not match the number of events\n"
522  "recorded in IndexIntoFile. This might (or might not) indicate a\n"
523  "problem related to fast copy.";
524  ex.addContext("Calling RootOutputFile::writeIndexIntoFile");
525  throw ex;
526  }
528  IndexIntoFile* iifPtr = &indexIntoFile_;
529  TBranch* b = metaDataTree_->Branch(poolNames::indexIntoFileBranchName().c_str(), &iifPtr, om_->basketSize(), 0);
530  assert(b);
531  b->Fill();
532  }
assert(m_qm.get())
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 ( LuminosityBlockPrincipal const &  lb,
ModuleCallingContext const *  mcc 
)

Definition at line 437 of file RootOutputFile.cc.

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

437  {
438  // Auxiliary branch
439  // NOTE: lumiAux_ must be filled before calling fillBranches since it gets written out in that routine.
440  lumiAux_ = lb.aux();
441  // Use the updated process historyID
442  lumiAux_.setProcessHistoryID(lb.processHistoryID());
443  // Store the process history.
444  processHistoryRegistry_.registerProcessHistory(lb.processHistory());
445  // Store the reduced ID in the IndexIntoFile
446  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(lb.processHistoryID());
447  // Add lumi to index.
450  fillBranches(InLumi, lb, nullptr, mcc);
451  lumiTree_.optimizeBaskets(10ULL*1024*1024);
452 
453  Service<JobReport> reportSvc;
454  reportSvc->reportLumiSection(reportToken_, lb.id().run(), lb.id().luminosityBlock(),nEventsInLumi_);
455  nEventsInLumi_ = 0;
456  }
void fillBranches(BranchType const &branchType, Principal const &principal, StoredProductProvenanceVector *productProvenanceVecPtr, ModuleCallingContext const *)
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 edm::RootOutputFile::writeOne ( EventPrincipal const &  e,
ModuleCallingContext const *  mcc 
)

Definition at line 391 of file RootOutputFile.cc.

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

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

Definition at line 559 of file RootOutputFile.cc.

References b, edm::poolNames::idToParameterSetBlobsBranchName(), edm::pset::Registry::instance(), om_, parameterSetsTree_, and TrackValidation_cff::pset.

559  {
560  std::pair<ParameterSetID, ParameterSetBlob> idToBlob;
561  std::pair<ParameterSetID, ParameterSetBlob>* pIdToBlob = &idToBlob;
562  TBranch* b = parameterSetsTree_->Branch(poolNames::idToParameterSetBlobsBranchName().c_str(),&pIdToBlob,om_->basketSize(), 0);
563 
564  for(auto const& pset : *pset::Registry::instance()) {
565  idToBlob.first = pset.first;
566  idToBlob.second.pset() = pset.second.toString();
567 
568  b->Fill();
569  }
570  }
std::string const & idToParameterSetBlobsBranchName()
Definition: BranchType.cc:255
edm::propagate_const< PoolOutputModule * > om_
edm::propagate_const< TTree * > parameterSetsTree_
double b
Definition: hdecay.h:120
static Registry * instance()
Definition: Registry.cc:12
void edm::RootOutputFile::writeParentageRegistry ( )

Definition at line 478 of file RootOutputFile.cc.

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

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

References assert(), b, metaDataTree_, om_, AlCaHLTBitMon_ParallelJobs::p, edm::poolNames::processHistoryBranchName(), and processHistoryRegistry_.

534  {
535  ProcessHistoryVector procHistoryVector;
536  for(auto const& ph : processHistoryRegistry_) {
537  procHistoryVector.push_back(ph.second);
538  }
539  ProcessHistoryVector* p = &procHistoryVector;
540  TBranch* b = metaDataTree_->Branch(poolNames::processHistoryBranchName().c_str(), &p, om_->basketSize(), 0);
541  assert(b);
542  b->Fill();
543  }
std::vector< ProcessHistory > ProcessHistoryVector
assert(m_qm.get())
edm::propagate_const< TTree * > metaDataTree_
ProcessHistoryRegistry processHistoryRegistry_
edm::propagate_const< PoolOutputModule * > om_
std::string const & processHistoryBranchName()
Definition: BranchType.cc:198
double b
Definition: hdecay.h:120
void edm::RootOutputFile::writeProductDependencies ( )

Definition at line 603 of file RootOutputFile.cc.

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

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  }
assert(m_qm.get())
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 572 of file RootOutputFile.cc.

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

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
assert(m_qm.get())
edm::propagate_const< TTree * > metaDataTree_
std::set< BranchID > branchesWithStoredHistory_
edm::propagate_const< PoolOutputModule * > om_
#define end
Definition: vmac.h:37
double b
Definition: hdecay.h:120
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:173
void edm::RootOutputFile::writeRun ( RunPrincipal const &  r,
ModuleCallingContext const *  mcc 
)

Definition at line 458 of file RootOutputFile.cc.

References edm::IndexIntoFile::addEntry(), edm::RunPrincipal::aux(), fillBranches(), indexIntoFile_, edm::InRun, edm::RootOutputTree::optimizeBaskets(), edm::Principal::processHistory(), edm::Principal::processHistoryID(), processHistoryRegistry_, edm::ProcessHistoryRegistry::reducedProcessHistoryID(), edm::ProcessHistoryRegistry::registerProcessHistory(), reportToken_, edm::RunAuxiliary::run(), edm::RunPrincipal::run(), runAux_, runEntryNumber_, runTree_, and edm::RunAuxiliary::setProcessHistoryID().

458  {
459  // Auxiliary branch
460  // NOTE: runAux_ must be filled before calling fillBranches since it gets written out in that routine.
461  runAux_ = r.aux();
462  // Use the updated process historyID
463  runAux_.setProcessHistoryID(r.processHistoryID());
464  // Store the process history.
466  // Store the reduced ID in the IndexIntoFile
467  ProcessHistoryID reducedPHID = processHistoryRegistry_.reducedProcessHistoryID(r.processHistoryID());
468  // Add run to index.
469  indexIntoFile_.addEntry(reducedPHID, runAux_.run(), 0U, 0U, runEntryNumber_);
470  ++runEntryNumber_;
471  fillBranches(InRun, r, nullptr, mcc);
472  runTree_.optimizeBaskets(10ULL*1024*1024);
473 
474  Service<JobReport> reportSvc;
475  reportSvc->reportRunNumber(reportToken_, r.run());
476  }
void fillBranches(BranchType const &branchType, Principal const &principal, StoredProductProvenanceVector *productProvenanceVecPtr, ModuleCallingContext const *)
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 edm::RootOutputFile::writeThinnedAssociationsHelper ( )

Definition at line 552 of file RootOutputFile.cc.

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

552  {
553  ThinnedAssociationsHelper const* p = om_->thinnedAssociationsHelper();
554  TBranch* b = metaDataTree_->Branch(poolNames::thinnedAssociationsHelperBranchName().c_str(), &p, om_->basketSize(), 0);
555  assert(b);
556  b->Fill();
557  }
assert(m_qm.get())
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 113 of file RootOutputFile.h.

Referenced by beginInputFile().

bool edm::RootOutputFile::dataTypeReported_
private

Definition at line 137 of file RootOutputFile.h.

Referenced by writeOne().

StoredProductProvenanceVector edm::RootOutputFile::eventEntryInfoVector_
private

Definition at line 129 of file RootOutputFile.h.

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

Definition at line 116 of file RootOutputFile.h.

Referenced by writeIndexIntoFile(), and writeOne().

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

Definition at line 115 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeFileIdentifier().

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

Definition at line 108 of file RootOutputFile.h.

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

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

Definition at line 114 of file RootOutputFile.h.

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

IndexIntoFile edm::RootOutputFile::indexIntoFile_
private

Definition at line 119 of file RootOutputFile.h.

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

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

Definition at line 109 of file RootOutputFile.h.

Referenced by RootOutputFile().

LuminosityBlockAuxiliary edm::RootOutputFile::lumiAux_
private

Definition at line 124 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

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

Definition at line 117 of file RootOutputFile.h.

Referenced by writeLuminosityBlock().

RootOutputTree edm::RootOutputFile::lumiTree_
private

Definition at line 134 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 120 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 122 of file RootOutputFile.h.

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

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

Definition at line 139 of file RootOutputFile.h.

Referenced by insertProductProvenance(), and writeParentageRegistry().

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

Definition at line 123 of file RootOutputFile.h.

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

BranchListIndexes const* edm::RootOutputFile::pBranchListIndexes_
private

Definition at line 131 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

EventAuxiliary const* edm::RootOutputFile::pEventAux_
private

Definition at line 126 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

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

Definition at line 130 of file RootOutputFile.h.

Referenced by pEventEntryInfoVector(), and writeOne().

EventSelectionIDVector const* edm::RootOutputFile::pEventSelectionIDs_
private

Definition at line 132 of file RootOutputFile.h.

Referenced by RootOutputFile(), and writeOne().

LuminosityBlockAuxiliary const* edm::RootOutputFile::pLumiAux_
private

Definition at line 127 of file RootOutputFile.h.

Referenced by RootOutputFile().

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

Definition at line 128 of file RootOutputFile.h.

Referenced by RootOutputFile().

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

Definition at line 125 of file RootOutputFile.h.

Referenced by writeRun().

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

Definition at line 118 of file RootOutputFile.h.

Referenced by writeRun().

RootOutputTree edm::RootOutputFile::runTree_
private

Definition at line 135 of file RootOutputFile.h.

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

RootOutputTreePtrArray edm::RootOutputFile::treePointers_
private

Definition at line 136 of file RootOutputFile.h.

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

int edm::RootOutputFile::whyNotFastClonable_
private

Definition at line 112 of file RootOutputFile.h.

Referenced by beginInputFile(), and fillBranches().

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

Definition at line 141 of file RootOutputFile.h.

Referenced by fillBranches().