Re: Named Objects in TClonesArrays

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Apr 14 1999 - 07:58:42 MEST


Hi Norbert,
TClonesArray assumes that the objects in the array have the same length
(clones). You should put a TNamed object there. Replace your derivation
from TNamed by TObject. In general TClonesArray are used when you deal
with a large number of small physics objects. I have doubts that you want
to give a name to each of these objects.

Rene Brun

On Tue, 13 Apr 1999, Norbert Danneberg wrote:

> Hi Rooters,
> 
> when I try to store a named object derived from  TNamed in TTree and
> write this
> Tree to disk, I do not receive the name of the object when I try to read
> it back.
> All other member variables are read in correctly.
> 
> Below is the slightly modified Event sample from the /test directory.
> 
> I changed  Track  so that it is derived from TNamed.
> 
> class Track : public TNamed {
> 
> private:
>    Float_t      fPx;           //X component of the momentum
>    Float_t      fPy;           //Y component of the momentum
>    Float_t      fPz;           //Z component of the momentum
> ....
> }
> 
> During filling a name to each Track is assigned in MainEvent.cxx:
> 
> //  Create and Fill the Track objects
> for (Int_t t = 0; t < ntrack; t++){
>     event->AddTrack(random);
>     Track* MyTrack = (Track*)event->GetTracks()->At(t); // Added Code
>     MyTrack->SetName("N"); //Added Code
> 
> }
> 
> I check after filling if the Name is set correctly:
> 
>  if (write) nb += tree->Fill();  //fill the tree
> 
>  Track* MyTrack = (Track*)event->GetTracks()->At(0);
>  printf("%s\n",MyTrack->GetName());
> 
> this gives the correct Name.
> 
> But the following testmacro gives empty names for  all Track Objects:
> 
> {
> gROOT->Reset();
> f1 = new TFile("Event.root");
> Event* ev=new Event();
> T->SetBranchAddress("event",&ev);
> T->SetBranchStatus("*",1);
> 
> for(Int_t i=0;i<1;i++){
>   T->GetEvent(i);
>   TClonesArray* TrackList = ev->GetTracks();
>   Track* MyTrack = (Track*)TrackList->At(0);
>   MyTrack->Inspect();
> 
>   printf("%s\n",MyTrack->GetName());
> }
> }
> 
> I am sorry but I do not have a clue whats wrong ??
> 
> 
> Thanks, Norbert
> 
> 
> 
> --
> 
> Norbert Danneberg
> 
> ETH Zurich - Institute for Particle Physics
>   Laboratory for Nuclear Physics          Phone.: +41-1-633-2034
>   Hoenggerberg                            Fax.:   +41-1-633-1067
>   CH-8093 Zurich
> 
> 
> ETH Zurich - Institute for Particle Physics
>   Paul Scherrer Institute                 Phone.: +41-56-310-3284
>   CH-5232 Villigen PSI                    Fax.:   +41-56-310-4362
> 
> email: Norbert.Danneberg@psi.ch
> 
> 



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