[ROOT] Use of TFolder

From: cstrato@EUnet.at
Date: Sun Oct 21 2001 - 19:59:42 MEST


Dear Rooters

Maybe the use of TFolder is not quite clear to me. What I would like
to do is the following:
Suppose I have the following hierarchy:
   Runs
       Run1
           Sets
               Set1
                    Tree1
                    Tree2
               Set2
                   Tree3
                   Tree4
       Run2
           Sets
               Set3
                   Tree5
      etc
where every Run is stored in its own root file:
    Run1.root
    Run2.root

Now I would like to display this hierachy in TBrowser as tree structure.

However, I want to display this structure permanently, and when I add
another RunX.root file, this file should be added automatically.

My idea was to create a TFolder structure and store this structure
permanently in another root file, called “folders.root”

As the macro (“macroFolder.C”) below shows, this works within one
root session. However, when I close root, and open it again, I can no
longer display the RunX.root files within TBrowser, since the
information
where these files are stored is lost.

Does someone have a hint, how I could store the TFolder hierarchy
permanently, so that I have access to TTrees of the different root
files?

If TFolder is not the right way to go, what other possibilities do
exist?

Normally, I would create a class TRun and TSet where each class has
a TList which stores the  list of Runs and Trees, respectively. However,

the root manual says, that the reason to use TFolders is to reduce class

dependencies. At the moment it is not quite clear to me how I could
achieve this in a standalone application?

Thank you very much in advance.

Best regards
Christian
----------------------------------
C.h.r.i.s.t.i.a.n  S.t.r.a.t.o.w.a
V.i.e.n.n.a,  A.u.s.t.r.i.a


----------macroFolder.C-------------------
TTree *CreateTree(const char *vTreeName, const char *vTreeTitle)
{
   vTree = new TTree(vTreeName, vTreeTitle);
   Int_t id;
   Float_t x, y;
   TBranch *br1 = vTree->Branch("br1",&id,"id/I");
   TBranch *br2 = vTree->Branch("br2",&x,"x/F");
   TBranch *br3 = vTree->Branch("br2",&y,"y/F");
   for (Int_t i = 0; i < 100; i++) {
      id = i;
      gRandom->Rannor(x,y);
      vTree->Fill();
   }

   return vTree;
}

//----------------------------------------------------------------------//

void AddTrees(TFolder *vSet)
{
   TFolder *vTrees = vSet->AddFolder("Trees", "Set Trees");

   vTrees->Add(CreateTree("Tree1", "Tree 1"));
   vTrees->Add(CreateTree("Tree2", "Tree 2"));
   vTrees->Add(CreateTree("Tree3", "Tree 3"));
   vTrees->Add(CreateTree("Tree4", "Tree 4"));
}

//----------------------------------------------------------------------//

void AddTree(TFolder *vSet, const char *vTreeName)
{
   TTree *vTree = CreateTree(vTreeName, vSet->GetName());

   vSet->Add(vTree);
}

//----------------------------------------------------------------------//

void AddFile(TFolder *vRun, const char *vFileName)
{
   TFile *vFile = new TFile(vFileName,"recreate");
   TTree *vTree1 = CreateTree("T1",vFileName);
   TTree *vTree2 = CreateTree("T2",vFileName);

   vFile->Write();

   vRun->Add(vFile);
}


//----------------------------------------------------------------------//

void MyFolders()
{
   TFolder *vMyRoot = gROOT->GetRootFolder()
                           ->AddFolder("MyRoot", "MyRoot top level");

   gROOT->GetListOfBrowsables()->Add(vMyRoot, "MyRoot");

   TFolder *vRuns = vMyRoot->AddFolder("Runs", "Runs");

   TFolder *vRun1 = vRuns->AddFolder("Run1", "Run 1");

   TFolder *vSets = vRun1->AddFolder("Sets", "Dataset");

   TFolder *vSet1 = vSets->AddFolder("Set1", "Dataset 1");
   vSet1->Add(new TNamed("Data1", "data1 in set 1"));
   vSet1->Add(new TNamed("Data2", "data2 in set 1"));
   vSet1->Add(new TNamed("Data3", "data3 in set 1"));

   TFolder *vSet2 = vSets->AddFolder("Set2", "Dataset 2");
   AddTrees(vSet2);

   TFolder *vSet3 = vSets->AddFolder("Set3", "Dataset 3");
   AddTree(vSet3, "TreeA");
   AddTree(vSet3, "TreeB");

   AddFile(vRun1, "/home/christian/rt/rootcode/xps/Run1.root");

   TFolder *vRun2 = vRuns->AddFolder("vRun2", "Run 2");
   AddFile(vRun2, "/home/christian/test/Run2.root");

//   new TBrowser();

   TFile *vFile = new TFile("folders.root","recreate");
   vMyRoot->Write();
   vFile->Delete("");
}


///////////////////////////
// To run it in root:
//     > .L macroFolder.C
//     > MyFolders()
//
///////////////////////////



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:03 MET