Re: [ROOT] array of TClonesArray

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Oct 04 2001 - 11:37:40 MEST


Hi Pierpaolo,

Currently, I do not support an array of pointers to TClonesArray when
splitting the branches (this could be added). I propose the following
turn around.

 - Declare your member pBLtrack[36 to be non persistent with:
   TClonesArray *pBLtrack[36];      //! 36 identical clonesarray 

 - Create your top level branch as you do now.
 - Make a loop on your 36 elements, creating a branch for each, giving
   the address of pBLtrack[i] (may be you need a member function in Event
   returning the address.

Rene Brun


Pierpaolo Righini wrote:
> 
> Hi Rene,
> 
> many thanks and sorry to disturb you again but unfortunately i suspetc I'm
> forced to put the array (or
> TList) in the top class, I mean I cannot use the constructor
> T.Branch(list) because my tree should contain an event class (similarly to
> the example in $ROOTSYS/test/Event.*) so that I have to use something like
> TBranch *branch = tree->Branch("event", "Event", &event,bsize, split);
> and then it is inside the Event.h that I tried to put the array of
> clonesarray:
> 
> class Event : public TObject{
>    Int_t nmu;
>    Int_t nTTtrk;
>    Int_t nCStrk;
>    Int_t nSStrk;
>    Int_t nBLtrk[36];
>    EventHeader evthdr;
>    TClonesArray *pTTtrack;          // three different clonesarray
>    TClonesArray *pCStrack;          // of tracks (use different
>    TClonesArray *pSStrack;          // classes)
>    TClonesArray *pBLtrack[36];      // 36 identical clonesarray (same
>                                     // class)
> 
>    static TClonesArray *gTTtrack;
>    static TClonesArray *gCStrack;
>    static TClonesArray *gSStrack;
>    static TClonesArray *gBLtrack[36];
> ......................................
> 
> while in Event.cpp:
> 
> TClonesArray *Event::gTTtrack = 0;
> TClonesArray *Event::gCStrack = 0;
> TClonesArray *Event::gSStrack = 0;
> TClonesArray *Event::gBLtrack[36] = {0,0,0,......,0;
> Event::Event(){
> .....................................
> for (Int_t i=0;i<36;i++) {
>   if (!gBLtrack[i]) gBLtrack[i] = new TClonesArray("BLtrack");
>      pBLtrack[i]=gBLtrack[i];
>      nBLtrk[i]=0;
> }
> ......
> }
> void Event::AddBLtrack(i,.....){
>     TClonesArray &bl_tr=*pBLtrack[i];
>     new(bl_tr[nBLtrk[i]++]) BLtrack(.......)
> }
> ..........................
> void Event::Clear(Option_t *option){
>   for (Int_t i=0;i<36;i++) {
>      pBLtrack[i]->Clear(option);
>      nBLtrk[i]=0;
>   }
> }
> ..........................
> void Event::Reset(Option_t *option){
>  for (Int_t i=0;i<36;i++) {
>     delete gBLtrack[i]; gBLtrack[i] = 0;
>   }
> 
> }
> 
> In such a way the program runs and ends normally but then the
> clonesarray pBLtrack[i] results to be empty. I was not able to use the
> TList in these conditions as well.
> 
> On Mon, 1 Oct 2001, Rene Brun wrote:
> 
> > Hi Pierpaolo,
> >
> > I suggest the following:
> >
> > {
> >    TList *list = new TList();
> >    for (Int_t i=0;i<36;i++) {
> >       TClonesArray *carray = new TClonesArray("myclass",...);
> >       char name[32];
> >       sprintf(name,"ftracks%d",i);
> >       carray->SetName(name);
> >       list->Add(carray);
> >    }
> >
> >    TTree T("T","..");
> >    T.Branch(list);
> >    T.Print();
> > }
> >
> > This special Branch constructor takes a dynamic TList as input.
> > The TList may contain TClonesArray or any other object.
> > It is better than hardwired pointers or arrays in the top level class.
> >
> > Rene Brun
> >
> > Pierpaolo Righini wrote:
> > >
> > > Hello,
> > > I have to write a root tree with events containing, each one, many tracks
> > > that are identical for what concerns the informations contained (i.e. the
> > > class definition is the same for all of them) but that should be tagged
> > > differently because they came from different part of the apparatus. So
> > > I would like to see them splitted using for example the TTree viewer.
> > >
> > > I tried to do an array of TClonesArray with
> > >
> > > TClonesArray *ftrack[36];
> > >
> > > instead of
> > >
> > > TClonesArray *f1track;
> > > TClonesArray *f2track;
> > > .......................
> > > TClonesArray *f36track;
> > >
> > > in my Event class, but it seems not to work properly. Is there the chance
> > > to do that? Many thanks in any cases.
> > >
> > >    Pierpaolo
> >
> 
>    Pierpaolo



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:02 MET