Hi Christian, The correct output of your test program should be: Filling tree ****************************************************************************** *Tree :stuff : MyClass entries * *Entries : 10 : Total = 0 bytes File Size = 0 * * : : Tree compression factor = 1.00 * ****************************************************************************** *Branch :MyClass * *Entries : 10 : BranchElement (see below) * *............................................................................* *Br 0 :TObject : * *Entries : 10 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 1 :fA : * *Entries : 10 : Total Size= 0 bytes File Size = 0 * *Baskets : 0 : Basket Size= 64000 bytes Compression= 1.00 * *............................................................................* *Br 2 :fS : * *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 In version 3, TArray objects are not split (does not make too much sense). Same for TString objects. Could you start from the CVS version? I fixed a problem connected with TArray objects in split mode a few weeks ago. Rene Brun On Tue, 14 Aug 2001, cstrato@EUnet.at wrote: > 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