<?xml version="1.0" encoding="UTF-8"?>
<vo-dml:model xmlns:vo-dml="http://www.ivoa.net/xml/VODML/v1"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.ivoa.net/xml/VODML/v1 https://www.ivoa.net/xml/VODML/vo-dml-v1.xsd">
  <name>coords</name>
  <description>This model defines objects which describe the coordinate space, coordinates within that space, and frames, which provide additional metadata regarding the origin, orientation, etc, of the coordinate space. The model also defines a coordinate system, bundling frames into associated groups.
</description>
  <uri/>
  <title>Astronomical Coordinates and Coordinate Systems</title>
  <author>Arnold Rots, Mark Cresitello-Dittmar, Omar Laurino</author>
  <version>1.0</version>
  <previousVersion>0</previousVersion>
  <lastModified>2021-06-17T16:27:43</lastModified>
  <import>
    <name>ivoa</name>
    <url>https://www.ivoa.net/xml/VODML/IVOA-v1.vo-dml.xml</url>
    <documentationURL>https://www.ivoa.net/documents/VODML/20180910/IVOA-REC-v1.0.html</documentationURL>
  </import>
  <primitiveType>
    <vodml-id>Epoch</vodml-id>
    <name>Epoch</name>
    <description>We define epoch as a primitive data type with the expected form "&lt;type&gt;&lt;year&gt;" where type = "J" or "B" for Julian or Besselian respectively, and year is expressed as a decimal year.  e.g.: "B1950", "J2000.0"</description>
  </primitiveType>

  <enumeration>
    <vodml-id>Handedness</vodml-id>
    <name>Handedness</name>
    <description>The handedness of a coordinate space.  For most cases, this will be a fixed value in the specification of the coordinate space.  We provide this element to allow this flexibility when needed.  In this document, it is used in the Pixel domain.</description>
    <literal>
      <vodml-id>Handedness.left</vodml-id>
      <name>left</name>
      <description>positive x and y axes point right and up, the positive z axis points inward</description>
    </literal>
    <literal>
      <vodml-id>Handedness.right</vodml-id>
      <name>right</name>
      <description>positive x and y axes point right and up, the positive z axis points outward</description>
    </literal>
  </enumeration>

  <enumeration>
    <vodml-id>PolStateEnum</vodml-id>
    <name>PolStateEnum</name>
    <description>Polarization states: Stokes, Circular, Linear and Vector states
</description>
    <literal>
      <vodml-id>PolStateEnum.I</vodml-id>
      <name>I</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.Q</vodml-id>
      <name>Q</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.U</vodml-id>
      <name>U</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.V</vodml-id>
      <name>V</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.RR</vodml-id>
      <name>RR</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.LL</vodml-id>
      <name>LL</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.RL</vodml-id>
      <name>RL</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.LR</vodml-id>
      <name>LR</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.XX</vodml-id>
      <name>XX</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.YY</vodml-id>
      <name>YY</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.XY</vodml-id>
      <name>XY</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.YX</vodml-id>
      <name>YX</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.PF</vodml-id>
      <name>PF</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.PP</vodml-id>
      <name>PP</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
    <literal>
      <vodml-id>PolStateEnum.PA</vodml-id>
      <name>PA</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
    </literal>
  </enumeration>

  <dataType abstract="true">
    <vodml-id>Coordinate</vodml-id>
    <name>Coordinate</name>
    <description>Abstract base class for the Coordinate data types which represent an absolute location within a coordinate space. Coordinates MUST refer to a coordinate system, providing additional metadata relevant to interpreting the coordinate value, and its representation.
</description>
    <reference>
      <vodml-id>Coordinate.coordSys</vodml-id>
      <name>coordSys</name>
      <description>Provided additional metadata relevant to interpreting the coordinate value; for example, the spatial reference position, or time scale, axis descriptions.
</description>
      <datatype>
        <vodml-ref>coords:CoordSys</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </reference>
  </dataType>

  <dataType>
    <vodml-id>BinnedCoordinate</vodml-id>
    <name>BinnedCoordinate</name>
    <description>Coordinate value type specifically intended for binned data (e.g.: pixel indexes).
