[ROOT] TNamed inheritance and Trees

From: Steve Lautenschlager (srlautenschlager@hotmail.com)
Date: Tue Apr 11 2000 - 09:57:39 MEST


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