Data header XML schema

The schema is specified here in the compact syntax form of the RELAX NG schema language.[4] A schema in the W3C XML schema language is also provided for reference, although it should be noted that this schema has been derived from the RELAX NG format schema.

RELAX NG compact syntax schema

namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
namespace xlink = "http://www.w3.org/1999/xlink"

start = sdmDataHeader

sdmDataHeader =
  element sdmDataHeader {

    [ a:documentation [ xml:id = "doc.byteOrder"
      "Binary data endianness." ] ]
    attribute byteOrder { "little endian" | "big endian" },

    [ a:documentation [ xml:id = "doc.axisOrder"
      "Axes are given an integer id as follows: 1. polarization " ~
      "product, 2. spectral channel, 3. apc, 4. bin, 5. spectral window, " ~
      "6. baseband, 7. baseline. Data in tables are ordered by a " ~
      "*column-major* traversal of the axes in this order. Note that " ~
      "the attribute value is fixed to be '1234567'." ] ]
    attribute axisOrder { "1234567" },

    [ a:documentation [ xml:id = "doc.schemaVersion"
      "Schema version number." ] ]
    attribute schemaVersion { xsd:decimal },

    [ a:documentation [ xml:id = "doc.time"
      "Scheduled time for the centroid of the integration. Units are " ~
      "MJD plus fractional day." ] ]
    element time { xsd:double, xsd:double },
    dataOID,
    execBlock,
    numAntenna,
    baselineFlags,
    actualTimes,
    actualDurations,
    zeroLags,

    numAPC,

    baseband+,

    crossData,

    autoData
  }

[ a:documentation [ xml:id = "doc.axes"
  'Attribute to declare axes used in supplemental data binary tables. ' ~
  'Although the order of the axes cannot be changed, some ' ~
  'axes may be omitted. The axis names correspond to the axis integer ' ~
  'identifiers as given in the "axisOrder" attribute of the ' ~
  '"sdmDataHeader" element. Note that it is the set of *non-omitted* ' ~
  '(i.e, present) axes that must be given.' ] ]
axes =
   attribute axes {
      list { "a1"?, "a2"?, "a3"?, "a4"?, "a5"?, "a6"?, "a7"? }
   }

[ a:documentation [ xml:id = "doc.baseband"
  'Container for "spectralWindows" in a baseband.' ] ]
baseband = element baseband { spectralWindow+ }

[ a:documentation [ xml:id = "doc.spectralWindow"
  "Metadata of a spectral window related to structure of the " ~
  "binary tables." ] ]
spectralWindow =
  element spectralWindow {
    [ a:documentation [ xml:id = "doc.numSpectralPoint"
      "Number of spectral channels." ] ]
    attribute numSpectralPoint { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.numBin"
      "Number of phase bins." ] ]
    attribute numBin { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.numPolProduct"
      "Number of polarization products." ] ]
    attribute numPolProduct {
      xsd:integer "1" | xsd:integer "2" | xsd:integer "4"
    },

    [ a:documentation [ xml:id = "doc.scaleFactor"
      "Scaling factor for spectral data." ] ]
    attribute scaleFactor { xsd:float }?
  }

[ a:documentation [ xml:id = "doc.crossData"
  "Table structure metadata of the cross-correlation spectral data " ~
   "binary table." ] ]
crossData =
  element crossData {
    [ a:documentation [ xml:id = "doc.crossData.size"
      "Size of binary table. (bytes)" ] ]
    attribute size { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.crossData.type"
      "Data type of spectral data. 'float': IEEE 754 single precision " ~
      "floating point; 'short': 16-bit twos-complement integer; " ~
      "'long': 32-bit twos-complement integer." ] ]
    attribute type { "float" | "short" | "long" },

    [ a:documentation [ xml:id = "doc.crossData.ref"
      "MIME message reference to MIME Content-id of binary table, " ~
      "may be in URI format (RFC 2111)."] ]
    attribute ref { xsd:NMTOKEN }
  }

[ a:documentation [ xml:id = "doc.autoData"
  "Table structure metadata of the auto-correlation spectral data " ~
   "binary table." ] ]
autoData =
  element autoData {
    [ a:documentation [ xml:id = "doc.autoData.size"
      "Size of binary table. (bytes)" ] ]
    attribute size { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.autoData.ref"
      "MIME message reference to MIME Content-id of binary table, " ~
      "may be in URI format (RFC 2111)."] ]
    attribute ref { xsd:NMTOKEN }
  }

[ a:documentation [ xml:id = "doc.baselineFlags"
  "baselineFlags table metadata." ] ]
