Re: [ROOT] Pure C++ into root.

From: Rene Brun (Rene.Brun@cern.ch)
Date: Tue Apr 22 2003 - 08:48:36 MEST


Hi Patrick,

You forgot the declaration of SubEventSTL in your myLinkDef.h.
This file should be:

//------------------file myLinkDef.h
#ifdef __CINT__

#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;

#pragma link C++ class EventSTL+;
#pragma link C++ class SubEventSTL+;
#endif

Also note that you can remove the declaration of the obsolete TROOT 
constructor in your main program.

Rene Brun

On Mon, 21 
Apr 2003, Patrick Murray wrote:

> If I have a class made of a hierarchy of classes in pure C++ (ie no
> ClassDef stuff) and I want to put this class into a root tree without
> changing the orginal class, can it be done the with inheritance into a
> root class (ie with ClassDef). Something like:
> 
> #include "TObject.h"
> #include <vector>
> #include "MyC++Class.h"
> 
> class RootClass : public MyC++Class
> {
>  public:
>  RootClas();
>  virtual ~RootClass();
>  ClassDef(RootClass,1)
> };
> 
> also how deep into the hierarchy must I go. I tried tried to modofy one of
> the examples by adding a pure C++ class SubEventSTL and adding a data
> member SEVector which is a vector of SubEventSTL objects. It compiled but
> gave the following errors:
> 
> [pmurray@ccc04 sample]$ ./STL
> UNKNOW type, sopen=SubEventSTL
> Size: 0 - Contents :
>  0 1 2 3 4 5 6 7 8 9here 1:0
> 
>  *** Break *** segmentation violation
>  Generating stack trace...
>  0x401cd7d7 in TUnixSystem::StackTrace(void) + 0x25b from
> /usr/local/lib/root/libCore.so.3.05
>  0x401cc3ce in TUnixSystem::DispatchSignals(ESignals) + 0xb2 from
> /usr/local/lib/root/libCore.so.3.05
>  0x401cb59b in <unknown> from /usr/local/lib/root/libCore.so.3.05
>  0x401cf099 in <unknown> from /usr/local/lib/root/libCore.so.3.05
>  0x40881848 in <unknown> from /lib/i686/libc.so.6
>  0x4019287d in TClass::Streamer(void *, TBuffer &) + 0x21 from
> /usr/local/lib/root/libCore.so.3.05
>  0x401263d4 in TBuffer::StreamObject(void *, TClass *) + 0x24 from
> /usr/local/lib/root/libCore.so.3.05
>  0x40021945 in R__EventSTL_SEVector__FR7TBufferPvi at
> /home/pmurray/sample/STLcint.cxx:154 from EventSTL.so
>  0x401b9f79 in TStreamerInfo::WriteBuffer(TBuffer &, char *, int) + 0x1bc1
> from /usr/local/lib/root/libCore.so.3.05
>  0x407300fb in TBranchElement::FillLeaves(TBuffer &) + 0x34b from
> /usr/local/lib/root/libTree.so.3.05
>  0x4072a92c in TBranch::Fill(void) + 0x214 from
> /usr/local/lib/root/libTree.so.3.05
>  0x4072fd3b in TBranchElement::Fill(void) + 0x117 from
> /usr/local/lib/root/libTree.so.3.05
>  0x40744644 in TTree::Fill(void) + 0x80 from
> /usr/local/lib/root/libTree.so.3.05
>  0x08048cb9 in main + 0x179 from ./STL
>  0x4086f507 in __libc_start_main at
> /usr/src/build/40457-i686/BUILD/glibc-2.2.4/csu/../sysdeps/generic/libc-start.c:129
> from /lib/i686/libc.so.6
>  0x08048a61 in EventSTL::EventSTL(void) + 0x3d from ./STL
> Aborted
> [pmurray@ccc04 sample]$
> 
> Here is the code:
> 
> Thank you for your help,
> 
> Pat Murray
> 
> //....goSTL
> rootcint -f STLcint.cxx -c EventSTL.h myLinkDef.h
> g++ -g -fPIC -I/usr/local/include/root -c STLcint.cxx EventSTL.cxx
> MainSTL.cxx SubEventSTL.cxx
> g++ -g -Wl,-soname,EventSTL.so -shared STLcint.o EventSTL.o SubEventSTL.o
> -o EventSTL.so
> g++ -g -o STL MainSTL.o EventSTL.so -L/usr/local/lib/root \
>     -lCore -lCint -lTree  -lm -ldl -rdynamic
> 
> //------------------file SubEventSTL.h
> 
> #include <vector>
> 
> class SubEventSTL
> {
>  public:
>  SubEventSTL();
>  virtual ~SubEventSTL();
>  void Add(int x);
>  void VI();
>  void Clear();
>  vector<int> B;
> 
> };
> 
> 
> //------------------file SubEventSTL.cxx
> #include "SubEventSTL.h"
> 
> 
> SubEventSTL::SubEventSTL() {
> for (int i=0;i<10;i++)
>   {
>     Add(i);
>     cout << " " << B[i];
>   }
> 
> }
> SubEventSTL::~SubEventSTL() {}
> void SubEventSTL::Add(int x)
> {
>  B.push_back(x);
> }
> 
> void SubEventSTL::Clear()
> {
>  B.clear();
> }
> 
> void SubEventSTL::VI()
> {
>  cout << "Size: " << B.size() << " - Contents : " ;
>  for (int i=0;i<B.size();i++)
>   {
>    cout << " " << B[i];
>   }
>  cout << endl;
> }
> 
> //------------------file EventSTL.h
> #include "TObject.h"
> #include <vector>
> #include "SubEventSTL.h"
> 
> class EventSTL : public TObject
> {
>  public:
>  EventSTL();
>  virtual ~EventSTL();
>  void Electron(Double_t x);
>  void VI();
>  void Clear();
>  vector<Double_t> A;
>  vector<SubEventSTL> SEVector;
>  ClassDef(EventSTL,1)
> };
> 
> //------------------file EventSTL.cxx
> #include "EventSTL.h"
> 
> ClassImp(EventSTL)
> 
> EventSTL::EventSTL() {}
> EventSTL::~EventSTL() {}
> void EventSTL::Electron(Double_t x)
> {
>  A.push_back(x);
>  SubEventSTL se;
>  SEVector.push_back(se);
> }
> 
> void EventSTL::Clear()
> {
>  A.clear();
> }
> 
> void EventSTL::VI()
> {
>  cout << "Size: " << A.size() << " - Contents : " ;
>  for (Int_t i=0;i<A.size();i++)
>   {
>    cout << " " << A[i];
>   }
>  cout << endl;
> }
> 
> //------------------file myLinkDef.h
> #ifdef __CINT__
> 
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
> 
> #pragma link C++ class EventSTL+;
> #endif
> 
> 
> 
> //-----------------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);
>    cout<<"here "<<i<<":"<<j<<endl;
>  }
>   mytree->Fill();
>   CC->VI();
>   CC->Clear();
> }
> 
> mytree->Write();
> mytree->Print();
> 
> return 0;
> 
> }
> 
> 
> 
> 



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:11 MET