Re: [ROOT] TClonesArray gathering

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Mar 12 2004 - 09:25:38 MET


Hi Ben,

It is not obvious to follow your explanations without looking at a concrete
piece of code ::)
I have the feeling that you do not fill the TClonesArray correctly. You must
call the constructor of the class in the TClonesArray (as shown in
$ROOTSYS/test/Event.cxx).
Could you send the shortest possible file reproducing the problem?

Rene brun



Ben Kilminster wrote:
> 
> I am trying to figure out how to fill a Tree in one object with a
> TClonesArray from another object.
> My code is crashing when I try to do the copying.
> 
> In my main class, I define a tree with a branch, with a TClonesArray of
> objects in it:
> 
> class MainSim
> {
>    TTree* SimTree;
>    TClonesArray* CloneXftpixel;
>    xft2Lpixel* xftpixelB;
> ...
> }
> 
> MainSim::MainSim()
> {
>      CloneXftpixel = new TClonesArray("xft2Lpixel");
>      SimTree = new TTree("T","SimTree");
>      SimTree->Branch("xft2Lpixel",&CloneXftpixel,32000,2);
>      ...
> }
> 
> I then fill the TClonesArray in another class, like :
> 
> class FinderChip
> {    TClonesArray* CloneXftpixel;
>       xft2Lpixel*  xft2pixelF;
>       int iPixel;
> ...
> }
> 
> FinderChip::FillBlock()
> {
>         iPixel++;
>         xft2pixelF = new ((*CloneXftpixel)[iPixel]) xft2Lpixel;
>         xft2pixelF->Chip =  this->COT_chip;
>                         ...
> }
> 
> Now, I want to fill the SimTree with the array of xft2Lpixels from the
> FinderChip object.
> But I have many FinderChip objects, with any number of xft2pixelF
> objects,  so I have to gather them by checking the iPixel counter for
> each FinderChip :
> 
> MainSim::FillTree()
> {
>         CloneXftpixel->Clear()
> 
>      for(int nbrd=0; nbrd<8; nbrd++) {
>        for (int nchp=0;nchp<8;nchp++) {
>          int nPix =
> XFTSystem->finderCrate[crate]->FinderBoard2_4Elements[nbrd]-
>  >finderChipElements[nchp]->iPixel;
>         if (nPix > 0)
>          CloneXftpixel =
> (TClonesArray*)XFTSystem->finderCrate[crate]-
>  >FinderBoard2_4Elements[nbrd]->finderChipElements[nchp]->CloneXftpixel-
>  >Clone();
>                 }
>         }
> 
>         SimTree->Fill()
> 
> This compiles and runs, but crashes filling the CloneXftpixel in the
> FillTree() method.
> 
> Instead of the if (nPix>0), I also tried to do this with a loop as in
> the At() statement :
>          for (int i=0; i < nPix; nPix++) {
>            xftpixelB =
> (xft2Lpixel*)XFTSystem->finderCrate[crate]-
>  >FinderBoard2_4Elements[nbrd]->finderChipElements[nchp]->CloneXftpixel-
>  >At(i);
>           }
> 
> but this crashed in the same place.
> 
> What is the correct way to do this ?
> 
> Cheers,
> Ben



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:06 MET