<?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="../../util/1.38-DEV/commons.xsd"/>
  <xs:include schemaLocation="../../util/1.38-DEV/measure.xsd"/>
  <xs:include schemaLocation="../../util/1.38-DEV/astronomy.xsd"/> 
  
  <!-- ================================================== -->
  <!-- ||||||||||||||||  ELEMENTS  |||||||||||||||||||||| -->
  <!-- ================================================== -->

  <xs:element name="sourceCatalog">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="notes"             type="sss:noteList"             minOccurs="0"/>
        <xs:element name="userDefinedValues" type="sss:userDefinedValueList" minOccurs="0"/>
        <xs:element name="userPriorities"    type="sss:userPriorityList"     minOccurs="0"/>
        <xs:group                             ref="sss:userTrackable"/>
        <xs:element name="sources"           type="sss:sourceList"/>
        <xs:element name="sourceTables"      type="sss:sourceTableList"/>
        <xs:element name="sourceGroups"      type="sss:sourceGroupList"/>
      </xs:sequence>
      <xs:attribute name="id"            type="xs:long"   use="required"/>
      <xs:attribute name="name"          type="xs:string" use="required"/>
      <xs:attribute name="owner"         type="xs:long"   use="optional"/>
      <xs:attribute name="ownerPriority" type="xs:int"    use="optional" default="0"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="source" type="sss:source"/>

  <xs:element name="sourceLookupTable" type="sss:sourceLookupTable"/>

  <!-- ================================================== -->
  <!-- ||||||||||||||||  COMPLEX TYPES  ||||||||||||||||| -->
  <!-- ================================================== -->
    
  <xs:complexType name="sourceGroup">
    <xs:sequence>
      <xs:element name="notes"             type="sss:noteList"             minOccurs="0"/>
      <xs:element name="userDefinedValues" type="sss:userDefinedValueList" minOccurs="0"/>
      
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="source" type="xs:IDREF"/>
      </xs:sequence>
      
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="sourceTable" type="xs:IDREF"/>
      </xs:sequence>
    </xs:sequence>
    <xs:attribute name="id"   type="xs:long" use="required"/>
    <xs:attribute name="name" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="sourceLookupTable">
    <xs:sequence>
      <xs:group    ref="sss:userTrackable"/>
      <xs:element name="notes" type="sss:noteList" minOccurs="0"/>
      <xs:choice>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:element name="sourceId" type="sss:sourceLookupTableEntry"/>
        </xs:sequence>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:element name="entry" type="sss:sourceLookupTableEntryFull"/>
        </xs:sequence>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="id"    type="xs:long"        use="required"/>
    <xs:attribute name="xmlId" type="xs:ID"          use="required"/>
    <xs:attribute name="name"  type="sss:nameString" use="required"/>
  </xs:complexType>

  <!-- Compare this type to sourceLookupTableEntryFull.
       sourceLookupTableEntry refers to a source by its ID;
       sourceLookupTableEntryFull contains the full source itself. -->    
  <xs:complexType name="sourceLookupTableEntry">
    <xs:simpleContent>
      <xs:extension base="xs:IDREF">
        <xs:attribute name="startTime" type="xs:dateTime" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
    
  <!-- Compare this type to sourceLookupTableEntry.
       sourceLookupTableEntry refers to a source by its ID;
       sourceLookupTableEntryFull contains the full source itself. -->    
  <xs:complexType name="sourceLookupTableEntryFull">
    <xs:all>
      <xs:element name="source" type="sss:source"/>
    </xs:all>
    <xs:attribute name="startTime" type="xs:dateTime" use="required"/>
  </xs:complexType>
    
  <xs:complexType name="source">
    <xs:sequence>
      <xs:group    ref="sss:userTrackable"/>
      <xs:element name="notes"               type="sss:noteList"           minOccurs="0"/>
      <xs:element name="originOfInformation" type="xs:string"              minOccurs="0"/>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="alias" type="xs:string"/>
      </xs:sequence>
      <xs:element name="userDefinedValues" type="sss:userDefinedValueList" minOccurs="0"/>
      <xs:element name="imageLinks"        type="sss:imageLinkList"        minOccurs="0"/>
      <xs:element name="historicalRecords" type="sss:historicalRecordList" minOccurs="0"/>
      <xs:element name="parFileContents"  type="xs:string"  minOccurs="0"/>
      <xs:element name="links"             type="sss:linkList"             minOccurs="0"/>
      <xs:element name="subsources"        type="sss:subsourceList"/>   
    </xs:sequence>
    <xs:attribute name="id"    type="xs:long"        use="required"/>
    <xs:attribute name="xmlId" type="xs:ID"          use="required"/>
    <xs:attribute name="name"  type="sss:nameString" use="required"/>
  </xs:complexType>
    
  <xs:complexType name="subsource">
    <xs:sequence>
      <xs:choice minOccurs="1" 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:element name="solarPointingPosition"   type="sss:solarPointingPosition"/>
      </xs:choice>

      <xs:element name="velocities"   type="sss:velocityList"   minOccurs="0" maxOccurs="1"/>
      <xs:element name="brightnesses" type="sss:brightnessList" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="id"   type="xs:long"        use="required"/>
    <xs:attribute name="name" type="sss:nameString" use="required"/>
  </xs:complexType>
                                      
  <xs:complexType name="sourceGroupList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="sourceGroup" type="sss:sourceGroup"/>
    </xs:sequence>
  </xs:complexType>
            
  <xs:complexType name="sourceTableList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="sourceLookupTable" type="sss:sourceLookupTable"/>
    </xs:sequence>
  </xs:complexType>
                      
  <xs:complexType name="sourceList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="source" type="sss:source"/>
    </xs:sequence>
  </xs:complexType>
                          
  <xs:complexType name="subsourceList">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
      <xs:element name="subsource" type="sss:subsource"/>
    </xs:sequence>
  </xs:complexType>
        
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
      <!-- ||||||||||   Velocity        ||||||||| -->
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    
  <xs:complexType name="sourceVelocity">
    <xs:all>
      <xs:element name="validFrequency" type="sss:frequencyRange"/>
      <xs:element name="radialVelocity" type="sss:linearVelocity"/>
    </xs:all>
    <xs:attribute name="convention" type="sss:velocityConvention" use="required"/>
    <xs:attribute name="restFrame"  type="sss:velocityFrame"      use="required"/>
  </xs:complexType>
                
  <xs:complexType name="velocityList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="velocity" type="sss:sourceVelocity"/>
    </xs:sequence>
  </xs:complexType>
        
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
      <!-- ||||||||||   Brightness      ||||||||| -->
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
  
      <!--
          Note: there were several places in this section where xs:all was
          desired, but where xs:sequence had to be used, due to a
          restriction on the type of element that could be a parent
          of xs:group.
      -->
             
  <xs:complexType name="fileBasedBrightness">
    <xs:all>
      <xs:element name="validTime"      type="sss:timeInterval"/>
      <xs:element name="brightnessFile" type="xs:string"/>
    </xs:all>
    <xs:attribute name="id" type="xs:long" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="pointBrightness">
    <xs:group ref="sss:descriptiveBrightness"/>
    <xs:attribute name="id" type="xs:long" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="gaussianBrightness">
    <xs:group ref="sss:areaBrightness"/>
    <xs:attribute name="id" type="xs:long" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="diskBrightness">
    <xs:sequence>
      <xs:group ref="sss:areaBrightness"/>
      <xs:element name="limbDarkening" type="xs:double"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:long" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="unknownBrightness">
    <xs:sequence>
      <xs:group ref="sss:descriptiveBrightness"/>
      <xs:element name="diameter" type="xs:double"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:long" use="required"/>
  </xs:complexType>
  
  <xs:group name="descriptiveBrightness">
    <xs:sequence>
      <xs:element name="validTime"         type="sss:timeInterval"/>
      <xs:element name="vlaObservation"    type="sss:vlaFluxObservation"  minOccurs="0"/>
      <xs:element name="polarization"      type="sss:stokesParameter"/>
      <xs:element name="validFrequency"    type="sss:frequencyRange"/>
      <xs:element name="peakFluxDensity"   type="sss:fluxDensity"/>
      <xs:element name="totalFluxDensity"  type="sss:fluxDensity"/>
    </xs:sequence>
  </xs:group>
  
  <xs:group name="areaBrightness">
    <xs:sequence>
      <xs:group                             ref="sss:descriptiveBrightness"/>
      <xs:element name="minorAxisDiameter" type="sss:nonNegativeDouble"/>
      <xs:element name="majorAxisDiameter" type="sss:nonNegativeDouble"/>
      <xs:element name="positionAngle"     type="xs:double"/>
    </xs:sequence>
  </xs:group>
                    
  <xs:complexType name="brightnessList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:choice>
        <xs:element name="cleanFileBrightness" type="sss:fileBasedBrightness"/>
        <xs:element name="fitsFileBrightness"  type="sss:fileBasedBrightness"/>
        <xs:element name="diskBrightness"      type="sss:diskBrightness"/>
        <xs:element name="gaussianBrightness"  type="sss:gaussianBrightness"/>
        <xs:element name="pointBrightness"     type="sss:pointBrightness"/>
        <xs:element name="unknownBrightness"   type="sss:unknownBrightness"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
             
  <xs:complexType name="vlaFluxObservation">
    <xs:all>
      <xs:element name="Source"          type="xs:string"/>
      <xs:element name="correlator_mode" type="xs:string"/>
      <xs:element name="el_end"          type="xs:double"/>
      <xs:element name="mjad"            type="xs:double"/>
      <xs:element name="obs_start"       type="xs:double"/>
      <xs:element name="obs_end"         type="xs:double"/>
      <xs:element name="time_obs"        type="xs:double"/>
      <xs:element name="ac_freq"         type="xs:double"/>
      <xs:element name="bd_freq"         type="xs:double"/>
      <xs:element name="ac_flux"         type="xs:double"/>
      <xs:element name="bd_flux"         type="xs:double"/>
      <xs:element name="ac_flux_stddev"  type="xs:double"/>
      <xs:element name="bd_flux_stddev"  type="xs:double"/>
    </xs:all>
  </xs:complexType>
            
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
      <!-- ||||||||||      Other        ||||||||| -->
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
                                    
  <xs:complexType name="imageLink">
    <xs:all>
      <xs:element name="displayName"   type="xs:string"/>
      <xs:element name="imageLocation" type="xs:string"/>
      <xs:element name="frequency"     type="sss:frequency"/>
      <xs:element name="polarization"  type="sss:stokesParameter"/>
      <xs:element name="comments"      type="xs:string" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
            
  <xs:complexType name="imageLinkList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="imageLink" type="sss:imageLink"/>
    </xs:sequence>
  </xs:complexType>
            
  <xs:complexType name="linkList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="link" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
            
  <xs:complexType name="historicalRecordList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="historicalRecord" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  
 
  <!-- ================================================== -->
  <!-- ||||||||||||||||  SIMPLE TYPES  |||||||||||||||||| -->
  <!-- ================================================== -->
  
  <!-- ================================================== -->
  <!-- ||||||||||||||||  ENUMERATIONS  |||||||||||||||||| -->
  <!-- ================================================== -->
  
</xs:schema>
  
