Hi, In CopyTrees2 you force all the tree to share a single double to store their data: fe = (TFriendElement*)friends->At(0); treej[0] = fe->GetParentTree(); treej[0]->SetBranchAddress("BrX",&x); for (Int_t j=0; j<nfriends; j++) { fe = (TFriendElement*)friends->At(j); treej[j+1] = fe->GetTree(); treej[j+1]->SetBranchAddress("BrX",&x); }//for_j I am not sure what you intend was .. but this wont result in real copies of the trees (unless they are all indentical!) > Why can I not use the following code in line 171: > fTreeZ->AddFriend(str.Data(), filename); Because of file ownership and lifetime. 'Filename' points to the file you are currently updateing. This call lead to an attempts to re-open it in read mode .... before you even wrote it's table of content once ... hence the error. Later in the code you have: //not allowed! fTreeZ->AddFriend(tree, str.Data()); delete tree; Indeed you can not have those 2 statements together (because fTreeZ might not be informed that the object point to by tree is gone. Cheers, Philippe. -----Original Message----- From: owner-roottalk@pcroot.cern.ch [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of cstrato Sent: Sunday, April 18, 2004 3:10 PM To: roottalk@pcroot.cern.ch Subject: [ROOT] Problem with CloneTree() Dear Rooters In the attached macro "macroFriends.C" I want to copy selected entries from a tree and its friends to a new file. For this purpose I have written two functions: - CopyTrees1() creates new trees which are stored in the new file. - CopyTrees2() uses CloneTree() for this purpose. While CopyTrees1() works fine, CopyTrees2() does not copy the entries of the first tree but the entries of the last tree, as seen in the following output: root [0] .x macroFriends.C ------MyClass::MyClass------ ------MyClass::CreateTrees------ ------MyClass::CreateTrees------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::CopyTrees1------ nfriends(treeX) = 7 file = TreeZ1.root j= 0 x[0]= 0.107915 //<========correct! j= 1 x[0]= 0.0206264 j= 2 x[0]= 0.142258 j= 3 x[0]= 0.0588223 j= 4 x[0]= 0.107915 j= 5 x[0]= 0.0206264 j= 6 x[0]= 0.142258 j= 7 x[0]= 0.0588223 ------MyClass::GetTreeZ------ nentries(treeZ) = 50 nfriends(treeZ) = 7 ------MyClass::CopyTrees2------ nfriends(treeX) = 7 file = TreeZ2.root j= 0 x[0]= 0.0588223 //<========entry of j=7! j= 1 x[0]= 0.0206264 j= 2 x[0]= 0.142258 j= 3 x[0]= 0.0588223 j= 4 x[0]= 0.107915 j= 5 x[0]= 0.0206264 j= 6 x[0]= 0.142258 j= 7 x[0]= 0.0588223 ------MyClass::GetTreeZ------ nentries(treeZ) = 50 nfriends(treeZ) = 7 ------MyClass::~MyClass------ root [1] I have the following questions: 1, CopyTrees2: Do you know why the parent tree copies the wrong entries to the cloned tree? 2, CopyTrees1: Why can I not use the following code in line 171: fTreeZ->AddFriend(str.Data(), filename); Thank you in advance for your help. Best regards Christian -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- C.h.r.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 : Sun Jan 02 2005 - 05:50:07 MET