baselineFlags =
  element baselineFlags {
    [ a:documentation [ xml:id = "doc.baselineFlags.size"
      "Size of binary table. (bytes)" ] ]
    attribute size { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.baselineFlags.ref"
      "MIME message reference to MIME Content-id of binary table, " ~
      "may be in URI format (RFC 2111)." ] ]
    attribute ref { xsd:NMTOKEN },
    axes
  }

[ a:documentation [ xml:id = "doc.actualTimes"
  "actualTimes table metadata." ] ]
actualTimes =
  element actualTimes {
    [ a:documentation [ xml:id = "doc.actualTimes.size"
      "Size of binary table. (bytes)" ] ]
    attribute size { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.actualTimes.ref"
      "MIME message reference to MIME Content-id of binary table, " ~
      "may be in URI format (RFC 2111)." ] ]
    attribute ref { xsd:NMTOKEN },
    axes
  }

[ a:documentation [ xml:id = "doc.lut"
  "Lookup table definition. Index values are implicit in the ordering " ~
  "of the floating point values given by the child elements of the 'lut' " ~
  "element, from index 0 up to, at most, index 2^{nbits} - 1." ] ]
lut =
  element lut {
    [ a:documentation [ xml:id = "doc.lut.nbits"
      "Lookup index bitfield length." ] ]
    attribute nbits { xsd:positiveInteger },

    xsd:double+
  }

[ a:documentation [ xml:id = "doc.actualDurations"
  "actualDurations table metadata." ] ]
actualDurations =
  element actualDurations {
    [ a:documentation [ xml:id = "doc.actualDurations.size"
      "Size of binary table. (bytes)" ] ]
    attribute size { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.actualDurations.ref"
      "MIME message reference to MIME Content-id of binary table, " ~
      "may be in URI format (RFC 2111)." ] ]
    attribute ref { xsd:NMTOKEN },

    axes,
    lut?
  }

[ a:documentation [ xml:id = "doc.zeroLags"
  "zeroLags table metadata." ] ]
zeroLags =
  element zeroLags {
    [ a:documentation [ xml:id = "doc.zeroLags.size"
      "Size of binary table. (bytes)" ] ]
    attribute size { xsd:positiveInteger },

    [ a:documentation [ xml:id = "doc.zeroLags.ref"
      "MIME message reference to MIME Content-id of binary table, " ~
      "may be in URI format (RFC 2111)." ] ]
    attribute ref { xsd:NMTOKEN },
    axes
  }

[ a:documentation [ xml:id= "doc.numAntenna"
  "Number of antennas in subarray." ] ]
numAntenna = element numAntenna { xsd:positiveInteger }

[ a:documentation [ xml:id = "doc.scanNum"
  "Scan number." ] ]
scanNum = element scanNum { xsd:positiveInteger }

[ a:documentation [ xml:id = "doc.subscanNum"
  "Sub-scan number." ] ]
subscanNum = element subscanNum { xsd:positiveInteger }

[ a:documentation [ xml:id = "doc.integrationNum"
  "Integration number." ] ]
integrationNum = element integrationNum { xsd:positiveInteger }

[ a:documentation [ xml:id = "doc.numAPC"
  "Number of data sets for atmospheric phase correction." ] ]
numAPC = element numAPC { xsd:positiveInteger }

[ a:documentation [ xml:id = "doc.execBlock"
  "Execution block identifier; uniquely identifies an instance of " ~
  "each execution of a scheduling block." ] ]
execBlock =
  element execBlock {
    [ a:documentation [ xml:id = "doc.execBlock.href"
      "Reference to containing(?) execBlock." ] ]
    attribute xlink:href { text },
    scanNum,
    subscanNum,
    integrationNum
  }

[ a:documentation [ xml:id = "doc.dataOID"
  "Unique identifier for the integration. This is actually a reference " ~
  "to the data for this integration itself, in essence a " ~
  "self-reference. It will be used by the SDM as a reference to this " ~
  "data." ] ]
dataOID =
  element dataOID {
    [ a:documentation [ xml:id = "doc.dataOID.href"
      "Reference to the identifier for this integration." ] ]
    attribute xlink:href { text },

    [ a:documentation [ xml:id = "doc.dataOID.title"
      "Description of the data." ] ]
    attribute xlink:title { "Correlator spectral data" }?
  }

