Re: [ROOT] TObjArray and I/O

From: Thomas Bretz (tbretz@astro.uni-wuerzburg.de)
Date: Thu Sep 16 2004 - 10:49:42 MEST


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.
>>
> 
> 


void test2()
{

    {
        TOrdCollection col;
        col.Add(new TNamed("MyObject", ""));
        TFile f("delme.root", "recreate");
        cout << col.GetSize() << endl;
        col.Write("Test");
        f.Close();
    }
    {
        TFile f("delme.root", "read");
        cout << ((TOrdCollection*)f.Get("Test"))->GetSize() << endl;
    }
}



void test3()
{

    {
        TObjArray col;
        col.Add(new TNamed("MyObject", ""));
        TFile f("delme.root", "recreate");
        cout << col.GetSize() << endl;
        cout << col.GetEntries() << endl;
        col.Write("Test");
        f.Close();
    }
    {
        TFile f("delme.root", "read");
        cout << ((TObjArray*)f.Get("Test"))->GetSize() << endl;
        cout << ((TObjArray*)f.Get("Test"))->GetEntries() << endl;
    }
}



void test4()
{

    {
        TObjArray col;
        col.Add(new TNamed("MyObject", ""));
        TFile f("delme.root", "recreate");
        cout << col.GetSize() << endl;
        cout << col.GetEntries() << endl;
        col.Write("Test");
        f.Close();
    }
    {
        TFile f("delme.root", "read");
        TObjArray col2;
        col2.Read("Test");
        cout << col2.GetSize() << endl;
        cout << col2.GetEntries() << endl;
    }
}



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