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