Re: [ROOT] How to fill list of trees?

From: cstrato (cstrato@aon.at)
Date: Sat Dec 21 2002 - 14:30:27 MET


Dear Rene

Thank you for sending me your suggestion. Now my code works.
What is not quite clear to me is, that I have to create only
one object mycl of MyClass for all trees.

My problem is the following:
I have a large table which can contain e.g. 300 columns and
50,000 rows. Three consecutive columns contain separate data
types so that I want to create 100 trees with three branches
each and 50,000 entries each to store the data.

Since the input table can be larger than 100MB, so that a
table 'data[id][i]' would not fit into memory, I read first
each line and store the data of each line in a temporary tree
in three branches as three arrays data1[100], data2[100] and
data3[100].

Then I create 100 trees, and read the data from the temporary
tree into each of the 100 trees. For this reason the code
needs to be:
// Fill trees with data
     for (Int_t id=0; id<numentries; id++) {
        tmptree->GetEntry(id);
        for (Int_t i=0; i<numtrees; i++) {
           tree = (TTree*)fList->At(i);
//          mycl->SetData(data[id][i]);
           mycl1->SetData(data1[i]);
           mycl2->SetData(data2[i]);
           mycl3->SetData(data3[i]);
           tree->Fill();
        }//for_i
     }//for_id

In the last loop I write all 100 trees to the root file
together with a header for each tree.

Currently, I have tested this only for a table containing
data for 4 trees, so I do not know if it will work for
100 trees. Maybe I have to reduce the buffersize for each
branch?

If you have suggestions how to solve this problem
differently, I would appreciate it.

Thank you and best regards
Christian




Rene Brun wrote:

> Hi Christian,
> 
> You do not give enough information to process your problem.
> In particular, you do not show where/how you create your file(s).
> I suggest a simplification of your program as shown below.
> Could you implement it and let me know
> 
> Rene Brun
> 
> //-------------------------
> // Create trees and store in list
>     TTree   *tree = 0;
>     MyClass *mycl = new MyClass();
>     fList->Clear();
>     for (Int_t i=0; i<numtrees; i++) {
>        tree = new TTree(name[i], "");
>        tree->Branch("MyBr", "MyClass", &mycl, 64000, 99);
>        fList->Add(tree);
>     }//for_i
> 
> // Fill trees with data
>     for (Int_t i=0; i<numtrees; i++) {
>        tree = (TTree*)fList->At(i);
>        for (Int_t id=0; id<numentries; id++) {
>           mycl->SetData(data[id][i]);
>           tree->Fill();
>        }//for_id
>     }//for_i
> 
> // Write trees to file
>     for (Int_t i=0; i<numtrees; i++) {
>        tree = (TTree*)fList->At(i);
>        tree->AutoSave();
>        delete tree;
>     }//for_i
> //-------------------------
> 
> 
> On Fri, 20 Dec 2002, cstrato wrote:
> 
> 
>>Dear Rooters
>>
>>I would like to fill many trees at once, i.e. a list
>>of trees, with data and tried the following code:
>>
>>//-------------------------
>>// Create trees and store in list
>>    TTree   *tree = 0;
>>    MyClass *mycl = 0;
>>    fList->Clear();
>>    for (Int_t i=0; i<numtrees; i++) {
>>       tree = new TTree(name[i], "");
>>       mycl = new MyClass();
>>       tree->Branch("MyBr", "MyClass", &mycl, 64000, 99);
>>
>>       fList->Add(tree);
>>       SafeDelete(mycl);
>>    }//for_i
>>
>>// Fill trees with data
>>    for (Int_t id=0; id<numentries; id++) {
>>       for (Int_t i=0; i<numtrees; i++) {
>>          tree = (TTree*)fList->At(i);
>>          mycl = 0;
>>          TBranch *br = tree->FindBranch("MyBr");
>>          br->SetAddress(&mycl);
>>//         tree->SetBranchAddress("MyBr", &mycl);
>>          mycl->SetData(data[id][i]);
>>          br->Fill();
>>       }//for_i
>>    }//for_id
>>
>>// Write trees to file
>>    for (Int_t i=0; i<numtrees; i++) {
>>       tree = (TTree*)fList->At(i);
>>//      mycl = 0;
>>//      tree->SetBranchAddress("MyBr", &mycl);
>>
>>       // write tree to file
>>       tree->Write("", TObject::kOverwrite);
>>       tree->Delete("");   //delete tree from memory
>>       tree = 0;
>>    }//for_i
>>//-------------------------
>>
>>Although I do not get any error message, the trees are
>>never written to the root file, and trying to open the
>>file with TBrowser results in a bus error.
>>
>>Can you tell me what is wrong with my code and how to
>>fill many trees at once?
>>(I am running root 3.04/01 on MacOS X 1.1.2)
>>
>>Thank you in advance for your help.
>>
>>Best regards
>>Christian
>>_._._._._._._._._._._._._._._._
>>C.h.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
>>_._._._._._._._._._._._._._._._
>>
>>
> 
> 
> 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:24 MET