Re: [ROOT] array of TClonesArray

From: Pierpaolo Righini (Pierpaolo.Righini@roma1.infn.it)
Date: Tue Oct 02 2001 - 19:48:21 MEST


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