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

From: Rene Brun (Rene.Brun@cern.ch)
Date: Sat Dec 21 2002 - 10:49:21 MET


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