Re: [ROOT] TTree Friend issues

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Apr 05 2002 - 15:32:39 MEST


Hi Matt,

You misuse friends.
In a first job, do:

{
        //Tree Friendship write test:
        Float_t a,b;
        TFile* f = new TFile("TreeFriend.root", "recreate");
        TTree* t1 = new TTree("t1", "Test tree 1");
        TTree* t2 = new TTree("t2", "Test tree 2");
        t1->Branch("a", &a, "a/F");
        t2->Branch("b", &b, "b/F");

        for (int i=0; i<1000; i++) {
                gRandom->Rannor(a, b);
                t1->Fill();
                t2->Fill();
        }

        t1->Write();
        t2->Write();
        f->Write();
}

In a second session, do, eg:

{
        //Tree Friendship read test:
        TFile* f = new TFile("TreeFriend.root");
        TTree* t1 = (TTree*)f->Get("t1");
        t1.AddFriend("t2", f);
        t1.Draw("a:b");
}

Rene Brun

Matt Palmer wrote:
> 
> Hi,
> I've had some problems when adding friends to TTrees when those friends are
> in the same file.  I am using ROOT v3.03/03 on rhlinux v7.1.  The script
> demonstrates the problems which are:
> ROOT generates lots of warning when adding a friend tree in the same file by
> filename (but it does work)
> When a friend TTree is in the same file, ROOT needlessly opens another copy
> of the file rather than using the one already there.
> If the friend is created by using a TFile* pointer, then no warning messages
> are produced but ROOT SEGVs when trying to close the file.
> If two TTrees are friends of each other and this has been set up with TFile*
> then closing the file results in a hang - not even a SEGV.
> 
> These 4 issues are demonstrated in this script - uncomment the labelled lines
> to see.
> 
> Matt
> 
> {
>         //Tree Friendship test:
>         Float_t a,b;
>         TFile* f = new TFile("TreeFriend.root", "recreate");
>         TTree* t1 = new TTree("t1", "Test tree 1");
>         TTree* t2 = new TTree("t2", "Test tree 2");
>         t1->Branch("a", &a, "a/F");
>         t2->Branch("b", &b, "b/F");
> 
>         //Critical lines:
> //      t1.AddFriend("t2", "TreeFriend.root"); //1,2: Works but lots or warnings
> //      t2.AddFriend("t1", "TreeFriend.root"); //2: Works, lots of warnings and
> //                                      ROOT opens 2 copies of the same file
> //      t1.AddFriend("t2", f);  //3: Causes a segv when trying to close f
> //      t2.AddFriend("t1", f);  //4: Now it won't even segv - it just hangs
> 
>         for (int i=0; i<1000; i++) {
>                 gRandom->Rannor(a, b);
>                 t1->Fill();
>                 t2->Fill();
>         }
> 
>         t1->Write();
>         t2->Write();
>         f->Write();
> //      cout << "Segv about to occur...." << endl;  //3
> //      f->Close();             //3:  Segv here!
> }



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