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