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