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