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