Hi Steve, Your program is OK, but you cannot use the split mode because your event object contains (in TNamed) data members with variable length basic types. See http://root.cern.ch/root/HowtoWriteTree.html "Making a Tree with many branches" Rene Brun Steve Lautenschlager wrote: > > Hello, > > I have written a very basic class which inherits from TNamed. > When creating a TTree, I appear to be setting the name with > myTest->SetName("JunkName"); > > but I can't read it back in from the file with > myTest->GetName(); > > I'm just assuming that the TNamed functions and data members are all > inherited properly and that the default streamer is sufficient here. > > _Should_ this work as I am expecting? Code follows. > > Thanks, > Steve > > #ifndef ROOT_TsTest > #define ROOT_TsTest > //////////////////////////////////////////////////////////////// > // > // file: TsTest.h > // > //////////////////////////////////////////////////////////////// > > #include "TObject.h" > #include "TNamed.h" > #include "TClonesArray.h" > #include "TH1.h" > #include "TMath.h" > > #include <iostream.h> > > class TsTest : public TNamed { > > private: > > public: > TsTest(); > TsTest(Text_t *name, Text_t *title); > virtual ~TsTest(); > > ClassDef(TsTest,1) //Event structure > }; > > #endif > > //////////////////////////////////////////////////////////////// > // > // file: TsTest.cxx > // > //////////////////////////////////////////////////////////////// > #include "TsTest.h" > ClassImp(TsTest) > > //_____________________________________________________________ > TsTest::TsTest() : TNamed() > { > // Default ctor for TsTest > } > > //____________________________________________________________ > TsTest::TsTest(Text_t *name, Text_t *title) : TNamed(name, title) > { > // Ctor > } > > //_____________________________________________________________ > TsTest::~TsTest() > { > // Dtor for TsTest > } > > //////////////////////////////////////////////////////////////// > // > // file: TsTestMain.cxx > // > //////////////////////////////////////////////////////////////// > #include <stdlib.h> > #include <iostream.h> > #include <stdio.h> > > #include "TROOT.h" > #include "TFile.h" > #include "TRandom.h" > #include "TTree.h" > #include "TBranch.h" > #include "TClonesArray.h" > #include "TStopwatch.h" > > #include "TsTest.h" > > //_________________________________________________________________ > int main(int argc, char **argv) > { > TROOT simple("simple","Example of creation of a tree"); > > Int_t nevent = 400; // by default create 400 events > Int_t comp = 1; // by default file is compressed > Int_t split = 1; // by default, split Event in sub branches > Int_t write = 1; // by default the tree is filled > Int_t hfill = 0; // by default histograms are not filled > Int_t read = 0; > Int_t arg4 = 1; > Int_t arg5 = 600; //default number of tracks per event > > if (argc > 1) nevent = atoi(argv[1]); > if (argc > 2) comp = atoi(argv[2]); > if (argc > 3) split = atoi(argv[3]); > if (argc > 4) arg4 = atoi(argv[4]); > if (argc > 5) arg5 = atoi(argv[5]); > if (arg4 == 0) { write = 0; hfill = 0; read = 1;} > if (arg4 == 1) { write = 1; hfill = 0;} > if (arg4 == 10) { write = 0; hfill = 1;} > if (arg4 == 11) { write = 1; hfill = 1;} > if (arg4 == 20) { write = 0; read = 1;} //read sequential > if (arg4 == 25) { write = 0; read = 2;} //read random > > TFile *hfile; > TTree *tree; > TsTest *mytest = new TsTest(); > > // Create a timer object to benchmark this loop > TStopwatch timer; > timer.Start(); > Int_t nb = 0; > Int_t ev; > Int_t bufsize; > Double_t told = 0; > Double_t tnew = 0; > Int_t printev = 100; > if (arg5 < 100) printev = 1000; > if (arg5 < 10) printev = 10000; > > // Read case > if (read) { > hfile = new TFile("Test.root"); > tree = (TTree*)hfile->Get("T"); > TBranch *branch = tree->GetBranch("test"); > branch->SetAddress(&mytest); > Int_t nentries = (Int_t)tree->GetEntries(); > nevent = TMath::Max(nevent,nentries); > if (read == 1) { //read sequential > for (ev = 0; ev < nevent; ev++) { > if (ev%printev == 0) cout<<"event_here1="<<ev<<endl; > nb += tree->GetEntry(ev); //read complete event in memory > cout << mytest->GetName() << endl; > } > } else { //read random > Int_t evrandom; > for (ev = 0; ev < nevent; ev++) { > if (ev%printev == 0) cout<<"event_here2="<<ev<<endl; > evrandom = Int_t(nevent*gRandom->Rndm(1)); > nb += tree->GetEntry(evrandom); //read complete event in memory > const Text_t *name = mytest->GetName(); > cout << name << endl; > > } > } > } else { > // Write case > // Create a new ROOT binary machine independent file. > // Note that this file may contain any kind of ROOT objects, > histograms, > // pictures, graphics objects, detector geometries, tracks, events, > etc.. > // This file is now becoming the current directory. > hfile = new TFile("Test.root","RECREATE","Test ROOT file"); > hfile->SetCompressionLevel(comp); > > // Create histogram to show write_time in function of time > Float_t curtime = -0.5; > Int_t ntime = nevent/printev; > TH1F *htime = new TH1F("htime","Real-Time to write versus > time",ntime,0,ntime); > > // Create a ROOT Tree and one superbranch > TTree *tree = new TTree("T","An example of a ROOT tree"); > tree->SetAutoSave(1000000000); // autosave when 1 Gbyte written > bufsize = 256000; > if (split) bufsize /= 4; > tree->Branch("test", "TsTest", &mytest, bufsize,split); > > for (ev = 0; ev < nevent; ev++) { > if (ev%printev == 0) { > tnew = timer.RealTime(); > printf("event_here3:%d, rtime=%f s\n",ev,tnew-told); > htime->Fill(curtime,tnew-told); > curtime += 1; > told=tnew; > timer.Continue(); > } > > Float_t sigmat, sigmas; > gRandom->Rannor(sigmat,sigmas); > Int_t ntrack = Int_t(arg5 +arg5*sigmat/120.); > Float_t random = gRandom->Rndm(1); > > mytest->SetName("JunkName"); > /* event->SetHeader(ev, 200, 960312, random); > event->SetNseg(Int_t(10*ntrack+20*sigmas)); > event->SetNvertex(1); > event->SetFlag(UInt_t(random+0.5)); > event->SetTemperature(random+20.); > */ > > if (write) nb += tree->Fill(); //fill the tree > > } > if (write) { > hfile->Write(); > tree->Print(); > } > } > > // Stop timer and print results > timer.Stop(); > Float_t mbytes = 0.000001*nb; > Double_t rtime = timer.RealTime(); > Double_t ctime = timer.CpuTime(); > > printf("\n%d events and %d bytes processed.\n",nevent,nb); > printf("RealTime=%f seconds, CpuTime=%f seconds\n",rtime,ctime); > if (read) { > printf("You read %f Mbytes/Realtime seconds\n",mbytes/rtime); > printf("You read %f Mbytes/Cputime seconds\n",mbytes/ctime); > } else { > printf("compression level=%d, split=%d, arg4=%d\n",comp,split,arg4); > printf("You write %f Mbytes/Realtime seconds\n",mbytes/rtime); > printf("You write %f Mbytes/Cputime seconds\n",mbytes/ctime); > } > hfile->Close(); > return 0; > } > ______________________________________________________ > Get Your Private, Free Email at http://www.hotmail.com
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:23 MET