Hi Paolo,
TClonesArray::AddrAt(int) returns a TObject*. Maybe you should specify
that this TObject is actually a Track with a cast :
Track *prova=(Track*) tracks->AddrAt(2);
cheers,
Colin
On Fri, 7 Jul 2000, Paolo MAESTRO wrote:
>
> Hello,
> my problem is the following.
> I have a class Event so defined (just like your example):
>
> ------------------------------
> #ifndef ROOT_Event
> #define ROOT_Event
>
> #include "TObject.h"
> #include "TClonesArray.h"
> #include "TMath.h"
>
> #include <iostream.h>
>
> class TDirectory;
>
>
> class EventHeader {
>
> private:
> Int_t fEvtNum;
> Int_t fRun;
> Int_t fDate;
>
> public:
> EventHeader() : fEvtNum(0), fRun(0), fDate(0) { }
> virtual ~EventHeader() { }
> void Set(Int_t i, Int_t r, Int_t d) { fEvtNum = i; fRun = r; fDate
> = d; }
> Int_t GetEvtNum() const { return fEvtNum; }
> Int_t GetRun() const { return fRun; }
> Int_t GetDate() const { return fDate; }
>
> ClassDef(EventHeader,1) //Event Header
> };
>
> class Track;
>
> class Event : public TObject {
>
> private:
> Int_t necht;
> EventHeader fEvtHdr;
> TClonesArray *fTracks;
>
> static TClonesArray *fgTracks;
>
> public:
> Event();
> virtual ~Event();
> void Clear(Option_t *option ="");
> static void Reset(Option_t *option ="");
> void SetNecht(Int_t n) { necht = n; };
> void SetHeader(Int_t i, Int_t run, Int_t date, Float_t
> random);
> void AddTrack(Float_t energy,Int_t cell,Int_t plane,Int_t
> proj,Int_t status);
> Int_t GetNecht() const { return necht; }
> EventHeader *GetHeader() { return &fEvtHdr; }
> TClonesArray *GetTracks() const { return fTracks; }
>
>
>
> ClassDef(Event,1) //Event structure
> };
>
>
> class Track : public TObject {
>
> private:
> Float_t Echtedep;
> Int_t Echtcell;
> Int_t Echtplane;
> Int_t Echtproj;
> Int_t Echtstatus;
>
>
> public:
> Track() { }
> Track(Float_t energy,Int_t cell,Int_t plane,Int_t proj,Int_t status);
>
> virtual ~Track() { }
> void Stampa() {cout << Echtedep<<endl;};
> Float_t GetEnergy() const { return Echtedep; };
> Float_t GetCell() const { return Echtcell; }
> Float_t GetPlane() const { return Echtplane; }
> Float_t GetProj() const { return Echtproj; }
>
>
> ClassDef(Track,1) //A track segment
> };
>
> #endif
> ----------------------
>
>
> When I use eventa.c to get information from the tree, I would like to
> get each tracks in each event.
> I try with:
> {
> gROOT->Reset();
> gSystem.Load("libEvent.so");
> TFile f("Event.root");
> TTree *T = (TTree*)f.Get("T");
>
> Event *event = new Event();
>
> TClonesArray *tracks=event->GetTracks();
> TBranch *branch=T->GetBranch("event");
> T->SetBranchAddress("event",&event);
>
> Int_t nevent = T->GetEntries();
> Int_t nb = 0;
> for (Int_t i=0;i<nevent;i++)
> {
> nb += T->GetEntry(i);
>
>
> // get data from the second track of the i-event
> Track *prova=tracks->AddrAt(2); //THIS LINE
>
> cout <<prova->GetEnergy()<<endl;
> cout <<prova->GetCell()<<endl;
> cout <<prova->GetPlane()<<endl;
>
> event->Clear();
> }
>
> printf("%d events and %d bytes read.\n",nevent,nb);
>
> f.Close();
> }
>
> ----
> This macro works well when I execute with .x eventa.c. Futhermore when I
>
> try to compile it (out of ROOT,as I would like to do), including all the
>
> required library, the compiler gives the error:
> THIS LINE: type `Track' is not a base type for type `TObject'
>
> Why this behaviour? Are There other methods to extract data from a
> TClonesArray?
> Thank you in advance for your help.
>
> ********************************************
> * Paolo Maestro
> * Istituto Nazionale di Fisica Nucleare
> * INFN - V.Vecchia Livornese,1291
> * 56010 S.Piero a Grado (Pisa) Italy
> * tel : +39-050-880309/245
> * fax : +39-050-880317
> ********************************************
>
>
>
>
>
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET