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