CMS 3D CMS Logo

Public Types | Public Member Functions | Private Member Functions | Private Attributes

edm::RootTree Class Reference

#include <RootTree.h>

List of all members.

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 ()
RootTreeoperator= (RootTree const &)
bool previous ()
void resetTraining ()
void rewind ()
DelayedReaderrootDelayedReader () 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< BranchMapbranches_
std::vector< std::string > branchNames_
BranchType branchType_
unsigned int cacheSize_
EntryNumber entries_
EntryNumber entryNumber_
boost::shared_ptr< InputFilefilePtr_
TTree * infoTree_
unsigned int learningEntries_
TTree * metaTree_
boost::shared_ptr< TTreeCache > rawTreeCache_
std::unique_ptr< DelayedReaderrootDelayedReader_
TBranch * statusBranch_
EntryNumber switchOverEntry_
bool trainNow_
TTree * tree_
long int treeAutoFlush_
boost::shared_ptr< TTreeCache > treeCache_

Detailed Description

Definition at line 56 of file RootTree.h.


Member Typedef Documentation

Definition at line 58 of file RootTree.h.

Definition at line 59 of file RootTree.h.


Constructor & Destructor Documentation

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 &  )

Member Function Documentation

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_.

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]

Definition at line 87 of file RootTree.h.

References branchNames_.

{return branchNames_;}
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]
template<typename T >
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_);
    }
template<typename T >
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_);
    }
template<typename T >
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]

Definition at line 113 of file RootTree.h.

References metaTree_.

{return metaTree_;}
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_;}
RootTree& edm::RootTree::operator= ( RootTree const &  )
bool edm::RootTree::previous ( ) [inline]

Definition at line 80 of file RootTree.h.

References entryNumber_.

{return --entryNumber_ >= 0;}
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_.

                                                                                     {
      assert(isValid());
      prod.init();
      if(tree_->GetBranch(oldBranchName.c_str()) == 0){
        prod.setDropped();
      }
  }
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]

Definition at line 112 of file RootTree.h.

References tree_.

{return tree_;}

Member Data Documentation

TBranch* edm::RootTree::auxBranch_ [private]

Definition at line 136 of file RootTree.h.

Referenced by close(), fillAux(), and isValid().

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().

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().

Definition at line 142 of file RootTree.h.

Referenced by entries(), isValid(), next(), and setEntryNumber().

boost::shared_ptr<InputFile> edm::RootTree::filePtr_ [private]
TTree* edm::RootTree::infoTree_ [private]

Definition at line 155 of file RootTree.h.

Referenced by close(), and isValid().

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().

Definition at line 151 of file RootTree.h.

Referenced by rootDelayedReader().

TBranch* edm::RootTree::statusBranch_ [private]

Definition at line 156 of file RootTree.h.

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]
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]