</description>
    <extends>
      <vodml-ref>coords:Coordinate</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>BinnedCoordinate.cval</vodml-id>
      <name>cval</name>
      <description>The binned coordinate value, expressed as an integer.  e.g.: bin number, pixel index.
</description>
      <datatype>
        <vodml-ref>ivoa:integer</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType>
    <vodml-id>PixelIndex</vodml-id>
    <name>PixelIndex</name>
    <description>Specialized BinnedCoordinate for the pixel domain for a 1-dimensional pixel index.  PixelIndex MUST refer to a PixelCoordSystem.
</description>
    <extends>
      <vodml-ref>coords:BinnedCoordinate</vodml-ref>
    </extends>
  </dataType>

  <dataType>
    <vodml-id>PhysicalCoordinate</vodml-id>
    <name>PhysicalCoordinate</name>
    <description>The most common type of coordinate value.  This type is appropriate for any data whose values can be described by an ivoa:Quantity (numeric, with unit).</description>
    <extends>
      <vodml-ref>coords:Coordinate</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>PhysicalCoordinate.cval</vodml-id>
      <name>cval</name>
      <description>This coordinate MUST contain a value expressed as an ivoa:Quantity.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType abstract="true">
    <vodml-id>Point</vodml-id>
    <name>Point</name>
    <description>Multi-dimensional spatial coordinate. The Point MUST refer to a spatial coordinate system (SpaceSys) which associates the point with corresponding coordinate domain space and frame metadata.</description>
    <extends>
      <vodml-ref>coords:Coordinate</vodml-ref>
    </extends>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:Coordinate.coordSys</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:SpaceSys</vodml-ref>
      </datatype>
    </constraint>
  </dataType>

  <dataType>
    <vodml-id>CartesianPoint</vodml-id>
    <name>CartesianPoint</name>
    <description>A spatial coordinate in a Cartesian coordinate space.  Any associated CoordSpace MUST be a CartesianCoordSpace.  If no CoordSpace is provided, a Standard Cartesian CoordSpace is assumed.  Values for unused/undefined dimensions need not be provided.
</description>
    <extends>
      <vodml-ref>coords:Point</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>CartesianPoint.x</vodml-id>
      <name>x</name>
      <description>The coordinate value along the 'X' axis.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>CartesianPoint.y</vodml-id>
      <name>y</name>
      <description>The coordinate value along the 'Y' axis.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>CartesianPoint.z</vodml-id>
      <name>z</name>
      <description>The coordinate value along the 'Z' axis.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType>
    <vodml-id>LonLatPoint</vodml-id>
    <name>LonLatPoint</name>
    <description>A spatial coordinate in a Spherical coordinate space defining a Celestial position in Latitude and Longitude.  Any associated CoordSpace MUST conform to this description.  If no CoordSpace is provided, a Standard Spherical CoordSpace is assumed.  Values for unused/undefined dimensions need not be provided.
</description>
    <extends>
      <vodml-ref>coords:Point</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>LonLatPoint.lon</vodml-id>
      <name>lon</name>
      <description>The longitude of the Point, as a Quantity with angular units.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>LonLatPoint.lat</vodml-id>
      <name>lat</name>
      <description>The latitude of the Point, as a Quantity with angular units.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>LonLatPoint.dist</vodml-id>
      <name>dist</name>
      <description>The distance to the Point from the origin.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType>
    <vodml-id>GenericPoint</vodml-id>
    <name>GenericPoint</name>
    <description>GenericPoint supports the representation of spatial coordinates in a custom coordinate space, or any space which is not covered by the other specializations.   The coordinate values map, in order, to the axes described by the associated CoordSpace.  If no CoordSpace is provided, the behavior is undefined.  Values for unused/undefined dimensions need not be provided.</description>
    <extends>
      <vodml-ref>coords:Point</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>GenericPoint.axis1</vodml-id>
      <name>axis1</name>
      <description>Coordinate value along the first axis of the associated coordinate space, expressed as an ivoa:Quantity.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>GenericPoint.axis2</vodml-id>
      <name>axis2</name>
      <description>Coordinate value along the second axis of the associated coordinate space, expressed as an ivoa:Quantity.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>GenericPoint.axis3</vodml-id>
      <name>axis3</name>
      <description>Coordinate value along the third axis of the associated coordinate space, expressed as an ivoa:Quantity.</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType abstract="true">
    <vodml-id>TimeStamp</vodml-id>
    <name>TimeStamp</name>
    <description>This is the abstract basis for a set of simple time domain coordinates which are expected to accommodate the vast majority of use cases. All TimeStamps, by definition, exist in a standard 1-D coordinate space, with domainMin|Max of +/-Infinity.  All TimeStamps MUST refer to an appropriate TimeSys.