W3C XML schema

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:xlink="http://www.w3.org/1999/xlink">
  <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink.xsd"/>
  <xs:element name="sdmDataHeader">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="time"/>
        <xs:element ref="dataOID"/>
        <xs:element ref="execBlock"/>
        <xs:element ref="numAntenna"/>
        <xs:element ref="baselineFlags"/>
        <xs:element ref="actualTimes"/>
        <xs:element ref="actualDurations"/>
        <xs:element ref="zeroLags"/>
        <xs:element ref="numAPC"/>
        <xs:element maxOccurs="unbounded" ref="baseband"/>
        <xs:element ref="crossData"/>
        <xs:element ref="autoData"/>
      </xs:sequence>
      <xs:attribute name="byteOrder" use="required">
        <xs:annotation>
          <xs:documentation>Binary data endianness.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:enumeration value="little endian"/>
            <xs:enumeration value="big endian"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="axisOrder" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:enumeration value="1234567"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="schemaVersion" use="required" type="xs:decimal">
        <xs:annotation>
          <xs:documentation>Schema version number.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="time">
    <xs:simpleType>
      <xs:union memberTypes="xs:double xs:double"/>
    </xs:simpleType>
  </xs:element>
  <xs:attributeGroup name="axes">
    <xs:attribute name="axes" use="required">
      <xs:simpleType>
        <xs:restriction>
          <xs:simpleType>
            <xs:list>
              <xs:simpleType>
                <xs:restriction base="xs:token">
                  <xs:enumeration value="a1"/>
                  <xs:enumeration value="a2"/>
                  <xs:enumeration value="a3"/>
                  <xs:enumeration value="a4"/>
                  <xs:enumeration value="a5"/>
                  <xs:enumeration value="a6"/>
                  <xs:enumeration value="a7"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:list>
          </xs:simpleType>
          <xs:maxLength value="7"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:element name="baseband">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="spectralWindow"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="spectralWindow">
    <xs:complexType>
      <xs:attribute name="numSpectralPoint" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Number of spectral channels.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="numBin" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Number of phase bins.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="numPolProduct" use="required">
        <xs:annotation>
          <xs:documentation>Number of polarization products.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:integer">
            <xs:enumeration value="1"/>
            <xs:enumeration value="2"/>
            <xs:enumeration value="4"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="scaleFactor" type="xs:float">
        <xs:annotation>
          <xs:documentation>Scaling factor for spectral data.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="crossData">
    <xs:complexType>
      <xs:attribute name="size" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Size of binary table. (bytes)</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="type" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:enumeration value="float"/>
            <xs:enumeration value="short"/>
            <xs:enumeration value="long"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="ref" use="required" type="xs:NMTOKEN"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="autoData">
    <xs:complexType>
      <xs:attribute name="size" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Size of binary table. (bytes)</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ref" use="required" type="xs:NMTOKEN"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="baselineFlags">
    <xs:complexType>
      <xs:attribute name="size" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Size of binary table. (bytes)</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ref" use="required" type="xs:NMTOKEN"/>
      <xs:attributeGroup ref="axes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="actualTimes">
    <xs:complexType>
      <xs:attribute name="size" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Size of binary table. (bytes)</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ref" use="required" type="xs:NMTOKEN"/>
      <xs:attributeGroup ref="axes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="lut">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="nbits" use="required" type="xs:positiveInteger">
            <xs:annotation>
              <xs:documentation>Lookup index bitfield length.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="actualDurations">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="lut"/>
      </xs:sequence>
      <xs:attribute name="size" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Size of binary table. (bytes)</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ref" use="required" type="xs:NMTOKEN"/>
      <xs:attributeGroup ref="axes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="zeroLags">
    <xs:complexType>
      <xs:attribute name="size" use="required" type="xs:positiveInteger">
        <xs:annotation>
          <xs:documentation>Size of binary table. (bytes)</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ref" use="required" type="xs:NMTOKEN"/>
      <xs:attributeGroup ref="axes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="numAntenna" type="xs:positiveInteger"/>
  <xs:element name="scanNum" type="xs:positiveInteger"/>
  <xs:element name="subscanNum" type="xs:positiveInteger"/>
  <xs:element name="integrationNum" type="xs:positiveInteger"/>
  <xs:element name="numAPC" type="xs:positiveInteger"/>
  <xs:element name="execBlock">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="scanNum"/>
        <xs:element ref="subscanNum"/>
        <xs:element ref="integrationNum"/>
      </xs:sequence>
      <xs:attributeGroup ref="xlink:href"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="dataOID">
    <xs:complexType>
      <xs:attributeGroup ref="xlink:href1"/>
      <xs:attribute ref="xlink:title"/>
    </xs:complexType>
  </xs:element>
</xs:schema>


[4] See http://relaxng.org for information.