inheriting from TClonesArray

From: Jiri Masik (masik@nc25.troja.mff.cuni.cz)
Date: Mon Jun 08 1998 - 14:58:19 MEST


Hello,
	I've defined a class called Tracks which inherits from
TClonesArray. It's a collection of Track objects and extends the
functionality of TClonesArray by jet algorithms, display methods etc.
In my Event class I have pointers to several Tracks objects. The event
class constructor allocates every time new Tracks object via fTracks =
new Tracks(); which is deleted in Event destructor by delete fTracks.
	Everything seems to work fine when I create event object and
add tracks to it. upon deletion of the event object also the Tracks
object and the contents of the collection are destroyed. When I check
in gObjectTable afterwards, there's nothing left from my
Event/Tracks/Track objects. 
	The problem is that when I use tree->GetEvent() to read events
back from a file, there's a memory leak which prevents me from
analysing larger data volumes. there is one Tracks object per event
left in the gObjectTable. When I replace pointer to Tracks object in
the event class by pointer to TClonesArray I don't observe any memory
deallocation problems so I guess the problem comes from my Tracks
class.
	I also tried a scenario similar to the example coming with
Root - to call new Tracks() only first time when event object is
created and call Delete method of TClonesArray when Track objects are
not needed anymore but the behaviour is the same - again Tracks
objects left.
	Please my questions are whether it is ok to put derived
objects from TClonesArray in a TTree and how should I write proper
constructor/destructor for such a class.

thank you in advance for your help.

		Jiri


////////////////////////////////////////////////////////////
class Tracks : public TClonesArray {
private:
  Int_t  fNtrack;

public:
  Tracks();
  Tracks(Int_t size);
  ~Tracks();
  void    AddTrack(Float_t x,Float_t y,Float_t z,Float_t e,Float_t m,Int_t ch);
  Track*  Get(Int_t index);
  void    Print() const;

  ClassDef(Tracks,1)
};


////////////////////////////////////////////////////////////
Tracks::Tracks()
  :TClonesArray("Track",32, kFALSE){
    fNtrack = 0;
}

Tracks::~Tracks(){
  cout << "<T\n";
}

void
Tracks::AddTrack(Float_t x,Float_t y,Float_t z,Float_t e,Float_t m,Int_t ch){
  Tracks &tracks = *this;
  new(tracks[fNtrack++]) Track(x,y,z,e,m,ch);
}



////////////////////////////////////////////////////////////
class Event : public TObject {
  
public:
  Int_t          fNtrack;
  EventHeader    fEvtHdr;
  Tracks        *fTracks;

public:
  Event();
  ~Event();
  void      Clear(Option_t *option ="");
  void      SetHeader(Int_t i, Int_t run, Int_t date, Float_t bm);
  void      AddTrack(Float_t x,Float_t y,Float_t z,Float_t e,Float_t m,Int_t ch);
  EventHeader  *GetHeader() { return &fEvtHdr; }
  Tracks       *GetTracks() { return fTracks; }

  ClassDef(Event,1)  //Event structure
};



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:33 MET