Re: [ROOT] array of TClonesArray

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed May 21 2003 - 20:54:19 MEST


Hi Tommaso,

Instead of:
     new(&vUp[nozone][contau[nozone]])
     Track(trUp->x(),trUp->y(),trUp->a(),trUp->b(),trUp->pol());
do

     TClonesArray &vupzone = *(vUp[nozone]);
     int count = contau[nozone];
     new(vupzone[count]) 
Track(trUp->x(),trUp->y(),trUp->a(),trUp->b(),trUp->pol());

Your code will be more readable and less error prone.

Rene Brun


On Wed, 21 
May 2003, Tommaso 
Chiarusi wrote:

> Hello.
> I have a script which works under cint.
> I need to convert it into a compiled executable.
> I become aware that cint automatically cures all the C++ venial sins in 
> the code...
> Unfortunately, my g++ compilator feels such sins become as unforgiven.
> 
> I try to cure my mistakens, so I managed to compile,
> But I get Segmentation fault.
> 
> I am quite sure that my problem IS NOT on some include files or 
> libraries which may lack.
> It is a problem of segmentation, so it should concern the usage of  
> pointers.
> 
> The problem is when I try to fill and then read an
> "array of TClonesArray"
> 
> 
> Conceptual sketch:
> Imagine a  detector subdivided into several zones.
> The number of interesting zone is variable, say  "ntotal_zone"
> 
> For each zone I have several tracks.
> So I need to make "ntotal_zone" collection of tracks.
> I decided to collect the tracks of each zone by means of a TClonesArray.
> So, I find myself with an array of TClonesArray.
> 
> In the cint-script I use the following (!uncorrect! but working syntax)
> 
>       TClonesArray *vUp = new TClonesArray[ntotal_zone];
>       TClonesArray *vDown = new TClonesArray[ntotal_zone];
> 
>       int *contau = new int[ntotal_zone];// vectors which counts the 
> number of tracks for each zone
>       int *contad = new int[ntotal_zone];
> 
>       TMatrix *notru = new TMatrix(ntotal_zone,neventUp);
>       TMatrix *notrd = new TMatrix(ntotal_zone,neventDown);
> 
> 
>       for(int in =0;in<ntotal_zone;in++) // initialization of all the 
> TClonesArrays
>     {
>       vUp[in]= new TClonesArray("Track",neventUp);
>       vDown[in]= new TClonesArray("Track",neventDown);
>       contau[in]=0;
>       contad[in]=0;
>     }
> 
> Then when I fill I use the following (whithin a loop on  the  total 
> number of the zones -
> nozone is the number of the currently analysed zone, let's call this 
>  procedure as (p.1) ):
> 
> 
>                   new(vUp[nozone][contau[nozone]])
>                 Track(trUp->x(),trUp->y(),trUp->a(),trUp->b(),trUp->pol());
> 
> 
> Note the array-form of the TClonesArray:
>         vUp[nozone] ....... should give the pointer to a TClonesArray
> vUp[nozone][contau[nozone]]  ....... should  give the component of such 
> pointer
>    
> 
> 
> 
> When trying to convert everithing into a g++ stand-alone executables, I 
> noticed that I was using a unforgiven syntax and I changed it by
> using the following:
> 
>       TClonesArray* *vUp = new TClonesArray*[ntotal_zone];
>       TClonesArray* *vDown = new TClonesArray*[ntotal_zone];
> 
> ... i.e. as a list of pointers to TClonesArray, which are initialized as 
> the same as in the cint-script.
> 
> 
> The filling procedure should remain the same as (p.1). If I do this the 
> compiler prompt out the following errors
> 
> Analisi_match3.C:321: no matching function for call to `Track::operator
> new (unsigned int, TClonesArray &)'
> /home/applicazioni/root/include/TObject.h:153: candidates are: static 
> void *TObject::operator new
> (unsigned int)
> /home/applicazioni/root/include/TObject.h:154:                 static 
> void *TObject::operator new
> (unsigned int, void *)
> 
>  Instead, if I write (note the "&" in the argument of "new()" )
> 
>                   new(&vUp[nozone][contau[nozone]])
>                 Track(trUp->x(),trUp->y(),trUp->a(),trUp->b(),trUp->pol());
> 
> I get the program to compile, but when I start to iterate through the 
> TClonesArray, the program crashes dumping a sementation fault.
> 
> What's wrong?
> 
> My system is  
> 
> Toshiba Satellite 1800 LapTop,
> Linux Mandrake 8.1
> Root Version   3.03/09 18 September 2002
> gcc version 2.96 20000731 (Mandrake Linux 8.1 2.96-0.62mdk)
> 
> Thank you very much
> 
> Tommaso
> 



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:11 MET