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