Hi Paul,
As you indicate, this is the same problem as the one reported by Wouter.
See my previous mail on this topic.
Rene Brun
On Wed, 20 Nov 2002, Paul Balm wrote:
> Hello,
>
> I have seen this problem as well in root 3.03/09 on Linux RH6, in a
> slightly different situation.
> I have a class called TVertex, deriving from TVector3 (the vertex
> position). TVertex contains a TLorentzVector, which in turn also
> contains a TVector3. So I have a class (TVertex) deriving from TVector3
> and, through TLorentzVector, also containing a TVector3.
> I have spent quite a bit of time trying to isolate this problem, but
> eventually gave up. I have appended my macros to read and write someting
> from/to a file below, perhaps Wouter can compare and see what he is
> doing differently.
> I don't think the specific implementation of the TVertex class is
> relevant (other than what I explained above), but you could have a look
> at it at http://www.nikhef.nl/~r45/root
>
> Thanks,
>
> Paul
>
> ---------------------------------------
> void write_tree() {
>
> TFile tf("test_lv.root","recreate");
> TTree* tt = new TTree("a_tree","see if I can write this tree");
> TClonesArray* clarr = new TClonesArray("seed::TVertex",4);
> tt->Branch("thearray",&clarr, 32000, 0); // case C in TTree doc
>
> seed::TVertex* vtx=new ((*clarr)[0]) seed::TVertex();
> seed::TTrack trk;
> trk.SetPxPyPzE(1,2,3,4);
> vtx->SetParentTrack(trk);
> cout << "storing a vertex with a mas of "<<vtx->GetMass() << endl;
> cout << "momentum: ("<<vtx->GetLorentzVector()->Px()<< ", "
> << vtx->GetLorentzVector().Py() << ", "
> << vtx->GetLorentzVector().Pz() << " )"<<endl;
> cout << "array has "<< clarr.GetEntries()<<" entries"<<endl;
>
> tt->Fill();
> tt->Write();
>
> tf.Close();
>
> }
>
>
> void read_tree() {
>
> TFile tf2("test_lv.root");
>
> TTree* tt = tf2->Get("a_tree");
> TClonesArray* clarr = new TClonesArray("seed::TVertex",5);
> cout << "Got TClonesArray at "<<clarr<<endl;
> tt->SetBranchAddress("thearray",&clarr);
>
> cout << "Got TClonesArray at "<<clarr<<endl;
> cout << "It has "<<clarr->GetEntries()<<" entries. Getting first tree
> entry now"<<endl;
> tt->GetEntry(0);
> cout << "Got it. Array now has "<<clarr->GetEntries()<<" entries."<<endl;
>
> seed::TVertex* vtx2;
> if(clarr) vtx2 = (seed::TVertex*) (*clarr)[0];
> else {
> cout << "Got null for clarr"<<endl;
> return;
> }
>
> cout << "got vertex at "<<vtx2<<endl;
> cout << "this vertex has a mass of "<<vtx2->GetMass()<<endl;
> cout << "momentum: ("<<vtx2.GetLorentzVector().Px()<< ", "
> << vtx2.GetLorentzVector().Py() << ", "
> << vtx2.GetLorentzVector().Pz() << " )"<<endl;
> }
>
>
> > -----Original Message-----
> > From: owner-roottalk@pcroot.cern.ch
> > [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Wouter Hulsbergen
> > Sent: Tuesday, November 19, 2002 7:06 PM
> > To: roottalk@pcroot.cern.ch
> > Subject: [ROOT] problem in streaming TClonesArray in 3.03/9
> >
> >
> >
> > Dear developers,
> >
> > I have an event class which contains a TClonesArray of objects of type B,
> > derived from type A. Type B also contains an object of type A:
> >
> > class A : public TObject
> > {
> > }
> >
> > class B : public A
> > {
> > private:
> > A _anA ;
> > }
> >
> > class Event
> > {
> > private:
> > TClonesArray* theAs ;
> > TClonesArray* theBs ;
> > }
> >
> > Processing the tree with tree->GetEvent(i) in a macro in interactive root,
> > I found something strange: The TClonesArray `theAs' and `theBs' are
> > properly filled, except for one thing: The branches containing the
> > elements `B::_anA' are all empty (zero).
> >
> > If I use the TBrowser to browse through the elements `B::_anA', they are
> > not zero, but instead take the values that are given to the corresponding
> > elements in B itself (derived from A). So something is really mixed
> > up.
> >
> > I am sure that the elements are properly set before the ClonesArray is
> > streamed. However, I cannot check that the TClonesArray is properly
> > written to file, since I do not know how to implement a private Streamer
> > in 3.03/09: The Streamer that I have written is not called.
> >
> > What could be wrong?
> >
> > Thanks and best regards,
> > Wouter
> >
> >
>
>
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:20 MET