From 210af7a5817b5e3fa9ab64b938cdc2dfc2e71b6f Mon Sep 17 00:00:00 2001
From: Olivier Couet <olivier.couet@cern.ch>
Date: Fri, 16 Apr 2021 09:29:59 +0200
Subject: [PATCH] Make the TFile layout doc visible in Ref Guide (#7891)

This PR makes the TFile Layout documentation visible in
the Doxygen ROOT reference Guide.

- The .txt file have been turned into markdown
- Doxyfile have io/doc/TFile folder as input
- References/links between the pages have been setup
- The \tableofcontents Doxygen functionality  has been turned ON
- Some typos have been fixed

Still two links need to be resolved:
  http://root.cern.ch/root/RootDoc.html
  http://root.cern.ch/root/htmldoc/examples/Version302.news.html
---
 documentation/doxygen/Doxyfile         |   3 +-
 io/doc/TFile/{README.txt => README.md} | 129 ++++++++-----
 io/doc/TFile/StreamerInfo.txt          | 226 ----------------------
 io/doc/TFile/TClonesArray.txt          |  37 ----
 io/doc/TFile/TDirectory.txt            |  67 -------
 io/doc/TFile/TFile.txt                 |  41 ----
 io/doc/TFile/TObject.txt               |  24 ---
 io/doc/TFile/TProcessID.txt            |  76 --------
 io/doc/TFile/TRef.txt                  |  20 --
 io/doc/TFile/TRefArray.txt             |  24 ---
 io/doc/TFile/datarecord.md             |  26 +++
 io/doc/TFile/datarecord.txt            |  21 ---
 io/doc/TFile/dobject.md                |  44 +++++
 io/doc/TFile/dobject.txt               |  34 ----
 io/doc/TFile/freesegments.md           |  36 ++++
 io/doc/TFile/freesegments.txt          |  31 ----
 io/doc/TFile/gap.md                    |   9 +
 io/doc/TFile/gap.txt                   |   4 -
 io/doc/TFile/header.md                 |  48 +++++
 io/doc/TFile/header.txt                |  40 ----
 io/doc/TFile/keyslist.md               |  31 ++++
 io/doc/TFile/keyslist.txt              |  25 ---
 io/doc/TFile/streamerinfo.md           | 248 +++++++++++++++++++++++++
 io/doc/TFile/tclonesarray.md           |  42 +++++
 io/doc/TFile/tdirectory.md             |  75 ++++++++
 io/doc/TFile/tfile.md                  |  46 +++++
 io/doc/TFile/tobject.md                |  29 +++
 io/doc/TFile/tprocessid.md             |  88 +++++++++
 io/doc/TFile/tref.md                   |  25 +++
 io/doc/TFile/trefarray.md              |  29 +++
 io/doc/TFile/{TTree.txt => ttree.md}   |   8 +-
 io/io/src/TFile.cxx                    |   1 +
 32 files changed, 865 insertions(+), 722 deletions(-)
 rename io/doc/TFile/{README.txt => README.md} (81%)
 delete mode 100644 io/doc/TFile/StreamerInfo.txt
 delete mode 100644 io/doc/TFile/TClonesArray.txt
 delete mode 100644 io/doc/TFile/TDirectory.txt
 delete mode 100644 io/doc/TFile/TFile.txt
 delete mode 100644 io/doc/TFile/TObject.txt
 delete mode 100644 io/doc/TFile/TProcessID.txt
 delete mode 100644 io/doc/TFile/TRef.txt
 delete mode 100644 io/doc/TFile/TRefArray.txt
 create mode 100644 io/doc/TFile/datarecord.md
 delete mode 100644 io/doc/TFile/datarecord.txt
 create mode 100644 io/doc/TFile/dobject.md
 delete mode 100644 io/doc/TFile/dobject.txt
 create mode 100644 io/doc/TFile/freesegments.md
 delete mode 100644 io/doc/TFile/freesegments.txt
 create mode 100644 io/doc/TFile/gap.md
 delete mode 100644 io/doc/TFile/gap.txt
 create mode 100644 io/doc/TFile/header.md
 delete mode 100644 io/doc/TFile/header.txt
 create mode 100644 io/doc/TFile/keyslist.md
 delete mode 100644 io/doc/TFile/keyslist.txt
 create mode 100644 io/doc/TFile/streamerinfo.md
 create mode 100644 io/doc/TFile/tclonesarray.md
 create mode 100644 io/doc/TFile/tdirectory.md
 create mode 100644 io/doc/TFile/tfile.md
 create mode 100644 io/doc/TFile/tobject.md
 create mode 100644 io/doc/TFile/tprocessid.md
 create mode 100644 io/doc/TFile/tref.md
 create mode 100644 io/doc/TFile/trefarray.md
 rename io/doc/TFile/{TTree.txt => ttree.md} (97%)

diff --git a/documentation/doxygen/Doxyfile b/documentation/doxygen/Doxyfile
index 781439218f4..f91adb2b679 100644
--- a/documentation/doxygen/Doxyfile
+++ b/documentation/doxygen/Doxyfile
@@ -313,7 +313,7 @@ MARKDOWN_SUPPORT       = YES
 # Minimum value: 0, maximum value: 99, default value: 0.
 # This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
 
-TOC_INCLUDE_HEADINGS   = 0
+TOC_INCLUDE_HEADINGS   = 3
 
 # When enabled doxygen tries to link words that correspond to documented
 # classes, or namespaces to their corresponding documentation. Such a link can
@@ -831,6 +831,7 @@ INPUT                  = . \
                          ../../gui/ \
                          ../../hist/ \
                          ../../html/ \
+                         ../../io/doc/TFile \
                          ../../io/dcache/ \
                          ../../io/gfal/ \
                          ../../io/io/ \
diff --git a/io/doc/TFile/README.txt b/io/doc/TFile/README.md
similarity index 81%
rename from io/doc/TFile/README.txt
rename to io/doc/TFile/README.md
index 6d6fd10b729..468ee873183 100644
--- a/io/doc/TFile/README.txt
+++ b/io/doc/TFile/README.md
@@ -1,4 +1,9 @@
-ROOTIO FILES
+\page rootio %ROOT files layout
+
+\tableofcontents
+
+
+## ROOTIO files
 
    A ROOTIO file consists of one "file header", one or more "data
 records," and zero or more "free segments".  The file header is always
@@ -6,7 +11,7 @@ at the beginning of the file, while the data records and free segments
 may in principle appear in any order.
 
    The file header is fixed length (64 bytes in the current
-release.)  It's detailed format is given in "header.txt".
+release.)  It's detailed format is given in \ref header.
 
    A free segment is of variable length.  One free segment is a set
 of contiguous bytes that are unused, and are available for ROOTIO to use
@@ -20,28 +25,28 @@ portion and a "data" portion.  The key portion precedes the data
 portion.  The format of the key portion is the same for all data.
 (The key portion corresponds to a class TKey object).  The object name
 and they key cycle are together sufficient to uniquely determine the
-record within the file.  The file "dobject.txt" describes the format
+record within the file.  The \ref dobject page describes the format
 of the data portion of a record for an object that uses the default
 streamer.
 
-DATA RECORD TYPES
+## Data record types
 
-"core" record types
+### "core" record types
 
    There are several types of data records used internally by
 ROOTIO to support the storage of byte sequences.  These record types
-are "TFile", "TDirectory", "KeysList", and "FreeSegments".  These types
+are TFile, TDirectory, "KeysList", and "FreeSegments".  These types
 can be considered to be in the "core" layer of ROOTIO.
 
-   A file always contains exactly one "TFile" data record, which
+   A file always contains exactly one TFile data record, which
 (nearly?) always immediately follows the file header.  The TFile record
 consists of either data pertaining to the file as a whole, or data
 pertaining to the root "directory" of records in the file.  Its detailed
-format is given in "tfile.txt".
+format is given in \ref tfile.
 
-   A file contains zero or more "TDirectory" data records, each
-representing a subdirectory in the directory tree that has the "TFile"
-record at its root.  The detailed format is given in "tdirectory.txt".
+   A file contains zero or more TDirectory data records, each
+representing a subdirectory in the directory tree that has the TFile
+record at its root.  The detailed format is given in \ref tdirectory.
 
    A file contains one or more "KeysList" data records.  There is
 one corresponding to the root directory (represented by the TFile
@@ -49,46 +54,46 @@ record), and one corresponding to each (non-empty) subdirectory in the
 tree (each represented by a TDirectory record).  The data portion of
 each KeysList record consists of the sequential keys of those data
 records in that directory.  The detailed format is given in
-"keyslist.txt".  Note that keys for "TFile", "KeysList", "FreeSegments",
+\ref keyslist.  Note that keys for TFile, "KeysList", "FreeSegments",
 and "StreamerInfo" data records never appear in the data portion of
 a KeysList data record.
 
    A file always contains exactly one "FreeSegments" data record,
 which keeps track of the free segments in the file.  Its detailed format
-is given in "freesegments.txt".  Note that the list of free segments
+is given in \ref freesegments.  Note that the list of free segments
 contains one additional free segment that is not in the file itself,
 because it represents the free space after the end of the file.
 
-"streamer" layer record types
+### "streamer" layer record types
 
 There is an additional data record type ("StreamerInfo") needed
 internally to support the storage of self-identifying objects.  Its
-detailed format is given in "streamerinfo.txt".  Note that the
+detailed format is given in \ref streamerinfo.  Note that the
 StreamerInfo data record itself and the "core" data records described
 above are not self-identifying objects.  A ROOTIO file contains
 exactly one StreamerInfo record.  The use of the "StreamerInfo" record
-is described under the "STREAMERINFO" heading below.
+is described under the \ref si "StreamerInfo" heading below.
 
-"pointer to persistent object" object types
+### "pointer to persistent object" object types
 
 There are three object types ("TProcessID", "TRef", and "TRefArray") used
 internally to support pointers to persistent objects.  Their formats are
-given in "tprocessid.txt", "tref.txt", and "trefarray.txt" respectively.
+given in \ref tprocessid, \ref tref, and \ref trefarray respectively.
 Of these three objects, only TProcessID objects necessarily comprise
 a complete data record (a "TProcessID" record).  TRef and TRefArray
 objects typically are data members of larger objects, and therefore are
 only a part of the data portion of a record.  In addition, objects that
 are referenced by such a pointer have an additional field in the base TObject.
