Re: Several tree /split=1 problems

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Mar 18 1999 - 09:00:15 MET


Hi Eddy,
Please read URL:

  http://root.cern.ch/root/HowtoWriteTree.html

in particular the section listing the limitations of the split mode
 "Making a tree with many branches"

Rene Brun


Eddy Offermann wrote:
> 
> Dear ROOT-ers
> 
> I have several problems when creating a tree in a ROOT file . I have tried to
> summarize it in a small example (showit) for which the files are listed below.
> 
> Problems:
> 1) using TArrayI ... in my class with split = 1
> 
>    When running my example with split = 0, I get the following output:
>    Creating a tree: ./showit
> 
>    ******************************************************************************
>    *Tree    :T         : tree                                                   *
>    *Entries :     1000 : Total  Size =     46888 bytes  File  Size =      23488 *
>    *        :          : Tree compression factor =   2.04                       *
>    ******************************************************************************
>    *Branch  :Super     : Super                                                  *
>    *Entries :     1000 : Total  Size =     45800 bytes  File Size  =      22400 *
>    *Baskets :      200 : Basket Size =       256 bytes  Compression=   2.04     *
>    *............................................................................*
> 
>    Reading the tree: ./showit -r
> 
>    nrEntries: 1000
>    fVar1                    5           var1
>    fVar2.*fArray            1           Array of fN 32 bit integers
>    fVar2.fN                 2           Number of array elements
>    fUniqueID                0           object unique identifier
>    fBits                    50331648    bit field status word
>    var2[0] = 1  var2[1] = 2
>    fVar1                    5           var1
>    fVar2.*fArray            1           Array of fN 32 bit integers
>    fVar2.fN                 2           Number of array elements
>    fUniqueID                0           object unique identifier
>    fBits                    50331648    bit field status word
>    var2[0] = 1  var2[1] = 2
> 
>    Conclusion: This looks fine !!
>    ----------
> 
>    Changing it to split = 1 gives for both cases the following:
> 
>    Creating a tree: ./showit
>    ******************************************************************************
>    *Tree    :T         : tree                                                   *
>    *Entries :     1000 : Total  Size =     21800 bytes  File  Size =       7637 *
>    *        :          : Tree compression factor =   3.16                       *
>    ******************************************************************************
>    *Branch  :Super     : Super                                                  *
>    *Entries :     1000 : BranchObject (see below)                               *
>    *............................................................................*
>    *Branch  :fVar1     : fVar1                                                  *
>    *Entries :     1000 : Total  Size =      5060 bytes  File Size  =       1580 *
>    *Baskets :       20 : Basket Size =       256 bytes  Compression=   3.20     *
>    *............................................................................*
>    *Branch  :fVar2.fN  : fVar2.fN                                               *
>    *Entries :     1000 : Total  Size =      5292 bytes  File Size  =       1722 *
>    *Baskets :       21 : Basket Size =       256 bytes  Compression=   3.07     *
>    *............................................................................*
>    *Branch  :fUniqueID : fUniqueID                                              *
>    *Entries :     1000 : Total  Size =      5313 bytes  File Size  =       1680 *
>    *Baskets :       21 : Basket Size =       256 bytes  Compression=   3.16     *
>    *............................................................................*
>    *Branch  :fBits     : fBits                                                  *
>    *Entries :     1000 : Total  Size =      5060 bytes  File Size  =       1580 *
>    *Baskets :       20 : Basket Size =       256 bytes  Compression=   3.20     *
>    *............................................................................*
> 
>    Reading the tree: ./showit -r
>    nrEntries: 1000
>    fVar1                    5           var1
>    fVar2.*fArray            ->0         Array of fN 32 bit integers
>    fVar2.fN                 2           Number of array elements
>    fUniqueID                0           object unique identifier
>    fBits                    50331648    bit field status word
> 
>     *** Break *** segmentation violation
>     Abort (core dumped)
> 
>    Conclusion: fVar2.fArray was not stored ???? Why not ?
>    ----------
> 
> 2) Large baskets in split = 0 and 1
> 
>    I increase the buffer size to 64000 ad get in split=0 the following:
>   ******************************************************************************
>   *Tree    :T         : tree                                                   *
>   *Entries :     1000 : Total  Size =      2155 bytes  File  Size =       2155 *
>   *        :          : Tree compression factor =   1.00                       *
>   ******************************************************************************
>   *Branch  :Super     : Super                                                  *
>   *Entries :     1000 : Total  Size =         0 bytes  File Size  =          0 *
>   *Baskets :        0 : Basket Size =     64000 bytes  Compression=   1.00     *
>   *............................................................................*
> 
>   When reading back, the file seems to contain all the data, so just
>   the tree->Print() gives the wrong info ??
> 
> 3) enum in split = 1
>    I changed the members of MyClass to:
>    Int_t    fVar1; //var1
>    TArrayI  fVar2; //var2
>    ENumbers fVar3; //var3
> 
>   with
>   typedef enum { kZero, kOne } ENumbers;
> 
>   reading and writing in split = 0 works fine but in split =1 fVar3 is
>   completely ignored just like fVar2.fArray
> 
> Best Regards,
> Eddy Offermann
> 
> *************************************************************************
> Below are my Makefile, MyClass_LinkDef.h, main.C, MyClass.C and MyClass.h
> 
> ------------------- Makefile ----------
> ObjSuf        = o
> SrcSuf        = C
> DllSuf        = so
> 
> ROOTLIBS      = -L$(ROOTSYS)/lib -lRint -lNew -lBase -lCint -lClib -lCont -lFunc \
>                 -lGraf -lGraf3d -lHist -lHtml -lMatrix -lMeta -lMinuit -lNet \
>                 -lPostscript -lProof -lTree -lUnix -lZip
> ROOTGLIBS     = -lGpad -lGui -lGX11 -lX3d
> 
> # Solaris
> CC            = CC
> CCFLAGS       = -O -KPIC -I./ -I$(ROOTSYS)/include
> LD            = CC
> LDFLAGS       = -g
> SOFLAGS       = -G
> 
> LIBS          = $(ROOTLIBS) $(ROOTGLIBS) -L/usr/openwin/lib \
>                 -L/usr/ccs/lib -lXpm -lX11 -lm -lgen -ldl -lsocket -lsunmath
> 
> OBJS          = main.$(ObjSuf) MyClass.$(ObjSuf) MyClassDict.$(ObjSuf)
> 
> PROGRAMS      = showit
> 
> all:            $(PROGRAMS)
> 
> $(PROGRAMS):    $(OBJS)
>                 $(LD) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAMS)
>                 @echo "$(RENROOT) done"
> 
> clean:
>                 @rm -f $(OBJS) core \
>                 MyClassDict.$(SrcSuf) MyClassDict.h
> 
> .SUFFIXES: .$(SrcSuf)
> 
> ###
> 
> main.o: MyClass.h
> MyClassDict.$(SrcSuf): MyClass.h
>         @echo "Generating MyClass dictionary"
>         @rootcint -f MyClassDict.$(SrcSuf) -c MyClass.h MyClass_LinkDef.h
> 
> .$(SrcSuf).$(ObjSuf):
>         $(CC) $(CCFLAGS) -c $<
> 
> ------------------- 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
> 
> ------------------- main.C ----------
> 
> #include "TROOT.h"
> #include "TFile.h"
> #include "TTree.h"
> #include "TBranch.h"
> 
> #include "MyClass.h"
> 
> int main(int argc, char **argv)
> {
>   TROOT simple("simple","Example of creation of a tree");
> 
>   // Just give any kind of argument and the file is read
>   // otherwise written.
> 
>   Int_t read  = 0;
>   Int_t write = 0;
>   if (argc > 1) read  = 1;
>   else          write = 1;
> 
>   TFile *hfile;
>   if (write) hfile = new TFile("example","RECREATE","Demo ROOT file");
>   else       hfile = new TFile("example");
> 
>   MyClass *c = new MyClass();
>   Int_t nrEntries = 0;
>   Int_t nrBytes = 0;
> 
>   if (write)
>   {
>     Int_t array[2];
>     array[0] = 1;
>     array[1] = 2;
>     c->SetVar1(5);
>     c->SetVar2(2,array);
> 
>     Int_t split = 0;
>     Int_t bsize = 256;
>     TTree *tree = new TTree("T","tree");
>     TBranch *br = tree->Branch("Super","MyClass",&c,bsize,split);
> 
>     for (Int_t i = 0; i < 1000; i++)
>     {
>        nrBytes += tree->Fill();
>        nrEntries++;
>     }
>     hfile->Write();
>     tree->Print();
>   }
>   else
>   {
>     TTree  *tree = (TTree*) hfile->Get("T");
>     TBranch *br = tree->GetBranch("Super");
>     br->SetAddress(&c);
>     Int_t nrEntries = (Int_t) tree->GetEntries();
>     printf("nrEntries: %d\n",nrEntries);
>     for (Int_t i = 0; i < 1000; i++)
>     {
>       nrBytes += tree->GetEvent(i);
>       if (i ==0 || i==999)
>       {
>         c->Dump();
>         TArrayI var2 = c->GetVar2();
>         printf("var2[0] = %d  var2[1] = %d\n",var2[0],var2[1]);
> 
>       }
>     }
>   }
> 
>   hfile->Close();
> 
>   return 0;
> }
> 
> ------------------- MyClass.C ----------
> 
> #include <MyClass.h>
> 
> ClassImp(MyClass)
> 
> //______________________________________________________________________________
> MyClass::MyClass()
> {
>   fVar1 = 0;
>   fVar2.Set(0);
> }
> 
> //______________________________________________________________________________
> MyClass::~MyClass()
> {
> }
> 
> ------------------- MyClass.h ----------
> 
> #ifndef ROOT_MyClass
> #define ROOT_MyClass
> 
> #include <TObject.h>
> #include <TArrayI.h>
> 
> class MyClass : public TObject {
> public:
> 
>   Int_t   fVar1; //var1
>   TArrayI fVar2; //var2
> 
>   MyClass();
>   virtual ~MyClass();
> 
>   Int_t GetVar1() { return fVar1;}
>   TArrayI& GetVar2() { return fVar2;}
>   void SetVar1(Int_t val) { fVar1 = val;}
>   void SetVar2(Int_t nr, Int_t *val) { fVar2.Set(nr,val);}
> 
>   ClassDef(MyClass,1)  //MyClass structure
> };
> 
> #endif



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:30 MET