void CopyDir(TDirectory *source) { //copy all objects and subdirs of directory source as a subdir of the current directory source->ls(); TDirectory *savdir = gDirectory; TDirectory *adir = savdir->mkdir(source->GetName()); adir->cd(); //loop on all entries of this directory TKey *key; TIter nextkey(source->GetListOfKeys()); while ((key = (TKey*)nextkey())) { const char *classname = key->GetClassName(); TClass *cl = gROOT->GetClass(classname); if (!cl) continue; if (cl->InheritsFrom(TDirectory::Class())) { source->cd(key->GetName()); TDirectory *subdir = gDirectory; adir->cd(); CopyDir(subdir); adir->cd(); } else if (cl->InheritsFrom(TTree::Class())) { TTree *T = (TTree*)source->Get(key->GetName()); adir->cd(); TTree *newT = T->CloneTree(-1,"fast"); newT->Write(); } else { source->cd(); TObject *obj = key->ReadObj(); adir->cd(); obj->Write(); delete obj; } } adir->SaveSelf(kTRUE); savdir->cd(); }
//Clone the file excluding the histogram (code stolen from Rene Brun) void copyDir(TDirectory *source,std::string iSkipHist,bool iFirst=true) { //copy all objects and subdirs of directory source as a subdir of the current directory TDirectory *savdir = gDirectory; TDirectory *adir = savdir; if(!iFirst) adir = savdir->mkdir(source->GetName()); if(!iFirst) adir->cd(); //loop on all entries of this directory TKey *key; TIter nextkey(source->GetListOfKeys()); while ((key = (TKey*)nextkey())) { const char *classname = key->GetClassName(); TClass *cl = gROOT->GetClass(classname); if (!cl) continue; if (cl->InheritsFrom(TDirectory::Class())) { source->cd(key->GetName()); TDirectory *subdir = gDirectory; adir->cd(); copyDir(subdir,iSkipHist,false); adir->cd(); } else { source->cd(); TObject *obj = key->ReadObj(); std::string pFullName = std::string(adir->GetName())+"/"+std::string(obj->GetName()); std::string iSkipHist2 = iSkipHist; std::string fine_binning = "_fine_binning"; iSkipHist2.replace(iSkipHist2.find(fine_binning), fine_binning.length(),""); if(pFullName.find(iSkipHist) != std::string::npos || pFullName.find(iSkipHist2) != std::string::npos) { continue; } adir->cd(); obj->Write(); delete obj; } } adir->SaveSelf(kTRUE); savdir->cd(); }