Re: List of (TClonesArray *) in an object added to a TTree

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Apr 05 1999 - 16:18:06 MEST


Hi Olivier,
When you give the address of the pointer in TTree::Branch,
you must make sure that at this address, you will always have
a valid pointer pointing to each of your TClonesArray.
In your case, you use the same address for all TClonesArrays.
I suggest that in your Run class, you have two arrays
  TClonesArray *fRClusters[7];
  TClonesArray *fPhiClusters[7];

then when you create a branch, you do:
  gRun->GetTree()->Branch(RName[i],&fRClusters[i],bufsize,split);
Note that it will make sense to have this code directly in a member
function of your Run class.

Rene Brun


On Wed, 31 Mar 1999, Olivier Dormond wrote:

> Rene Brun wrote:
> > 
> > Olivier,
> > I suggest you build a TList of TClonesArray to be more general.
> > You can then loop on the TList to create a branch for each
> > TClonesArray.
> > There is an example in the ATLFast package.
> > 
> > Rene Brun
> 
> Hi Rooters,
> 
> I've try to solve my problems with your indication but without success.
> So this time I'll try to be as much clear as I can. Here is what I'm
> trying to do:
> 
> Program's layout:
> - run object containing pointers to the current event, to a TTree and
>   some more informations.
> - FZReader object used to fill the current event with data from a
>   zebra file.
> - event object containing all the reconstructed data which is mainly
>   the clusters informations. This is implemented, now, by a TList of
>   TClonesArray * containing cluster objects.
> - cluster objects storing clusters information.
> 
> Program's execution sequence:
> - A run object is created which create a TTree and an event object.
> - The tree is created by issuing a
> 
>   fTree->Branch("event", "LVxEvent", &fEvent, 32000, 1);
> 
>   in a method of the run object and than a similar method is called
>   on the event object which does the following things:
> 
>   void LVxEvent::MakeBranch( Text_t *name, Int_t bufsize, Int_t
> splitlevel )
>   {
>     TIter nextR(&fgRClusters), nextPhi(&fgPhiClusters);
>     TClonesArray *clusters;
>     int i=0;
>     Text_t *RName[] = {"R0","R1","R2","R3","R4","R5","R6"};
>     Text_t *PhiName[] =
> {"Phi0","Phi1","Phi2","Phi3","Phi4","Phi5","Phi6"};
> 
>     while( clusters = (TClonesArray *)nextR() )
>       gRun->GetTree()->Branch(RName[i++], &clusters, bufsize,
> splitlevel);
>     i=0;
>     while( clusters = (TClonesArray *)nextPhi() )
>       gRun->GetTree()->Branch(PhiName[i++], &clusters, bufsize,
> splitlevel);
>   }
> 
>   N.B. I also tried clusters instead of &clusters.
> 
> - A loop is done on the fz file in which the next event is read. The
>   cluster maker is than run and a short display of the resulting data
>   is printed out. Next the tree is filled (by fTree->Fill();) and at
>   last the event is cleared.
> 
> The program segfault next to the call to the Fill() method. dbx says:
> 
> Segmentation fault in ptrgl.$PTRGL
> [/afs/cern.ch/na49/library.4/ROOT/pro/rs_aix41/root/lib/libRoot.a] at
> 0xd12e3868 ($t1)
> 0xd12e3868 ($PTRGL)    800b0000        lwz   r0,0x0(r11)
> (dbx) where
> ptrgl.$PTRGL() at 0xd12e3868
> Fill__13TBranchClonesFv() at 0xd160ad8c
> Fill__5TTreeFv() at 0xd1401064
> FillTree()(0x204edbd8), line 106 in "LVxRun.cxx"
> unnamed block $b2, line 124 in "LVxMain.cxx"
> main(argc = 3, argv = 0x2ff21f48), line 124 in "LVxMain.cxx"
> 
> I don't see what's wrong in my code. The TTree::Branch(..) method
> documentation says:
> 
>  "clonesaddress is the address of a pointer to a TClonesArray."
> 
> That the case of &clusters but as it's the same for all the branch
> and it becomes invalid on exit of LVxEvent::MakeBranch(..) I've thought
> this might be the cause of my trouble.
> 
> All ideas/comments are welcome!
> 
> Cheers,
> 
> 
> 		Odie
> -- 
> +----------------------------------------------------------------------+
> | Olivier Dormond                 EMail : Olivier.Dormond@iphe.unil.ch |
> | IPHE - BSP - UNIL               WWW   : iphedec2.unil.ch/~odie       |
> | CH-1015 Dorigny                 Phone : (++41 21) 692 3739           |
> | Switzerland                     Fax   : (++41 21) 692 3605           |
> +----------------------------------------------------------------------+
> 



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:31 MET