Re: [ROOT] Seg.Vol. reading the class derived from abstract class

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon May 06 2002 - 18:39:30 MEST


Hi Ruben,

Unfortunately you do not mention which version you are using.
This problem had been fixed on November 19 2001 and you should not see this
problem if you use the current PRO version 3.02/07
or the dev version 3.03

Rene Brun

Ruben Shahoian wrote:
> 
> Hello,
> I have a question about the root IO: does the TTree supposed to read/write
> the object which is derived from fully abstract class?
> 
> Here are details of my problem:
> 
> I need to write/read using the TTree the TClonesArray of the
> object. One of the ancestor classes of this object is fully abstract.
> (provides some general data members/methods for derived classes)
> 
> class NaTrack :
> public NaRecParticle {
>  // ..
>    virtual NaCluster1D* GetCluster(Int_t i)   const=0; // !!!
>   //this method is abstract, depends on derived track version
> 
>  protected:
>   Int_t  fNClusters;                     //  Number of contributing clusters
>   Int_t  fClusters[kMaxClusters];        //  Clusters Id's (in the station)
>   //
>   ClassDef(NaTrack,1)                    //  NA60 Reconstructed Base Track Class
> };
> 
> Surely, the derived class (NaPCMuon) which goes into the TClonesArray implements its
> virtual NaCluster1D* GetCluster(Int_t i).
> 
> class NaPCMuon :
> public NaTrack
> {
> //....
>  virtual NaCluster1D* GetCluster(Int_t i)   const;
> //..
> };
> 
> The following happens at IO stage:
> 1) When I write the tree, close it and read it back in the same root
> session, everything works well.
> 
> 2) But if I quit and start new root
> session, I get seg.vol. reading the branch containing mentioned TClonesArray.
> 
> Running with the .T and gDebug=1 gives:
> 1) in the same root session:
> ...
> ReadBufferClones, class:NaPCMuon, name=NaTrack, fType[0]=0, offset=0,  TStreamerBase, bufpos=132, nc=2
> ReadBufferClones, class:NaTrack, name=NaRecParticle, fType[0]=0, offset=0,  TStreamerBase, bufpos=132, nc=2
> ReadBufferClones, class:NaRecParticle, name=TObject, fType[0]=66, offset=0,  TStreamerBase, bufpos=132, nc=2
> ReadBufferClones, class:NaRecParticle, name=fPXYZ, fType[1]=25, offset=12,  TStreamerBasicType, bufpos=152, nc=2
> ....
> // !!!! This part corresponds to fully abstract ancestor:
> ReadBufferClones, class:NaTrack, name=fNClusters, fType[1]=3, offset=64,  TStreamerBasicType, bufpos=250, nc=2
> ReadBufferClones, class:NaTrack, name=fClusters, fType[2]=23, offset=68,  TStreamerBasicType, bufpos=258, nc=2
> // !!!!
> ...
> ReadBufferClones, class:NaPCMuon, name=fParsUncorr, fType[1]=25, offset=168,  TStreamerBasicType, bufpos=450, nc=2
> 
> Works fine!
> 
> 2) If I read the tree in the new root session, it first rebuilds the TStreamerInfo:
> 
> ====>Rebuilding TStreamerInfo for class: NaPCMuon, version: 1
> 
> ====>Rebuilding TStreamerInfo for class: NaTrack, version: 1
> 
> ====>Rebuilding TStreamerInfo for class: NaRecParticle, version: 1
> 
> StreamerInfo for class: NaRecParticle, version=1
>   BASE          TObject         offset=  0 type=66 Basic ROOT object
>   Float_t       fPXYZ[3]        offset= 12 type=25 Px,Py,Pz of the Particle
>   Float_t       fVXYZ[3]        offset= 24 type=25 x,y,z of the Particle beginning
>   Float_t       fMass           offset= 36 type= 5 Imposed mass
>   Float_t       fPt             offset= 40 type= 5 Particle Pt
>   Float_t       fYLab           offset= 44 type= 5 Lab Rapidity
>   Char_t        fCharge         offset= 48 type= 1 Particle charge
>   Float_t       fChi2           offset= 52 type= 5 Particle quality
>   Int_t         fNumber         offset= 56 type= 3 Index in the Particles list
>   Int_t         fVertexId       offset= 60 type= 3 Id of the vertex to which it is attached
>    i= 0, TObject         type= 66, offset=  0, len=1, method=0
>    i= 1, fPXYZ           type= 25, offset= 12, len=3, method=0
>    i= 2, fVXYZ           type= 25, offset= 24, len=3, method=0
>    i= 3, fMass           type=  5, offset= 36, len=1, method=0
>    i= 4, fPt             type=  5, offset= 40, len=1, method=0
>    i= 5, fYLab           type=  5, offset= 44, len=1, method=0
>    i= 6, fCharge         type=  1, offset= 48, len=1, method=0
>    i= 7, fChi2           type=  5, offset= 52, len=1, method=0
>    i= 8, fNumber         type=  3, offset= 56, len=1, method=0
>    i= 9, fVertexId       type=  3, offset= 60, len=1, method=0
> 
> StreamerInfo for class: NaTrack, version=1
>   BASE          NaRecParticle   offset=  0 type= 0 NA60 Reconstructed Particle Class
>   Int_t         fNClusters      offset=99999 type= 3 Number of contributing clusters      !!!! Wrong offsets
>   Int_t         fClusters[24]   offset=99999 type=23 Clusters Id's (in the station)
>    i= 0, NaRecParticle   type=  0, offset=  0, len=1, method=157383136
>    i= 1, fNClusters      type=  3, offset=99999, len=1, method=0
>    i= 2, fClusters       type= 23, offset=99999, len=24, method=0
> 
> StreamerInfo for class: NaPCMuon, version=1
>   BASE          NaTrack         offset=  0 type= 0 NA60 Track Class
>   Float_t       fParsUncorr[6]  offset=168 type=25 ax,ay,bx,by,pfit,pcomp of Forward Space Track
>   Int_t         fSextantId      offset=200 type= 3 Sextant ID
>   Float_t       fSlopErr2       offset=204 type= 5 RRR
>    i= 0, NaTrack         type=  0, offset=  0, len=1, method=157415504
>    i= 1, fParsUncorr     type= 25, offset=168, len=6, method=0
>    i= 2, fSextantId      type=  3, offset=200, len=1, method=0
>    i= 3, fSlopErr2       type=  5, offset=204, len=1, method=0
> ReadBufferClones, class:NaPCMuon, name=NaTrack, fType[0]=0, offset=0,  TStreamerBase, bufpos=132, nc=2
> ReadBufferClones, class:NaTrack, name=NaRecParticle, fType[0]=0, offset=0,  TStreamerBase, bufpos=132, nc=2
> ReadBufferClones, class:NaRecParticle, name=TObject, fType[0]=66, offset=0,  TStreamerBase, bufpos=132, nc=2
> ReadBufferClones, class:NaRecParticle, name=fPXYZ, fType[1]=25, offset=12,  TStreamerBasicType, bufpos=152, nc=2
> ReadBufferClones, class:NaRecParticle, name=fVXYZ, fType[2]=25, offset=24,  TStreamerBasicType, bufpos=176, nc=2
> ReadBufferClones, class:NaRecParticle, name=fMass, fType[3]=5, offset=36,  TStreamerBasicType, bufpos=200, nc=2
> ReadBufferClones, class:NaRecParticle, name=fPt, fType[4]=5, offset=40,  TStreamerBasicType, bufpos=208, nc=2
> ReadBufferClones, class:NaRecParticle, name=fYLab, fType[5]=5, offset=44,  TStreamerBasicType, bufpos=216, nc=2
> ReadBufferClones, class:NaRecParticle, name=fCharge, fType[6]=1, offset=48,  TStreamerBasicType, bufpos=224, nc=2
> ReadBufferClones, class:NaRecParticle, name=fChi2, fType[7]=5, offset=52,  TStreamerBasicType, bufpos=226, nc=2
> ReadBufferClones, class:NaRecParticle, name=fNumber, fType[8]=3, offset=56,  TStreamerBasicType, bufpos=234, nc=2
> ReadBufferClones, class:NaRecParticle, name=fVertexId, fType[9]=3, offset=60,  TStreamerBasicType, bufpos=242, nc=2
> ReadBufferClones, class:NaTrack, name=fNClusters, fType[1]=3, offset=99999,  TStreamerBasicType, bufpos=250, nc=2
> 
>  *** Break *** segmentation violation
> Root > Function readrec() busy flag cleared
> 
> As one can see, all data members of the abstract class have offset = kMissing !
> The fact that it happens on when TStreamerInfo::BuildOld() methos is used makes
> me to think that this is a bug. Is that so?
> 
> Best regards,
>   Ruben



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:52 MET