-See "tobject.txt".  A description of how these pointers work is given under
-the "POINTERS TO PERSISTENT OBJECTS" heading below.
+See \ref tobject.  A description of how these pointers work is given under
+the \ref ptpo "Pointers to persistent objects" heading below.
 
-"application" layer record types
+### "application" layer record types
 
 These are either user defined record types, or record types supplied
 by ROOT that are not needed by ROOTIO. The format of such an object that
-uses the default streamer is shown in "dobject.txt".
+uses the default streamer is shown in \ref dobject.
 
-DATA COMPRESSION
+## Data compression
 
 The user can set the data compression level for new or modified data records
 when creating or opening a file.  When an existing file is opened for update,
@@ -105,12 +110,14 @@ If level 2 is selected, level 1 is used with no notification to the user.
 The chosen compression level is not applied to the entire file.  The following
 portions of the file are not compressed, regardless of the compression level
 selected:
-   1) the file header
-   2) the KeysList data record
-   3) the FreeSegments data record
-   4) any data record (outside of a TTree) where the uncompressed size of
+
+   1. the file header
+   2. the KeysList data record
+   3. the FreeSegments data record
+   4. any data record (outside of a TTree) where the uncompressed size of
       the data portion is 256 bytes or less.
-   5) the key portion of any data record
+   5. the key portion of any data record
+
 Furthermore, the data portion of the StreamerInfo data record is always
 compressed at level 1 (if over 256 bytes uncompressed), regardless of the
 compression level selected (even if no compression is selected).
@@ -119,10 +126,11 @@ The compression algorithm used is an in memory ZIP compression written for the
 DELPHI collaboration at CERN.  Its author is E. Chernyaev (IHEP/Protvino).
 The source code is internal to ROOTIO.
 
-STREAMERINFO
+\anchor si
+## StreamerInfo
 
 The "StreamerInfo" data record is used by ROOTIO to support the storage of
-self-identifying objects.  Its detailed format is given in "streamerinfo.txt".
+self-identifying objects.  Its detailed format is given in \ref streamerinfo.
 A ROOTIO file contains exactly one StreamerInfo record, which is written to disk
 automatically when a new or modified file is closed.
 
@@ -176,7 +184,7 @@ to explicitly code the decomposition and composition of the object to its member
 In this case, the StreamerInfo for that class might not be used.  In any case, if the
 composition/decomposition of the class is explicitly coded, the user should include
 the byte count, class information, and version number of the class before the data on
-disk as shown in "dobject.txt".
+disk as shown in \ref dobject.
 
 The special method used for streaming a TClonesArray is described in the TClonesArray
 section below.
@@ -190,7 +198,8 @@ StreamerInfo record to do the (de)composition.  In this case, the StreamerInfo f
 the class may still be present in the StreamerInfo record, but may not match what is
 actually written to disk for those objects.
 
-POINTERS TO PERSISTENT OBJECTS
+\anchor ptpo
+## Pointers to persistent objects
 
 Information on how these work in memory can be found at:
 http://root.cern.ch/root/htmldoc/examples/Version302.news.html
@@ -199,19 +208,19 @@ Root Users Guide, which is for a version release 3.1.  Here we discuss only the
 on disk.
 
 A ROOT file contains zero or more TProcessID records.  Each such record contains a globally
-unique ID defining a given ROOT job that wrote a referenced object (see tprocessid.txt).
+unique ID defining a given ROOT job that wrote a referenced object (see \ref tprocessid).
 Each referenced object contains a "pidf" field referencing the corresponding TProcessID
 record and an "fUniqueID" field uniquely identifying the referenced object among those
-written by that process (see tobject.txt).  Similarly, every persistent reference to that
-object (a TRef Object, see tref.txt) also contains "pidf" and "fUniqueID" fields with the
+written by that process (see \ref tobject).  Similarly, every persistent reference to that
+object (a TRef Object, see \ref tref) also contains "pidf" and "fUniqueID" fields with the
 same value, thereby uniquely determining the referenced object (which need not even be in the
-same file).  In the case of an array of references (a TRefArray object, see "trefarray.txt"),
+same file).  In the case of an array of references (a TRefArray object, see \ref trefarray),
 there is one "pidf" value for the entire array, and a separate "fUniqueID" value for each
 reference.  For further information, see the above URL.
 
-SOME USEFUL CONTAINER CLASSES
+## Some useful container classes
 
-1) TObjArray and TClonesArray
+### TObjArray and TClonesArray
 
 The TObjArray class can be used to support an array of objects.  The objects need not be of the
 same type, but each object must be of a class type that inherits from TObject.  We have already
@@ -221,22 +230,23 @@ TStreamerElement, which in turn inherits from TObject.
 
 The TClonesArray class is a specialization of the TObjArray class for holding an array
 of objects that are all of the same type.  The format of a TClonesArray object
-is given in "tclonesarray.txt".
+is given in \ref tclonesarray.
 
 There are two great advantages in the use of TClonesArray over TObjArray when the objects
 all will be of the same class:
-  1) Memory for the objects will be allocated only once for the entire array, rather
-     than the per-object allocation for TObjArray.  This can be done because all the
-     objects are the same size.
-  2) In the case of TObjArray, the stored objects are written sequentially. However,
-     in a TClonesArray, by default, each object is split one level deep into its base
-     class(es) and data members, and each of these members is written sequentially for
-     all objects in the array before the next member is written.  This has two advantages:
-      a) Greater compression can be achieved when similar data is consecutive.
-      b) The object's data members can easily be split into different TTree branches
+
+   1. Memory for the objects will be allocated only once for the entire array, rather
+      than the per-object allocation for TObjArray.  This can be done because all the
+      objects are the same size.
+   2. In the case of TObjArray, the stored objects are written sequentially. However,
+      in a TClonesArray, by default, each object is split one level deep into its base
+      class(es) and data members, and each of these members is written sequentially for
+      all objects in the array before the next member is written.  This has two advantages:
+      1. Greater compression can be achieved when similar data is consecutive.
+      2. The object's data members can easily be split into different TTree branches
          (TTrees are discussed below).
 
-2) TTree
+### TTree
 
 A TTree is a highly specialized container class for efficient storage and retrieval of user data.
 The use of TTrees is discussed in detail in the Trees chapter of the Root Users Guide:
@@ -268,7 +278,7 @@ the additional TBasket records are written into the specified file, rather than
 the TTree data record itself.  In this case, a TBranch data record for the specified branch is also
 written to the specified file, containing the TBranch object for the specified branch.
 
-The file "ttree.txt" shows the streamer information for the TTree, TBranch, TLeaf, and some related
+\ref ttree shows the streamer information for the TTree, TBranch, TLeaf, and some related
 classes, together with some additional commentary.  For writing to a ROOTIO file, the streamers
 for these three classes act exactly as those of default generated streamers, except that, if the
 user has specified a separate file for a branch, the TBranch streamer also writes the TBranch object
@@ -276,3 +286,22 @@ as a keyed data record to the specified file.
 
 There is no streamer information for the TBasket class.  The custom written TBasket streamer
 internally handles the packing of data into fixed size TBasket objects.
