RE: [ROOT] Problem with CloneTree()

From: Philippe Canal (pcanal@fnal.gov)
Date: Tue Apr 20 2004 - 00:20:23 MEST


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