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

From: Pasha Murat (630)840-8237@169G ((630)840-8237@169G)
Date: Wed Jul 12 2000 - 17:02:42 MEST


if you write your tree out in non-split mode, TTree:MakeClass
would produce correct prototype for the analysis macro such that 
you would be using plain C++ w/o any shortcuts in the analysis code.
In this case TTree::Draw would have to be sacrificed with.

-best, pasha


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