[ROOT] TClonesArray

From: Paolo MAESTRO (paolo.maestro@pi.infn.it)
Date: Fri Jul 07 2000 - 21:25:49 MEST


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