// Author: Rene Brun #include #include "TROOT.h" #include "TKey.h" #include "TFile.h" #include "TSystem.h" #include "TTree.h" //Example of script showing how to copy all objects (including directories) //from a source file. //For each input file, a new directory is created in the current directory //with the name of the source file. //After execution of: // root > .x copyFiles.C //the file result.root will contain 4 subdirectories: // "tot100.root", "hsimple.root", "hs1.root","hs2.root" 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 = (TDirectory*)savdir->Get(source->GetName()); if (adir == 0) { std::cout << "creating a new directory called " << source->GetName() << std::endl; 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")) { source->cd(key->GetName()); TDirectory *subdir = gDirectory; adir->cd(); CopyDir(subdir); adir->cd(); } else if (cl->InheritsFrom("TTree")) { TTree *T = (TTree*)source->Get(key->GetName()); adir->cd(); TTree *newT = T->CloneTree(); newT->Write(); } else { source->cd(); TObject *obj = key->ReadObj(); adir->cd(); obj->Write(); delete obj; } } adir->SaveSelf(kTRUE); savdir->cd(); } void CopyObjects(TDirectory *source) { //copy all objects and subdirs of directory source into the current directory source->ls(); TDirectory *savdir = gDirectory; TDirectory *adir = (TDirectory*)savdir; //loop on all entries of the source 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")) { source->cd(key->GetName()); TDirectory *subdir = gDirectory; adir->cd(); CopyDir(subdir); adir->cd(); } else if (cl->InheritsFrom("TTree")) { TTree *T = (TTree*)source->Get(key->GetName()); adir->cd(); TTree *newT = T->CloneTree(); newT->Write(); } else { source->cd(); TObject *obj = key->ReadObj(); adir->cd(); obj->Write(); delete obj; } } } void CopyFile(const char *fname) { //Copy all objects and subdirs of file fname as a subdir of the current directory TDirectory *target = gDirectory; TFile *f = TFile::Open(fname); if (!f || f->IsZombie()) { printf("Cannot copy file: %s\n",fname); target->cd(); return; } target->cd(); CopyDir(f); delete f; target->cd(); } void copyFiles() { //main function copying 4 files as subdirectories of a new file TFile *f = new TFile("result.root","recreate"); CopyFile("tot100.root"); CopyFile("hsimple.root"); CopyFile("hs1.root"); CopyFile("hs2.root"); f->ls(); delete f; }