Re: [ROOT] Object Tree stored in a TTree?

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Jul 13 2000 - 12:39:58 MEST


Hi Greg,

Since your event structure has relations everywhere, it does not make sense
to use the split mode because the branches would not be independent.
In addition, I repeat that a TClonesArray cannot have objects with variable
length (ie not with embedded dynamic structures). Replace your TClonesArray
by TObjArray and use the non-split mode.

We are considering extensions of TClonesArray to support variable lists
of pointers to other arrays. Hope to get this working for the end of this year.

Rene Brun

Greg Novak wrote:
> 
> I'm trying to figure out how to get my data structure stored in a
> TTree.  It'd be nice if I could also easily plot all my variables using
> the TTree->Draw() method, but that part is negotiable.  The problem is
> that my data structure amounts to a tree of objects and not all of them
> seem to make it into the TTree.
> 
> I have a data sructure encoding an event that contains a TClonesArray of
> tracks.  The Track object in turn includes at TClonesArray of detectors
> that were involved in constructing the track.  The TTree seems to get the
> first TClonesArray (of tracks) but does not get the TClonesArray buried
> inside the Track object.  Here are simplified versions of my objects:
> 
> class Event : TObject {
>         Int_t EventID;
>         TClonesArray *track;
> }
> class Track : TObject {
>         Float_t angle;
>         TClonesArray *detector;
> }
> class Detector : TObject {
>         Float_t x,y;
> }
> 
> I pack them up w/ code that looks something like:
> 
> Event *evt=new Event();
> evt->track = new TClonesArray("Track", 10);
> new( (*track) [0]) Track();
> ((Track *) (*track)[0])->detector = new TClonesArray("Detector", 10);
> new (((Track *) (*track)[0])->detector[0] ) Detector();
> new (((Track *) (*track)[0])->detector[1] ) Detector();
> new( (*track) [1]) Track();
> ((Track *) (*track)[0])->detector = new TClonesArray("Detector", 10);
> new (((Track *) (*track)[1])->detector[0] ) Detector();
> new (((Track *) (*track)[1])->detector[1] ) Detector();
> 
> Sorry, some of those lines are rather dense.  I have wrapper functions so
> that my real code is much prettier.  :-)  Now I compile all this, run the
> code that generates all this information, and write it to a root
> file.  Then I run root interactively and I can do things like:
> data->Draw("EventID");
> data->Draw("track.angle");
> 
> but *not*:
> data->Draw("track.detector.x");
> 
> When I do data->MakeClass("foo"); and then inspect foo.C, I find a
> generated class with data structures like:
> class foo {
>         Int_t EventID;
>         Int_t track_;
>         Int_t track_angle[10];
> }
> I can't seem to get to my information about the detectors, if it's
> stored there at all.
> 
> So, that's my story.  I'm at a loss, I'll really appreciate any help at
> all.
> 
> Thanks!
> Greg



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET