[ROOT] Pure C++ into root.

From: Patrick Murray (pjmurray@ucdavis.edu)
Date: Tue Apr 22 2003 - 00:45:44 MEST


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