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