Re: [ROOT] Automatic Scheme Eveolution

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Wed Mar 06 2002 - 16:57:06 MET


Hi Thomas,

  if you used purely generated streamers it is very likely that the
automatic schema evolution streamers will be able to read the old files.
Just try it. Add a + in the linkdef behind the class name and try to
read some old files. If this fails, or if your classes were written via
a custom streamer, do:

- in LinkDef.h add '-' behind class name (you want to use a custom
  streamer)
- cut and paste the Streamer() code from the dictionary file and place
  it in your class implementation file
- in the Streamer() add code like this:

//______________________________________________________________________________
void TH3::Streamer(TBuffer &R__b)
{
   // Stream an object of class TH3.

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 2) {  // use now automatic schema evolution
         TH3::Class()->ReadBuffer(R__b, this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TH1::Streamer(R__b);
      TAtt3D::Streamer(R__b);
      R__b.CheckByteCount(R__s, R__c, TH3::IsA());
      //====end of old versions
      
   } else {
      TH3::Class()->WriteBuffer(R__b,this);  // write with new mechanism
   }
}

   notice the Class()->ReadBuffer() and Class()->WriteBuffer().


Cheers, Fons.




On Wed, 2002-03-06 at 13:57, Thomas Bretz wrote:
> Hi Rene,
> 
> let's clarify the situation a bit more:
> We introduced the class using root 2.25/? without any '+' or '-' or
> similar in the LinkDef file. And we produced some files. Then we moved
> to root 3.02/06 again without any additional sign in the LinkDef file,
> and we produced again some files and were able to read the old created
> files. Now we want first to 'add the plus in the LinkDef file' and in
> the future we may want to change the class definition (eg. adding a new
> data member). What do we have to do when we want still to be able to
> read the old created files. Is it enough to add the '+' or may this
> result in some incompatibilities?
> 
> Thomas.
> 
> > Clarification. The text in the documentation that you are quoting refers
> > to the process of moving from old Root versions to the version 3.
> > If you had always been using the option "+" in LinkDef.h, things should be
> > totally automatic and schema evolution is supported by default.
> > As soon as version 3 is used with option "+", Root I/O will be able to
> > read evolutive versions of your classes automatically.
> > 
> > > from: http://root.cern.ch/root/SchemaEvolution.html
> > > ------------------------
> > > How to use the new system
> > >
> > > We will distinguish the following cases:
> > >
> > >     Case A: You have your own Streamer function in your class
> > > implementation
> > > [...]
> > >     Case B: You use the automatic streamer in the dictionary file.
> > >         Move the old Streamer from the file generated by rootcint to
> > > your class implementation file, then modified the Streamer
> > >         function as in case A above.
> > >         Increment your class version id in ClassDef by 1, eg.
> > > ClassDef(MyClass, 2)
> > >         Add option "-" in the pragma line of LinkDef.
> > >     Case C: You use the automatic streamer in the dictionary file and
> > > you
> > > already use the option "+" in the LinkDef file. If the old
> > >     automatic Streamer does not contain any statement using the
> > > functions ReadArray, ReadStaticArray, WriteArray,
> > >     WriteStaticArray you have nothing to do, except running rootcint
> > > again to regenerate the new form of the Streamer function,
> > >     otherwise proceed like for case B.
> > > -------------------------
> > >
> > > In our case we have classes with some basic data types (Float_t, Int_t,
> > > etc.) and some fixed size arrays (Float_t[16], ...) without an own
> > > streamer. Someone made a test (with root 3.02/06) and found out: that if
> > > we compile a writing version of the program and a reading one, both
> > > versions once with auto scheme evolution enabled ('+' added in the
> > > LinkDef file) and without it: both readers can read both files without
> > > any further changes. Does this work by chance or did I missunderstood
> > > the stetement above.
> > >
> > > Best regards,
> > > Thomas.
> > >
-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7679480



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