</description>
    <extends>
      <vodml-ref>coords:Coordinate</vodml-ref>
    </extends>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:Coordinate.coordSys</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:TimeSys</vodml-ref>
      </datatype>
    </constraint>
  </dataType>

  <dataType>
    <vodml-id>TimeOffset</vodml-id>
    <name>TimeOffset</name>
    <description>Time is given as an offset from a specific point in time (time0).</description>
    <extends>
      <vodml-ref>coords:TimeStamp</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>TimeOffset.time</vodml-id>
      <name>time</name>
      <description>The TimeOffset coordinate value.</description>
      <datatype>
        <vodml-ref>ivoa:RealQuantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>TimeOffset.time0</vodml-id>
      <name>time0</name>
      <description>The reference time from which the offset is calculated.  This MUST be given as a TimeInstant (e.g.: JD, MJD, ISOTime).</description>
      <datatype>
        <vodml-ref>coords:TimeInstant</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType abstract="true">
    <vodml-id>TimeInstant</vodml-id>
    <name>TimeInstant</name>
    <description>TimeStamps which specify a specific instant in time.  We define three subtypes (ISOTime, JD, MJD), which allow users to explicitly identify the representation and interpretation of the TimeInstant.</description>
    <extends>
      <vodml-ref>coords:TimeStamp</vodml-ref>
    </extends>
  </dataType>

  <dataType>
    <vodml-id>JD</vodml-id>
    <name>JD</name>
    <description>Extension of TimeInstant for time expressed in Julian days.  Note that JD does not properly specify a time stamp unless it is related to a time scale and reference position.  Precision can easily become an issue with JD, as the numbers tend to be large.</description>
    <extends>
      <vodml-ref>coords:TimeInstant</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>JD.date</vodml-id>
      <name>date</name>
      <description>The JD coordinate value.  JD dates are dimensionless, with implied units in days.</description>
      <datatype>
        <vodml-ref>ivoa:real</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType>
    <vodml-id>MJD</vodml-id>
    <name>MJD</name>
    <description>Extension of TimeInstant for time expressed in Modified Julian Days.  T(MJD) = T(JD) - 2400000.5.</description>
    <extends>
      <vodml-ref>coords:TimeInstant</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>MJD.date</vodml-id>
      <name>date</name>
      <description>The MJD coordinate value.  MJD dates are dimensionless, with implied units in days.</description>
      <datatype>
        <vodml-ref>ivoa:real</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType>
    <vodml-id>ISOTime</vodml-id>
    <name>ISOTime</name>
    <description>Extension of TimeInstant for time expressed as a structured datetime string.
