Dear Rooters 1) First, I have a question regarding branches with objects, e.g. tree->Branch("MyBranch", "MyData", &data, 64000, 99); where MyData is defined as: class MyData { //class MyData: public TObject { protected: Int_t fID; Double_t fX; public: MyData() {} virtual ~MyData() {} }; With the old branch style, MyData must derive from TObject, but this is no longer necessary. My question is: Are there still advantages to derive MyClass from TObject? Under which circumstances would you derive an object from TObject? 2) The enclosed macro "macroFriends.C" works fine when compiled with ACLiC, but with CINT I get the following output: root [0] .x macroFriends.C ------MyClass::MyClass------ ------MyClass::CreateTrees------ Error in <TClass::BuildRealData>: can not find any ShowMembers function for MyData! ------MyClass::CreateTrees------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::AddTree------ ------MyClass::CopyTrees1------ nfriends(fTree) = 7 nentries(fTree) = 100 treej[0] = TreeX0 treej[1] = TreeX1 treej[2] = TreeX2 *** Break *** bus error Root > Function macroFriends() busy flag cleared Function CopyTrees1() busy flag cleared a, Interestingly, only the first call to CreateTrees() gives an error message, but not the second call. b, It is not clear to me why CINT can only set the first two branch addresses and than crashes? My system: root 4.00/03 from 26 March 2004 on MacOS X 10.3.1 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 "TBranch.h" #include "TFile.h" #include "TFriendElement.h" #include "TLeaf.h" #include "TList.h" #include "TRandom.h" #include "TTree.h" #include "TString.h" #include <Riostream.h> class MyClass: public TNamed { protected: TFile *fFile; TTree *fTree; TTree *fTreeY; TTree *fTreeZ; 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 CopyTrees1(const char *treename, const char *filename); void CopyTrees2(const char *treename, const char *filename); void GetTree(); void GetTreeZ(); #if !defined (__CINT__) || defined (__MAKECINT__) ClassDef(MyClass,1) //MyClass #endif }; class MyData { //class MyData: public TObject { protected: Int_t fID; Double_t fX; public: MyData() {} virtual ~MyData() {} void SetID(Int_t id) {fID = id;} void SetX(Double_t x) {fX = x;} Int_t GetID() const {return fID;} Double_t GetX() const {return fX;} #if !defined (__CINT__) || defined (__MAKECINT__) ClassDef(MyData,1) //MyData #endif }; #if !defined (__CINT__) || defined (__MAKECINT__) ClassImp(MyClass); ClassImp(MyData); #endif //______________________________________________________________________________ MyClass::MyClass(const char *name, const char *title) :TNamed(name, title) { cout << "------MyClass::MyClass------" << endl; fFile = 0; fTree = 0; fTreeY = 0; fTreeZ = 0; }//Constructor //______________________________________________________________________________ MyClass::~MyClass() { cout << "------MyClass::~MyClass------" << endl; SafeDelete(fTreeZ); SafeDelete(fTreeY); SafeDelete(fTree); 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; TTree *tree = 0; TString str = ""; gRandom->SetSeed(); for (Int_t i=0; i<4; i++) { str = treename; str += i; tree = new TTree(str, "trees"); Int_t split = 99; MyData *data = 0; data = new MyData(); tree->Branch("DataBranch", "MyData", &data, 64000, split); for (Int_t j=0; j<nentries; j++) { data->SetID(j); data->SetX(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 (!fTree) fTree = (TTree*)fFile->Get(treename); else fTree->AddFriend(treename, filename); }//AddTree //______________________________________________________________________________ void MyClass::CopyTrees1(const char *treename, const char *filename) { // creates new trees and copies selected entries cout << "------MyClass::CopyTrees1------" << endl; TList *friends = fTree->GetListOfFriends(); Int_t nentries = (Int_t)(fTree->GetEntries()); Int_t nfriends = friends->GetSize(); Int_t ntrees = nfriends + 1; cout << "nfriends(fTree) = " << nfriends << endl; cout << "nentries(fTree) = " << nentries << endl; TFriendElement *fe = 0; TTree *treej[20]; MyData *dataj[20]; for (Int_t j=0; j<ntrees; j++) { dataj[j] = 0; }//for_j // Create tree/branch/leaf arrays fFile->cd(); fe = (TFriendElement*)friends->At(0); treej[0] = fe->GetParentTree(); cout << "treej[0] = " << treej[0]->GetName() << endl; treej[0]->SetBranchAddress("DataBranch",&dataj[0]); for (Int_t j=0; j<nfriends; j++) { fe = (TFriendElement*)friends->At(j); treej[j+1] = fe->GetTree(); cout << "treej[" << j+1 << "] = " << treej[j+1]->GetName() << endl; treej[j+1]->SetBranchAddress("DataBranch",&dataj[j+1]); }//for_j TFile *file = new TFile(filename,"RECREATE"); cout << "file = " << file->GetName() << endl; TTree *newtree = 0; TTree *tmptree = 0; for (Int_t j=0; j<ntrees; j++) { // newtree = treej[j]->CloneTree(0); TString name = treej[j]->GetName(); TString alias = name + "=" + TString(treej[j]->GetName()); cout << "alias = " << alias << endl; tmptree = new TTree(treej[j]->GetName(), treej[j]->GetTitle()); Int_t split = 99; MyData *data = 0; data = new MyData(); tmptree->Branch("DataBranch", "MyData", &data, 64000, split); for (Int_t i=0; i<nentries; i++) { // Test: filter mask!!!! if (i%2) continue; treej[j]->GetEntry(i); data->SetID(dataj[j]->GetID()); data->SetX(dataj[j]->GetX()); if (i<4) cout << "i= " << i << " j= " << j << " data= " << data->GetX() << endl; tmptree->Fill(); }//for_i tmptree->Write(); if (j == 0) { newtree = tmptree; } else { newtree->AddFriend(tmptree, alias.Data()); // delete tmptree; // tmptree->Delete(""); tmptree = 0; }//if delete data; }//for_j fTree = newtree; // fTreeZ = newtree; }//CopyTrees1 //______________________________________________________________________________ void MyClass::CopyTrees2(const char *treename, const char *filename) { cout << "------MyClass::CopyTrees2------" << endl; TList *friends = fTree->GetListOfFriends(); Int_t nentries = (Int_t)(fTree->GetEntries()); Int_t nfriends = friends->GetSize(); Int_t ntrees = nfriends + 1; cout << "nfriends(fTree) = " << nfriends << endl; cout << "nentries(fTree) = " << nentries << endl; TFriendElement *fe = 0; TTree *treej[20]; MyData *dataj[20]; for (Int_t j=0; j<ntrees; j++) { dataj[j] = 0; }//for_j // Create tree/branch/leaf arrays fFile->cd(); fe = (TFriendElement*)friends->At(0); treej[0] = fe->GetParentTree(); cout << "treej[0] = " << treej[0]->GetName() << endl; treej[0]->SetBranchAddress("DataBranch",&dataj[0]); for (Int_t j=0; j<nfriends; j++) { fe = (TFriendElement*)friends->At(j); treej[j+1] = fe->GetTree(); cout << "treej[" << j+1 << "] = " << treej[j+1]->GetName() << endl; treej[j+1]->SetBranchAddress("DataBranch",&dataj[j+1]); }//for_j TFile *file = new TFile(filename,"RECREATE"); cout << "file = " << file->GetName() << endl; TTree *tree = 0; for (Int_t j=0; j<ntrees; j++) { tree = treej[j]->CloneTree(0); cout << "tree[" << j << "]= " << tree->GetName() << endl; for (Int_t i=0; i<nentries; i++) { // Test: select every second entry if (i%2) continue; treej[j]->GetEntry(i); if (i<4) cout << "j= " << j << " x[" << i << "]= " << dataj[j]->GetX() << endl; tree->Fill(); }//for_j tree->Write(); if (j == 0) { fTreeZ = tree; } else { //not allowed! fTreeZ->AddFriend(tree, str.Data()); delete tree; }//if }//for_i }//CopyTrees2 //______________________________________________________________________________ void MyClass::GetTree() { cout << "------MyClass::GetTree------" << endl; if (!fTree) {cout << "fTree does not exist" << endl; return;} TList *friends = fTree->GetListOfFriends(); Int_t nentries = (Int_t)(fTree->GetEntries()); Int_t nfriends = friends->GetSize(); cout << "fTreeName = " << fTree->GetName() << endl; cout << "fTreeTitle = " << fTree->GetTitle() << endl; cout << "nentries(tree) = " << nentries << endl; cout << "nfriends(tree) = " << nfriends << endl; }//GetTree //______________________________________________________________________________ void MyClass::GetTreeZ() { cout << "------MyClass::GetTreeZ------" << endl; if (!fTreeZ) {cout << "fTreeZ does not exist" << endl; return;} TList *friends = fTreeZ->GetListOfFriends(); Int_t nentries = (Int_t)(fTreeZ->GetEntries()); Int_t nfriends = friends->GetSize(); cout << "nentries(treeZ) = " << nentries << endl; cout << "nfriends(treeZ) = " << nfriends << endl; }//GetTreeZ //______________________________________________________________________________ //______________________________________________________________________________ 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->CopyTrees1("TreeZ","TreeZ1.root"); myclass->GetTree(); // myclass->GetTreeZ(); myclass->CopyTrees2("TreeZ","TreeZ2.root"); // myclass->GetTree(); myclass->GetTreeZ(); delete myclass; }//macroFriends
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:07 MET