<?xml version="1.0" encoding="UTF-8"?>

<xs:schema
  version         = "1.0"
  xmlns:xs        = "http://www.w3.org/2001/XMLSchema"
  targetNamespace = "http://www.nrao.edu/namespaces/sss"
  xmlns:sss       = "http://www.nrao.edu/namespaces/sss"
  elementFormDefault = "qualified">
    
  <xs:include schemaLocation="measure.xsd"/>

  <!-- ================================================== -->
  <!-- ||||||||||||||||  ELEMENTS  |||||||||||||||||||||| -->
  <!-- ================================================== -->

  <!-- Some of these are here solely to facilitate testing. -->
  
  <xs:element name="ephemerisTable" type="sss:ephemerisTable"/>
  
  <xs:element name="dopplerSpecification" type="sss:dopplerSpecification"/>
  
  <!-- ================================================== -->
  <!-- ||||||||||||||||  COMPLEX TYPES  ||||||||||||||||| -->
  <!-- ================================================== -->
  
  <xs:complexType name="simpleSkyPosition">
    <xs:all>
      <xs:element name="originOfInformation"  type="xs:string"                minOccurs="0"/>
      <xs:element name="longitude"            type="sss:longitude"/>
      <xs:element name="latitude"             type="sss:latitude"/>
      <xs:element name="distance"             type="sss:nonNegativeDistance"  minOccurs="0"/>
      <xs:element name="longitudeUncertainty" type="sss:longitude"            minOccurs="0"/>
      <xs:element name="latitudeUncertainty"  type="sss:latitude"             minOccurs="0"/>
      <xs:element name="distanceUncertainty"  type="sss:nonNegativeDistance"  minOccurs="0"/>
    </xs:all>
    <xs:attribute name="coordinateSystem" type="sss:celestialCoordinateSystem" use="required"/>
    <xs:attribute name="epoch"            type="sss:epoch"                     use="required"/>
  </xs:complexType>
  
  <xs:complexType name="ephemerisTableEntry">
    <xs:all>
      <xs:element name="longitude" type="sss:longitude"/>
      <xs:element name="latitude"  type="sss:latitude"/>
      <xs:element name="distance"  type="sss:nonNegativeDistance"/>
      <xs:element name="velocity"  type="sss:linearVelocity"/>
    </xs:all>
    <xs:attribute name="startTime" type="xs:dateTime" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="ephemerisTable">
    <xs:sequence>
      <xs:element name="originOfInformation" type="xs:string" minOccurs="0"/>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="entry" type="sss:ephemerisTableEntry"/>
      </xs:sequence>
    </xs:sequence>
    <xs:attribute name="coordinateSystem" type="sss:celestialCoordinateSystem" use="required"/>
    <xs:attribute name="epoch"            type="sss:epoch"                     use="required"/>
  </xs:complexType>

  <xs:complexType name="solarPointingPosition">
    <xs:sequence>
      <xs:element name="originOfInformation" type="xs:string" minOccurs="0"/>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="entry" type="sss:ephemerisTableEntry"/>
      </xs:sequence>
    </xs:sequence>
    <xs:attribute name="coordinateSystem" type="sss:celestialCoordinateSystem" use="required"/>
    <xs:attribute name="epoch"            type="sss:epoch"                     use="required"/>
  </xs:complexType>

  <xs:complexType name="polynomialPosition">
    <xs:all>
      <xs:element name="validTime"           type="sss:timeInterval"/>
      <xs:element name="originOfInformation" type="xs:string" minOccurs="0"/>

      <xs:element name="longitudeAtTimeZero" type="sss:longitude"/>
      <xs:element name="latitudeAtTimeZero"  type="sss:latitude"/>
      <xs:element name="distanceAtTimeZero"  type="sss:nonNegativeDistance"/>

      <xs:element name="longitudeMotion" type="xs:string" minOccurs="0"/>
      <xs:element name="latitudeMotion"  type="xs:string" minOccurs="0"/>
      <xs:element name="radialMotion"    type="xs:string" minOccurs="0"/>

      <xs:element name="longitudeVelocityUnits" type="sss:angularVelocityUnits" minOccurs="0"/>
      <xs:element name="latitudeVelocityUnits"  type="sss:angularVelocityUnits" minOccurs="0"/>
      <xs:element name="radialVelocityUnits"    type="sss:linearVelocityUnits"  minOccurs="0"/>

      <xs:element name="longitudeUncertainty" type="sss:longitude"           minOccurs="0"/>
      <xs:element name="latitudeUncertainty"  type="sss:latitude"            minOccurs="0"/>
      <xs:element name="distanceUncertainty"  type="sss:nonNegativeDistance" minOccurs="0"/>
    </xs:all>
    <xs:attribute name="referenceTime"    type="xs:dateTime"                   use="required"/>
    <xs:attribute name="coordinateSystem" type="sss:celestialCoordinateSystem" use="required"/>
    <xs:attribute name="epoch"            type="sss:epoch"                     use="required"/>
  </xs:complexType>
                
  <xs:complexType name="distantSourcePosition">
    <xs:all>
      <xs:element name="validTime"           type="sss:timeInterval"/>
      <xs:element name="originOfInformation" type="xs:string" minOccurs="0"/>
      
      <xs:element name="longitudeAtTimeZero" type="sss:longitude"/>
      <xs:element name="latitudeAtTimeZero"  type="sss:latitude"/>
      <xs:element name="distanceAtTimeZero"  type="sss:nonNegativeDistance"/>
      
      <xs:element name="longitudeMotion" type="xs:string" minOccurs="0"/>
      <xs:element name="latitudeMotion"  type="xs:string" minOccurs="0"/>
      <xs:element name="radialMotion"    type="xs:string" minOccurs="0"/>
      
      <xs:element name="longitudeVelocityUnits" type="sss:angularVelocityUnits" minOccurs="0"/>
      <xs:element name="latitudeVelocityUnits"  type="sss:angularVelocityUnits" minOccurs="0"/>
      <xs:element name="radialVelocityUnits"    type="sss:linearVelocityUnits"  minOccurs="0"/>
      
      <xs:element name="longitudeUncertainty" type="sss:longitude"           minOccurs="0"/>
      <xs:element name="latitudeUncertainty"  type="sss:latitude"            minOccurs="0"/>
      <xs:element name="distanceUncertainty"  type="sss:nonNegativeDistance" minOccurs="0"/>
    </xs:all>
    <xs:attribute name="referenceTime"    type="xs:dateTime"                   use="required"/>
    <xs:attribute name="coordinateSystem" type="sss:celestialCoordinateSystem" use="required"/>
    <xs:attribute name="epoch"            type="sss:epoch"                     use="required"/>
  </xs:complexType>
                
  <xs:complexType name="nearSourcePosition">
    <xs:all>
      <xs:element name="validTime"           type="sss:timeInterval"/>
      <xs:element name="originOfInformation" type="xs:string" minOccurs="0"/>
      
      <xs:element name="longitudeAtTimeZero" type="sss:longitude"/>
      <xs:element name="latitudeAtTimeZero"  type="sss:latitude"/>
      <xs:element name="distanceAtTimeZero"  type="sss:nonNegativeDistance"/>
      
      <xs:element name="longitudeMotion" type="xs:string" minOccurs="0"/>
      <xs:element name="latitudeMotion"  type="xs:string" minOccurs="0"/>
      <xs:element name="radialMotion"    type="xs:string" minOccurs="0"/>
      
      <xs:element name="longitudeVelocityUnits" type="sss:angularVelocityUnits" minOccurs="0"/>
      <xs:element name="latitudeVelocityUnits"  type="sss:angularVelocityUnits" minOccurs="0"/>
      <xs:element name="radialVelocityUnits"    type="sss:linearVelocityUnits"  minOccurs="0"/>
      
      <xs:element name="longitudeUncertainty" type="sss:longitude"           minOccurs="0"/>
      <xs:element name="latitudeUncertainty"  type="sss:latitude"            minOccurs="0"/>
      <xs:element name="distanceUncertainty"  type="sss:nonNegativeDistance" minOccurs="0"/>
    </xs:all>
    <xs:attribute name="referenceTime"    type="xs:dateTime"                   use="required"/>
    <xs:attribute name="coordinateSystem" type="sss:celestialCoordinateSystem" use="required"/>
    <xs:attribute name="epoch"            type="sss:epoch"                     use="required"/>
  </xs:complexType>
                
  <xs:complexType name="polynomialPositionList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="polynomialPosition" type="sss:polynomialPosition"/>
    </xs:sequence>
  </xs:complexType>
                
  <xs:complexType name="solarSystemBody">
    <xs:attribute name="bodyName" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="dopplerSpecification">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="1">
        <xs:element name="simpleSkyPosition"       type="sss:simpleSkyPosition"/>
        <xs:element name="polynomialPosition"      type="sss:polynomialPosition"/>
        <xs:element name="polynomialPositionTable" type="sss:polynomialPositionList"/>
        <xs:element name="ephemerisTable"          type="sss:ephemerisTable"/>
        <xs:element name="solarSystemBodyPosition" type="sss:solarSystemBody"/>
      </xs:choice>
      <xs:element name="velocity" type="sss:dopplerSpecVelocity" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="optional"/>
  </xs:complexType>

  <xs:complexType name="dopplerSpecVelocity">
    <xs:all>
      <xs:element name="radialVelocity"     type="sss:linearVelocity"/>
    </xs:all>
    <xs:attribute name="restFrame"          type="sss:velocityFrame"      use="required"/>
    <xs:attribute name="velocityConvention" type="sss:velocityConvention" use="required"/>
  </xs:complexType>

  <!-- ================================================== -->
  <!-- ||||||||||||||||  SIMPLE TYPES  |||||||||||||||||| -->
  <!-- ================================================== -->

  <xs:simpleType name="astronomicalUnits">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="eccentricity">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0.0"/>
      <xs:maxExclusive value="1.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="fullCircleInDegrees">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0.0"/>
      <xs:maxExclusive value="360.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="halfCircleInDegrees">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0.0"/>
      <xs:maxExclusive value="180.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="polarizationList">
    <xs:list itemType="sss:stokesParameter"/>
  </xs:simpleType>

  <!-- ================================================== -->
  <!-- ||||||||||||||||  ENUMERATIONS  |||||||||||||||||| -->
  <!-- ================================================== -->

  <xs:simpleType name="celestialCoordinateSystem">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ECLIPTIC"/>
      <xs:enumeration value="EQUATORIAL"/>
      <xs:enumeration value="GALACTIC"/>
      <xs:enumeration value="HORIZONTAL"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="epoch">
    <xs:restriction base="xs:string">
      <!--<xs:enumeration value="B1950"/>-->
      <xs:enumeration value="J2000"/>
      <xs:enumeration value="UNKNOWN"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="polarizationType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="R"/>
      <xs:enumeration value="L"/>
      <xs:enumeration value="X"/>
      <xs:enumeration value="Y"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="stokesParameter">
    <xs:restriction base="xs:string">
      <xs:enumeration value="I"/>
      <xs:enumeration value="Q"/>
      <xs:enumeration value="U"/>
      <xs:enumeration value="V"/>
      <xs:enumeration value="RR"/>
      <xs:enumeration value="RL"/>
      <xs:enumeration value="LR"/>
      <xs:enumeration value="LL"/>
      <xs:enumeration value="XX"/>
      <xs:enumeration value="XY"/>
      <xs:enumeration value="YX"/>
      <xs:enumeration value="YY"/>
      <xs:enumeration value="RX"/>
      <xs:enumeration value="RY"/>
      <xs:enumeration value="LX"/>
      <xs:enumeration value="LY"/>
      <xs:enumeration value="XR"/>
      <xs:enumeration value="XL"/>
      <xs:enumeration value="YR"/>
      <xs:enumeration value="YL"/>
      <xs:enumeration value="PP"/>
      <xs:enumeration value="PQ"/>
      <xs:enumeration value="QP"/>
      <xs:enumeration value="QQ"/>
      <xs:enumeration value="RCIRCULAR"/>
      <xs:enumeration value="LCIRCULAR"/>
      <xs:enumeration value="LINEAR"/>
      <xs:enumeration value="PTOTAL"/>
      <xs:enumeration value="PLINEAR"/>
      <xs:enumeration value="PFTOTAL"/>
      <xs:enumeration value="PFLINEAR"/>
      <xs:enumeration value="PANGLE"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="velocityConvention">
    <xs:restriction base="xs:string">
      <xs:enumeration value="OPTICAL"/>
      <xs:enumeration value="RADIO"/>
      <xs:enumeration value="REDSHIFT"/>
      <xs:enumeration value="RELATIVISTIC"/>
      <xs:enumeration value="UNKNOWN"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="velocityFrame">
    <xs:restriction base="xs:string">
      <xs:enumeration value="TOPOCENTRIC"/>
      <xs:enumeration value="GEOCENTRIC"/>
      <xs:enumeration value="BARYCENTRIC"/>
      <xs:enumeration value="HELIOCENTRIC"/>
      <xs:enumeration value="LSR_KINEMATIC"/>
      <xs:enumeration value="LSR_DYNAMIC"/>
      <xs:enumeration value="GALACTOCENTRIC"/>
      <xs:enumeration value="LOCAL_GROUP"/>
      <xs:enumeration value="COSMIC_MICROWAVE_BACKGROUND"/>
      <xs:enumeration value="UNKNOWN"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
  
