Hi Benoit, I have modified your files to get your program running correctly in split mode. Note that the use of a TClonesArray is only efficient if you keep the storage between events (see the static TClonesArray like we do in $ROOTSYS/test/Event). Rene Brun Benoit Revenu wrote: > > dear rooters, > > I'm using root 3-05-07 on linux > > I'm trying to write a TTree containing data in a TFile. When the split is > 0 or 1, the file is big (good sign!). When split >=2, the file is very > small. I verified that the data instance is corerctly filled at each step > of the process but I don't undertstand the behavior with the split. > > In attachements are the tiny files with simple code. > > Any help ? > > -- > > Benoît > > -------------------------------------------------------------------------------- > Name: LinkDef.h > LinkDef.h Type: Plain Text (TEXT/PLAIN) > Encoding: BASE64 > > Name: main.cc > main.cc Type: Plain Text (TEXT/PLAIN) > Encoding: BASE64 > > Name: test.cc > test.cc Type: Plain Text (TEXT/PLAIN) > Encoding: BASE64 > > Name: test.h > test.h Type: Plain Text (TEXT/PLAIN) > Encoding: BASE64 #include "test.h" #include <fstream> #include <TFile.h> #include <TTree.h> #define NEVTS 15 int main() { int bufsize, split = 99; TFile * file = new TFile("toto.root","RECREATE","toto"); TTree * tree = new TTree("tree","testtree"); Test * br = new Test(); bufsize = 256000; if (split) bufsize /= 4; TBranch * b = tree->Branch("Tests","Test",&br,bufsize,split); Test * test = new Test(); data * pdata; int nbytes = 0; for( int i=1;i<=NEVTS;i++ ) { test->Set(i); for( int j=1;j<=NDATA;j++ ) { data dt(sin(double(i*j))); test->Add(dt); } *br = *test; /* test for( int k=0;k<NDATA;k++ ) { pdata = (data*)((*(br->ftcl))[k]); cout << "write->" << pdata->val << endl; } */ nbytes += tree->Fill(); cout << "tree : " << nbytes << endl; // test->Clear(); // br->Clear(); } tree->Print(); file->Write(); file->ls(); delete test; delete br; delete tree; delete file; } /** @file SdEvent.cc @author Benoit Revenu @brief this file implements the quantities defined in SdEvent.h */ #include "test.h" #include <string> #include <sstream> #include <fstream> ClassImp(data) ClassImp(Test) ClassImp(Toto) TClonesArray *Toto::fgtcl = 0; Toto::Toto() { count=0; if (!fgtcl) fgtcl = new TClonesArray("data",NDATA); ftcl = fgtcl; } #ifndef _TEST_H_ #define _TEST_H_ #include <string> #include <vector> #include <iostream> #include "TROOT.h" #include "TObject.h" #include "TClonesArray.h" using namespace std; class data : public TObject { public: data(double d=-1) {val=d;} virtual ~data(){} double val; ClassDef(data,1) }; #define NDATA 1000 class Toto : public TObject { public: Toto(); TClonesArray *ftcl; static TClonesArray *fgtcl; void Clear() { ftcl->Clear(); count = 0; } void Add(const data& dt) { TClonesArray &bla = *ftcl; new(bla[count++]) data(dt); } int count; ClassDef(Toto,1) }; class Test : public Toto { public: Test(int truc=10){machin=truc;} virtual ~Test(){} int machin; void Set(int i) {machin=i;} ClassDef(Test,1) }; #endif
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET