// Format of StreamerInfo record in release 3.02.06. // It is probably not accessed by its key, but from its offset given in the file header. // The StreamerInfo record DATA consists of a TList (list) object containing elements // of class TStreamerInfo. // ----------TKey-(never compressed)---------------------- // byte 0->3 Nbytes = Number of bytes in compressed record (TKey+data) TKey::fNbytes // 4->5 Version = TKey class version identifier TKey::fVersion // 6->9 ObjLen = Number of bytes of uncompressed data TKey::fObjLen // 10->13 Datime = Date and time when record was written to file TKey::fDatime // | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second // 14->15 KeyLen = Number of bytes in key structure (TKey) (64) TKey::fKeyLen // 16->17 Cycle = Cycle of key TKey::fCycle // 18->21 SeekKey = Byte offset of record itself (consistency check) TKey::fSeekKey // 22->25 SeekPdir = Byte offset of parent directory record (TFile) TKey::fSeekPdir // 26->26 lname = Number of bytes in the class name (5) TKey::fClassName // 27->31 ClassName = Object Class Name ("TList") TKey::fClassName // 32->32 lname = Number of bytes in the object name (12) TNamed::fName // 33->44 Name = lName bytes with the name of the object ("StreamerInfo") TNamed::fName // 45->45 lTitle = Number of bytes in the object title (18) TNamed::fTitle // 46->63 Title = lTitle bytes with the title of the object TNamed::fTitle // | ("Doubly linked list") // ----------TList-(always compressed at level 1 (even if compression level 0))---- // The DATA is a TList collection object containing TStreamerInfo objects. // Below is the format of this TList data. // // Here is the format of a TList object in Release 3.02.06. // Comments and offsets refer specifically to its use in the StreamerInfo record. //-------- // 0->3 ByteCount = Number of remaining bytes in TList object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->5 Version = Version of TList Class // 6->15 = TObject object (a base class of TList) (see tobject.txt). // | Objects in StreamerInfo record are not referenced. // | Would be two bytes longer (6->17) if object were referenced. // 16->16 fName = Number of bytes in name of TList object, followed by the // | name itself. (TCollection::fName). The TList object in // | StreamerInfo record is unnamed, so byte contains 0. // 17->20 nObjects = Number of objects in list. // 21->.. objects = Sequentially, TStreamerInfo Objects in the list. // | In the StreamerInfo record, the objects in the list are // | TStreamerInfo objects. There will be one TStreamerInfo // | object for every class used in data records other than // | core records and the the StreamerInfo record itself. //------- // Here is the format of a TStreamerInfo object in Release 3.02.06. // Note: Although TStreamerInfo does not use the default streamer, it has the same // format as if it did. (compare with dobject.txt) // 0->3 ByteCount = Number of remaining bytes in TStreamerInfo object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->.. ClassInfo = Information about TStreamerInfo class // | If this is the first occurrence of a TStreamerInfo object in the record // | 4->7 -1 = New class tag (constant kNewClassTag = 0xffffffff) // | 8->21 Classname = Object Class Name "TStreamerInfo" (null terminated) // | Otherwise // | 4->7 clIdx = Byte offset of new class tag in record, plus 2. // | OR'd with kClassMask (0x80000000) // 0->3 ByteCount = Number of remaining bytes in TStreamerInfo object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->5 Version = Version of TStreamerInfo Class // -Begin TNamed object (Base class of TStreamerInfo) // 6->9 ByteCount = Number of remaining bytes in TNamed object // | OR'd with kByteCountMask (0x40000000) // 10->11 Version = Version of TNamed Class // 12->21 = TObject object (Base class of TNamed) (see tobject.txt). // | Objects in StreamerInfo record are not referenced. // | Would be two bytes longer (12->23) if object were referenced. // 22->.. fName = Number of bytes in name of class that this TStreamerInfo object // | describes, followed by the class name itself. (TNamed::fName). // 0->.. fTitle = Number of bytes in title of class that this TStreamerInfo object // | describes, followed by the class title itself. (TNamed::fTitle). // | (Class title may be zero length) // -End TNamed object // 0->3 fCheckSum = Check sum for class that this TStreamerInfo object describes. // | This checksum is over all base classes and all persistent // | non-static data members. It is computed by TClass::GetCheckSum(). // | (TStreamerInfo::fCheckSum) // 4->7 fClassVersion = Version of class that this TStreamerInfo object describes. // | (TStreamerInfo::fClassVersion) // -Begin TObjArray object (Data member of TStreamerInfo) // 0->3 ByteCount = Number of remaining bytes in TObjArray object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->.. ClassInfo = Information about TObjArray class // | If this is the first occurrence of a TObjArray object in the record // | 4->7 -1 = New class tag (constant kNewClassTag = 0xffffffff) // | 8->17 Classname = Object Class Name "TObjArray" (null terminated) // | Otherwise // | 4->7 clIdx = Byte offset of new class tag in record, plus 2. // | OR'd with kClassMask (0x80000000) // 0->3 ByteCount = Number of remaining bytes in TObjArray object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->5 Version = Version of TObjArray Class // 6->15 = TObject object (a base class of TObjArray) (see tobject.txt). // | Objects in StreamerInfo record are not referenced. // | Would be two bytes longer (6->17) if object were referenced. // 16->16 fName = Number of bytes in name of TObjArray object, followed by the // | name itself. (TCollection::fName). TObjArray objects in // | StreamerInfo record are unnamed, so byte contains 0. // 17->20 nObjects = Number of objects (derived from TStreamerElement) in array. // 21->24 fLowerBound = Lower bound of array. Will always be 0 in StreamerInfo record. // 25->.. objects = Sequentially, TStreamerElement objects in the array. // | In a TStreamerInfo object, the objects in the TObjArray are // | of various types (described below), all of which inherit // | directly from TStreamerElement objects. There will be one // | such object for every base class of the class that the // | TStreamerInfo object describes, and also one such object for // | each persistent non-static data member of the class that the // | TStreamerInfo object describes. // -End TObjArray object and TStreamerInfo object //------- // The objects stored in the TObjectArray in TStreamerInfo are of various classes, each of // which inherits directly from the TStreamerElement class. The possible classes (which // we refer to collectively as TStreamer) are: // // TStreamerBase: Used for a base class. All others below used for data members. // TStreamerBasicType: For a basic type // TStreamerString: For type TString // TStreamerBasicPointer: For pointer to array of basic types // TStreamerObject: For an object derived from TObject // TStreamerObjectPointer: For pointer to an object derived from TObject // TStreamerLoop: For pointer to an array of objects // TStreamerObjectAny: For an object not derived from TObject // TStreamerSTL: For an STL container (not yet used??) // TStreamerSTLString: For an STL string (not yet used??) //------- // Here is the format of a TStreamer object in Release 3.02.06. // In description below, // 0->3 ByteCount = Number of remaining bytes in TStreamer object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->.. ClassInfo = Information about the specific TStreamer class // | If this is the first occurrence of a TStreamerXXX object in the record // | 4->7 -1 = New class tag (constant kNewClassTag = 0xffffffff) // | 8->.. Classname = Object Class Name "TStreamer" (null terminated) // | Otherwise // | 4->7 clIdx = Byte offset of new class tag in record, plus 2. // | OR'd with kClassMask (0x80000000) // 0->3 ByteCount = Number of remaining bytes in TStreamer object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->5 Version = Version of TStreamer Class // -Begin TStreamerElement object (Base class of TStreamerXXX) // 0->3 ByteCount = Number of remaining bytes in TStreamerElement object (uncompressed) // | OR'd with kByteCountMask (0x40000000) // 4->5 Version = Version of TStreamerElement Class // -Begin TNamed object (Base class of TStreamerElement) // 6->9 ByteCount = Number of remaining bytes in TNamed object // | OR'd with kByteCountMask (0x40000000) // 10->11 Version = Version of TNamed Class // 12->21 = TObject object (Base class of TNamed) (see tobject.txt). // | Objects in StreamerInfo record are not referenced. // | Would be two bytes longer (12->23) if object were referenced. // 22->.. fName = Number of bytes in class name of base class or member name of // | data member that this TStreamerElement object describes, // | followed by the name itself. (TNamed::fName). // 0->.. fTitle = Number of bytes in title of base class or data member that this // | TStreamerElement object describes, followed by the title itself. // | (TNamed::fTitle). // -End TNamed object // 0->3 fType = Type of data described by this TStreamerElement. // | (TStreamerElement::fType) // | Built in types: // | 1:char, 2:short, 3:int, 4:long, 5:float, 8:double // | 11, 12, 13, 14:unsigned char, short, int, long respectively // | 6: an array dimension (counter) // | 15: bit mask (used for fBits field) // | // | Pointers to built in types: // | 40 + fType of built in type (e.g. 43: pointer to int) // | // | Objects: // | 65:TString, 66:TObject, 67:TNamed // | 0: base class (other than TObject or TNamed) // | 61: object data member derived from TObject (other than TObject or TNamed) // | 62: object data member not derived from TObject // | 63: pointer to object derived from TObject (pointer can't be null) // | 64: pointer to object derived from TObject (pointer may be null) // | 501: pointer to an array of objects // | 500: an STL string or container // | // | Arrays: // | 20 + fType of array element (e.g. 23: array of int) // | // 4->7 fSize = Size of built in type or of pointer to built in type. 0 otherwise. // | (TStreamerElement::fSize). // 8->11 fArrayLength = Size of array (0 if not array) // | (TStreamerElement::fArrayLength). // 12->15 fArrayDim = Number of dimensions of array (0 if not an array) // | (TStreamerElement::fArrayDim). // 16->35 fMaxIndex = Five integers giving the array dimensions (0 if not applicable) // | (TStreamerElement::fMaxIndex). // 36->.. fTypeName = Number of bytes in name of the data type of the data member that // | the TStreamerElement object describes, followed by the name // | itself. If this TStreamerElement object defines a base class // | rather than a data member, the name used is 'BASE'. // | (TStreamerElement::fTypeName). // -End TStreamerElement object // The remaining data is specific to the type of TStreamer class. // For TStreamerInfoBase: // 0->3 fBaseVersion = Version of base class that this TStreamerElement describes. // For TStreamerBasicType: // No specific data // For TStreamerString: // No specific data // For TStreamerBasicPointer: // 0->3 fCountVersion = Version of class with the count (array dimension) // 4->.. fCountName= Number of bytes in the name of the data member holding // | the count, followed by the name itself. // 0->.. fCountName= Number of bytes in the name of the class holding the // | count, followed by the name itself. // For TStreamerObject: // No specific data // For TStreamerObjectPointer: // No specific data // For TStreamerLoop: // 0->3 fCountVersion = Version of class with the count (array dimension) // 4->.. fCountName= Number of bytes in the name of the data member holding // | the count, followed by the name itself. // 0->.. fCountClass= Number of bytes in the name of the class holding the // | count, followed by the name itself. // For TStreamerObjectAny: // No specific data // For TStreamerSTL: // 0->3 fSTLtype = Type of STL container: // | 1:vector, 2:list, 3:deque, 4:map, 5:set, 6:multimap, 7:multiset // 4->7 fCType = Type contained in STL container: // | Same values as for fType above, with one addition: 365:STL string // For TStreamerSTLString: // No specific data