The string representation of a datetime value should follow the FITS convention for representing dates (Hanish and Farris et al, 2001).  The FITS standard is effectively ISO8601 format without the 'Z' tag to indicate UTC:  YYYY-MM-DD['T'hh:mm:ss[.SSS]].  The TimeScale is provided in the associated TimeFrame.</description>
    <extends>
      <vodml-ref>coords:TimeInstant</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>ISOTime.date</vodml-id>
      <name>date</name>
      <description>The ISOTime coordinate value.</description>
      <datatype>
        <vodml-ref>ivoa:datetime</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType abstract="true">
    <vodml-id>PolCoordinate</vodml-id>
    <name>PolCoordinate</name>
    <description>Abstract head of the polarization coordinate types. Current use cases only require support for discrete polarization states, however, we include this head class to facilitate extension for other types (eg: polarization fraction and angle).</description>
    <extends>
      <vodml-ref>coords:Coordinate</vodml-ref>
    </extends>
  </dataType>

  <dataType>
    <vodml-id>PolState</vodml-id>
    <name>PolState</name>
    <description>Coordinate type for discrete polarization states.
</description>
    <extends>
      <vodml-ref>coords:PolCoordinate</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>PolState.cval</vodml-id>
      <name>cval</name>
      <description>The coordinate value MUST be from the PolStateEnum enumerated set.
