/** \class ExRootTreeReader * * Class simplifying access to ROOT tree branches * * $Date: 2009-02-05 13:37:32 $ * $Revision: 1.3 $ * * * \author S. Ovyn - UCL, Louvain-la-Neuve * */ #include "ExRootTreeReader.h" #include "TBranchElement.h" #include "TClonesArray.h" #include "TChain.h" #include #include using namespace std; //------------------------------------------------------------------------------ ExRootTreeReader::ExRootTreeReader(TTree *tree) : fChain(tree), fCurrentTree(-1), fIsInitDone(kFALSE) { } //------------------------------------------------------------------------------ ExRootTreeReader::~ExRootTreeReader() { TBranchMap::iterator it_map; for(it_map = fBranchMap.begin(); it_map != fBranchMap.end(); ++it_map) { delete it_map->second.second; } } //------------------------------------------------------------------------------ Bool_t ExRootTreeReader::ReadEntry(Long64_t entry) { // Read contents of entry. if(!fChain) return kFALSE; if(!fIsInitDone) Init(); Int_t treeEntry = fChain->LoadTree(entry); if(treeEntry < 0) return kFALSE; if(fChain->IsA() == TChain::Class()) { TChain *chain = static_cast(fChain); if(chain->GetTreeNumber() != fCurrentTree) { fCurrentTree = chain->GetTreeNumber(); Notify(); } } TBranchMap::iterator it_map; TBranch *branch; for(it_map = fBranchMap.begin(); it_map != fBranchMap.end(); ++it_map) { branch = it_map->second.first; if(branch) { branch->GetEntry(treeEntry); } } return kTRUE; } //------------------------------------------------------------------------------ TClonesArray *ExRootTreeReader::UseBranch(const TString &branchName) { fIsInitDone = kFALSE; TClonesArray *array = 0; TBranchMap::iterator it_map = fBranchMap.find(branchName); if(it_map != fBranchMap.end()) { array = it_map->second.second; } else { TBranch *branch = fChain->GetBranch(branchName); if(branch) { if(branch->IsA() == TBranchElement::Class()) { TBranchElement *element = static_cast(branch); const char *className = element->GetClonesName(); Int_t size = element->GetMaximum(); TClass *cl = gROOT->GetClass(className); if(cl) { array = new TClonesArray(cl, size); fBranchMap.insert(make_pair(branchName, make_pair(branch, array))); } } } } if(!array) { cerr << left << setw(35) <<"** ERROR: cannot access branch"<<"" << left << setw(15) << branchName <<"" << right << setw(19) <<" **"<<""<SetBranchAddress(it_map->first, &(it_map->second.second)); } Notify(); fIsInitDone = kTRUE; } //------------------------------------------------------------------------------ void ExRootTreeReader::Notify() { // Called when loading a new file. // Get branch pointers. if(!fChain) return; TBranchMap::iterator it_map; for(it_map = fBranchMap.begin(); it_map != fBranchMap.end(); ++it_map) { it_map->second.first = fChain->GetBranch(it_map->first); if(!it_map->second.first) { cerr << left << setw(35) <<"** ERROR: cannot get branch"<<"" << left << setw(15) << it_map->first <<"" << right << setw(19) <<" **"<<""<