Hi, I've tried to follow the exemples given with root to create a class event, and it seems i can't do it properly. I f anyone could explain me what's wrong i would be very gratefull. File IEvent.H:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #ifndef IEVENT_H #define IEVENT_H #include <TObject.h> #include <TClonesArray.h> class IParticle; class IEvent: public TObject{ protected : UInt_t fMult; //Multiplicity of particles TClonesArray *fParticles; //->Array of Particles in the event static TClonesArray* fgParticles; public : IEvent(); ~IEvent(); UInt_t GetMult()const{return fMult;}; TClonesArray* GetParticles()const{return fParticles;}; IParticle * AddParticle(UInt_t z,UInt_t a,Double_t energy,Double_t theta,Double_t phi); virtual void Clear(Option_t *option=""); ClassDef(IEvent,1) // Event class; }; class IParticle: public TObject{ protected: UInt_t fZ; UInt_t fA; Double_t fEnergy; Double_t fTheta; Double_t fPhi; IEvent *fEvent; // Event the particle belongs to public: IParticle(); IParticle(UInt_t z,UInt_t a,Double_t energy,Double_t theta,Double_t phi,IEvent*event=0); ~IParticle(); UInt_t GetZ()const{return fZ;}; UInt_t GetA()const{return fA;}; Double_t GetEnergy()const{return fEnergy;}; Double_t GetTheta()const{return fTheta;}; Double_t GetPhi()const{return fPhi;}; ClassDef(IParticle,1) // Particle class } ; #endif >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> File IEvent.cxx : <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #include "IEvent.H" #define MAX_PART 120 ClassImp(IParticle) ClassImp(IEvent) TClonesArray *IEvent::fgParticles=0; //_____________________________________________________________ IEvent::IEvent(){ if (!fgParticles) fgParticles = new TClonesArray("IParticle",MAX_PART); fParticles = fgParticles; fMult=0; } //_____________________________________________________________ IEvent::~IEvent() { Clear(); } //_____________________________________________________________ void IEvent::Clear(Option_t *option){ fParticles->Clear(); fMult=0; } //_____________________________________________________________ IParticle* IEvent::AddParticle(UInt_t z,UInt_t a,Double_t energy,Double_t theta,Double_t phi){ TClonesArray &particles=*fParticles; IParticle*part=new(particles[fMult++]) IParticle(z,a,energy,theta,phi,this); return part; } //_____________________________________________________________ IParticle::IParticle(){ fZ=fA=0; fEnergy=fTheta=fPhi=0; fEvent=0; } //_____________________________________________________________ IParticle::IParticle(UInt_t z,UInt_t a,Double_t energy,Double_t theta,Double_t phi,IEvent*event){ fZ=z; fA=a; fEnergy=energy; fTheta=theta; fPhi=phi; fEvent=event; } //_____________________________________________________________ IParticle::~IParticle(){ fEvent=0; } >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I create the tree with : #include <TFile.h> #include <TTree.h> #include "IEvent.H" int main(){ TFile*f=new TFile("IEventTree.root","recreate"); TTree*tree=new TTree("Tree","IEvent Tree"); IEvent *event=new IEvent(); tree->Branch("IEventBranch","IEvent",&event,32000,2); event->AddParticle(2,4,90,3,110); event->AddParticle(3,7,50,62,10); event->AddParticle(24,50,10,30,54); event->AddParticle(1,1,200,4,79); tree->Fill(); event->Clear(); event->AddParticle(12,21,30,7,24); event->AddParticle(23,52,23,12,130); event->AddParticle(5,11,60,22,10); event->AddParticle(82,161,5,10,7); event->AddParticle(32,64,21,5,35); event->AddParticle(2,4,120,78,110); event->AddParticle(1,3,105,31,23); event->AddParticle(1,1,168,3,21); tree->Fill(); event->Clear(); event->AddParticle(12,21,30,7,24); event->AddParticle(23,52,23,12,130); event->AddParticle(1,1,200,4,79); event->AddParticle(24,50,10,30,54); event->AddParticle(5,11,60,22,10); event->AddParticle(82,5,10,7,32); event->AddParticle(32,2,21,5,35); event->AddParticle(1,1,200,4,79); event->AddParticle(24,50,10,30,54); event->AddParticle(2,4,120,78,110); event->AddParticle(1,3,105,31,23); event->AddParticle(1,1,168,3,21); tree->Fill(); tree->Write(); f->Close(); } Then in CINT i can open the .L libIEvent.so TFile*f=new TFile("IEventTree.root","read"); TTree*tree=(TTree*)f->Get("Tree"); IEvent *event=new IEvent(); tree->SetBranchAddress("IEventBranch",&event); tree->GetEntry(2); i get a segmentation fault error *** Break *** segmentation violation Generating stack trace... 0x40196943 in TUnixSystem::DispatchSignals(ESignals) + 0xb5 from /usr/local/root/lib/libCore.so 0x40195960 in <unknown> from /usr/local/root/lib/libCore.so 0x40199a2a in <unknown> from /usr/local/root/lib/libCore.so 0x40d29e55 in <unknown> from /lib/i686/libpthread.so.0 tho i can use tree->Show() ======> EVENT:2 IEventBranch = NULL fUniqueID = 0 fBits = 50331648 fMult = 12 fParticles = 12 fParticles.fUniqueID = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 fParticles.fBits = 50331648, 50331648, 50331648, 50331648, 50331648, 50331648, 50331648, 50331648, 50331648, 50331648 fParticles.fZ = 12, 23, 1, 24, 5, 82, 32, 1, 24, 2 fParticles.fA = 21, 52, 1, 50, 11, 5, 2, 1, 50, 4 fParticles.fEnergy = 30, 23, 200, 10, 60, 10, 21, 200, 10, 120 fParticles.fTheta = 7, 12, 4, 30, 22, 7, 5, 4, 30, 78 fParticles.fPhi = 24, 130, 79, 54, 10, 32, 35, 79, 54, 110 fParticles.fEvent = (IEvent*)8f134b8, (IEvent*)8f134b8, (IEvent*)8f134b8, (IEvent*)8f134b8, (IEvent*)0, (IEvent*)0, (IEvent*)0, (IEvent*)0, (IEvent*)0, (IEvent*)0 the event seems more or less correctly filled so i'm puzzled, what did i do wrong ? thanks in advance Alexis Mignon PS : i use the 3.05/00 version of root on a linux platform (g++-3.2) -- Alexis Mignon GANIL Bd Henri Becqurel 14076 CAEN Cedex 5 France tel: +(33) (0)231454680 e-mail : mignon@ganil.fr
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:08 MET