</description>
      <datatype>
        <vodml-ref>coords:PolStateEnum</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <dataType abstract="true">
    <vodml-id>RefLocation</vodml-id>
    <name>RefLocation</name>
    <description>RefLocation defines the origin of the spatial coordinate space.  This location is represented either by a standard reference position (for which the absolute location in phase space is known by definition), or a specified point in another Spatial frame.  This object is used as the origin of the SpaceFrame here, but also to specify the Spatial Reference Position (refPosition) associated with other domain Frames.  For example, in the Time domain, the Spatial Reference Position indicates that the 'time' values are the time that the 'event' occurred at that location, which might be different from the detector location.  
 </description>
  </dataType>

  <dataType>
    <vodml-id>StdRefLocation</vodml-id>
    <name>StdRefLocation</name>
    <description>An absolute a-priori known location in phase space (position and velocity).  Values are selected from the StdRefPosition vocabulary.  Considering that the GEOCENTER is really the only place for which we know the absolute location at all times, all other locations require the specification of a planetary ephemeris.  LSR[KD] are reserved for spectral and reshift frames.  TOPOCENTER (location of the observer) is special in that it assumes that the observing location is available through other means (e.g. a geographic location or an orbit ephemeris).  RELOCATABLE is available for simulations.  UNKNOWN should only be used if absolutely necessary.</description>
    <extends>
      <vodml-ref>coords:RefLocation</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>StdRefLocation.position</vodml-id>
      <name>position</name>
      <description>Standard reference location.  Values MUST be selected from the controlled vocabulary at the given URL. </description>
      <datatype>
        <vodml-ref>ivoa:string</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
      <semanticconcept>
        <topConcept>ReferencePosition</topConcept>
        <vocabularyURI>http://www.ivoa.net/rdf/refposition</vocabularyURI>
      </semanticconcept>
    </attribute>
  </dataType>

  <dataType>
    <vodml-id>CustomRefLocation</vodml-id>
    <name>CustomRefLocation</name>
    <description>A custom reference location in phase space (position and velocity).  Position and velocity are given as coordinates with an associated SpaceFrame.  An epoch MAY be provided to further refine the location.</description>
    <extends>
      <vodml-ref>coords:RefLocation</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>CustomRefLocation.epoch</vodml-id>
      <name>epoch</name>
      <description>Epoch for the reference location.</description>
      <datatype>
        <vodml-ref>coords:Epoch</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>CustomRefLocation.position</vodml-id>
      <name>position</name>
      <description>The spatial coordinates of the reference location.</description>
      <datatype>
        <vodml-ref>coords:Point</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>CustomRefLocation.velocity</vodml-id>
      <name>velocity</name>
      <description>The velocity of the reference location.</description>
      <datatype>
        <vodml-ref>coords:Point</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </dataType>

  <objectType abstract="true">
    <vodml-id>CoordSpace</vodml-id>
    <name>CoordSpace</name>
    <description>This object defines a domain space.  i.e.: it describes the set of possible coordinate values.</description>
    <composition>
      <vodml-id>CoordSpace.axis</vodml-id>
      <name>axis</name>
      <description>Describes an axis of the coordinate space.  </description>
      <datatype>
        <vodml-ref>coords:Axis</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>-1</maxOccurs>
      </multiplicity>
    </composition>
  </objectType>

  <objectType abstract="true">
    <vodml-id>Axis</vodml-id>
    <name>Axis</name>
    <description>The abstract parent class for all coordinate axis types.  We provide concrete classes for the most common types of data, Continuous, Binned, and Discrete, but allow extension for other types as needed.</description>
    <attribute>
      <vodml-id>Axis.name</vodml-id>
      <name>name</name>
      <description>Freeform string, provides the name or label for the axis.</description>
      <datatype>
        <vodml-ref>ivoa:string</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </objectType>

  <objectType>
    <vodml-id>ContinuousAxis</vodml-id>
    <name>ContinuousAxis</name>
    <description>Axis description for continuous data.  This object describes the domain for a particular axis of the domain space.  It allows for the specification of the legal domain range (min,max), and a flag indicating if the axis is cyclic.</description>
    <extends>
      <vodml-ref>coords:Axis</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>ContinuousAxis.domainMin</vodml-id>
      <name>domainMin</name>
      <description>Minimum extent of the axis domain space.  If not provided, the domain space is considered to have no lower bound (-INFINITY).</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>ContinuousAxis.domainMax</vodml-id>
      <name>domainMax</name>
      <description>Maximum extent of the axis domain space.  If not provided, the domain space is considered to have no upper bound (+INFINITY).</description>
      <datatype>
        <vodml-ref>ivoa:Quantity</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>ContinuousAxis.cyclic</vodml-id>
      <name>cyclic</name>
      <description>Flag indicating if the axis is cyclic in nature.  If not provided, it is assumed to be FALSE.</description>
      <datatype>
        <vodml-ref>ivoa:boolean</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </objectType>

  <objectType>
    <vodml-id>BinnedAxis</vodml-id>
    <name>BinnedAxis</name>
    <description>Axis description for binned data, where values along the axis correspond to a bin number.</description>
    <extends>
      <vodml-ref>coords:Axis</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>BinnedAxis.length</vodml-id>
      <name>length</name>
      <description>  The length, or number of bins, along the axis.</description>
      <datatype>
        <vodml-ref>ivoa:nonnegativeInteger</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </objectType>

  <objectType>
    <vodml-id>DiscreteSetAxis</vodml-id>
    <name>DiscreteSetAxis</name>
    <description>Axis type specifically intended for enumerated coordinates.  Since the content and nature of this axis type is heavily dependent on the use case, we define no additional metadata here.  Extensions of this type may include additional metadata relevant to the particular use cases.  For example, an extension could include the allowed set of values.</description>
    <extends>
      <vodml-ref>coords:Axis</vodml-ref>
    </extends>
  </objectType>

  <objectType abstract="true">
    <vodml-id>CoordFrame</vodml-id>
    <name>CoordFrame</name>
    <description>This is the abstract, empty, base class for all coordinate frames.  Coordinate frames provide metadata associated with the coordinate domain space.  Typically, this will be related to the origin and orientation of the axes, but might include any metadata which pertains to the definition of the domain.</description>
  </objectType>

  <objectType>
    <vodml-id>GenericFrame</vodml-id>
    <name>GenericFrame</name>
    <description>The generic coordinate frame is for cases where a domain-specific frame (e.g.: Space, Time), is not required, but the relevant reference metadata is still needed (e.g.: for Redshift or Spectral data)</description>
    <extends>
      <vodml-ref>coords:CoordFrame</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>GenericFrame.refPosition</vodml-id>
      <name>refPosition</name>
      <description>Spatial location in phase space (position and velocity) at which the observed value is considered to have been taken. This will typically be given by a standard reference position, but we allow for custom locations as well.
