Skip to content

Commit

Permalink
Merge pull request #59 from AndrewEdmonds11/trkana-utils-for-v1
Browse files Browse the repository at this point in the history
TrkAnaUtils
  • Loading branch information
AndrewEdmonds11 authored May 19, 2022
2 parents dc9a749 + bd79d09 commit d0035dd
Showing 1 changed file with 143 additions and 0 deletions.
143 changes: 143 additions & 0 deletions examples/TrkAnaUtils.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
//
// Utility macros for inspecting TrkAna files for use from the root prompt. As an example, running from
// a muse directory with TrkAna included:
// > root -l
// root> #include TrkAna/examples/TrkAnaUtils.C
// root> TrkAnaUtils tau("MyTrkAnaFile.root");
// root> tau.ListTrees(); // lists available TrkAna trees (TDirectories)
// root> tau.UseTree("TrkAnaNeg"); // use the tree based on downstream negative electron tracks
// root> tau.ListBranches(); // list the available branches
// root> tau.ListSubbranches("deent"); // list sub-branches for the downstream negative electron branch
// root> tau.ListLeaves("hcnt."); // list leaves in the hitcount branch
// root> tau.Draw("deent.mom.Theta():deent.pos.Y()","hcnt.nbkg<400","colorz"); // Draw a plot
//
// Original author: Dave Brown (LBNL)
//
#include <iostream>
#include <string>
class TrkAnaUtils {
public:
TrkAnaUtils(TFile* myfile,const char* treename="TrkAnaNeg");
TrkAnaUtils(const char* filename,const char* treename="TrkAnaNeg");
~TrkAnaUtils() { delete myfile_; }
TFile const& File() const { return *myfile_; }
void ListTrees() const;
void UseTree(const char* treename="TrkAnaNeg");
void fileName() { return myfile_->GetName(); }
void treeName() { if(mytree_)return mytree_->GetName(); else std::cout << "No current tree" << std::endl; }
TFile* file() { return myfile_;}
TTree* tree() { return mytree_;}
void ListBranches(int maxdepth=0) const;
void ListBranch(const char* bname, int maxdepth=1) const;
void ListLeaves(const char* branch) const;
void Draw(const char* lname,const char* cut="", const char* gopt="") const;
private:
void ListBranch(TBranch* branch, int idepth, int maxdepth) const;
TFile* myfile_;
TTree* mytree_;
};

TrkAnaUtils::TrkAnaUtils(TFile* myfile,const char* treename) : myfile_(myfile) {
UseTree(treename);
}

TrkAnaUtils::TrkAnaUtils(const char* filename,const char* treename) : mytree_(0) {
myfile_ = new TFile(filename);
UseTree(treename);
}

void TrkAnaUtils::ListTrees() const {
TObjArray* keylist = (TObjArray*)myfile_->GetListOfKeys();
int nkeys = keylist->GetEntries();
for(int ikey=0;ikey<nkeys;++ikey){
auto key = keylist->At(ikey);
std::string kname(key->GetName());
if(0 == kname.compare(0,6,std::string("TrkAna")))
std::cout << kname << std::endl;
}
}

void TrkAnaUtils::UseTree( const char* treename) {
TObjArray* keylist = (TObjArray*)myfile_->GetListOfKeys();
int nkeys = keylist->GetEntries();
for(int ikey=0;ikey<nkeys;++ikey){
auto key = keylist->At(ikey);
std::string kname(key->GetName());
if(0 == kname.compare(std::string(treename))){
auto td = (TDirectory*)myfile_->GetDirectory(treename);
if(td){
mytree_ = (TTree*)td->Get("trkana");
if(!mytree_)
std::cout <<"Error: can't find TrkAna tree in TDirectory " << treename << std::endl;
} else
std::cout <<"Error: can't find TDirectory " << treename << std::endl;
}
}
}

void TrkAnaUtils::ListBranches(int maxdepth) const {
int idepth(0);
if(mytree_){
auto tlist = mytree_->GetListOfBranches();
int nbs = tlist->GetEntries();
for(int ib=0;ib<nbs;++ib){
auto branch = (TBranch*)tlist->At(ib);
ListBranch(branch,idepth,maxdepth);
}
} else {
std::cout << "No current tree; call UseTree to set current tree" << std::endl;
}
}

void TrkAnaUtils::ListBranch(const char* bname, int maxdepth) const {
if(mytree_){
auto branch = mytree_->GetBranch(bname);
if(branch){
ListBranch(branch,0,maxdepth);
} else {
std::cout << "No branch " << bname << " in current tree" << std::endl;
}
} else {
std::cout << "No current tree; call UseTree to set current tree" << std::endl;
}
}

void TrkAnaUtils::ListBranch(TBranch* branch, int idepth, int maxdepth) const {
std::cout << branch->GetName() << std::endl;
if(idepth < maxdepth){
auto blist = branch->GetListOfBranches();
int nbs = blist->GetEntries();
for(int ib=0;ib<nbs;++ib){
auto subbranch = (TBranch*)blist->At(ib);
ListBranch(subbranch,idepth++,maxdepth);
}
}
}



void TrkAnaUtils::ListLeaves(const char* branch) const {
if(mytree_){
auto bran = mytree_->GetBranch(branch);
if(bran){
auto blist = bran->GetListOfLeaves();
int nbs = blist->GetEntries();
for(int ib=0;ib<nbs;++ib){
auto b = blist->At(ib);
std::cout << b->GetName() << std::endl;
}
} else {
std::cout << "Current tree has no branch" << branch << std::endl;
}
} else {
std::cout << "No current tree; call UseTree to set current tree" << std::endl;
}
}

void TrkAnaUtils::Draw(const char* lname,const char* cut="", const char* gopt="") const {
if(mytree_){
mytree_->Draw(lname,cut,gopt);
} else {
std::cout << "No current tree; call UseTree to set current tree" << std::endl;
}
}

0 comments on commit d0035dd

Please sign in to comment.