+
+## Related pages
+
+  - \ref dobject
+  - \ref gap
+  - \ref keyslist
+  - \ref tclonesarray
+  - \ref tfile
+  - \ref tprocessid
+  - \ref trefarray
+  - \ref datarecord
+  - \ref freesegments
+  - \ref header
+  - \ref streamerinfo
+  - \ref tdirectory
+  - \ref tobject
+  - \ref tref
+  - \ref ttree
+
diff --git a/io/doc/TFile/StreamerInfo.txt b/io/doc/TFile/StreamerInfo.txt
deleted file mode 100644
index aeb7fa2a353..00000000000
--- a/io/doc/TFile/StreamerInfo.txt
+++ /dev/null
@@ -1,226 +0,0 @@
-//  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<XXX>) 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<XXX> object in Release 3.02.06.
-// In description below,
-//     0->3  ByteCount = Number of remaining bytes in TStreamer<XXX> object (uncompressed)
-//                     |   OR'd with kByteCountMask (0x40000000)
-//     4->.. ClassInfo = Information about the specific TStreamer<XXX> 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<XXX>" (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<XXX> object (uncompressed)
-//                   |   OR'd with kByteCountMask (0x40000000)
-//     4->5  Version   = Version of TStreamer<XXX> 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<XXX> 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
diff --git a/io/doc/TFile/TClonesArray.txt b/io/doc/TFile/TClonesArray.txt
deleted file mode 100644
index 0713ed432e9..00000000000
--- a/io/doc/TFile/TClonesArray.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// -Here is the format (release 3.02.06)  of the DATA for a TClonesArray object in a ROOTIO file.
-//      0->3  ByteCount = Number of remaining bytes in TClonesArray object (uncompressed)
-//                      |   OR'd with kByteCountMask (0x40000000)
-//      4->.. ClassInfo = Information about TClonesArray class
-//                      | If this is the first occurrence of a TClonesArray object in the record
-//                      |  4->7  -1        = New class tag (constant kNewClassTag = 0xffffffff)
-//                      |  8->17 Classname = Object Class Name "TClonesArray" (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 TClonesArray object (uncompressed)
-//                      |   OR'd with kByteCountMask (0x40000000)
-//      4->5  Version   = Version of TClonesArray Class
-//      6->15           = TObject object (a base class of TClonesArray) (see tobject.txt).
-//                      |   Would be two bytes longer (6->17) if object were referenced.
-//     16->.. fName     = Number of bytes in name of TClonesArray object, followed by the
-//                      |   name itself.  (TCollection::fName).  This name will be the
-//                      |   class name of the cloned object, appended with an 's'
-//                      |   (e.g. "TXxxs")
-//      0->..           = Number of bytes in name and version of the cloned class, followed
-//                      |   by the name and version themselves (e.g. "TXxx;1")
-//      0->3  nObjects  = Number of objects in clones array.
-//      4->7  fLowerBound= Lower bound of clones array.
-//      8->.. objects   = Sequentially, objects in the clones array.  However, the data
-//                      |   ordering depends on whether or not kBypassStreamer (0x1000) is
-//                      |   set in TObject::fBits.   By default, it is set.  If it is not set,
-//                      |   the objects are streamed sequentially using the streamer of the
-//                      |   cloned class (e.g. TXxx::Streamer()).
-//                      |
-//                      |   If it is set, the cloned class is split into its base classes and
-//                      |   persistent data members, and those streamers are used.  So, if the
-//                      |   base classes and persistent data members of class TXxx are TXxxbase,
-//                      |   TXxxdata0, TXxxdata1, etc.,  all the TXxxbase data from the entire
-//                      |   clones array is streamed first, followed by all the TXxxdata0 data,
-//                      |   etc.  This breakdown is not recursive, in that the member objects
-//                      |   are not again split.
-// -End TClonesArray object
diff --git a/io/doc/TFile/TDirectory.txt b/io/doc/TFile/TDirectory.txt
deleted file mode 100644
index 3cbb7628496..00000000000
--- a/io/doc/TFile/TDirectory.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-// Format of a TDirectory record in release 6.22.06.  It is never compressed.
-//
-// If the SeekKeys or SeekPdir in the TKey are located past the 32 bit file limit (> 2000000000),
-// then these fields will be 8 instead of 4 bytes and 1000 is added to the TKey Version.
-//
-// If the SeekDir, SeekParent, or SeekKeys in the TDirectory header are past the 32 bit file limit,
-// then these fields will be 8 instead of 4 bytes and 1000 is added to the TDirectory Version.
-// ----------TKey--------------
-//  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)                    TKey::fKeyLen
-//      16->17          Cycle     = Cycle of key                                               TKey::fCycle
-//      18->21 [18->25] SeekKey   = Byte offset of record itself (consistency check)           TKey::fSeekKey
-//      22->25 [26->33] SeekPdir  = Byte offset of parent directory record                     TKey::fSeekPdir
-//      26->26 [33->33] lname     = Number of bytes in the class name (10)                     TKey::fClassName
-//      27->.. [34->..] ClassName = Object Class Name ("TDirectory")                           TKey::fClassName
-//       0->0           lname     = Number of bytes in the object name                         TNamed::fName
-//       1->..          Name      = lName bytes with the name of the object <directory name>   TNamed::fName
-//       0->0           lTitle    = Number of bytes in the object title                        TNamed::fTitle
-//       1->..          Title     = lTitle bytes with the title of the object <direcory title> TNamed::fTitle
-// --------DATA----------------
-//       0->1           Version   = TDirectory class version identifier                        TDirectory::Class_Version()
-//       2->5           DatimeC   = Date and time when directory was created                   TDirectory::fDatimeC
-//                                | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
-//       6->9           DatimeM   = Date and time when directory was last modified             TDirectory::fDatimeM
-//                                | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
-//      10->13          NbytesKeys= Number of bytes in the associated KeysList record          TDirectory::fNbyteskeys
-//      14->17          NbytesName= Number of bytes in TKey+TNamed at creation                 TDirectory::fNbytesName
-//      18->21 [18->25] SeekDir   = Byte offset of directory record in file                    TDirectory::fSeekDir
-//      22->25 [26->33] SeekParent= Byte offset of parent directory record in file             TDirectory::fSeekParent
-//      26->29 [34->41] SeekKeys  = Byte offset of associated KeysList record in file          TDirectory::fSeekKeys
-//      30->31 [42->43] UUID vers = TUUID class version identifier                             TUUID::Class_Version()
-//      32->47 [44->59] UUID      = Universally Unique Identifier                              TUUID::fTimeLow through fNode[6]
-//      48->59          Extra space to allow SeekKeys to become 64 bit without moving this header
-
-//  Format of a TDirectory record in release 3.02.06.  It is never compressed.
-// ----------TKey--------------
-//  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)                    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                     TKey::fSeekPdir
-//      26->26 lname     = Number of bytes in the class name (10)                     TKey::fClassName
-//      27->.. ClassName = Object Class Name ("TDirectory")                           TKey::fClassName
-//       0->0  lname     = Number of bytes in the object name                         TNamed::fName
-//       1->.. Name      = lName bytes with the name of the object <directory name>   TNamed::fName
-//       0->0  lTitle    = Number of bytes in the object title                        TNamed::fTitle
-//       1->.. Title     = lTitle bytes with the title of the object <direcory title> TNamed::fTitle
-// --------DATA----------------
-//       0->0  Modified  = True if directory has been modified                        TDirectory::fModified
-//       1->1  Writable = True if directory is writable                               TDirectory::fWriteable
-//       2->5  DatimeC   = Date and time when directory was created                   TDirectory::fDatimeC
-//                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
-//       6->9  DatimeM   = Date and time when directory was last modified             TDirectory::fDatimeM
-//                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
-//      10->13 NbytesKeys= Number of bytes in the associated KeysList record          TDirectory::fNbyteskeys
-//      14->17 NbytesName= Number of bytes in TKey+TNamed at creation                 TDirectory::fNbytesName
-//      18->21 SeekDir   = Byte offset of directory record in file                    TDirectory::fSeekDir
-//      22->25 SeekParent= Byte offset of parent directory record in file             TDirectory::fSeekParent
-//      26->29 SeekKeys  = Byte offset of associated KeysList record in file          TDirectory::fSeekKeys
diff --git a/io/doc/TFile/TFile.txt b/io/doc/TFile/TFile.txt
deleted file mode 100644
index efad7a06d64..00000000000
--- a/io/doc/TFile/TFile.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Format of the root (first) directory record in release 6.22.06.  It is never compressed.
-//
-// This directory record differs from subdirectories (see TDirectory.txt) in the additional
-// Name and Title at the beginning of the DATA (after the TKey).
-//
-// If the SeekKeys or SeekPdir in the TKey are located past the 32 bit file limit (> 2000000000),
-// then these fields will be 8 instead of 4 bytes and 1000 is added to the TKey Version.
-//
-// If the SeekDir, SeekParent, or SeekKeys in the TDirectory header are past the 32 bit file limit,
-// then these fields will be 8 instead of 4 bytes and 1000 is added to the TDirectory Version.
-// ----------TKey---------------
-//  byte 0->3           Nbytes    = Number of bytes 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)                TKey::fKeyLen
-//      16->17          Cycle     = Cycle of key                                           TKey::fCycle
-//      18->21 [18->25] SeekKey   = Byte offset of record itself (consistency check) (64)  TKey::fSeekKey
-//      22->25 [26->33] SeekPdir  = Byte offset of parent directory record (0)             TKey::fSeekPdir
-//      26->26 [34->34] lname     = Number of bytes in the class name (5)                  TKey::fClassName
-//      27->.. [35->..] ClassName = Object Class Name ("TFile")                            TKey::fClassName
-//       0->0  lname     = Number of bytes in the object name                              TNamed::fName
-//       1->..          Name      = lName bytes with the name of the object <file name>    TNamed::fName
-//       0->0           lTitle    = Number of bytes in the object title                    TNamed::fTitle
-//       1->..          Title     = lTitle bytes with the title of the object <file title> TNamed::fTitle
-// --------DATA-----------------
-//       0->0           lname     = Number of bytes in the TFile name                      TNamed::fName
-//       1->.. Name      = lName bytes with the name of the TFile <file name>              TNamed::fName
-//       0->0           lTitle    = Number of bytes in the TFile title                     TNamed::fTitle
-//       1->..          Title     = lTitle bytes with the title of the TFile <file title>  TNamed::fTitle
-//       0->1           Version   = TDirectory class version identifier                    TDirectory::Class_Version()
-//       2->5           DatimeC   = Date and time when directory was created               TDirectory::fDatimeC
-//                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
-//       6->9           DatimeM   = Date and time when directory was last modified         TDirectory::fDatimeM
-//                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
-//      10->13          NbytesKeys= Number of bytes in the associated KeysList record      TDirectory::fNbyteskeys
-//      14->17          NbytesName= Number of bytes in TKey+TNamed at creation             TDirectory::fNbytesName
-//      18->21 [18->25] SeekDir   = Byte offset of directory record in file (64)           TDirectory::fSeekDir
-//      22->25 [26->33] SeekParent= Byte offset of parent directory record in file (0)     TDirectory::fSeekParent
-//      26->29 [34->41] SeekKeys  = Byte offset of associated KeysList record in file      TDirectory::fSeekKeys
diff --git a/io/doc/TFile/TObject.txt b/io/doc/TFile/TObject.txt
deleted file mode 100644
index f8fce95cf81..00000000000
--- a/io/doc/TFile/TObject.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-// Here is the format of the DATA for a TObject object in Release 3.02.06.
-//--------
-//  0->1  Version   = Version of TObject Class
-//  2->5  fUniqueID = Unique ID of object.  Currently, unless this object is or was
-//                       | referenced by a TRef or TRefArray, or is itself a TRef or TRefArray,
-//                       | this field is not used by ROOT.
-//  6->9  fBits     = A 32 bit mask containing status bits for the object.
-//                       | The bits relevant to ROOTIO are:
-//                       | 0x00000001 - if object in a list can be deleted.
-//                       | 0x00000008 - if other objects may need to be deleted when this one is.
-//                       | 0x00000010 - if object is referenced by pointer to persistent object.
-//                       | 0x00002000 - if object ctor succeeded but object shouldn't be used
-//                       | 0x01000000 - if object is on Heap.
-//                       | 0x02000000 - if object has not been deleted.
-// The "pidf" field below is present only if this TObject object (or an object inheriting
-//      from it) is referenced by a pointer to persistent object.
-// 10->11 pidf  = An identifier of the TProcessID record for the process that wrote the
-//                       | object. This identifier is an unsigned short.  The relevant record
-//                       | has a name that is the string "ProcessID" concatenated with the ASCII
-//                       | decimal representation of "pidf" (no leading zeros).  0 is a valid pidf.
-//-------
-// No object in the StreamerInfo record will be a reference or referenced, and all objects
-//      are on the heap.  So, for each occurrence in the StreamerInfo record, fUniqueID will be 0,
-//      fBits will be 0x03000000, and pidf will be absent.
diff --git a/io/doc/TFile/TProcessID.txt b/io/doc/TFile/TProcessID.txt
deleted file mode 100644
index 30c24f41a17..00000000000
--- a/io/doc/TFile/TProcessID.txt
+++ /dev/null
@@ -1,76 +0,0 @@
-// Format of TProcessID record in release 3.02.06.
-// Will be present if there are any referenced objects.
-// ----------TKey---------------
-//   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)            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             TKey::fSeekPdir
-//       26->26 lname    = Number of bytes in the class name (10)             TKey::fClassName
-//       27->36 ClassName= Object Class Name ("TProcessID")                   TKey::fClassName
-//       37->37 lname    = Number of bytes in the object name                 TNamed::fName
-//       38->.. Name     = lName bytes with the name of the object            TNamed::fName
-//                       | (e.g. "ProcessID0")
-//        0->0  lTitle   = Number of bytes in the object title                TNamed::fTitle
-//        1->.. Title    = lTitle bytes with the title of the object          TNamed::fTitle
-//                       | (Identifies processor, time stamp, etc.)
-//                       | See detailed explanation below.
-// ----------DATA--------------
-//        0->3 ByteCount = Number of remaining bytes in TProcessID object (uncompressed)
-//                       |   OR'd with kByteCountMask (0x40000000)
-//        4->5 Version   = Version of TProcessID Class
-// -Begin TNamed object (Base class of TProcessID)
-//        6->9 ByteCount = Number of remaining bytes in TNamed object (uncompressed)
-//                       |   OR'd with kByteCountMask (0x40000000)
-//       10->11 Version  = Version of TNamed Class
-//       12->21          = TObject object (Base class of TNamed) (see tobject.txt).
-//                       |   The TProcessID object is not itself referenced.
-//       22->22 lname    = Number of bytes in the object name                 TNamed::fName
-//       23->.. Name     = lName bytes with the name of the object            TNamed::fName
-//                       | The name will be "ProcessID" concatenated with
-//                       | a decimal integer, or "pidf".
-//        0->0  lTitle   = Number of bytes in the object title                TNamed::fTitle
-//        1->.. Title    = lTitle bytes with the title of the object          TNamed::fTitle
-//                       | (Identifies processor, time stamp, etc.)
-//                       | See detailed explanation below.
-// -End TNamed object
-//
-//     ----------Explanation of the title of a TProcessID object-----------------
-// The title of a TProcessID object is a globally unique identifier of the
-// ROOTIO process that created it.  It is derived from the following quantities.
-//
-// 1) The creation time ("fTime) of the TProcessID record.  This is a 60 bit time
-// in 100ns ticks since Oct. 15, 1582.
-//
-// 2) A 16 bit random unsigned integer ("clockeq") generated from a seed that is the
-//      job's process ID.  The highest two bits are not used.
-//
-// 3) A six byte unsigned quantity ("fNode") identifying the machine.  If the machine has a
-// valid network address, the first four bytes are set to that address, and the last two bytes
-// are stuffed with 0xbe and 0xef respectively.  Otherwise a six byte quantity is generated
-// from the time and random machine statistics. In this case, the high order bit of the
-// first byte is set to 1, to distinguish it from a network ID, where the bytes can be
-// no larger than 255.
-//
-// We the define the following quantities (class TUUID):
-        UInt_t    fTimeLow;               // 60 bit time, lowest 32 bits
-        UShort_t  fTimeMid;               // 60 bit time, middle 16 bits
-        UShort_t  fTimeHiAndVersion;      // 60 bit time, highest 12 time bits (low 12 bits)
-                                          // + 4 UUID version bits (high 4 bits)
-                                          // version is 1 if machine has valid network address
-                                          // and 3 otherwise.
-        UChar_t   fClockSeqHiAndReserved; // high 6 clockseq bits (low 6 bits)
-                                          // + 2 high bits reserved (currently set to binary 10)
-        UChar_t   fClockSeqLow;           // low 8 clockseq bits
-        UChar_t   fNode[6];               // 6 node (machine) id bytes
-
-// Then the following sprintf() call defines the format of the title string:
-   sprintf(Title, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-           fTimeLow, fTimeMid, fTimeHiAndVersion, fClockSeqHiAndReserved,
-           fClockSeqLow, fNode[0], fNode[1], fNode[2], fNode[3], fNode[4],
-           fNode[5]);
-// Since the title written to disk is preceded by its byte count, the delimiting null is not written.
diff --git a/io/doc/TFile/TRef.txt b/io/doc/TFile/TRef.txt
deleted file mode 100644
index e9cf965c247..00000000000
--- a/io/doc/TFile/TRef.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-// Here is the format of the DATA for a TRef object in Release 3.02.06.
-//--------
-//  0->1  Version   = Version of TObject Class (base class of TRef)
-//  2->5  fUniqueID = Unique ID of referenced object.  Typically, every referenced
-//                       | object has an ID that is a positive integer set to a counter
-//        | of the number of referenced objects in the file, beginning at 1.
-//                       | fUniqueID in the TRef object matches fUniqueID in the
-//                       | referenced object.
-//  6->9  fBits     = A 32 bit mask containing status bits for the TRef object.
-//                       | The bits relevant to ROOTIO are:
-//        | 0x00000008 - Other objects may need to be deleted when this one is.
-//        | 0x00000010 - Object is referenced by pointer to persistent object.
-//        | 0x01000000 - Object is on Heap.
-//        | 0x02000000 - Object has not been deleted.
-// 10->11 pidf  = An identifier of the TProcessID record for the process that wrote the
-//                       | referenced object. This identifier is an unsigned short.  The relevant
-//                       | record has a name that is the string "ProcessID" concatenated with the
-//                       | ASCII decimal representation of "pidf" (no leading zeros).
-//                       | 0 is a valid pidf.
-//-------
diff --git a/io/doc/TFile/TRefArray.txt b/io/doc/TFile/TRefArray.txt
deleted file mode 100644
index 05d54c2733b..00000000000
--- a/io/doc/TFile/TRefArray.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-// Here is the format of the DATA for a TRefArray object in Release 3.02.06.
-//--------
-//       0->3  ByteCount = Number of remaining bytes in TRefArray object (uncompressed)
-//                       |   OR'd with kByteCountMask (0x40000000)
-//       4->5  Version   = Version of TRefArray Class
-//       6->15           = TObject object (Base class of TRefArray) (see tobject.txt).
-//                       |   Will be two bytes longer (6->17) if TRefArray object is
-//                       |   itself referenced (unlikely).
-//      16->.. fName     = Number of bytes in name of TRefArray object, followed by the
-//                       |   name itself.  (TCollection::fName). Currently, TRefArrays
-//                       |   are not named, so this is a single byte containing 0.
-//       0->3  nObjects  | Number of object references (fUIDs) in this TRefArray.
-//       4->7  fLowerBound= Lower bound of array.  Typically 0.
-//       8->9  pidf  = An identifier of the TProcessID record for the process that wrote the
-//                       | referenced objects. This identifier is an unsigned short.  The relevant
-//                       | record has a name that is the string "ProcessID" concatenated with the
-//                       | ASCII decimal representation of "pidf" (no leading zeros).
-//                       | 0 is a valid pidf.
-//      10->.. fUIDs     = Sequentially, object Unique ID's.
-//                       | Each Unique ID is a four byte unsigned integer.
-//                       | If non-zero, it matches the Unique ID in the referenced
-//                       | object.  If zero, it is an unused element in the array.
-//                       | The fUIDs are written out only up to the last used element,
-//                       | so the last fUID will always be non-zero.
diff --git a/io/doc/TFile/datarecord.md b/io/doc/TFile/datarecord.md
new file mode 100644
index 00000000000..36e33e95cb9
--- /dev/null
+++ b/io/doc/TFile/datarecord.md
@@ -0,0 +1,26 @@
+\page datarecord Format of data records
+
+### Release 3.02.06
+  A ROOT file is mostly a suite of consecutive data records with the following format
+ <Name>;<Cycle> uniquely identifies the record in a directory
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------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)            TKey::fKeyLen
+      16->17 Cycle     = Cycle of key (e.g. 1)                              TKey::fCycle
+      18->21 SeekKey   = Byte offset of record itself (consistency check)   TKey::fSeekKey
+      22->25 SeekPdir  = Byte offset of parent directory record             TKey::fSeekPdir
+      26->26 lname     = Number of bytes in the class name                  TKey::fClassName
+      27->.. ClassName = Object Class Name                                  TKey::fClassName
+       0->0  lname     = Number of bytes in the object name                 TNamed::fName
+       1->.. Name      = lName bytes with the name of the object            TNamed::fName
+       0->0  lTitle    = Number of bytes in the object title                TNamed::fTitle
+       1->.. Title     = lTitle bytes with the title of the object          TNamed::fTitle
+ ----------DATA---(may be compressed)-----------
+       0->..             The data object itself.  For an example, see \ref dobject
+</pre></div>
diff --git a/io/doc/TFile/datarecord.txt b/io/doc/TFile/datarecord.txt
deleted file mode 100644
index d9e81a72db0..00000000000
--- a/io/doc/TFile/datarecord.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-//  Release 3.02.06
-//  A ROOT file is mostly a suite of consecutive data records with the following format
-// <Name>;<Cycle> uniquely identifies the record in a directory
-// ----------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)            TKey::fKeyLen
-//      16->17 Cycle     = Cycle of key (e.g. 1)                              TKey::fCycle
-//      18->21 SeekKey   = Byte offset of record itself (consistency check)   TKey::fSeekKey
-//      22->25 SeekPdir  = Byte offset of parent directory record             TKey::fSeekPdir
-//      26->26 lname     = Number of bytes in the class name                  TKey::fClassName
-//      27->.. ClassName = Object Class Name                                  TKey::fClassName
-//       0->0  lname     = Number of bytes in the object name                 TNamed::fName
-//       1->.. Name      = lName bytes with the name of the object            TNamed::fName
-//       0->0  lTitle    = Number of bytes in the object title                TNamed::fTitle
-//       1->.. Title     = lTitle bytes with the title of the object          TNamed::fTitle
-// ----------DATA---(may be compressed)-----------
-//       0->..             The data object itself.  For an example, see dobject.txt
diff --git a/io/doc/TFile/dobject.md b/io/doc/TFile/dobject.md
new file mode 100644
index 00000000000..735dab1160f
--- /dev/null
+++ b/io/doc/TFile/dobject.md
@@ -0,0 +1,44 @@
+\page dobject Format of a class object in DATA
+
+### Release 3.02.06
+
+Here is the format of a class object in DATA that uses the default streamer.
+Objects of many classes with custom streamers can have very similar formats.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+----------------
+  0->3  ByteCount = Number of remaining bytes in object (uncompressed)
+        | OR'd with kByteCountMask (0x40000000)
+  4->.. ClassInfo = Information about class of object
+        | If this is the first occurrence of an object of this class in the record
+                       |  4->7  -1        = New class tag (constant kNewClassTag = 0xffffffff)
+                       |  8->.. Classname = Object Class Name (null terminated string)
+        | 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 object (uncompressed)
+        | OR'd with kByteCountMask (0x40000000)
+  4->5  Version   = Version of Class
+</pre></div>
+
+ The rest consists of objects of base classes and persistent non-static data members.
+ Data members marked as transient are not stored.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+  6->.. Sequentially, Objects of each base class from which this class is derived
+    (rarely more than one)
+  0->.. Sequentially, Objects of all non-static persistent data members.
+</pre></div>
+
+ Class objects are broken down recursively as above.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+      Built in types are stored as follows:
+ 1 Byte: char, unsigned char
+      2 Bytes: short, unsigned short
+      4 Bytes: int, unsigned int, float
+      8 Bytes: long, unsigned long, double
+</pre></div>
+Note that a long (signed or unsigned) is stored as 8 bytes even if it is only four bytes
+in memory.  In that case, it is filled with leading zeros (or ones, for a negative value).
+
diff --git a/io/doc/TFile/dobject.txt b/io/doc/TFile/dobject.txt
deleted file mode 100644
index 5bab206389f..00000000000
--- a/io/doc/TFile/dobject.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-//  Release 3.02.06
-// Here is the format of a class object in DATA that uses the default streamer.
-// Objects of many classes with custom streamers can have very similar formats.
-//----------------
-//  0->3  ByteCount = Number of remaining bytes in object (uncompressed)
-//        | OR'd with kByteCountMask (0x40000000)
-//  4->.. ClassInfo = Information about class of object
-//        | If this is the first occurrence of an object of this class in the record
-//                       |  4->7  -1        = New class tag (constant kNewClassTag = 0xffffffff)
-//                       |  8->.. Classname = Object Class Name (null terminated string)
-//        | 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 object (uncompressed)
-//        | OR'd with kByteCountMask (0x40000000)
-//  4->5  Version   = Version of Class
-//
-// The rest consists of objects of base classes and persistent non-static data members.
-// Data members marked as transient are not stored.
-//
-//  6->.. Sequentially, Objects of each base class from which this class is derived
-//    (rarely more than one)
-//  0->.. Sequentially, Objects of all non-static persistent data members.
-//
-// Class objects are broken down recursively as above.
-//
-//      Built in types are stored as follows:
-// 1 Byte: char, unsigned char
-//      2 Bytes: short, unsigned short
-//      4 Bytes: int, unsigned int, float
-//      8 Bytes: long, unsigned long, double
-// Note that a long (signed or unsigned) is stored as 8 bytes even if it is only four bytes
-//  in memory.  In that case, it is filled with leading zeros (or ones, for a negative value).
-//
diff --git a/io/doc/TFile/freesegments.md b/io/doc/TFile/freesegments.md
new file mode 100644
index 00000000000..baa7a1a1bc4
--- /dev/null
+++ b/io/doc/TFile/freesegments.md
@@ -0,0 +1,36 @@
+\page freesegments Format of FreeSegments record
+
+Format of FreeSegments record, release 6.22.06.  It is never compressed.
+It is probably not accessed by its key, but from its offset given in the file header.
+
+If any *individual* free segments refer to bytes beyond 2000000000,
+their fFirst/fLast have 8 bytes, not 4 and 1000 is added to the TFree Version.
+
+Some free segment records may be 32 bit while others are 64 bit.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------TKey---------------
+  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)               TKey::fKeyLen
+      16->17          Cycle     = Cycle of key                                           TKey::fCycle
+      18->21 [18->25] SeekKey   = Byte offset of record itself (consistency check)       TKey::fSeekKey
+      22->25 [26->33] SeekPdir  = Byte offset of parent directory record (TFile)         TKey::fSeekPdir
+      26->26 [34->34] lname     = Number of bytes in the class name (5)                  TKey::fClassName
+      27->.. [35->..] ClassName = Object Class Name ("TFile")                            TKey::fClassName
+       0->0           lname     = Number of bytes in the object name                     TNamed::fName
+       1->..          Name      = lName bytes with the name of the object <file name>    TNamed::fName
+       0->0           lTitle    = Number of bytes in the object title                    TNamed::fTitle
+       1->..          Title     = lTitle bytes with the title of the object <file title> TNamed::fTitle
+ ----------DATA---------------
+       0->1           Version   = TFree class version identifier                         TFree::Class_Version()
+       2->5  [ 2-> 9] fFirst    = First free byte of first free segment                  TFree::fFirst
+       6->9  [10->17] fLast     = Last free byte of first free segment (inclusive)       TFree::fLast
+                                  (e.g. a free segment that is 1 byte long would have fFirst == fLast)
+       ....           Sequentially, Version, fFirst and fLast of additional free segments.
+       ....           There is always one free segment beginning at file end and ending before 2000000000.
+       ....           If the file size is larger than 2000000000, the last segment ends with 4000000000.
+</pre></div>
\ No newline at end of file
diff --git a/io/doc/TFile/freesegments.txt b/io/doc/TFile/freesegments.txt
deleted file mode 100644
index e2110aa9b2e..00000000000
--- a/io/doc/TFile/freesegments.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-// Format of FreeSegments record, release 6.22.06.  It is never compressed.
-// It is probably not accessed by its key, but from its offset given in the file header.
-//
-// If any *individual* free segments refer to bytes beyond 2000000000,
-// their fFirst/fLast have 8 bytes, not 4 and 1000 is added to the TFree Version.
-//
-// Some free segment records may be 32 bit while others are 64 bit.
-// ----------TKey---------------
-//  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)               TKey::fKeyLen
-//      16->17          Cycle     = Cycle of key                                           TKey::fCycle
-//      18->21 [18->25] SeekKey   = Byte offset of record itself (consistency check)       TKey::fSeekKey
-//      22->25 [26->33] SeekPdir  = Byte offset of parent directory record (TFile)         TKey::fSeekPdir
-//      26->26 [34->34] lname     = Number of bytes in the class name (5)                  TKey::fClassName
-//      27->.. [35->..] ClassName = Object Class Name ("TFile")                            TKey::fClassName
-//       0->0           lname     = Number of bytes in the object name                     TNamed::fName
-//       1->..          Name      = lName bytes with the name of the object <file name>    TNamed::fName
-//       0->0           lTitle    = Number of bytes in the object title                    TNamed::fTitle
-//       1->..          Title     = lTitle bytes with the title of the object <file title> TNamed::fTitle
-// ----------DATA---------------
-//       0->1           Version   = TFree class version identifier                         TFree::Class_Version()
-//       2->5  [ 2-> 9] fFirst    = First free byte of first free segment                  TFree::fFirst
-//       6->9  [10->17] fLast     = Last free byte of first free segment (inclusive)       TFree::fLast
-//                                  (e.g. a free segment that is 1 byte long would have fFirst == fLast)
-//       ....           Sequentially, Version, fFirst and fLast of additional free segments.
-//       ....           There is always one free segment beginning at file end and ending before 2000000000.
-//       ....           If the file size is larger than 2000000000, the last segment ends with 4000000000.
diff --git a/io/doc/TFile/gap.md b/io/doc/TFile/gap.md
new file mode 100644
index 00000000000..a4864e54407
--- /dev/null
+++ b/io/doc/TFile/gap.md
@@ -0,0 +1,9 @@
+\page gap Free segment in middle of file
+
+  A gap (free segment in middle of file) has the following format.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ------------------------
+  byte 0->3  Nbytes    = Negative of number of bytes in gap
+       4->.. irrelevant
+</pre></div>
diff --git a/io/doc/TFile/gap.txt b/io/doc/TFile/gap.txt
deleted file mode 100644
index c12c2ff41d8..00000000000
--- a/io/doc/TFile/gap.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-//  A gap (free segment in middle of file) has the following format.
-// ------------------------
-//  byte 0->3  Nbytes    = Negative of number of bytes in gap
-//       4->.. irrelevant
diff --git a/io/doc/TFile/header.md b/io/doc/TFile/header.md
new file mode 100644
index 00000000000..8e77fb4d327
--- /dev/null
+++ b/io/doc/TFile/header.md
@@ -0,0 +1,48 @@
+\page header File header format
+
+ Here is the file header format as of release 6.22.06.  It is never compressed.
+
+ If END, SeekFree, or SeekInfo are located past the 32 bit file limit (> 2000000000)
+ then these fields will be 8 instead of 4 bytes and 1000000 is added to the file format version.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ -----------------------------------
+ byte  0->3  "root"               = Identifies this file as a ROOT file.
+       4->7  Version              = File format version                         TFile::fVersion
+                                  |  (10000*major+100*minor+cycle (e.g. 62206 for 6.22.06))
+       8->11          BEGIN       = Byte offset of first data record (100)      TFile::fBEGIN
+      12->15 [12->19] END         = Pointer to first free word at the EOF       TFile::fEND
+                                  | (will be == to file size in bytes)
+      16->19 [20->27] SeekFree    = Byte offset of FreeSegments record          TFile::fSeekFree
+      20->23 [28->31] NbytesFree  = Number of bytes in FreeSegments record      TFile::fNBytesFree
+      24->27 [32->35] nfree       = Number of free data records
+      28->31 [36->39] NbytesName  = Number of bytes in TKey+TNamed for TFile at creation TDirectory::fNbytesName
+      32->32 [40->40] Units       = Number of bytes for file pointers (4)       TFile::fUnits
+      33->36 [41->44] Compress    = Zip compression level (i.e. 0-9)            TFile::fCompress
+      37->40 [45->52] SeekInfo    = Byte offset of StreamerInfo record          TFile::fSeekInfo
+      41->44 [53->56] NbytesInfo  = Number of bytes in StreamerInfo record      TFile::fNbytesInfo
+      45->46 [57->58] UUID vers   = TUUID class version identifier              TUUID::Class_Version()
+      47->62 [59->74] UUID        = Universally Unique Identifier               TUUID::fTimeLow through fNode[6]
+      63->99 [75->99] Extra space to allow END, SeekFree, or SeekInfo to become 64 bit without moving this header
+</pre></div>
+
+ Here is the file header format as of release 3.02.06.  It is never compressed.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ -----------------------------------
+ byte  0->3  "root"      = Identifies this file as a ROOT file.
+       4->7  Version     = File format version                        TFile::fVersion
+                         |  (10000*major+100*minor+cycle (e.g. 30203 for 3.2.3))
+       8->11 BEGIN       = Byte offset of first data record (64)      TFile::fBEGIN
+      12->15 END         = Pointer to first free word at the EOF      TFile::fEND
+                         | (will be == to file size in bytes)
+      16->19 SeekFree    = Byte offset of FreeSegments record         TFile::fSeekFree
+      20->23 NbytesFree  = Number of bytes in FreeSegments record     TFile::fNBytesFree
+      24->27 nfree       = Number of free data records
+      28->31 NbytesName  = Number of bytes in TKey+TNamed for TFile at creation TDirectory::fNbytesName
+      32->32 Units       = Number of bytes for file pointers (4)      TFile::fUnits
+      33->36 Compress    = Zip compression level (i.e. 0-9)           TFile::fCompress
+      37->40 SeekInfo    = Byte offset of StreamerInfo record         TFile::fSeekInfo
+      41->44 NbytesInfo  = Number of bytes in StreamerInfo record     TFile::fNbytesInfo
+      45->63             = Unused??
+</pre></div>
\ No newline at end of file
diff --git a/io/doc/TFile/header.txt b/io/doc/TFile/header.txt
deleted file mode 100644
index e62a7730f01..00000000000
--- a/io/doc/TFile/header.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-// Here is the file header format as of release 6.22.06.  It is never compressed.
-//
-// If END, SeekFree, or SeekInfo are located past the 32 bit file limit (> 2000000000)
-// then these fields will be 8 instead of 4 bytes and 1000000 is added to the flie format version.
-// -----------------------------------
-// byte  0->3  "root"               = Identifies this file as a ROOT file.
-//       4->7  Version              = File format version                         TFile::fVersion
-//                                  |  (10000*major+100*minor+cycle (e.g. 62206 for 6.22.06))
-//       8->11          BEGIN       = Byte offset of first data record (100)      TFile::fBEGIN
-//      12->15 [12->19] END         = Pointer to first free word at the EOF       TFile::fEND
-//                                  | (will be == to file size in bytes)
-//      16->19 [20->27] SeekFree    = Byte offset of FreeSegments record          TFile::fSeekFree
-//      20->23 [28->31] NbytesFree  = Number of bytes in FreeSegments record      TFile::fNBytesFree
-//      24->27 [32->35] nfree       = Number of free data records
-//      28->31 [36->39] NbytesName  = Number of bytes in TKey+TNamed for TFile at creation TDirectory::fNbytesName
-//      32->32 [40->40] Units       = Number of bytes for file pointers (4)       TFile::fUnits
-//      33->36 [41->44] Compress    = Zip compression level (i.e. 0-9)            TFile::fCompress
-//      37->40 [45->52] SeekInfo    = Byte offset of StreamerInfo record          TFile::fSeekInfo
-//      41->44 [53->56] NbytesInfo  = Number of bytes in StreamerInfo record      TFile::fNbytesInfo
-//      45->46 [57->58] UUID vers   = TUUID class version identifier              TUUID::Class_Version()
-//      47->62 [59->74] UUID        = Universally Unique Identifier               TUUID::fTimeLow through fNode[6]
-//      63->99 [75->99] Extra space to allow END, SeekFree, or SeekInfo to become 64 bit without moving this header
-
-// Here is the file header format as of release 3.02.06.  It is never compressed.
-// -----------------------------------
-// byte  0->3  "root"      = Identifies this file as a ROOT file.
-//       4->7  Version     = File format version                        TFile::fVersion
-//                         |  (10000*major+100*minor+cycle (e.g. 30203 for 3.2.3))
-//       8->11 BEGIN       = Byte offset of first data record (64)      TFile::fBEGIN
-//      12->15 END         = Pointer to first free word at the EOF      TFile::fEND
-//                         | (will be == to file size in bytes)
-//      16->19 SeekFree    = Byte offset of FreeSegments record         TFile::fSeekFree
-//      20->23 NbytesFree  = Number of bytes in FreeSegments record     TFile::fNBytesFree
-//      24->27 nfree       = Number of free data records
-//      28->31 NbytesName  = Number of bytes in TKey+TNamed for TFile at creation TDirectory::fNbytesName
-//      32->32 Units       = Number of bytes for file pointers (4)      TFile::fUnits
-//      33->36 Compress    = Zip compression level (i.e. 0-9)           TFile::fCompress
-//      37->40 SeekInfo    = Byte offset of StreamerInfo record         TFile::fSeekInfo
-//      41->44 NbytesInfo  = Number of bytes in StreamerInfo record     TFile::fNbytesInfo
-//      45->63             = Unused??
diff --git a/io/doc/TFile/keyslist.md b/io/doc/TFile/keyslist.md
new file mode 100644
index 00000000000..598f8185033
--- /dev/null
+++ b/io/doc/TFile/keyslist.md
@@ -0,0 +1,31 @@
+\page keyslist Format of KeysList record
+
+
+Format of KeysList record in release 3.02.06.  It is never compressed.
+There is one KeysList record for the main (TFile) directory and one per non-empty subdirectory.
+It is probably not accessed by its key, but from its offset given in the directory data.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------TKey---------------
+  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 the key structure (TKey)        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 (directory) TKey::fSeekPdir
+      26->26 lname     = Number of bytes in the class name (5 or 10)        TKey::fClassName
+      27->.. ClassName = Object Class Name ("TFile" or "TDirectory")        TKey::fClassName
+       0->0  lname     = Number of bytes in the object name                 TNamed::fName
+       1->.. Name      = lName bytes with the name of the object <directory name> TNamed::fName
+       0->0  lTitle    = Number of bytes in the object title                TNamed::fTitle
+       1->.. Title     = lTitle bytes with the title of the object <directory title> TNamed::fTitle
+ ----------DATA---------------
+       0->3  NKeys     = Number of keys in list (i.e. records in directory (non-recursive))
+                       | Excluded:: The directory itself, KeysList, StreamerInfo, and FreeSegments
+       4->.. TKey      = Sequentially for each record in directory,
+                       |  the entire TKey portion of each record is replicated.
+                       |  Note that SeekKey locates the record.
+</pre></div>
diff --git a/io/doc/TFile/keyslist.txt b/io/doc/TFile/keyslist.txt
deleted file mode 100644
index effeeff1f81..00000000000
--- a/io/doc/TFile/keyslist.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-//  Format of KeysList record in release 3.02.06.  It is never compressed.
-//  There is one KeysList record for the main (TFile) directory and one per non-empty subdirectory.
-//  It is probably not accessed by its key, but from its offset given in the directory data.
-// ----------TKey---------------
-//  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 the key structure (TKey)        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 (directory) TKey::fSeekPdir
-//      26->26 lname     = Number of bytes in the class name (5 or 10)        TKey::fClassName
-//      27->.. ClassName = Object Class Name ("TFile" or "TDirectory")        TKey::fClassName
-//       0->0  lname     = Number of bytes in the object name                 TNamed::fName
-//       1->.. Name      = lName bytes with the name of the object <directory name> TNamed::fName
-//       0->0  lTitle    = Number of bytes in the object title                TNamed::fTitle
-//       1->.. Title     = lTitle bytes with the title of the object <directory title> TNamed::fTitle
-// ----------DATA---------------
-//       0->3  NKeys     = Number of keys in list (i.e. records in directory (non-recursive))
-//                       | Excluded:: The directory itself, KeysList, StreamerInfo, and FreeSegments
-//       4->.. TKey      = Sequentially for each record in directory,
-//                       |  the entire TKey portion of each record is replicated.
-//                       |  Note that SeekKey locates the record.
diff --git a/io/doc/TFile/streamerinfo.md b/io/doc/TFile/streamerinfo.md
new file mode 100644
index 00000000000..23dbf3efc86
--- /dev/null
+++ b/io/doc/TFile/streamerinfo.md
@@ -0,0 +1,248 @@
+\page streamerinfo Format of StreamerInfo record
+
+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.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------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")
+</pre></div>
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------TList-(always compressed at level 1 (even if compression level 0))----
+</pre></div>
+ 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.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+--------
+      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 \ref tobject).
+                      |   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.
+-------
+</pre></div>
+
+ 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 \ref dobject)
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+      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 \ref tobject).
+                      |   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 \ref tobject).
+                      |   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
+-------
+</pre></div>
+
+  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<XXX>) are:
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+  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??)
+-------
+</pre></div>
+
+ Here is the format of a TStreamer<XXX> object in Release 3.02.06.
+ In description below,
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+     0->3  ByteCount = Number of remaining bytes in TStreamer<XXX> object (uncompressed)
+                     |   OR'd with kByteCountMask (0x40000000)
+     4->.. ClassInfo = Information about the specific TStreamer<XXX> 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<XXX>" (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<XXX> object (uncompressed)
+                   |   OR'd with kByteCountMask (0x40000000)
+     4->5  Version   = Version of TStreamer<XXX> 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 \ref tobject).
+                      |   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<XXX> 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
+</pre></div>
diff --git a/io/doc/TFile/tclonesarray.md b/io/doc/TFile/tclonesarray.md
new file mode 100644
index 00000000000..aca9b36a32a
--- /dev/null
+++ b/io/doc/TFile/tclonesarray.md
@@ -0,0 +1,42 @@
+\page tclonesarray Format of the DATA for a TClonesArray object
+
+Here is the format (release 3.02.06)  of the DATA for a TClonesArray object in a ROOTIO file.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+      0->3  ByteCount = Number of remaining bytes in TClonesArray object (uncompressed)
+                      |   OR'd with kByteCountMask (0x40000000)
+      4->.. ClassInfo = Information about TClonesArray class
+                      | If this is the first occurrence of a TClonesArray object in the record
+                      |  4->7  -1        = New class tag (constant kNewClassTag = 0xffffffff)
+                      |  8->17 Classname = Object Class Name "TClonesArray" (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 TClonesArray object (uncompressed)
+                      |   OR'd with kByteCountMask (0x40000000)
+      4->5  Version   = Version of TClonesArray Class
+      6->15           = TObject object (a base class of TClonesArray) (see \ref tobject).
+                      |   Would be two bytes longer (6->17) if object were referenced.
+     16->.. fName     = Number of bytes in name of TClonesArray object, followed by the
+                      |   name itself.  (TCollection::fName).  This name will be the
+                      |   class name of the cloned object, appended with an 's'
+                      |   (e.g. "TXxxs")
+      0->..           = Number of bytes in name and version of the cloned class, followed
+                      |   by the name and version themselves (e.g. "TXxx;1")
+      0->3  nObjects  = Number of objects in clones array.
+      4->7  fLowerBound= Lower bound of clones array.
+      8->.. objects   = Sequentially, objects in the clones array.  However, the data
+                      |   ordering depends on whether or not kBypassStreamer (0x1000) is
+                      |   set in TObject::fBits.   By default, it is set.  If it is not set,
+                      |   the objects are streamed sequentially using the streamer of the
+                      |   cloned class (e.g. TXxx::Streamer()).
+                      |
+                      |   If it is set, the cloned class is split into its base classes and
+                      |   persistent data members, and those streamers are used.  So, if the
+                      |   base classes and persistent data members of class TXxx are TXxxbase,
+                      |   TXxxdata0, TXxxdata1, etc.,  all the TXxxbase data from the entire
+                      |   clones array is streamed first, followed by all the TXxxdata0 data,
+                      |   etc.  This breakdown is not recursive, in that the member objects
+                      |   are not again split.
+ -End TClonesArray object
+</pre></div>
\ No newline at end of file
diff --git a/io/doc/TFile/tdirectory.md b/io/doc/TFile/tdirectory.md
new file mode 100644
index 00000000000..294eb671108
--- /dev/null
+++ b/io/doc/TFile/tdirectory.md
@@ -0,0 +1,75 @@
+\page tdirectory Format of a TDirectory record
+
+Format of a TDirectory record in release 6.22.06.  It is never compressed.
+
+ If the SeekKeys or SeekPdir in the TKey are located past the 32 bit file limit (> 2000000000),
+ then these fields will be 8 instead of 4 bytes and 1000 is added to the TKey Version.
+
+ If the SeekDir, SeekParent, or SeekKeys in the TDirectory header are past the 32 bit file limit,
+ then these fields will be 8 instead of 4 bytes and 1000 is added to the TDirectory Version.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------TKey--------------
+  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)                     TKey::fKeyLen
+      16->17          Cycle     = Cycle of key                                                TKey::fCycle
+      18->21 [18->25] SeekKey   = Byte offset of record itself (consistency check)            TKey::fSeekKey
+      22->25 [26->33] SeekPdir  = Byte offset of parent directory record                      TKey::fSeekPdir
+      26->26 [33->33] lname     = Number of bytes in the class name (10)                      TKey::fClassName
+      27->.. [34->..] ClassName = Object Class Name ("TDirectory")                            TKey::fClassName
+       0->0           lname     = Number of bytes in the object name                          TNamed::fName
+       1->..          Name      = lName bytes with the name of the object <directory name>    TNamed::fName
+       0->0           lTitle    = Number of bytes in the object title                         TNamed::fTitle
+       1->..          Title     = lTitle bytes with the title of the object <directory title> TNamed::fTitle
+ --------DATA----------------
+       0->1           Version   = TDirectory class version identifier                         TDirectory::Class_Version()
+       2->5           DatimeC   = Date and time when directory was created                    TDirectory::fDatimeC
+                                | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
+       6->9           DatimeM   = Date and time when directory was last modified              TDirectory::fDatimeM
+                                | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
+      10->13          NbytesKeys= Number of bytes in the associated KeysList record           TDirectory::fNbyteskeys
+      14->17          NbytesName= Number of bytes in TKey+TNamed at creation                  TDirectory::fNbytesName
+      18->21 [18->25] SeekDir   = Byte offset of directory record in file                     TDirectory::fSeekDir
+      22->25 [26->33] SeekParent= Byte offset of parent directory record in file              TDirectory::fSeekParent
+      26->29 [34->41] SeekKeys  = Byte offset of associated KeysList record in file           TDirectory::fSeekKeys
+      30->31 [42->43] UUID vers = TUUID class version identifier                              TUUID::Class_Version()
+      32->47 [44->59] UUID      = Universally Unique Identifier                               TUUID::fTimeLow through fNode[6]
+      48->59          Extra space to allow SeekKeys to become 64 bit without moving this header
+</pre></div>
+
+Format of a TDirectory record in release 3.02.06.  It is never compressed.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------TKey--------------
+  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)                     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                      TKey::fSeekPdir
+      26->26 lname     = Number of bytes in the class name (10)                      TKey::fClassName
+      27->.. ClassName = Object Class Name ("TDirectory")                            TKey::fClassName
+       0->0  lname     = Number of bytes in the object name                          TNamed::fName
+       1->.. Name      = lName bytes with the name of the object <directory name>    TNamed::fName
+       0->0  lTitle    = Number of bytes in the object title                         TNamed::fTitle
+       1->.. Title     = lTitle bytes with the title of the object <directory title> TNamed::fTitle
+ --------DATA----------------
+       0->0  Modified  = True if directory has been modified                         TDirectory::fModified
+       1->1  Writable = True if directory is writable                                TDirectory::fWriteable
+       2->5  DatimeC   = Date and time when directory was created                    TDirectory::fDatimeC
+                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
+       6->9  DatimeM   = Date and time when directory was last modified              TDirectory::fDatimeM
+                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
+      10->13 NbytesKeys= Number of bytes in the associated KeysList record           TDirectory::fNbyteskeys
+      14->17 NbytesName= Number of bytes in TKey+TNamed at creation                  TDirectory::fNbytesName
+      18->21 SeekDir   = Byte offset of directory record in file                     TDirectory::fSeekDir
+      22->25 SeekParent= Byte offset of parent directory record in file              TDirectory::fSeekParent
+      26->29 SeekKeys  = Byte offset of associated KeysList record in file           TDirectory::fSeekKeys
+</pre></div>
diff --git a/io/doc/TFile/tfile.md b/io/doc/TFile/tfile.md
new file mode 100644
index 00000000000..2746451ea33
--- /dev/null
+++ b/io/doc/TFile/tfile.md
@@ -0,0 +1,46 @@
+\page tfile Format of the root (first) directory record
+
+Format of the root (first) directory record in release 6.22.06.  It is never compressed.
+
+This directory record differs from subdirectories (see \ref tdirectory) in the additional
+Name and Title at the beginning of the DATA (after the TKey).
+
+If the SeekKeys or SeekPdir in the TKey are located past the 32 bit file limit (> 2000000000),
+then these fields will be 8 instead of 4 bytes and 1000 is added to the TKey Version.
+
+If the SeekDir, SeekParent, or SeekKeys in the TDirectory header are past the 32 bit file limit,
+then these fields will be 8 instead of 4 bytes and 1000 is added to the TDirectory Version.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------TKey---------------
+  byte 0->3           Nbytes    = Number of bytes 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)                TKey::fKeyLen
+      16->17          Cycle     = Cycle of key                                           TKey::fCycle
+      18->21 [18->25] SeekKey   = Byte offset of record itself (consistency check) (64)  TKey::fSeekKey
+      22->25 [26->33] SeekPdir  = Byte offset of parent directory record (0)             TKey::fSeekPdir
+      26->26 [34->34] lname     = Number of bytes in the class name (5)                  TKey::fClassName
+      27->.. [35->..] ClassName = Object Class Name ("TFile")                            TKey::fClassName
+       0->0  lname     = Number of bytes in the object name                              TNamed::fName
+       1->..          Name      = lName bytes with the name of the object <file name>    TNamed::fName
+       0->0           lTitle    = Number of bytes in the object title                    TNamed::fTitle
+       1->..          Title     = lTitle bytes with the title of the object <file title> TNamed::fTitle
+ --------DATA-----------------
+       0->0           lname     = Number of bytes in the TFile name                      TNamed::fName
+       1->.. Name      = lName bytes with the name of the TFile <file name>              TNamed::fName
+       0->0           lTitle    = Number of bytes in the TFile title                     TNamed::fTitle
+       1->..          Title     = lTitle bytes with the title of the TFile <file title>  TNamed::fTitle
+       0->1           Version   = TDirectory class version identifier                    TDirectory::Class_Version()
+       2->5           DatimeC   = Date and time when directory was created               TDirectory::fDatimeC
+                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
+       6->9           DatimeM   = Date and time when directory was last modified         TDirectory::fDatimeM
+                       | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
+      10->13          NbytesKeys= Number of bytes in the associated KeysList record      TDirectory::fNbyteskeys
+      14->17          NbytesName= Number of bytes in TKey+TNamed at creation             TDirectory::fNbytesName
+      18->21 [18->25] SeekDir   = Byte offset of directory record in file (64)           TDirectory::fSeekDir
+      22->25 [26->33] SeekParent= Byte offset of parent directory record in file (0)     TDirectory::fSeekParent
+      26->29 [34->41] SeekKeys  = Byte offset of associated KeysList record in file      TDirectory::fSeekKeys
+</pre></div>
diff --git a/io/doc/TFile/tobject.md b/io/doc/TFile/tobject.md
new file mode 100644
index 00000000000..9fc08c18326
--- /dev/null
+++ b/io/doc/TFile/tobject.md
@@ -0,0 +1,29 @@
+\page tobject Format of the DATA for a TObject object
+
+Here is the format of the DATA for a TObject object in Release 3.02.06.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+--------
+  0->1  Version   = Version of TObject Class
+  2->5  fUniqueID = Unique ID of object.  Currently, unless this object is or was
+                       | referenced by a TRef or TRefArray, or is itself a TRef or TRefArray,
+                       | this field is not used by ROOT.
+  6->9  fBits     = A 32 bit mask containing status bits for the object.
+                       | The bits relevant to ROOTIO are:
+                       | 0x00000001 - if object in a list can be deleted.
+                       | 0x00000008 - if other objects may need to be deleted when this one is.
+                       | 0x00000010 - if object is referenced by pointer to persistent object.
+                       | 0x00002000 - if object ctor succeeded but object shouldn't be used
+                       | 0x01000000 - if object is on Heap.
+                       | 0x02000000 - if object has not been deleted.
+ The "pidf" field below is present only if this TObject object (or an object inheriting
+      from it) is referenced by a pointer to persistent object.
+ 10->11 pidf  = An identifier of the TProcessID record for the process that wrote the
+                       | object. This identifier is an unsigned short.  The relevant record
+                       | has a name that is the string "ProcessID" concatenated with the ASCII
+                       | decimal representation of "pidf" (no leading zeros).  0 is a valid pidf.
+-------
+ No object in the StreamerInfo record will be a reference or referenced, and all objects
+      are on the heap.  So, for each occurrence in the StreamerInfo record, fUniqueID will be 0,
+      fBits will be 0x03000000, and pidf will be absent.
+</pre></div>
diff --git a/io/doc/TFile/tprocessid.md b/io/doc/TFile/tprocessid.md
new file mode 100644
index 00000000000..06f281ff900
--- /dev/null
+++ b/io/doc/TFile/tprocessid.md
@@ -0,0 +1,88 @@
+\page tprocessid Format of TProcessID record
+
+
+Format of TProcessID record in release 3.02.06.
+Will be present if there are any referenced objects.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+ ----------TKey---------------
+   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)            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             TKey::fSeekPdir
+       26->26 lname    = Number of bytes in the class name (10)             TKey::fClassName
+       27->36 ClassName= Object Class Name ("TProcessID")                   TKey::fClassName
+       37->37 lname    = Number of bytes in the object name                 TNamed::fName
+       38->.. Name     = lName bytes with the name of the object            TNamed::fName
+                       | (e.g. "ProcessID0")
+        0->0  lTitle   = Number of bytes in the object title                TNamed::fTitle
+        1->.. Title    = lTitle bytes with the title of the object          TNamed::fTitle
+                       | (Identifies processor, time stamp, etc.)
+                       | See detailed explanation below.
+ ----------DATA--------------
+        0->3 ByteCount = Number of remaining bytes in TProcessID object (uncompressed)
+                       |   OR'd with kByteCountMask (0x40000000)
+        4->5 Version   = Version of TProcessID Class
+ -Begin TNamed object (Base class of TProcessID)
+        6->9 ByteCount = Number of remaining bytes in TNamed object (uncompressed)
+                       |   OR'd with kByteCountMask (0x40000000)
+       10->11 Version  = Version of TNamed Class
+       12->21          = TObject object (Base class of TNamed) (see \ref tobject).
+                       |   The TProcessID object is not itself referenced.
+       22->22 lname    = Number of bytes in the object name                 TNamed::fName
+       23->.. Name     = lName bytes with the name of the object            TNamed::fName
+                       | The name will be "ProcessID" concatenated with
+                       | a decimal integer, or "pidf".
+        0->0  lTitle   = Number of bytes in the object title                TNamed::fTitle
+        1->.. Title    = lTitle bytes with the title of the object          TNamed::fTitle
+                       | (Identifies processor, time stamp, etc.)
+                       | See detailed explanation below.
+ -End TNamed object
+</pre></div>
+
+### Explanation of the title of a TProcessID object
+
+The title of a TProcessID object is a globally unique identifier of the
+ROOTIO process that created it.  It is derived from the following quantities.
+
+  1. The creation time ("fTime) of the TProcessID record.  This is a 60 bit time
+     in 100ns ticks since Oct. 15, 1582.
+
+  2. A 16 bit random unsigned integer ("clockeq") generated from a seed that is the
+     job's process ID.  The highest two bits are not used.
+
+  3. A six byte unsigned quantity ("fNode") identifying the machine.  If the machine has a
+     valid network address, the first four bytes are set to that address, and the last two bytes
+     are stuffed with 0xbe and 0xef respectively.  Otherwise a six byte quantity is generated
+     from the time and random machine statistics. In this case, the high order bit of the
+     first byte is set to 1, to distinguish it from a network ID, where the bytes can be
+     no larger than 255.
+
+We the define the following quantities (class TUUID):
+<div style="background-color: lightgrey; font-size: small;"><pre>
+        UInt_t    fTimeLow;               // 60 bit time, lowest 32 bits
+        UShort_t  fTimeMid;               // 60 bit time, middle 16 bits
+        UShort_t  fTimeHiAndVersion;      // 60 bit time, highest 12 time bits (low 12 bits)
+                                          // + 4 UUID version bits (high 4 bits)
+                                          // version is 1 if machine has valid network address
+                                          // and 3 otherwise.
+        UChar_t   fClockSeqHiAndReserved; // high 6 clockseq bits (low 6 bits)
+                                          // + 2 high bits reserved (currently set to binary 10)
+        UChar_t   fClockSeqLow;           // low 8 clockseq bits
+        UChar_t   fNode[6];               // 6 node (machine) id bytes
+</pre></div>
+
+Then the following sprintf() call defines the format of the title string:
+<div style="background-color: lightgrey; font-size: small;"><pre>
+   sprintf(Title, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+           fTimeLow, fTimeMid, fTimeHiAndVersion, fClockSeqHiAndReserved,
+           fClockSeqLow, fNode[0], fNode[1], fNode[2], fNode[3], fNode[4],
+           fNode[5]);
+</pre></div>
+
+Since the title written to disk is preceded by its byte count, the delimiting null is not written.
diff --git a/io/doc/TFile/tref.md b/io/doc/TFile/tref.md
new file mode 100644
index 00000000000..4be1397f9b1
--- /dev/null
+++ b/io/doc/TFile/tref.md
@@ -0,0 +1,25 @@
+\page tref Format of the DATA for a TRef object
+
+Here is the format of the DATA for a TRef object in Release 3.02.06.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+--------
+  0->1  Version   = Version of TObject Class (base class of TRef)
+  2->5  fUniqueID = Unique ID of referenced object.  Typically, every referenced
+                       | object has an ID that is a positive integer set to a counter
+        | of the number of referenced objects in the file, beginning at 1.
+                       | fUniqueID in the TRef object matches fUniqueID in the
+                       | referenced object.
+  6->9  fBits     = A 32 bit mask containing status bits for the TRef object.
+                       | The bits relevant to ROOTIO are:
+        | 0x00000008 - Other objects may need to be deleted when this one is.
+        | 0x00000010 - Object is referenced by pointer to persistent object.
+        | 0x01000000 - Object is on Heap.
+        | 0x02000000 - Object has not been deleted.
+ 10->11 pidf  = An identifier of the TProcessID record for the process that wrote the
+                       | referenced object. This identifier is an unsigned short.  The relevant
+                       | record has a name that is the string "ProcessID" concatenated with the
+                       | ASCII decimal representation of "pidf" (no leading zeros).
+                       | 0 is a valid pidf.
+-------
+</pre></div>
\ No newline at end of file
diff --git a/io/doc/TFile/trefarray.md b/io/doc/TFile/trefarray.md
new file mode 100644
index 00000000000..a62ae2fb085
--- /dev/null
+++ b/io/doc/TFile/trefarray.md
@@ -0,0 +1,29 @@
+\page trefarray Format of the DATA for a TRefArray object
+
+Here is the format of the DATA for a TRefArray object in Release 3.02.06.
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
+--------
+       0->3  ByteCount = Number of remaining bytes in TRefArray object (uncompressed)
+                       |   OR'd with kByteCountMask (0x40000000)
+       4->5  Version   = Version of TRefArray Class
+       6->15           = TObject object (Base class of TRefArray) (see \ref tobject).
+                       |   Will be two bytes longer (6->17) if TRefArray object is
+                       |   itself referenced (unlikely).
+      16->.. fName     = Number of bytes in name of TRefArray object, followed by the
+                       |   name itself.  (TCollection::fName). Currently, TRefArrays
+                       |   are not named, so this is a single byte containing 0.
+       0->3  nObjects  | Number of object references (fUIDs) in this TRefArray.
+       4->7  fLowerBound= Lower bound of array.  Typically 0.
+       8->9  pidf  = An identifier of the TProcessID record for the process that wrote the
+                       | referenced objects. This identifier is an unsigned short.  The relevant
+                       | record has a name that is the string "ProcessID" concatenated with the
+                       | ASCII decimal representation of "pidf" (no leading zeros).
+                       | 0 is a valid pidf.
+      10->.. fUIDs     = Sequentially, object Unique ID's.
+                       | Each Unique ID is a four byte unsigned integer.
+                       | If non-zero, it matches the Unique ID in the referenced
+                       | object.  If zero, it is an unused element in the array.
+                       | The fUIDs are written out only up to the last used element,
+                       | so the last fUID will always be non-zero.
+</pre></div>
diff --git a/io/doc/TFile/TTree.txt b/io/doc/TFile/ttree.md
similarity index 97%
rename from io/doc/TFile/TTree.txt
rename to io/doc/TFile/ttree.md
index a2b0777735f..7f2d52dd7d9 100644
--- a/io/doc/TFile/TTree.txt
+++ b/io/doc/TFile/ttree.md
@@ -1,5 +1,10 @@
+\page ttree Streamer information for TTree related classes
+
+
 Here is the streamer information for TTree related classes in release 3.02.06:
-(For the explanation of the meaning of the type, see "fType" in "streamerinfo.txt".)
+(For the explanation of the meaning of the type, see "fType" in \ref streamerinfo.)
+
+<div style="background-color: lightgrey; font-size: small;"><pre>
 ----------------------------------------------------
 StreamerInfo for class: TTree, version=6
   BASE          TNamed          offset=  0 type=67 The basis for a named object (name, title)
@@ -84,3 +89,4 @@ StreamerInfo for class: TLeafElement, version=1
   BASE          TLeaf           offset=  0 type= 0 Leaf: description of a Branch data type
   Int_t         fID             offset=  0 type= 3 element serial number in fInfo
   Int_t         fType           offset=  0 type= 3 leaf type
+</pre></div>
diff --git a/io/io/src/TFile.cxx b/io/io/src/TFile.cxx
index 1b2fece15ca..3961e5308eb 100644
--- a/io/io/src/TFile.cxx
+++ b/io/io/src/TFile.cxx
@@ -14,6 +14,7 @@
 
   The library collecting the ROOT classes dedicated to data input and output.
 
+  The detailed internal description of the \ref rootio is available.
 */
 
 /**
-- 
GitLab