</description>
      <datatype>
        <vodml-ref>coords:RefLocation</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>GenericFrame.planetaryEphem</vodml-id>
      <name>planetaryEphem</name>
      <description>A planetary ephemeris MAY be provided, and SHOULD be provided whenever appropriate, to indicate which solar system ephemeris was used.  If needed, but not provided, it is assumed to be "DE405"</description>
      <datatype>
        <vodml-ref>ivoa:string</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </objectType>

  <objectType>
    <vodml-id>SpaceFrame</vodml-id>
    <name>SpaceFrame</name>
    <description>A SpaceFrame is specified by its reference frame (orientation), and a reference position (origin). Currently only standard reference frames are allowed. An equinox MUST be provided for pre-ICRS reference frames. A planetary ephemeris MAY be provided if relevant. If needed, but not provided, it is assumed to be "DE405".
</description>
    <extends>
      <vodml-ref>coords:CoordFrame</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>SpaceFrame.refPosition</vodml-id>
      <name>refPosition</name>
      <description>The spatial location at which the coordinates are considered to have been determined.  This model supports locations provided as either a standard reference position (e.g. GEOCENTER), or a coordinate specifying a custom location (e.g. long, lat, height ).</description>
      <datatype>
        <vodml-ref>coords:RefLocation</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>SpaceFrame.spaceRefFrame</vodml-id>
      <name>spaceRefFrame</name>
      <description>The spatial reference frame. Values MUST be selected from the controlled vocabulary at the given URL.
