Re: [ROOT] TObjArray and I/O

From: Rene Brun (brun@pcbrun.cern.ch)
Date: Thu Sep 16 2004 - 21:30:23 MEST


Thomas,

Please read my mails carefully.
Read the doc of TCollection::Write and replace
        col.Write("Test");	
by
        col.Write("Test",TObject::kSingleKey);

By default, each element of a collection is streamed as a separate key

Rene Brun


On 
Thu, 16 Sep 2004, Thomas 
Bretz wrote:

> Hi Rene,
> 
> I cannot reproduce what you say... I'm using root 3.10/02 (g++ 3.3.1) 
> and the output of test2.C (attached) is
> 1
> 1078907948
> 
> the output of test3.C is
> 16
> 1
> 1078907948
>   *** Break *** segmentation violation
> 
> the output of test4.C is
> 16
> 1
> [*] <see below>
> 65536
> 0
> 
> Can you tell me what's wrong with this example? We have tried all three 
> collections as (valid!) pointers as data-members in our classes (using a 
> '+' in the #pragma statement). Writing the class to a file seems to 
> work. Reading it always results in arrays with 0 size.
> 
> Best regards,
> Thomas.
> 
> [*]
> Error in <TBuffer::ReadObject>: object tag too large, I/O buffer corrupted
> Warning in <TExMap::Remove>: key 1701016576 not found at 350
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=1701016576 pointer will be 0
> Warning in <TExMap::Remove>: key 100 not found at 100
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=100 pointer will be 0
> Warning in <TExMap::Remove>: key 24 not found at 24
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=24 pointer will be 0
> Warning in <TExMap::Remove>: key 16777216 not found at 154
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=16777216 pointer will be 0
> Warning in <TExMap::Remove>: key 48 not found at 48
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=48 pointer will be 0
> Warning in <TExMap::Remove>: key 112 not found at 112
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=112 pointer will be 0
> Warning in <TExMap::Remove>: key 360 not found at 360
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=360 pointer will be 0
> Warning in <TExMap::Remove>: key 675365036 not found at 14
> Warning in <TBuffer::CheckObject>: reference to unavailable class 
> TObject, point
> ers of this type will be 0
> Warning in <TExMap::Remove>: key 692994048 not found at 385
> Warning in <TBuffer::CheckObject>: reference to unavailable class 
> TObject, point
> ers of this type will be 0
> Warning in <TExMap::Remove>: key 25625 not found at 475
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=25625 pointer will be 0
> Warning in <TExMap::Remove>: key 184 not found at 184
> Warning in <TBuffer::CheckObject>: reference to object of unavailable 
> class TObj
> ect, offset=184 pointer will be 0
> Warning in <TExMap::Remove>: key 954728713 not found at 6
> Warning in <TBuffer::CheckObject>: reference to unavailable class 
> TObject, point
> ers of this type will be 0
> Error in <TBuffer::CheckByteCount>: object of class TObjArray read too 
> many byte
> s: 85 instead of 22
> Warning in <TBuffer::CheckByteCount>: TObjArray::Streamer() not in sync 
> with dat
> a on file, fix Streamer()
> 
> 
> Rene Brun wrote:
> > Thomas,
> > 
> > Your question is not clear. Do you mean "can" or "cannot" ?
> > 
> > Any collection of objects can be written to a file
> > (see TCollection::Write method). You have two ways
> >   -single key (all objects are serialized in teh same buffer)
> >   -one key per object in the collection (default).
> > 
> > Obviously, each object in the collection must be streamable (have a 
> > dictionary).
> > 
> > See for example this session:
> > root [4] TObjArray a(3)
> > root [5] a.Add(hpx)
> > root [6] a.Add(hprof)
> > root [7] a.Add(hpxpy)
> > root [8] TFile f("junk.root","recreate")
> > root [9] a.Write("a")
> > (Int_t)4644
> > root [10] .ls
> > TFile**         junk.root
> >  TFile*         junk.root
> >   KEY: TH2F     a;3     py vs px
> >   KEY: TProfile a;2     Profile of pz versus px
> >   KEY: TH1F     a;1     This is the px distribution
> > root [11] a.Write("as",TObject::kSingleKey)
> > (Int_t)4381
> > root [12] .ls
> > TFile**         junk.root
> >  TFile*         junk.root
> >   KEY: TH2F     a;3     py vs px
> >   KEY: TProfile a;2     Profile of pz versus px
> >   KEY: TH1F     a;1     This is the px distribution
> >   KEY: TObjArray        as;1    An array of objects
> > 
> > 
> > Rene Brun
> > 
> > On Wed, 15 
> > Sep 
> > 2004, Thomas Bretz wrote:
> > 
> > 
> >>Hi,
> >>
> >>is it possible that a TObjArray cannot be written to a file? I cannot 
> >>find anything about this in the documenation...
> >>
> >>Thomas.
> >>
> > 
> > 
> 



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:09 MET