Re: Dynamic tree ROOT example with STL

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Nov 24 1999 - 15:52:27 MET


Hi Maurizio,
You fill find below your code slightly modified and a small script
(Linux)
to run it. I join the following files:
 - goSTL  a short script to generate the shared libs, etc
 - EventSTL.h  example of class using STL
 - EventSTL.cxx the implementation
 - EventSTLLinkDef.h
 - MainSTL.cxx  example of batch main program
 - STLw.C example of Root macro to write the Tree interactively
 - STLr.C example of Root macro to read the tree interactively

Note that when a class contains STL objects, you cannot use the split
mode for the branch supporting this class.

Rene Brun

//-----------------file goSTL
rootcint -f STLcint.cxx -c EventSTL.h EventSTLLinkDef.h
g++ -g -fPIC -I$ROOTSYS/include -c STLcint.cxx EventSTL.cxx MainSTL.cxx
g++ -g -Wl,-soname,EventSTL.so -shared STLcint.o EventSTL.o -o
EventSTL.so 
g++ -g -o STL MainSTL.o EventSTL.so -L$ROOTSYS/lib \
    -lCore -lCint -lTree  -lm -ldl -rdynamic


//-----------------file EventSTL.h
#include "TObject.h"
#include <vector>

class EventSTL : public TObject 
{
 public:
 EventSTL();
 virtual ~EventSTL();
 Electron(Double_t x);
 VI();
 Clear();
 vector<double> A;           //<<----------------- lenght if elements
may vary
 ClassDef(EventSTL,1) 
};


//-----------------file EventSTL.cxx
#include "EventSTL.h"

ClassImp(EventSTL)

EventSTL::EventSTL() {}
EventSTL::~EventSTL() {}
EventSTL::Electron(Double_t x) 
{
 A.push_back(x);            //<<----------------- Here I put stuff in A
}

EventSTL::Clear() 
{
 A.clear();                 //<<----------------- Remove from memory A
}

EventSTL::VI()            //<<----------------- This to see A while the
                          //                      code is running. I'm
                          //                      seeing the right
things 
{
 cout << "Size: " << A.size() << " - Contents : " ;
 for (Int_t i=0;i<A.size();i++)
  {
   cout << " " << A[i];
  }
 cout << endl;
}

//-----------------file MainSTL.cxx
#include <iostream>

#include "TROOT.h"
#include "TFile.h"
#include "TTree.h"
#include "EventSTL.h"


EventSTL *CC = new EventSTL;

TROOT Mauri("Bos_to_Root","Bos Banks to Root file conversion");
 
main()
{

TFile *myfile;
myfile = new TFile("STL.root","RECREATE","TTree Dynamic ROOT file");

TTree *mytree = new TTree("T","My tree");
mytree->Branch("abc","EventSTL",&CC,16000,0);

for (Int_t i=0;i<10;++i)
{
 for (Int_t j=0;j<i;++j)
 {
  CC->Electron(i);
 } 
  mytree->Fill(); 
  CC->VI();
  CC->Clear();
}
 
mytree->Write();
mytree->Print();

return 0;

}
//-----------------file STLw.C
{
   gSystem->Load("EventSTL");
   TFile myfile("STL.root","RECREATE","TTree Dynamic ROOT file");

   EventSTL *CC = new EventSTL;
   TTree *mytree = new TTree("T","My tree");
   mytree->Branch("abc","EventSTL",&CC,16000,0);

   for (Int_t i=0;i<20;++i) {
      for (Int_t j=0;j<i;++j) {
         CC->Electron(i);
      } 
      mytree->Fill(); 
      CC->VI();
      CC->Clear();
   }
 
   mytree->Write();
   mytree->Print();
}


//-----------------file STLr.C
{
   gSystem->Load("EventSTL");
   TFile myfile("STL.root");

   EventSTL *CC = 0;
   TTree *T = (TTree*)myfile.Get("T");
   T->SetBranchAddress("abc",&CC);

   T->GetEntry(15);
   CC->VI();
}

Maurizio Ungaro wrote:
> 
> Hi Rene,
> thanks to your help I manage to write the code,
> but here's a question I think can be of interest
> for everybody: I want a dynamic tree, id est I tried the following
> code, which compiled and run but doesn't fill the tree.
> 
> //--------------------------A.h
> #include "TObject.h"
> #include <vector>
> 
> class Clas_event : public TObject
> {
>  public:
>  Clas_event();
>  virtual ~Clas_event();
>  Electron(Double_t x);
>  VI();
>  Clear();
>  vector<double> A;           <<----------------- lenght if elements may vary
>  ClassDef(Clas_event,1)
> };
> 
> //------------------------A.cxx
> #include "A.h"
> 
> ClassImp(Clas_event)
> 
> Clas_event::Clas_event() {}
> Clas_event::~Clas_event() {}
> Clas_event::Electron(Double_t x)
> {
>  A.push_back(x);            <<----------------- Here I put stuff in A
> }
> 
> Clas_event::Clear()
> {
>  A.clear();                 <<----------------- Remove from memory A
> }
> 
> Clas_event::VI()            <<----------------- This to see A while the
>                                                 code is running. I'm
>                                                 seeing the right things
> {
>  cout << "Size: " << A.size() << " - Contents : " ;
>  for (Int_t i=0;i<A.size();i++)
>   {
>    cout << " " << A[i];
>   }
>  cout << endl;
> }
> 
> //-----------------------AMain.cxx
> #include <iostream>
> using namespace std;
> 
> #include "TROOT.h"
> #include "TFile.h"
> #include "TObject.h"
> #include "TTree.h"
> #include "TBranch.h"
> #include "A.h"
> 
> Clas_event *CC = new Clas_event;
> 
> TROOT Mauri("Bos_to_Root","Bos Banks to Root file conversion");
> 
> main()
> {
> 
> TFile *myfile;
> myfile = new TFile("file.root","RECREATE","TTree Dynamic ROOT file");
> 
> TTree *mytree = new TTree("T","My tree");
> mytree->Branch("abcBranch","Clas_event",&CC);
> 
> for (Int_t i=0;i<10;++i)
> {
>  for (Int_t j=0;j<i;++j)
>  {
>   CC->Electron(i);
>  }
>   mytree->Fill();
>   CC->VI();
>   CC->Clear();
> }
> 
> mytree->Write();
> mytree->Print();
> 
> return 0;
> 
> }
> 
> Mauri



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