</description>
      <datatype>
        <vodml-ref>ivoa:string</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
      <semanticconcept>
        <topConcept>SpaceRefFrame</topConcept>
        <vocabularyURI>http://www.ivoa.net/rdf/refframe</vocabularyURI>
      </semanticconcept>
    </attribute>
    <attribute>
      <vodml-id>SpaceFrame.equinox</vodml-id>
      <name>equinox</name>
      <description>Reference date for the frame, required for pre-ICRS reference frames.</description>
      <datatype>
        <vodml-ref>coords:Epoch</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>SpaceFrame.planetaryEphem</vodml-id>
      <name>planetaryEphem</name>
      <description>Ephemeris file for solar system objects SHOULD be specified whenever relevant.</description>
      <datatype>
        <vodml-ref>ivoa:string</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </objectType>

  <objectType>
    <vodml-id>TimeFrame</vodml-id>
    <name>TimeFrame</name>
    <description>A TimeFrame SHALL include a time scale and reference position.  It MAY also include a reference direction.</description>
    <extends>
      <vodml-ref>coords:CoordFrame</vodml-ref>
    </extends>
    <attribute>
      <vodml-id>TimeFrame.refPosition</vodml-id>
      <name>refPosition</name>
      <description>The spatial location at which the coordinate is considered to have been taken.  This model supports locations provided as either a standard reference position (e.g. GEOCENTER), or a coordinate specifying a custom location (e.g. long, lat, height).</description>
      <datatype>
        <vodml-ref>coords:RefLocation</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
    <attribute>
      <vodml-id>TimeFrame.timescale</vodml-id>
      <name>timescale</name>
      <description>The time scale sets the reference frame.  The value MUST be selected from the controlled vocabulary at the given URL.</description>
      <datatype>
        <vodml-ref>ivoa:string</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
      <semanticconcept>
        <topConcept>TimeScale</topConcept>
        <vocabularyURI>http://www.ivoa.net/rdf/timescale</vocabularyURI>
      </semanticconcept>
    </attribute>
    <attribute>
      <vodml-id>TimeFrame.refDirection</vodml-id>
      <name>refDirection</name>
      <description>The reference direction is needed if the time stamps are transformed to a time frame with a different reference position.  In those situations, the solar system ephemeris also comes into play.  See: FITS WCS Paper IV for details, but in short:  The reference direction, presumably the direction to the thing being observed, is used in conjunction with the reference position and planetary ephemeris to determine the correction applied for the path length change.  To be fully useful, one also needs to know the location at which the observation was made ( i.e. the observatory location), which is not considered to be Frame metadata.</description>
      <datatype>
        <vodml-ref>coords:RefLocation</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </objectType>

  <objectType>
    <vodml-id>AstroCoordSystem</vodml-id>
    <name>AstroCoordSystem</name>
    <description>The AstroCoordSystem object holds a collection of component coordinate system descriptions across all represented physical domains.</description>
    <extends>
      <vodml-ref>coords:CoordSys</vodml-ref>
    </extends>
    <composition>
      <vodml-id>AstroCoordSystem.coordSys</vodml-id>
      <name>coordSys</name>
      <description>Coordinate system description for each physical domain (Space, Time, etc).</description>
      <datatype>
        <vodml-ref>coords:PhysicalCoordSys</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>-1</maxOccurs>
      </multiplicity>
    </composition>
  </objectType>

  <objectType>
    <vodml-id>PixelCoordSystem</vodml-id>
    <name>PixelCoordSystem</name>
    <description>The PixelCoordSystem provides a complete description of the pixel coordinate space.  It SHALL contain one PixelSpace instance describing each pixel axis.</description>
    <extends>
      <vodml-ref>coords:CoordSys</vodml-ref>
    </extends>
    <composition>
      <vodml-id>PixelCoordSystem.pixelSpace</vodml-id>
      <name>pixelSpace</name>
      <description>The pixel space completely defines the pixel coordinate axes.  Each axis MUST be defined as a BinnedAxis type.</description>
      <datatype>
        <vodml-ref>coords:PixelSpace</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>1</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </composition>
  </objectType>

  <objectType>
    <vodml-id>PixelSpace</vodml-id>
    <name>PixelSpace</name>
    <description>A PixelSpace SHALL include one or more BinnedAxis objects describing the pixel coordinate space.  A handedness value MAY be provided to specify the relative orientation of the axes.  </description>
    <extends>
      <vodml-ref>coords:CoordSpace</vodml-ref>
    </extends>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:CoordSpace.axis</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:BinnedAxis</vodml-ref>
      </datatype>
    </constraint>
    <attribute>
      <vodml-id>PixelSpace.handedness</vodml-id>
      <name>handedness</name>
      <description>Specifies the handedness of the coordinate space.</description>
      <datatype>
        <vodml-ref>coords:Handedness</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </attribute>
  </objectType>

  <objectType abstract="true">
    <vodml-id>CoordSys</vodml-id>
    <name>CoordSys</name>
    <description>Abstract head of the coordinate system object tree.</description>
  </objectType>

  <objectType abstract="true">
    <vodml-id>PhysicalCoordSys</vodml-id>
    <name>PhysicalCoordSys</name>
    <description>Coordinate system description for any physical domain, such as Time, Space, Redshift, Temperature, Flux, etc.</description>
    <extends>
      <vodml-ref>coords:CoordSys</vodml-ref>
    </extends>
    <composition>
      <vodml-id>PhysicalCoordSys.coordSpace</vodml-id>
      <name>coordSpace</name>
      <description>Description of the coordinate space occupied by the property.</description>
      <datatype>
        <vodml-ref>coords:PhysicalCoordSpace</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </composition>
    <composition>
      <vodml-id>PhysicalCoordSys.frame</vodml-id>
      <name>frame</name>
      <description>
          TODO : Missing description : please, update your UML model asap.
        </description>
      <datatype>
        <vodml-ref>coords:CoordFrame</vodml-ref>
      </datatype>
      <multiplicity>
        <minOccurs>0</minOccurs>
        <maxOccurs>1</maxOccurs>
      </multiplicity>
    </composition>
  </objectType>

  <objectType>
    <vodml-id>GenericSys</vodml-id>
    <name>GenericSys</name>
    <description>Specialized coordinate system for generic, one-dimensional domains not covered by other, more concrete objects.  If a CoordSpace is not provided, it is assumed to be represented by a Standard 1-Dimensional Coordinate Space as described in Appendix B.</description>
    <extends>
      <vodml-ref>coords:PhysicalCoordSys</vodml-ref>
    </extends>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:PhysicalCoordSys.frame</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:GenericFrame</vodml-ref>
      </datatype>
    </constraint>
  </objectType>

  <objectType>
    <vodml-id>SpaceSys</vodml-id>
    <name>SpaceSys</name>
    <description>Specialized coordinate system for the Spatial domain.  This object SHOULD include an appropriate SpaceFrame.  In Appendix B, we define two standard spatial coordinate space instances (Spherical and Cartesian), which may be referenced in serializations.  If a CoordSpace is not provided, it is assumed to be represented by a Standard Spherical Coordinate Space.</description>
    <extends>
      <vodml-ref>coords:PhysicalCoordSys</vodml-ref>
    </extends>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:PhysicalCoordSys.frame</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:SpaceFrame</vodml-ref>
      </datatype>
    </constraint>
  </objectType>

  <objectType>
    <vodml-id>TimeSys</vodml-id>
    <name>TimeSys</name>
    <description>Specialized coordinate system for the Temporal domain.  This object SHOULD include an appropriate TimeFrame.  If a CoordSpace is not provided, it is assumed to be represented by a Standard 1-Dimensional Coordinate Space as described in Appendix B.</description>
    <extends>
      <vodml-ref>coords:PhysicalCoordSys</vodml-ref>
    </extends>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:PhysicalCoordSys.frame</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:TimeFrame</vodml-ref>
      </datatype>
    </constraint>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:PhysicalCoordSys.coordSpace</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:GenericCoordSpace</vodml-ref>
      </datatype>
    </constraint>
  </objectType>

  <objectType abstract="true">
    <vodml-id>PhysicalCoordSpace</vodml-id>
    <name>PhysicalCoordSpace</name>
    <description>Abstract head of coordinate spaces related to physical properties.</description>
    <extends>
      <vodml-ref>coords:CoordSpace</vodml-ref>
    </extends>
  </objectType>

  <objectType>
    <vodml-id>GenericCoordSpace</vodml-id>
    <name>GenericCoordSpace</name>
    <description>Generic, one-dimensional coordinate space suitable for use with most non-spatial properties.  In Appendix B, we provide the description of a Standard 1D Coordinate Space instance which may be referenced in serializations.</description>
    <extends>
      <vodml-ref>coords:PhysicalCoordSpace</vodml-ref>
    </extends>
    <constraint>
      <description>axis[1]</description>
    </constraint>
  </objectType>

  <objectType>
    <vodml-id>SphericalCoordSpace</vodml-id>
    <name>SphericalCoordSpace</name>
    <description>Spatial domain, three-dimensional spherical coordinate space.  The particulars of the axis descriptions depend on the flavor of space being instantiated.  In Appendix B., we provide a Standard Spherical Coordinate Space instance which applies to many Astronomical use cases.  It provides the default space for SpaceSys instances, and may be referenced in serializations.</description>
    <extends>
      <vodml-ref>coords:PhysicalCoordSpace</vodml-ref>
    </extends>
    <constraint>
      <description>axis[3]</description>
    </constraint>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:CoordSpace.axis</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:ContinuousAxis</vodml-ref>
      </datatype>
    </constraint>
  </objectType>

  <objectType>
    <vodml-id>CartesianCoordSpace</vodml-id>
    <name>CartesianCoordSpace</name>
    <description>Spatial domain, three-dimensional cartesian coordinate space.  The particulars of the axis descriptions depend on the physical constraints of the instance.  In Appendix B, we provide the description of a Standard Cartesian Coordinate Space instance which applies to many Astronomical cases, and may be referenced in serializations.</description>
    <extends>
      <vodml-ref>coords:PhysicalCoordSpace</vodml-ref>
    </extends>
    <constraint>
      <description>axis[1..3]</description>
    </constraint>
    <constraint xsi:type="vo-dml:SubsettedRole">
      <role>
        <vodml-ref>coords:CoordSpace.axis</vodml-ref>
      </role>
      <datatype>
        <vodml-ref>coords:ContinuousAxis</vodml-ref>
      </datatype>
    </constraint>
  </objectType>

</vo-dml:model>
