Re: [ROOT] How to separate tree friends

From: cstrato (cstrato@aon.at)
Date: Thu Apr 15 2004 - 23:32:45 MEST


Dear Philippe

I understand, however it would be great if there would be
a simpler way, e.g if there would exist a method such as:
   TTree * TTree::RemoveFriend(const char *treename)
which removes the tree from the list of friends and returns
a pointer to the removed tree.
(I am not quite sure if this would make sense?)

Best regards
Christian

Philippe Canal wrote:
> Hi Christian,
> 
> In your case the TFriendElements owns the TTree object (and the file)
> and is deleted when RemoveFriend is called.
> 
> You will need to record the name of the TTree and the name of the
> file before Removing the friendship from the previous tree.
> 
> Cheers,
> Philippe.
> 
> -----Original Message-----
> From: cstrato [mailto:cstrato@aon.at]
> Sent: Wednesday, April 14, 2004 4:55 PM
> To: Philippe Canal
> Cc: Rene Brun; roottalk@pcroot.cern.ch
> Subject: Re: [ROOT] How to separate tree friends
> 
> 
> Dear Philippe,
> 
> I have tried to implement your suggestion in the attached
> macro "macroFriends.C". Sorrowly, I get 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::MoveTree------
> Error in <TMemberInspector::Streamer>: version id <=0 in ClassDef, dummy 
> Streamer() called
> Error in <TMemberInspector::Streamer>: version id <=0 in ClassDef, dummy 
> Streamer() called
> Error in <TMemberInspector::Streamer>: version id <=0 in ClassDef, dummy 
> Streamer() called
> ------MyClass::GetTreeX------
> nfriends(treeX) = 3
> ------MyClass::GetTreeY------
> 
>   *** Break *** bus error
> Root > Function macroFriends() busy flag cleared
> Function GetTreeY() busy flag cleared
> 
> Can you tell me, why I cannot add the selected trees to fTreeY?
> 
> Thank you in advance
> Christian
> 
> 
> Philippe Canal wrote:
> 
>>Hi Christian,
>>
>>The TTree object has one list of friend and it always
>>uses all the friends on the list.
>>
>>However you can manipulate the list as you see fit after
>>getting it from TTree::GetListOfFriends.
>>
>>For example you could extract (Remove) from it, TreeA,
>>TreeB, TreeC etc ... and add them to the list of friends
>>of TTreeA.
>>
>>Cheers,
>>Philippe.
>>
>>-----Original Message-----
>>From: owner-roottalk@pcroot.cern.ch
>>[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of cstrato
>>Sent: Tuesday, April 13, 2004 1:00 PM
>>To: Rene Brun
>>Cc: roottalk@pcroot.cern.ch
>>Subject: Re: [ROOT] How to separate tree friends
>>
>>
>>Dear Rene
>>
>>Thank you, but this is not what I want:
>>I have a method:
>>     myclass-AddTrees("treename", "filename", "group")
>>where the user can add trees from different root files.
>>These trees are stored as friends to the first tree fTree.
>>
>>fTree is then passed to different methods, where I would
>>like to separate these trees based on their "groups",
>>and create e.g. two trees with friends for:
>>"group1": fTree("Tree1") with friends Tree2, Tree3, Tree4
>>"group2": atree("TreeA") with friends TreeB, TreeC
>>(These separate tree groups are then again passed to
>>different methods.)
>>
>>Best regards
>>Christian
>>
>>
>>Rene Brun wrote:
>>
>>
>>>Hi Christian,
>>>
>>>As I am not sure to understand your question (or what you want to do),
>>>I can only give a naive answer
>>>
>>>   fTree = (TTree*)gDirectory->Get("Tree1");
>>>   fTree->AddFriend("Tree2", "file2.root");
>>>   fTree->AddFriend("Tree3", "file3.root");
>>>   fTree->AddFriend("Tree4", "file4.root");
>>>
>>>   aTree = (TTree*)gDirectory->Get("TreeA");
>>>   aTree->AddFriend("TreeB", "fileB.root");
>>>   aTree->AddFriend("TreeC", "fileC.root");
>>>
>>>Rene Brun
>>>
>>>
>>>cstrato wrote:
>>>
>>>
>>>
>>>>Dear Rooters
>>>>
>>>>Suppose that I have a tree with following friends:
>>>>  fTree = (TTree*)gDirectory->Get("Tree1");
>>>>  fTree->AddFriend("Tree2", "file2.root");
>>>>  fTree->AddFriend("Tree3", "file3.root");
>>>>  fTree->AddFriend("TreeA", "fileA.root");
>>>>  fTree->AddFriend("Tree4", "file4.root");
>>>>  fTree->AddFriend("TreeB", "fileB.root");
>>>>  fTree->AddFriend("TreeC", "fileC.root");
>>>>
>>>>How can I separate fTree into the following two treefriends:
>>>>1, fTree("Tree1") with friends Tree2, Tree3, Tree4
>>>>2, aTree("TreeA") with friends TreeB, TreeC
>>>>
>>>>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