#include <RootTree.h>
Public Types | |
typedef roottree::BranchMap | BranchMap |
typedef roottree::EntryNumber | EntryNumber |
Public Member Functions | |
void | addBranch (BranchKey const &key, BranchDescription const &prod, std::string const &oldBranchName) |
TBranch * | branchEntryInfoBranch () const |
BranchMap const & | branches () const |
std::vector< std::string > const & | branchNames () const |
BranchType | branchType () const |
void | close () |
bool | current () |
void | dropBranch (std::string const &oldBranchName) |
EntryNumber const & | entries () const |
EntryNumber const & | entryNumber () const |
template<typename T > | |
void | fillAux (T *&pAux) |
template<typename T > | |
void | fillBranchEntry (TBranch *branch, T *&pbuf) |
template<typename T > | |
void | fillBranchEntryMeta (TBranch *branch, T *&pbuf) |
void | getEntry (TBranch *branch, EntryNumber entry) const |
bool | isValid () const |
TTree const * | metaTree () const |
bool | next () |
RootTree & | operator= (RootTree const &) |
bool | previous () |
void | resetTraining () |
void | rewind () |
DelayedReader * | rootDelayedReader () const |
RootTree (boost::shared_ptr< InputFile > filePtr, BranchType const &branchType, unsigned int maxVirtualSize, unsigned int cacheSize, unsigned int learningEntries) | |
RootTree (RootTree const &) | |
void | setEntryNumber (EntryNumber theEntryNumber) |
void | setPresence (BranchDescription const &prod, std::string const &oldBranchName) |
void | trainCache (char const *branchNames) |
TTree * | tree () |
TTree const * | tree () const |
~RootTree () | |
Private Member Functions | |
void | setCacheSize (unsigned int cacheSize) |
void | setTreeMaxVirtualSize (int treeMaxVirtualSize) |
void | startTraining () |
void | stopTraining () |
Private Attributes | |
TBranch * | auxBranch_ |
TBranch * | branchEntryInfoBranch_ |
boost::shared_ptr< BranchMap > | branches_ |
std::vector< std::string > | branchNames_ |
BranchType | branchType_ |
unsigned int | cacheSize_ |
EntryNumber | entries_ |
EntryNumber | entryNumber_ |
boost::shared_ptr< InputFile > | filePtr_ |
TTree * | infoTree_ |
unsigned int | learningEntries_ |
TTree * | metaTree_ |
boost::shared_ptr< TTreeCache > | rawTreeCache_ |
std::unique_ptr< DelayedReader > | rootDelayedReader_ |
TBranch * | statusBranch_ |
EntryNumber | switchOverEntry_ |
bool | trainNow_ |
TTree * | tree_ |
long int | treeAutoFlush_ |
boost::shared_ptr< TTreeCache > | treeCache_ |
Definition at line 56 of file RootTree.h.
Definition at line 58 of file RootTree.h.
Definition at line 59 of file RootTree.h.
edm::RootTree::RootTree | ( | boost::shared_ptr< InputFile > | filePtr, |
BranchType const & | branchType, | ||
unsigned int | maxVirtualSize, | ||
unsigned int | cacheSize, | ||
unsigned int | learningEntries | ||
) |
Definition at line 27 of file RootTree.cc.
References cacheSize_, setCacheSize(), setTreeMaxVirtualSize(), tree_, and treeAutoFlush_.
: filePtr_(filePtr), tree_(dynamic_cast<TTree*>(filePtr_.get() != 0 ? filePtr_->Get(BranchTypeToProductTreeName(branchType).c_str()) : 0)), metaTree_(dynamic_cast<TTree*>(filePtr_.get() != 0 ? filePtr_->Get(BranchTypeToMetaDataTreeName(branchType).c_str()) : 0)), branchType_(branchType), auxBranch_(tree_ ? getAuxiliaryBranch(tree_, branchType_) : 0), treeCache_(), rawTreeCache_(), entries_(tree_ ? tree_->GetEntries() : 0), entryNumber_(-1), branchNames_(), branches_(new BranchMap), trainNow_(false), switchOverEntry_(-1), learningEntries_(learningEntries), cacheSize_(cacheSize), treeAutoFlush_(tree_ ? tree_->GetAutoFlush() : 0), rootDelayedReader_(new RootDelayedReader(*this, filePtr)), branchEntryInfoBranch_(metaTree_ ? getProductProvenanceBranch(metaTree_, branchType_) : (tree_ ? getProductProvenanceBranch(tree_, branchType_) : 0)), infoTree_(dynamic_cast<TTree*>(filePtr_.get() != 0 ? filePtr->Get(BranchTypeToInfoTreeName(branchType).c_str()) : 0)) // backward compatibility { assert(tree_); // On merged files in older releases of ROOT, the autoFlush setting is always negative; we must guess. // TODO: On newer merged files, we should be able to get this from the cluster iterator. if (treeAutoFlush_ < 0) { // The "+1" is here to avoid divide-by-zero in degenerate cases. Long64_t averageEventSizeBytes = tree_->GetZipBytes() / (tree_->GetEntries()+1) + 1; treeAutoFlush_ = cacheSize_/averageEventSizeBytes+1; } setTreeMaxVirtualSize(maxVirtualSize); setCacheSize(cacheSize); }
edm::RootTree::~RootTree | ( | ) |
Definition at line 64 of file RootTree.cc.
{ }
edm::RootTree::RootTree | ( | RootTree const & | ) |
void edm::RootTree::addBranch | ( | BranchKey const & | key, |
BranchDescription const & | prod, | ||
std::string const & | oldBranchName | ||
) |
Definition at line 95 of file RootTree.cc.
References branches_, edm::BranchDescription::branchName(), branchNames_, info, edm::BranchDescription::init(), isValid(), metaTree_, edm::BranchDescription::present(), edm::roottree::BranchInfo::productBranch_, edm::roottree::BranchInfo::provenanceBranch_, and tree_.
{ assert(isValid()); prod.init(); //use the translated branch name TBranch* branch = tree_->GetBranch(oldBranchName.c_str()); roottree::BranchInfo info = roottree::BranchInfo(ConstBranchDescription(prod)); info.productBranch_ = 0; if (prod.present()) { info.productBranch_ = branch; //we want the new branch name for the JobReport branchNames_.push_back(prod.branchName()); } TTree* provTree = (metaTree_ != 0 ? metaTree_ : tree_); info.provenanceBranch_ = provTree->GetBranch(oldBranchName.c_str()); branches_->insert(std::make_pair(key, info)); }
TBranch* edm::RootTree::branchEntryInfoBranch | ( | ) | const [inline] |
Definition at line 117 of file RootTree.h.
References branchEntryInfoBranch_.
{return branchEntryInfoBranch_;}
roottree::BranchMap const & edm::RootTree::branches | ( | ) | const |
Definition at line 138 of file RootTree.cc.
References branches_.
Referenced by edm::RootDelayedReader::branches().
{return *branches_;}
std::vector<std::string> const& edm::RootTree::branchNames | ( | ) | const [inline] |
BranchType edm::RootTree::branchType | ( | ) | const [inline] |
Definition at line 122 of file RootTree.h.
References branchType_.
Referenced by edm::ReducedProvenanceReader::ReducedProvenanceReader().
{return branchType_;}
void edm::RootTree::close | ( | void | ) |
Definition at line 239 of file RootTree.cc.
References auxBranch_, branchEntryInfoBranch_, filePtr_, infoTree_, metaTree_, and tree_.
{ // The TFile is about to be closed, and destructed. // Just to play it safe, zero all pointers to quantities that are owned by the TFile. auxBranch_ = branchEntryInfoBranch_ = 0; tree_ = metaTree_ = infoTree_ = 0; // We own the treeCache_. // We make sure the treeCache_ is detached from the file, // so that ROOT does not also delete it. filePtr_->SetCacheRead(0); // We give up our shared ownership of the TFile itself. filePtr_.reset(); }
bool edm::RootTree::current | ( | ) | [inline] |
Definition at line 81 of file RootTree.h.
Referenced by edm::RootFile::readLuminosityBlockAuxiliary_(), and edm::RootFile::readRunAuxiliary_().
{return entryNumber_ < entries_ && entryNumber_ >= 0;}
void edm::RootTree::dropBranch | ( | std::string const & | oldBranchName | ) |
Definition at line 115 of file RootTree.cc.
References scaleCards::br, entries(), i, python::Node::leaf, and tree_.
{ //use the translated branch name TBranch* branch = tree_->GetBranch(oldBranchName.c_str()); if (branch != 0) { TObjArray* leaves = tree_->GetListOfLeaves(); int entries = leaves->GetEntries(); for (int i = 0; i < entries; ++i) { TLeaf* leaf = (TLeaf*)(*leaves)[i]; if (leaf == 0) continue; TBranch* br = leaf->GetBranch(); if (br == 0) continue; if (br->GetMother() == branch) { leaves->Remove(leaf); } } leaves->Compress(); tree_->GetListOfBranches()->Remove(branch); tree_->GetListOfBranches()->Compress(); delete branch; } }
EntryNumber const& edm::RootTree::entries | ( | ) | const [inline] |
Definition at line 85 of file RootTree.h.
References entries_.
Referenced by dropBranch().
{return entries_;}
EntryNumber const& edm::RootTree::entryNumber | ( | ) | const [inline] |
Definition at line 84 of file RootTree.h.
References entryNumber_.
Referenced by edm::RootDelayedReader::entryNumber(), edm::RootFile::readLuminosityBlockAuxiliary_(), and edm::RootFile::readRunAuxiliary_().
{return entryNumber_;}
void edm::RootTree::fillAux | ( | T *& | pAux | ) | [inline] |
Definition at line 90 of file RootTree.h.
References auxBranch_, entryNumber_, and getEntry().
{ auxBranch_->SetAddress(&pAux); getEntry(auxBranch_, entryNumber_); }
void edm::RootTree::fillBranchEntry | ( | TBranch * | branch, |
T *& | pbuf | ||
) | [inline] |
Definition at line 106 of file RootTree.h.
References entryNumber_, and getEntry().
{ branch->SetAddress(&pbuf); getEntry(branch, entryNumber_); }
void edm::RootTree::fillBranchEntryMeta | ( | TBranch * | branch, |
T *& | pbuf | ||
) | [inline] |
Definition at line 95 of file RootTree.h.
References entryNumber_, getEntry(), and metaTree_.
{ if (metaTree_ != 0) { // Metadata was in separate tree. Not cached. branch->SetAddress(&pbuf); roottree::getEntry(branch, entryNumber_); } else { fillBranchEntry<T>(branch, pbuf); } }
void edm::RootTree::getEntry | ( | TBranch * | branch, |
EntryNumber | entry | ||
) | const |
Definition at line 182 of file RootTree.cc.
References cms::Exception::addContext(), alignCSCRings::e, filePtr_, edm::errors::FileReadError, rawTreeCache_, lumiQTWidget::t, and treeCache_.
Referenced by fillAux(), fillBranchEntry(), and fillBranchEntryMeta().
{ try { if (!treeCache_) { filePtr_->SetCacheRead(0); branch->GetEntry(entryNumber); } else if (treeCache_->IsLearning() && rawTreeCache_) { treeCache_->AddBranch(branch, kTRUE); filePtr_->SetCacheRead(rawTreeCache_.get()); branch->GetEntry(entryNumber); filePtr_->SetCacheRead(0); } else { filePtr_->SetCacheRead(treeCache_.get()); branch->GetEntry(entryNumber); filePtr_->SetCacheRead(0); } } catch(cms::Exception const& e) { // We make sure the treeCache_ is detached from the file, // so that ROOT does not also delete it. filePtr_->SetCacheRead(0); Exception t(errors::FileReadError, "", e); t.addContext(std::string("Reading branch ")+branch->GetName()); throw t; } }
bool edm::RootTree::isValid | ( | void | ) | const |
Definition at line 68 of file RootTree.cc.
References auxBranch_, branchEntryInfoBranch_, entries_, infoTree_, metaTree_, and tree_.
Referenced by addBranch(), and setPresence().
{ if (metaTree_ == 0 || metaTree_->GetNbranches() == 0) { return tree_ != 0 && auxBranch_ != 0; } if (tree_ != 0 && auxBranch_ != 0 && metaTree_ != 0) { // backward compatibility if (branchEntryInfoBranch_ != 0 || infoTree_ != 0) return true; // backward compatibility return (entries_ == metaTree_->GetEntries() && tree_->GetNbranches() <= metaTree_->GetNbranches() + 1); // backward compatibility } // backward compatibility return false; }
TTree const* edm::RootTree::metaTree | ( | ) | const [inline] |
bool edm::RootTree::next | ( | void | ) | [inline] |
Definition at line 79 of file RootTree.h.
References entries_, and entryNumber_.
Referenced by edm::RootFile::initializeDuplicateChecker(), and edm::RootFile::nextEventEntry().
{return ++entryNumber_ < entries_;}
bool edm::RootTree::previous | ( | ) | [inline] |
void edm::RootTree::resetTraining | ( | ) | [inline] |
Definition at line 120 of file RootTree.h.
References trainNow_.
Referenced by edm::RootFile::RootFile().
{trainNow_ = true;}
void edm::RootTree::rewind | ( | ) | [inline] |
Definition at line 82 of file RootTree.h.
References entryNumber_.
Referenced by edm::RootFile::rewind().
{entryNumber_ = 0;}
DelayedReader * edm::RootTree::rootDelayedReader | ( | ) | const |
Definition at line 80 of file RootTree.cc.
References rootDelayedReader_.
{ rootDelayedReader_->reset(); return rootDelayedReader_.get(); }
void edm::RootTree::setCacheSize | ( | unsigned int | cacheSize | ) | [private] |
Definition at line 141 of file RootTree.cc.
References cacheSize_, filePtr_, rawTreeCache_, tree_, and treeCache_.
Referenced by RootTree().
{ cacheSize_ = cacheSize; tree_->SetCacheSize(static_cast<Long64_t>(cacheSize)); treeCache_.reset(dynamic_cast<TTreeCache*>(filePtr_->GetCacheRead())); filePtr_->SetCacheRead(0); rawTreeCache_.reset(); }
void edm::RootTree::setEntryNumber | ( | EntryNumber | theEntryNumber | ) |
Definition at line 155 of file RootTree.cc.
References entries_, entryNumber_, filePtr_, startTraining(), stopTraining(), switchOverEntry_, trainNow_, tree_, treeAutoFlush_, and treeCache_.
Referenced by edm::RootFile::initializeDuplicateChecker(), edm::RootFile::readLuminosityBlockAuxiliary_(), edm::RootFile::readRunAuxiliary_(), and edm::RootFile::skipEvents().
{ filePtr_->SetCacheRead(treeCache_.get()); // Detect a backward skip. If the skip is sufficiently large, we roll the dice and reset the treeCache. // This will cause some amount of over-reading: we pre-fetch all the events in some prior cluster. // However, because reading one event in the cluster is supposed to be equivalent to reading all events in the cluster, // we're not incurring additional over-reading - we're just doing it more efficiently. // NOTE: Constructor guarantees treeAutoFlush_ is positive, even if TTree->GetAutoFlush() is negative. if ((theEntryNumber < static_cast<EntryNumber>(entryNumber_-treeAutoFlush_)) && (treeCache_) && (!treeCache_->IsLearning()) && (entries_ > 0) && (switchOverEntry_ >= 0)) { treeCache_->SetEntryRange(theEntryNumber, entries_); treeCache_->FillBuffer(); } entryNumber_ = theEntryNumber; tree_->LoadTree(entryNumber_); filePtr_->SetCacheRead(0); if(treeCache_ && trainNow_ && entryNumber_ >= 0) { startTraining(); trainNow_ = false; } if (treeCache_ && treeCache_->IsLearning() && switchOverEntry_ >= 0 && entryNumber_ >= switchOverEntry_) { stopTraining(); } }
void edm::RootTree::setPresence | ( | BranchDescription const & | prod, |
std::string const & | oldBranchName | ||
) |
Definition at line 86 of file RootTree.cc.
References edm::BranchDescription::init(), isValid(), edm::BranchDescription::setDropped(), and tree_.
void edm::RootTree::setTreeMaxVirtualSize | ( | int | treeMaxVirtualSize | ) | [private] |
Definition at line 150 of file RootTree.cc.
References tree_.
Referenced by RootTree().
{ if (treeMaxVirtualSize >= 0) tree_->SetMaxVirtualSize(static_cast<Long64_t>(treeMaxVirtualSize)); }
void edm::RootTree::startTraining | ( | ) | [private] |
Definition at line 208 of file RootTree.cc.
References edm::poolNames::branchListIndexesBranchName(), branchType_, edm::BranchTypeToAuxiliaryBranchName(), cacheSize_, entryNumber_, filePtr_, edm::InEvent, learningEntries_, rawTreeCache_, switchOverEntry_, tree_, and treeCache_.
Referenced by setEntryNumber().
{ if (cacheSize_ == 0) { return; } assert(treeCache_ && treeCache_->GetOwner() == tree_); assert(branchType_ == InEvent); assert(!rawTreeCache_); treeCache_->SetLearnEntries(learningEntries_); tree_->SetCacheSize(static_cast<Long64_t>(cacheSize_)); rawTreeCache_.reset(dynamic_cast<TTreeCache *>(filePtr_->GetCacheRead())); filePtr_->SetCacheRead(0); rawTreeCache_->SetLearnEntries(0); switchOverEntry_ = entryNumber_ + learningEntries_; rawTreeCache_->StartLearningPhase(); rawTreeCache_->SetEntryRange(entryNumber_, switchOverEntry_); rawTreeCache_->AddBranch("*", kTRUE); rawTreeCache_->StopLearningPhase(); treeCache_->StartLearningPhase(); treeCache_->SetEntryRange(switchOverEntry_, tree_->GetEntries()); treeCache_->AddBranch(poolNames::branchListIndexesBranchName().c_str(), kTRUE); treeCache_->AddBranch(BranchTypeToAuxiliaryBranchName(branchType_).c_str(), kTRUE); }
void edm::RootTree::stopTraining | ( | ) | [private] |
Definition at line 232 of file RootTree.cc.
References filePtr_, rawTreeCache_, and treeCache_.
Referenced by setEntryNumber().
{ filePtr_->SetCacheRead(treeCache_.get()); treeCache_->StopLearningPhase(); rawTreeCache_.reset(); }
void edm::RootTree::trainCache | ( | char const * | branchNames | ) |
Definition at line 253 of file RootTree.cc.
References cacheSize_, filePtr_, tree_, and treeCache_.
Referenced by edm::RootFile::RootFile().
{ if (cacheSize_ == 0) { return; } tree_->LoadTree(0); assert(treeCache_); filePtr_->SetCacheRead(treeCache_.get()); assert(treeCache_->GetOwner() == tree_); treeCache_->StartLearningPhase(); treeCache_->SetEntryRange(0, tree_->GetEntries()); treeCache_->AddBranch(branchNames, kTRUE); treeCache_->StopLearningPhase(); // We own the treeCache_. // We make sure the treeCache_ is detached from the file, // so that ROOT does not also delete it. filePtr_->SetCacheRead(0); }
TTree const* edm::RootTree::tree | ( | ) | const [inline] |
Definition at line 111 of file RootTree.h.
References tree_.
Referenced by edm::ReducedProvenanceReader::ReducedProvenanceReader().
{return tree_;}
TTree* edm::RootTree::tree | ( | ) | [inline] |
TBranch* edm::RootTree::auxBranch_ [private] |
Definition at line 136 of file RootTree.h.
TBranch* edm::RootTree::branchEntryInfoBranch_ [private] |
Definition at line 153 of file RootTree.h.
Referenced by branchEntryInfoBranch(), close(), and isValid().
boost::shared_ptr<BranchMap> edm::RootTree::branches_ [private] |
Definition at line 145 of file RootTree.h.
Referenced by addBranch(), and branches().
std::vector<std::string> edm::RootTree::branchNames_ [private] |
Definition at line 144 of file RootTree.h.
Referenced by addBranch(), and branchNames().
BranchType edm::RootTree::branchType_ [private] |
Definition at line 135 of file RootTree.h.
Referenced by branchType(), and startTraining().
unsigned int edm::RootTree::cacheSize_ [private] |
Definition at line 149 of file RootTree.h.
Referenced by RootTree(), setCacheSize(), startTraining(), and trainCache().
EntryNumber edm::RootTree::entries_ [private] |
Definition at line 142 of file RootTree.h.
Referenced by entries(), isValid(), next(), and setEntryNumber().
EntryNumber edm::RootTree::entryNumber_ [private] |
Definition at line 143 of file RootTree.h.
Referenced by entryNumber(), fillAux(), fillBranchEntry(), fillBranchEntryMeta(), next(), previous(), rewind(), setEntryNumber(), and startTraining().
boost::shared_ptr<InputFile> edm::RootTree::filePtr_ [private] |
Definition at line 129 of file RootTree.h.
Referenced by close(), getEntry(), setCacheSize(), setEntryNumber(), startTraining(), stopTraining(), and trainCache().
TTree* edm::RootTree::infoTree_ [private] |
Definition at line 155 of file RootTree.h.
unsigned int edm::RootTree::learningEntries_ [private] |
Definition at line 148 of file RootTree.h.
Referenced by startTraining().
TTree* edm::RootTree::metaTree_ [private] |
Definition at line 134 of file RootTree.h.
Referenced by addBranch(), close(), fillBranchEntryMeta(), isValid(), and metaTree().
boost::shared_ptr<TTreeCache> edm::RootTree::rawTreeCache_ [private] |
Definition at line 141 of file RootTree.h.
Referenced by getEntry(), setCacheSize(), startTraining(), and stopTraining().
std::unique_ptr<DelayedReader> edm::RootTree::rootDelayedReader_ [private] |
Definition at line 151 of file RootTree.h.
Referenced by rootDelayedReader().
TBranch* edm::RootTree::statusBranch_ [private] |
Definition at line 156 of file RootTree.h.
EntryNumber edm::RootTree::switchOverEntry_ [private] |
Definition at line 147 of file RootTree.h.
Referenced by setEntryNumber(), and startTraining().
bool edm::RootTree::trainNow_ [private] |
Definition at line 146 of file RootTree.h.
Referenced by resetTraining(), and setEntryNumber().
TTree* edm::RootTree::tree_ [private] |
Definition at line 133 of file RootTree.h.
Referenced by addBranch(), close(), dropBranch(), isValid(), RootTree(), setCacheSize(), setEntryNumber(), setPresence(), setTreeMaxVirtualSize(), startTraining(), trainCache(), and tree().
long int edm::RootTree::treeAutoFlush_ [private] |
Definition at line 150 of file RootTree.h.
Referenced by RootTree(), and setEntryNumber().
boost::shared_ptr<TTreeCache> edm::RootTree::treeCache_ [private] |
Definition at line 140 of file RootTree.h.
Referenced by getEntry(), setCacheSize(), setEntryNumber(), startTraining(), stopTraining(), and trainCache().