Re: [ROOT] Problem with TClonesArray as Branch

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Sep 18 2003 - 15:18:25 MEST


H.-Gerd,

I cannot reproduce your problem.
For example, using the Event example in the $ROOTSYS directory, I can
run the following session:

root [0] gSystem.Load("libEvent")
root [2] Event *event=0
root [3] TFile f("Event.root")
root [4] T.SetBranchAddress("event",&event)
root [5] T.GetEntry(0)
(Int_t)75202
root [6] event->GetTracks()->GetEntries()
(const Int_t)594
root [7] T.GetEntry(1)
(Int_t)76608
root [8] event->GetTracks()->GetEntries()
(const Int_t)605
root [9] T.GetEntry(2)
(Int_t)75514
root [10] event->GetTracks()->GetEntries()
(const Int_t)596

The file Event.root was produced with split=99 with
  Event 100 0 99 1

Note that in the above example, I call T->GetEntry.

If you do not solve the proble, I will need a small x.tar.gz file
with the strict minimum to reproduce the problem.

Rene Brun

"H.-Gerd Rosarius" wrote:
> 
> Hello Rene,
> 
> nice to hear from you that soon!
> 
> Well, in the meantime I solved a part of the problem on my own.
> To answer your question: I did set the branch address, but made
> a mess out of some pointers and addresses of pointers. :o)
> 
> However, a few question marks have been left. Maybe you can help me to
> clear the picture.
> 
> Unlike I wrote in my previous message, I initialised the branch
> before serialising with split-level zero, means:
> 
>   dT->Branch( "myArrayBranch", "TClonesArray", &aBuf, 32000, 0);
> 
> If I do so, TClonesArray::GetEntries() returns the correct amount
> of objects stored in TClonesArray, when reading it back from
> the ROOT file. I can also get objects from TClonesArray and I can
> correctly read data stored inside of the objects.
> That's the functionality I wish to have.
> 
> So far, so good.
> 
> If I initialise the branch with split-level > 0, for example 99,
> TClonesArray::GetEntries() returns always 0 in case of
> reading it back from the file. It seems to loose it's objects?!?
> 
> Does this happen on purpose? What is the reason?
> 
> Thanks in advance for your answer.
> 
>   H.-Gerd Rosarius
> 
> 
> On Thu, 2003-09-18 at 12:11, Rene Brun wrote:
> > H-Gerd,
> >
> > You descrive very well the points 1,2 and 3. But in your point 4,
> > you do not say if you set the branch address. This is mandatory if your class
> > in the TClonesArray contains complex structures
> >
> > Rene Brun
> >
> > "H.-Gerd Rosarius" wrote:
> > >
> > > Hello Rooters,
> > >
> > > I have problems with writing a TClonesArray to a root-file
> > > and my work doesn't look to different from the Event/Track
> > > examples coming with ROOT.
> > >
> > > However, let me describe the situation in detail first.
> > >
> > > 1. I wrote an own class, called WARequest, which serves as a
> > >    kind of data container for different variables of type
> > >    string, map<string,string>, Double_t, etc.
> > >    It is derived from TObject.
> > >    That class includes the ClassDef-/ClassImp-Makros and a
> > >    dictionary-file is generated with rootcint successfully.
> > >
> > > 2. In my main application I have a TClonesArray which is
> > >    filled with n objects of type WARequest. The objects
> > >    in TClonesArray are still fine after filling the array, because
> > >
> > >    WARequest* r = (WARequest*) myClonesArray->At(0);
> > >    cout << r->getValue() << endl;
> > >
> > >    returns a senseful string like "Hello world!" to the console.
> > >
> > > 3. I want to use a TTree that holds a TClonesArray with my
> > >    WARequest-Objects as branch. Therefore I coded (shortened):
> > >
> > >    TClonesArray* aBuf = new TClonesArray( "WARequest", 100 );
> > >
> > >    dT = new TTree( "myTree", "No description" );
> > >    dT->Branch( "myArrayBranch", "TClonesArray", &aBuf, 32000, 99 );
> > >
> > >    and I fill the tree with
> > >
> > >    aBuf = myClonesArray;
> > >    dT->Fill();
> > >
> > >    At this point all objects in TClonesArray are still in
> > >    a fine condition.
> > >
> > > 4. I write the tree and close the file.
> > >
> > > When I read the file, get the tree, open the branch, get an entry
> > > and access the TClonesArray, TClonesArray::GetEntries() returns
> > > the right number of objects inside.
> > > If I take an object from TClonesArray and want to get data from
> > > the object, say again for example
> > >
> > >  WARequest* r = (WARequest*) myClonesArray->At(0);
> > >  cout << r->getValue() << endl;
> > >
> > > the output consists of strange characters.
> > >
> > > It seems the objects in TClonesArray "forget" the values
> > > in their fields.
> > >
> > > What is happening here? Am I doing something wrong? If so, what?
> > >
> > > Thanks for any help.
> > >
> > >   H.-Gerd Rosarius
> > >
> > > Tech: Using ROOT 3.05/03 made from source with g++ 3.0.4, running
> > >       on a Debian Linux box.
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> --
> Dipl.-Betriebsw. (FH) H.-Gerd Rosarius
> Softwareentwickler und Berater            mailto:rosarius@getit.de
> 
> -----
> GETIT - Gesellschaft für Technologie- und Informationstransfer mbH
> 
>                                              Fon: +49.231.9742.298
>                                              Fax: +49.231.9742.356
> 
> Emil-Figge-Straße 76-80                        http://www.getit.de
> 44227 Dortmund                                mailto:info@getit.de



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