Re: [ROOT] How to separate tree friends

From: cstrato (cstrato@aon.at)
Date: Wed Apr 14 2004 - 23:54:49 MEST


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
>>>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-

> 
> 


///////////////////////////
//
// in new root session:
//     > .x macroFriends.C 
//
///////////////////////////

#include "TFile.h"
#include "TFriendElement.h"
#include "TList.h"
#include "TRandom.h"
#include "TTree.h"
#include "TString.h"

#include <Riostream.h>


class MyClass: public TNamed {

   protected:
      TFile   *fFile;
      TTree   *fTreeX;
      TTree   *fTreeY;
      
   public:
      MyClass() {}
      MyClass(const char *name, const char *title = "test");
      virtual ~MyClass();

      void CreateTrees(const char *treename, const char *filename);
      void AddTree(const char *treename, const char *filename);
      void MoveTree(const char *treename, const char *filename);

      void GetTreeX();
      void GetTreeY();

#if !defined (__CINT__) || defined (__MAKECINT__)
      ClassDef(MyClass,1) //MyClass
#endif
};


#if !defined (__CINT__) || defined (__MAKECINT__)
ClassImp(MyClass);
#endif

//______________________________________________________________________________
MyClass::MyClass(const char *name, const char *title)
        :TNamed(name, title)
{
   cout << "------MyClass::MyClass------" << endl;

   fFile  = 0;
   fTreeX = 0;
   fTreeY = 0;
}//Constructor

//______________________________________________________________________________
MyClass::~MyClass()
{
   cout << "------MyClass::~MyClass------" << endl;

   SafeDelete(fTreeY);
   SafeDelete(fTreeX);
   SafeDelete(fFile);
}//Destructor

//______________________________________________________________________________
void MyClass::CreateTrees(const char *treename, const char *filename)
{
   cout << "------MyClass::CreateTrees------" << endl;

   TFile *file = new TFile(filename,"RECREATE");

// Number  of tree entries
   Int_t nentries = 100;

   Double_t x;
   TTree *tree = 0;
   TString str = "";

   gRandom->SetSeed();
   for (Int_t i=0; i<4; i++) {
      str = treename; str += i;
      tree = new TTree(str, "trees");
      tree->Branch("BrX", &x, "x/D");

      for (Int_t j=0; j<nentries; j++) {
         x = gRandom->Rndm(1);
         tree->Fill();
      }//for_j

      tree->Write();
   }//for_i

   delete file;
}//CreateTrees

//______________________________________________________________________________
void MyClass::AddTree(const char *treename, const char *filename)
{
   cout << "------MyClass::AddTree------" << endl;

   if (!fFile) fFile = new TFile(filename,"READ"); 

   if (!fTreeX) fTreeX = (TTree*)fFile->Get(treename);
   else         fTreeX->AddFriend(treename, filename);

}//AddTree

//______________________________________________________________________________
void MyClass::MoveTree(const char *treename, const char *filename)
{
   cout << "------MyClass::MoveTree------" << endl;

   TTree *tree = 0;
   TFile *file = 0;
   TFriendElement *fe = 0;

   TList *friends = fTreeX->GetListOfFriends();

   fe = (TFriendElement*)friends->FindObject(treename);
   fTreeY = fe->GetTree();
   fTreeX->RemoveFriend(fTreeY);

   fe = (TFriendElement*)friends->FindObject("TreeY1");
   tree = fe->GetTree();
   file = fe->GetFile();
   fTreeY->AddFriend(tree->GetName(), file->GetName());
   fTreeX->RemoveFriend(tree);

   fe = (TFriendElement*)friends->FindObject("TreeY2");
   tree = fe->GetTree();
   file = fe->GetFile();
   fTreeY->AddFriend(tree->GetName(), file->GetName());
   fTreeX->RemoveFriend(tree);

   fe = (TFriendElement*)friends->FindObject("TreeY3");
   tree = fe->GetTree();
   file = fe->GetFile();
   fTreeY->AddFriend(tree->GetName(), file->GetName());
   fTreeX->RemoveFriend(tree);
}//MoveTree

//______________________________________________________________________________
void MyClass::GetTreeX()
{
   cout << "------MyClass::GetTreeX------" << endl;

   if (!fTreeX) {cout << "TreeX does not exist" << endl; return;}

   TList *friends = fTreeX->GetListOfFriends();
   Int_t nfriends = friends->GetSize();

   cout << "nfriends(treeX) = " << nfriends << endl;
}//GetTreeX

//______________________________________________________________________________
void MyClass::GetTreeY()
{
   cout << "------MyClass::GetTreeY------" << endl;

   if (!fTreeY) {cout << "TreeY does not exist" << endl; return;}

   TList *friends = fTreeY->GetListOfFriends();
   Int_t nfriends = friends->GetSize();

   cout << "nfriends(treeY) = " << nfriends << endl;
}//GetTreeY

//______________________________________________________________________________
//______________________________________________________________________________
void macroFriends()
{
   MyClass *myclass = new MyClass("MyClass");

   myclass->CreateTrees("TreeX","TreeX.root");
   myclass->CreateTrees("TreeY","TreeY.root");

   myclass->AddTree("TreeX0","TreeX.root");
   myclass->AddTree("TreeX1","TreeX.root");
   myclass->AddTree("TreeX2","TreeX.root");
   myclass->AddTree("TreeX3","TreeX.root");
   myclass->AddTree("TreeY0","TreeY.root");
   myclass->AddTree("TreeY1","TreeY.root");
   myclass->AddTree("TreeY2","TreeY.root");
   myclass->AddTree("TreeY3","TreeY.root");

   myclass->MoveTree("TreeY0","TreeY.root");

   myclass->GetTreeX();
   myclass->GetTreeY();

   delete myclass;
}//macroFriends



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:07 MET