Re: [ROOT] Problem using new Branch() with TString?

From: cstrato@EUnet.at
Date: Tue Aug 14 2001 - 21:16:53 MEST


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