Hi Junichi,
see the tar file in attachement.
A few diffs in all files.
You had two main problems
-in MyCLinkDef.h note the "MyClass+" instead of "MyClass"
-in MyC.h note the comment field for member Vect
Rene Brun
On Sat, 19 Jul
2003 Junichi.Tanaka@cern.ch
wrote:
> Hello,
>
> I'd like to write and read the ROOT file,
> which is created by the following codes:
> MyC.h, MyC.cxx, MyCLinkDef.h, simple-write.C, simple-read.C.
> (I use ROOT of v3.05.05 at RH7.3 PC.)
>
> First I made a shared library "libMyC.so" by my Makefile:
> -----
> g++ -O -Wall -fPIC -D_REENTRANT -I/usr/local/root/v3.05.05/include -c MyC.cxx
> rootcint -f MyCDict.cxx -c MyC.h MyCLinkDef.h
> g++ -O -Wall -fPIC -D_REENTRANT -I/usr/local/root/v3.05.05/include -c MyCDict.cxx
> g++ -shared -O MyC.o MyCDict.o -o libMyC.so
> -----
> Then I could run ".x simple-write.C" with no error.
> I could run ".x simple-read.C" with no error
> but the size of vector is always 0.
> How do I modify my codes to get the correct size of vector
> and to access the data stored at the ROOT files?
>
> //
> // MyC.h
> //
> #include "TObject.h"
> #include <vector>
> #include "TLorentzVector.h"
>
> class MyClass : public TObject
> {
> private:
> Int_t m_id;
> std::vector<double> List;
> std::vector<TLorentzVector> Vect;
>
> public:
> MyClass() {};
> virtual ~MyClass() {};
> Int_t GetID() { return m_id; }
> void SetID(Int_t x) { m_id = x; }
>
> void SetList(double x) { List.push_back(x); }
> std::vector<double> * GetList() { return &List; }
> void View() { cout << List.size() << endl; }
>
> void SetP(TLorentzVector &v) { Vect.push_back(TLorentzVector(v)); }
> std::vector<TLorentzVector> * GetPList() { return &Vect; }
> void PView() { cout << Vect.size() << endl; }
>
> ClassDef(MyClass,1)
> };
>
> //
> // MyC.cxx
> //
> #include "MyC.h"
>
> ClassImp(MyClass);
>
> //
> // MyCLinkDef.h
> //
> #ifdef __CINT__
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
> #pragma link C++ class MyClass;
> #pragma link C++ class std::vector<double>;
> #pragma link C++ class std::vector<TLorentzVector>;
> #endif
>
> //
> // simple-write.C
> //
> {
> gSystem.Load("libPhysics.so");
> gSystem.Load("libMyC.so");
> TFile *f = new TFile("simple-class.root","RECREATE");
> TTree *t = new TTree("t","Simple Class");
> MyClass *m = new MyClass();
> // t->Branch("my","MyClass",&m,16000,0);
> t->Branch("my","MyClass",&m);
>
> for (Int_t i=0;i<5;++i) {
> m->SetID(i*2);
> int n = 0;
> for (Int_t j=0;j<i+1;++j) {
> ++n;
> m->SetList(double(i+j)*1.5);
> m->SetP(TLorentzVector(1,2,i,j));
> }
> cout << n << endl;
> t->Fill();
> }
>
> f->Write();
> }
>
> //
> // simple-read.C
> //
> {
> gSystem.Load("libPhysics.so");
> gSystem.Load("libMyC.so");
> TFile *f = new TFile("simple-class.root");
> TTree *t = (TTree*)f->Get("t");
> MyClass *m = new MyClass();
> TBranch *b = t->GetBranch("my");
> b->SetAddress(&m);
>
> Int_t nEnt = t->GetEntries();
> for (Int_t i=0;i<nEnt;++i) {
> b->GetEntry(i);
> cout << i << ": " << m->GetID() << endl;
> m->View();
> cout << m->GetList()->size() << endl;
> m->PView();
> cout << m->GetPList()->size() << endl;
> }
> }
>
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:13 MET