Re: Simple tree

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Nov 19 1999 - 18:30:10 MET


Thanks to the many people who reacted to my mail yesterday.
I forgot to include the example of main program.
It is included below.

Rene Brun


//-----------------------file Amain.cxx
#include "TROOT.h"
#include "TFile.h"
#include "TTree.h"
#include "TRandom.h"
#include "A.h"
      
TROOT simple("simple","trees");
 
int main()
 {

   Int_t split = 1;
   Int_t bsize = 32000;


// Create a ROOT Tree

   A *a = new A; 
   TFile f("A.root","recreate");
   TTree *tree = new TTree("T","An example of ROOT tree");
   tree->Branch("aa","A",&a,bsize,split);
   for (Int_t i=0;i<10000;i++) {
      a->fA = gRandom->Rndm();
      a->fB = gRandom->Gaus(0,1);
      tree->Fill();
   }
   tree->Print();
   tree->Write();
   return 0;
 }



Rene Brun wrote:
> 
> Hi Maurizio,
> I have already posted several times the following example.
> I have slightly extended it to show how
> to create a Tree in a compiled program and read it with
> two small macros. Your short example cannot work because you
> try to create a branch with a pointer to a class not derived
> from TObject.
> 
> You will find below the following files:
>  A.h         the definition file for a small class A
>  A.cxx       the corresponding implementation file
>  ALinkDef.h  the file containing the rootcint directives
>  AMain.cxx   the main program to create the Tree
>  ARead.C     a small macro to loop on the file A.root generated by Amain
>  Asimple.C   a small macro to plot one Tree variable
>  goA         a small script showing how to run rootcint,link,etc on Linux
> 
> In this short example, I also illustrate how to create a shared lib.
> You should look at the examples in $ROOTSYS/test/MainEvent.cxx for a more
> elaborated Tree example.
> I also suggest you read the nice tutorials developped by the FNAL Root
> support team at URL: http://www-pat.fnal.gov/root/
> 
> Rene Brun
> 
> I suggest the following steps using Root version 2.23:
>  1- execute goA
>  2- run A
>  3- execute the following Root interactive session
>     Root > .x ARead.C
>  4- execute the following Root interactive session
>     Root > .x Asimple.C
> 
> #--------------file goA
> rootcint -f Acint.cxx -c A.h ALinkDef.h
> g++ -g -fPIC -I$ROOTSYS/include -c Acint.cxx A.cxx Amain.cxx
> g++ -g -Wl,-soname,A.so -shared Acint.o A.o -o A.so
> g++ -g -o A Amain.o A.so -L$ROOTSYS/lib \
>     -lCore -lCint -lTree  -lm -ldl -rdynamic
> 
> //------------------------------ A.h
> #ifndef __A_HH__
> #define __A_HH__
> #include "TObject.h"
> 
> class A : public TObject {
> public:
> 
>   A();
>   virtual ~A();
> 
>   Float_t fA;
>   Float_t fB;
> 
>   ClassDef(A,1)  //My small class example
> };
> 
> #endif
> //------------------------------- A.cxx
> #include "A.h"
> 
>  ClassImp(A)
> 
> A::A() {
>   fA = 1;
>   fB = 2;
> }
> 
> A::~A() {
> }
> 
> //---------------------------file ALinkDef.h
> 
> #ifdef __CINT__
> 
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
> 
> #pragma link C++ class A;
> #endif
> 
> //------------------------------macro ARead.C
> void Aread()
> {
>    //example of macro to read the Tree generated in Amain.cxx
> 
>    gSystem->Load("A");
>    TFile *f = new TFile("A.root");
>    TTree *T = (TTree*)f->Get("T");
>    A *a=0;
>    T->SetBranchAddress("aa",&a);
> 
>    Int_t nentries = (Int_t)T->GetEntries();
>    for (Int_t i=0;i<nentries;i++) {
>       T->GetEntry(i);
>       if (a->fA >0.001) continue;
>       printf("Print entry:%d\n",i);
>       a->Dump();
>    }
> }
> 
> //------------------------------macro Asimple.C
> {
>    // small macro plotting the distribution of variable fB
>    gROOT->Reset();
>    gSystem->Load("A");
>    TFile *f = new TFile("A.root");
>    T->Draw("fB","fA<0.5");
> }
> 
> On Thu, 18 Nov 1999, Maurizio Ungaro wrote:
> 
> > I'm trying to build a very simple tree
> > with my class A this way:
> >
> >
> > class  A
> > {
> >  public:
> >  Int_t a;
> >  Int_t b;
> > };
> >
> >
> >
> > A *CC;
> >
> >
> > TROOT simple("simple","trees");
> >
> >  main()
> >  {
> >
> >    Int_t split = 0;
> >    Int_t bsize = 32000;
> >
> >
> > // Create a ROOT Tree
> >
> > TTree *tree = new TTree("T","An example of ROOT tree");
> > tree->Branch("aa","A",&CC,bsize,split);
> >
> >
> >    return 0;
> >  }
> >
> >
> > and I'm getting the message
> >
> > Error in <TTree::BranchObject>: Cannot find class:A
> >
> >
> > What am I doing wrong?
> >



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:43 MET