Dear Rene About 2 months ago I reported a problem that I have with the new Tree::Branch() function, and you asked me to supply a democode. See roottalk and followups: http://root.cern.ch/root/roottalk/roottalk01/2035.html In a reply to me Eddy Offermann was so kind to send me a democode, which he has tested on SunOS running 3.00/6 (see code below). Probably, this code works fine on Intel architecture, too? However, it does not work on my Mac running LinuxPPC. Sorrowly, I had some problems in creating the makefile for my system, then I had to reformat my harddisk, which took some time, so I am only now able to report my results. First, I did a new clean install of my system: PowerBook G3 with LinuxPPC 2000 Q4 using root 3.01/06. Then I compiled the democode: [christian@pbook eddy]$ gmake -f Makefile4doit g++ -O -Wall -fsigned-char -I/usr/X11/include -I/home/christian/rt/root/include -c main.cxx main.cxx: In function `void CreateOutput(TString &)': main.cxx:43: warning: unused variable `class TBranch * br' g++ -O -Wall -fsigned-char -I/usr/X11/include -I/home/christian/rt/root/include -c MyClass.cxx g++ -O -Wall -fsigned-char -I/usr/X11/include -I/home/christian/rt/root/include -c MyClassDict.cxx g++ -shared -fPIC -O -o libMyClass.so MyClass.o MyClassDict.o libMyClass.so done g++ -O -o doit main.o -L. -lMyClass -L/home/christian/rt/root/lib -lCore -lCint -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lm -ldl -rdynamic doit done However, the output of the democode is as follows: [christian@pbook eddy]$ ./doit Filling tree ****************************************************************************** *Tree :stuff : MyClass entries * *Entries : 0 : Total = 0 bytes File Size = 0 * * : : Tree compression factor = 1.00 * ****************************************************************************** *Branch :MyClass * *Entries : 0 : BranchElement (see below) * *............................................................................* *Br 0 :TObject : * *Entries : 0 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 1 :fA : * *Entries : 0 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 2 :fS : * *Entries : 0 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* Reading tree 0: size = 0 1: size = 0 2: size = 0 3: size = 0 4: size = 0 5: size = 0 6: size = 0 7: size = 0 8: size = 0 9: size = 0 10: size = 0 11: size = 0 12: size = 0 13: size = 0 14: size = 0 15: size = 0 16: size = 0 17: size = 0 18: size = 0 19: size = 0 20: size = 0 21: size = 0 22: size = 0 IMPORTANT: This means that I can recreate my problem with the new branch style with the demo example, since when I add the following line in function CreateOutput(...) just before setting the branch: tree->SetBranchStyle(0); // <== new line added to use BranchOld() TBranch *br = tree->Branch("MyClass","MyClass",&c,bsize,split); then everything works as expected: [christian@pbook eddy]$ ./doit Filling tree ****************************************************************************** *Tree :stuff : MyClass entries * *Entries : 10 : Total = 0 bytes File Size = 0 * * : : Tree compression factor = 1.00 * ****************************************************************************** *Branch :MyClass : MyClass * *Entries : 10 : BranchObject (see below) * *............................................................................* *Br 0 :fA.fArray : fA.fArray[fA.fN]/D * *Entries : 10 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 1 :fA.fN : * *Entries : 10 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 2 :fS.fData : fData/C * *Entries : 10 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 3 :fUniqueID : * *Entries : 10 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 4 :fBits : * *Entries : 10 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* Reading tree 0: size = 1 aap 1: size = 2 aap 2: size = 3 aap 3: size = 4 aap 4: size = 5 aap 5: size = 6 aap 6: size = 7 aap 7: size = 8 aap 8: size = 9 aap 9: size = 10 aap Now I have the following questions: What could be the reason that on my machine the new branch() function does not work? I suppose, the code works fine on Linux for Intelx86? Could this be a processor-specific problem? Since the Mac uses a PowerPC processor, do you know if the code runs fine on an IBM RS6000? Thank you very much in advance. 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 //-----main.cxx---------------------------------------- #include <TROOT.h> #include <TFile.h> #include <TTree.h> #include <TSystem.h> #include <Rtypes.h> #include <TArrayD.h> #include <TError.h> #include <iostream.h> #include "MyClass.h" void CreateOutput(TString &file); void LoadOutput(TString &file); int main(Int_t argc, Char_t **argv) { TROOT showit("showit","showit"); TString file = "sample.txt"; CreateOutput(file); LoadOutput(file); return 0; } //________________________ void CreateOutput(TString &file) { TFile *tfile = new TFile(file.Data(),"RECREATE","file filed with MyClass",1); TTree *tree = new TTree("stuff","MyClass entries"); Int_t split = 1; Int_t bsize = 64000; MyClass *c = new MyClass(); // tree->SetBranchStyle(0); //use BranchOld() TBranch *br = tree->Branch("MyClass","MyClass",&c,bsize,split); printf("Filling tree\n"); for (Int_t i = 0; i < 10; i++) { (c->fA).Set(i+1); // Set array length to i+1 (c->fA).Reset(i); // Set all values to i c->fS = "aap"; tree->Fill(); } tree->Print(); tfile->Write(); tfile->Close(); } //______________________ void LoadOutput(TString &file) { TFile tfile(file.Data()); TTree *tr = (TTree*)gDirectory->Get("stuff"); MyClass* c = new MyClass(); tr->SetBranchAddress("MyClass",&c); printf("Reading tree\n"); Int_t nrBytes = 0; for (Int_t j = 0; j < tr->GetEntries(); j++) { nrBytes += tr->GetEvent(j); printf("%d: size = %d %s\n",j,(c->fA).GetSize(),(c->fS).Data()); } delete tr; } //-----MyClass.h--------------------------------------- #ifndef MYCLASS #define MYCLASS #include <TObject.h> #include <Rtypes.h> #include <TString.h> #include <TTree.h> #include <TError.h> class MyClass : public TObject { public: TArrayD fA; TString fS; public: MyClass(); virtual ~MyClass(); ClassDef(MyClass,1) //MyClass }; #endif //-----MyClass.cxx------------------------------------- #include "MyClass.h" ClassImp(MyClass); MyClass::MyClass() { } MyClass::~MyClass() { } //-----MyClass_LinkDef.h------------------------------- #ifdef __CINT__ #pragma link off all globals; #pragma link off all classes; #pragma link off all functions; #pragma link C++ class MyClass+; #endif //-----Makefile4doit----------------------------------- # Makefile for doit. # modified from root example Event # shell: gmake -f Makefile4doit ARCH = linuxppcegcs CXX = ObjSuf = o SrcSuf = cxx ExeSuf = DllSuf = so OutPutOpt = -o LPATH = . MYCLASSLIB = -L$(LPATH) -lMyClass ROOTCFLAGS := $(shell root-config --cflags) ROOTLIBS := $(shell root-config --libs) ROOTGLIBS := $(shell root-config --glibs) ifeq ($(ARCH),linuxegcs) # Linux with egcs (>= RedHat 5.2) CXX = g++ CXXFLAGS = -I ./ -O -Wall -fPIC LD = g++ LDFLAGS = -O SOFLAGS = -shared endif ifeq ($(ARCH),linuxppcegcs) # MkLinux with egcs/glibc CXX = g++ CXXFLAGS = -O -Wall LD = g++ LDFLAGS = -O SOFLAGS = -shared -fPIC endif CXXFLAGS += $(ROOTCFLAGS) LIBS = $(ROOTLIBS) $(SYSLIBS) GLIBS = $(ROOTGLIBS) $(SYSLIBS) #-------- MYCLASSO = MyClass.$(ObjSuf) \ MyClassDict.$(ObjSuf) MYCLASSS = MyClass.$(SrcSuf) \ MyClassDict.$(SrcSuf) MAINO = main.$(ObjSuf) MAINS = main.$(SrcSuf) MAIN = doit$(ExeSuf) MYCLASSSO = libMyClass.$(DllSuf) OBJS = $(MYCLASSO) $(MAINO) PROGRAMS = $(MAIN) #-------- .SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(DllSuf) all: $(PROGRAMS) $(MYCLASSSO): $(MYCLASSO) $(LD) $(SOFLAGS) $(LDFLAGS) $(OutPutOpt) $(MYCLASSSO) $(MYCLASSO) @echo "$@ done" $(MAIN): $(MAINO) $(MYCLASSSO) $(LD) $(LDFLAGS) $(OutPutOpt) $(MAIN) $(MAINO) $(MYCLASSLIB) $(LIBS) @echo "$@ done" clean: @rm -f $(OBJS) core distclean: clean @rm -f $(PROGRAMS) $(MYCLASSSO) $(MYCLASSLIB) *Dict.* *.def *.exp \ *.root *.ps *.so .def so_locations # @rm -rf cxx_repository .SUFFIXES: .$(SrcSuf) ### MyClass.$(ObjSuf): MyClass.h doit.$(ObjSuf): MyClass.h MyClassDict.$(SrcSuf): MyClass.h MyClass_LinkDef.h @echo "Generating dictionary MyClassDict..." @rootcint -f MyClassDict.$(SrcSuf) -c MyClass.h MyClass_LinkDef.h .$(SrcSuf).$(ObjSuf): $(CXX) $(CXXFLAGS) -c $< #--------------------------------------------- Rene Brun wrote: > Hi Christian, > > You can have your libraries where you want. They don't need to be > in $ROOTSYS/lib ! > Concerning your problem, you do not provide enough information. > Did you set the branch address ? > You can get an idea of what happens (with version 3.01/05) by activating > the debug flag. Just before the loop on entries, add the statement > gDebug = 2; (in TSystem.h) > > Rene Brun > > On Sat, 16 Jun 2001 cstrato@EUnet.at wrote: > > > Dear Rene > > > > Thank you for your suggestion. Sorrowly, the problem persists > > with version 3.01/05. > > > > Regarding your second suggestion, until now I have not been > > able to extract a subset where the problem can be reproduced. > > I have tried to create test classes, but the problem never > > appeared. > > > > However, I know exactly where the program crashes: > > // The following command is still ok: > > Int_t vNEntries = (Int_t)(vTree->GetEntries()); > > cout << "vNEntries <" << vNEntries << ">" << endl; > > for (Int_t i=0;i<vNEntries;i++) { > > // The following line crashes!! > > vTree->GetEntry(i); > > some code; > > }//for_i > > > > Although there are entries in the tree, it cannot get the > > entries. > > Maybe, you can give me some hints where to look further? > > > > I have seen that the option Bronch() requires access to the > > library where the corresponding class is defined. > > Since my libs are stored in /opt/rootcode maybe Bronch() > > cannot access the corresponding library, although it is > > loaded first with gSystem->Load(lib). > > Could it be that I need to store my own libraries also > > in /opt/root/lib in order for Bronch() to find the > > corresponding class? > > > > Thank you for your help. > > Best regards > > Christian > > > > Rene Brun wrote: > > > > > Hi Christian, > > > > > > Let me suggest two things: > > > 1- could you try with the version 3.01/5 now released including the > > > version for PPPLinux, thanks to Damir). > > > 2- if the problem persists, prepare a tar file with a very small subset > > > of your classes such that I can reproduce the problem. > > > > > > Note that, as I explained in a previous mail, we will not have frequent > > > access to the Internet in the coming 10 days. > > > > > > Rene Brun > > > > > > On Fri, 8 Jun 2001 cstrato@EUnet.at wrote: > > > > > > > > > > > Dear Rene, dear Rooters > > > > > > > > In my first root file I store a tree with one branch that addresses a > > > > class, > > > > which is derived from TNamed, but contains as member variables two > > > > TStrings > > > > and a couple of integer variables. Thus I had to set the splitlevel to > > > > zero > > > > in my first library in earlier versions of root. > > > > > > > > My second library creates a new root file and stores a couple of trees > > > > with > > > > branches containing only integers and doubles. However, it accesses the > > > > tree > > > > from the first root file to get some data. > > > > > > > > This second library works fine as long as it accessed the first root > > > > file > > > > created with the old Tree::Branch() function. However, now I have > > > > recreated > > > > the first root file, which uses now the new Tree::Branch function (since > > > > > > > > I am using now 3.01/02). Now the second library crashes with a > > > > "segmentation > > > > violation". > > > > > > > > After setting "Tree->SetBranchStyle(0)" in my first library for the > > > > branch > > > > containing TStrings and integers, everything works fine again. It seems > > > > that > > > > simply setting split=0 in the new Branch() is not enough. > > > > > > > > My question now is: > > > > Why do I have to use BranchOld() when my class contains TStrings? > > > > > > > > My system: PowerBook running LinuxPPC 2000, root 3.01/02. > > > > > > > > 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 : Tue Jan 01 2002 - 17:50:57 MET