[Volute] r5290 - in trunk/projects/dm/STC/Trans: doc vo-dml

Volute commit messages volutecommits at g-vo.org
Tue Dec 18 23:18:41 CET 2018


Author: mdittmar
Date: Tue Dec 18 23:18:40 2018
New Revision: 5290

Log:
Update model per group discussion.

Modified:
   trunk/projects/dm/STC/Trans/doc/Transforms.tex
   trunk/projects/dm/STC/Trans/doc/WD-Trans-1.0.pdf
   trunk/projects/dm/STC/Trans/doc/body.tex
   trunk/projects/dm/STC/Trans/doc/other.bib
   trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.html
   trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.png
   trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.vo-dml.xml

Modified: trunk/projects/dm/STC/Trans/doc/Transforms.tex
==============================================================================
--- trunk/projects/dm/STC/Trans/doc/Transforms.tex	Tue Dec 18 21:10:19 2018	(r5289)
+++ trunk/projects/dm/STC/Trans/doc/Transforms.tex	Tue Dec 18 23:18:40 2018	(r5290)
@@ -10,11 +10,20 @@
 
 \author{Arnold Rots}
 \author{Mark Cresitello-Dittmar}
+\author{David Berry}
+\author{Steven Crawford}
+\author{Nadia Dencheva}
+\author{Perry Greenfield}
+\author{Tim Jenness}
+\author{Omar Laurino}
+\author{Stuart Mumford}
+\author{Erik Tollerud}
+
 %\author[????URL????]{????Alfred Usher Thor????}
 %\author{????Fred Offline????}
 
-\editor{Arnold Rots}
 \editor{Mark Cresitello-Dittmar}
+\editor{Arnold Rots}
 
 % \previousversion[????URL????]{????Funny Label????}
 \previousversion{This is the first public release}
@@ -100,16 +109,25 @@
 \end{enumerate}
 
 \subsection{Context and Scope}
-This document is a result from updating the \href{http://www.ivoa.net/documents/latest/STC.html}{Space-Time Coordinate Metadata for the Virtual Observatory} (STC) \citep{std:STC} model for use in VO-DML compliant models.
+This document is a result of updating the \href{http://www.ivoa.net/documents/latest/STC.html}{Space-Time Coordinate Metadata for the Virtual Observatory} (STC) \citep{std:STC} model for use in VO-DML compliant models.
 
-The update and revision of the STC model has sub-divided the content into component models, each covering a portion of the scope of the parent model.  This has allowed for a better description of the relations between the various components, allows for independent development of the component models, and creates smaller, more digestible content for users.
+The update and revision of the STC model has sub-divided the content into component 
+models, each covering a portion of the scope of the original model.  This has 
+allowed for a better description of the relations between the various components, 
+allows for independent development of the component models, and creates smaller, 
+more digestible content for users.
 
-This document describes the WCS Transforms model which provides the metadata describing:
+This document defines the WCS Transforms model, providing the metadata describions for:
 \begin{itemize}
   \item The description of mathematical operations which form the building blocks for conversions from one coordinate space to another.
   \item The combination of individual operations into an arbitrarily complex Transform.
 \end{itemize}
 
+This version of the model covers a core set of transform operations commonly used by the community.
+It is designed to be compatible with FITS WCS metadata transport, and existing implementations
+like AST \citep{soft:AST}, GWCS \citep{soft:GWCS}, and wcslib \citep{soft:WCSLIB}.
+It forms a foundation which can be built upon in future versions.
+
 \pagebreak
 \subsection{Role within the VO Architecture}
 
@@ -137,7 +155,14 @@
 \appendix
 \section{Changes from Previous Versions}
 
-No previous versions yet.  
+2018-Dec-18
+\begin{itemize}
+\item Unit operation to 1-D
+\item Lookup: added text about handling enumeration data
+\item SkyProjection: included text about providing LONPOLE/LATPOLE inputs
+\item Changed Reorder to broader scoped operation Permute
+\item Miscellaneous changes descriptions
+\end{itemize}
 % these would be subsections "Changes from v. WD-..."
 % Use itemize environments.
 

Modified: trunk/projects/dm/STC/Trans/doc/WD-Trans-1.0.pdf
==============================================================================
Binary file (source and/or target). No diff available.

Modified: trunk/projects/dm/STC/Trans/doc/body.tex
==============================================================================
--- trunk/projects/dm/STC/Trans/doc/body.tex	Tue Dec 18 21:10:19 2018	(r5289)
+++ trunk/projects/dm/STC/Trans/doc/body.tex	Tue Dec 18 23:18:40 2018	(r5290)
@@ -11,13 +11,29 @@
     
 %\author{Mark Cresitello-Dittmar}
     
+%\author{David Bery}
+    
+%\author{Steven Crawford}
+    
+%\author{Nadia Dencheva}
+    
+%\author{Perry Greenfield}
+    
+%\author{Tim Jenness}
+    
+%\author{Omar Laurino}
+    
+%\author{Stuart Mumford}
+    
+%\author{Erik Tollerud}
+    
 %\previousversion{0.0}
       
 % -------------------------------------------
 
 \pagebreak
 \section{Model: trans }
-
+  
   % INSERT FIGURE HERE
   \begin{figure}[h]
   \begin{center}
@@ -32,9 +48,15 @@
   \label{sect:TOperation}
     Transform Operation (TOperation) defines a mathematical operation to be performed on its inputs. These operations form the building blocks with which complex operations can be defined.
 
+    \subsubsection{TOperation.invert}
+      \textbf{vodml-id: TOperation.invert} \newline
+      \textbf{type: \hyperref[sect:ivoa]{ivoa:boolean}} \newline
+      \textbf{multiplicity: 0..1} \newline 
+      Boolean flag indicating that it the inverse of the specified operation should be applied. This is most useful in building operation chains; for example, operation A followed by the inverse of operation B. If missing, it is assumed to be "False"
+
   \subsection{Unit}
   \label{sect:Unit}
-    The Unit transform is an n-Dimensional operation which makes no change to the inputs. ( $x' = x$ )
+    The Unit transform is an 1-Dimensional operation which makes no change to the inputs. ( $x' = x$ )
 
   \subsection{Shift}
   \label{sect:Shift}
@@ -64,7 +86,7 @@
       \textbf{vodml-id: Rotate.angle} \newline
       \textbf{type: \hyperref[sect:ivoa]{ivoa:real}} \newline
       \textbf{multiplicity: 1} \newline 
-      Rotation angle in degrees, applied in counter-clockwise direction.
+      Rotation angle, in degrees, from the positive direction of axis 1 to the positive direction of axis 2.
 
   \subsection{Matrix}
   \label{sect:Matrix}
@@ -118,6 +140,13 @@
   \label{sect:Lookup}
     Defines a lookup table operation. The Lookup is comprised of a series of value pairs (LookupEntry). All members of the series MUST be of the same type.
 
+    Handling Enumerated data: A common useage of a Lookup operation is to map image pixel index to an enumeration, such as a Polarization state. This can be handled by two means:
+    \begin{enumerate}
+    \item define a numeric equivalent for each enumeration literal, and use NumericEntry types. Casting to the corresponding literal occurs outside of the operation.
+    \item your local model can define a LookupEntry extension which maps the native value directly the target EnumerationLiteral.
+    \end{enumerate}
+    The details of either approach for particular enumerations is considered outside the scope of this document.
+
     \subsubsection{Lookup.entry}
       \textbf{vodml-id: Lookup.entry} \newline
       \textbf{type: \hyperref[sect:LookupEntry]{trans:LookupEntry}} \newline
@@ -146,7 +175,7 @@
 
   \subsection{StringEntry}
   \label{sect:StringEntry}
-    A 1-Dimensional discrete mapping of an integer counter to a corresponding string form. A simple use case example is to transform a pixel index value to a particular Polarization state represented as a string.
+    A 1-Dimensional discrete mapping of an integer counter to a corresponding string form. Since the result is non-numeric, a Lookup table with StringEntry-s can only be used at the end of a Transform sequence.
 
     \subsubsection{StringEntry.nativeValue}
       \textbf{vodml-id: StringEntry.nativeValue} \newline
@@ -168,7 +197,7 @@
       \textbf{vodml-id: WCSProjection.param} \newline
       \textbf{type: \hyperref[sect:ProjectionParam]{trans:ProjectionParam}} \newline
       \textbf{multiplicity: 0..*} \newline 
-      Set of 0 or more parameters providing supplemental metadata required to execute a particular projection algorithm. The number and meaning of the parameters depends on the algorithm. They are typically in the from of "PVi\_j" keyword/value pairs, so we provide a simple ProjectionParam element to accommodate these. The detailed content specification is left to the WCS paper.
+      Set of 0 or more parameters providing supplemental metadata required to execute a particular projection algorithm. The number and meaning of the parameters depends on the algorithm. They are typically in the from of keyword/value pairs, so we provide a simple ProjectionParam element to accommodate these. The detailed content specification is left to the WCS paper.
 
   \subsection{ProjectionParam}
   \label{sect:ProjectionParam}
@@ -178,7 +207,7 @@
       \textbf{vodml-id: ProjectionParam.name} \newline
       \textbf{type: \hyperref[sect:ivoa]{ivoa:string}} \newline
       \textbf{multiplicity: 1} \newline 
-      The parameter name. This is typically, but not always, given as a "PVi\_j" key.
+      The parameter name, typically expressed as a "PVi\_j" key.
 
     \subsubsection{ProjectionParam.value}
       \textbf{vodml-id: ProjectionParam.value} \newline
@@ -188,7 +217,7 @@
 
   \subsection{SkyProjection}
   \label{sect:SkyProjection}
-    This class represents a two-dimensional projection of sky as detailed in the FITS WCS paper II. As in the paper, this operation picks up from the intermediate coordinate system, AFTER the application of the linear transform from pixel to intermediate space. In this model, the full transform from pixel to world is accomplished with a two-stage Transform, first applying the linear operations via a Matrix or other component operations, followed by the SkyProjection operation.
+    This class represents a two-dimensional projection of sky as detailed in the FITS WCS paper II. As in the paper, this operation picks up from the intermediate coordinate system, AFTER the application of the linear transform from pixel to intermediate space, and includes both the spherical projection and spherical rotation steps. When required, LONPOLEa and LATPOLEa are to be provided through the ProjectionParam list. The full transform from pixel to world is accomplished with a two-stage Transform, first applying the linear operations via a Matrix or other component operations, followed by the SkyProjection operation.
 
     \subsubsection{SkyProjection.referenceValue}
       \textbf{vodml-id: SkyProjection.referenceValue} \newline
@@ -290,21 +319,30 @@
       \textbf{multiplicity: 2} \newline 
       The power to raise the values for this term in each dimension.
 
-  \subsection{Reorder}
-  \label{sect:Reorder}
-    This operation facilitates the specification of axis order shuffling between operations. For example, if we have a 3-dimensional coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane, this operation, joined, allows us to define a new axis order (y,x,z) to feed into the next step ( 1D + 2D operations).
-
-    \subsubsection{Reorder.in}
-      \textbf{vodml-id: Reorder.in} \newline
-      \textbf{type: \hyperref[sect:ivoa]{ivoa:nonnegativeInteger}} \newline
-      \textbf{multiplicity: 1} \newline 
-      The input (original) axis/dimension number.
+  \subsection{Permute}
+  \label{sect:Permute}
+    Permute the order and possibly number of dimensions between operations. This operation facilitates the workflow through the operation sequence. It is comprised of an ordered axismap list, defining the output axis sequence in terms of the source (input) axes. It supports the reorder, duplication, and dropping of dimensions. 
+    \begin{itemize}
+    \item[Reorder Example]: We have a 3-dimensional coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane. Define a Permute operation with axismap list specifying sourceAxis [2,1,3]. The results feed into the next step ( 1D + 2D operations ). 
+    \item[Duplicate Example]: We have 2-dimensional coordinate (x,y) feeding two Polynomial2D operations to form (x',y'). Define a Permute operation with axismap list specifying sourceAxis set [1,2,1,2]. The result feeds into the next step ( Polynomial2D + Polynomial2D operations). 
+    \item[Drop Example]: We have a 5-dimensional input feeding into a 3x3 Matrix operation. Define a Permute operation selecting the relevant axis set [1,3,5], the remaining axes, [2,4], are dropped.
+    \end{itemize}
+
+    \subsubsection{Permute.axismap}
+      \textbf{vodml-id: Permute.axismap} \newline
+      \textbf{type: \hyperref[sect:PermuteEntry]{trans:PermuteEntry}} \newline
+      \textbf{multiplicity: 0..*  (ordered)} \newline 
+      Ordered list defining the number and order of the resulting axis set. Each entry provides the source (input) dimension for that output dimension.
+
+  \subsection{PermuteEntry}
+  \label{sect:PermuteEntry}
+    Entry for the Permute operation, this object defines the mapping of input dimension to output dimension. The output dimension is determined from its order in the axismap list.
 
-    \subsubsection{Reorder.out}
-      \textbf{vodml-id: Reorder.out} \newline
+    \subsubsection{PermuteEntry.sourceAxis}
+      \textbf{vodml-id: PermuteEntry.sourceAxis} \newline
       \textbf{type: \hyperref[sect:ivoa]{ivoa:nonnegativeInteger}} \newline
       \textbf{multiplicity: 1} \newline 
-      The output (target) axis/dimension number.
+      Source (input) dimension number, 1 based.
 
   \subsection{TComplexOperation (Abstract)}
   \label{sect:TComplexOperation}

Modified: trunk/projects/dm/STC/Trans/doc/other.bib
==============================================================================
--- trunk/projects/dm/STC/Trans/doc/other.bib	Tue Dec 18 21:10:19 2018	(r5289)
+++ trunk/projects/dm/STC/Trans/doc/other.bib	Tue Dec 18 23:18:40 2018	(r5290)
@@ -27,3 +27,22 @@
   doi =          {10.1051/0004-6361:20053818},
   adsurl =       {http://adsabs.harvard.edu/abs/2006A&A...446..747G},
 }
+ at ARTICLE{soft:AST,
+  author =       {Warren-Smith, R. F. and Berry, D. S.},
+  title =        {AST -- A Library for Handling World Coordinates Systems in Astronomy (C Version)},
+  howpublished = {{Starlink User Note}},
+  year =         {2013},
+  volume =       211,
+  adsurl =       {http://adsabs.harvard.edu/abs/2013StaUN.211.....W},
+}
+ at inproceedings{soft:GWCS,
+  author  = {{Dencheva}, N. and {Greenfield}, P. and {Droettboom}, M.},
+   title  = {GWCS: A Library for Managing World Coordinate Systems},
+booktitle = {Astronomical Data Analysis Software and Systems (ADASS) XXV},
+     year = 2017,
+    month = dec,
+   series = {Astronomical Society of the Pacific Conference Series},
+   volume = 512,
+    pages = {609},
+   adsurl = {http://adsabs.harvard.edu/abs/2017ASPC..512..609D},
+}

Modified: trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.html
==============================================================================
--- trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.html	Tue Dec 18 21:10:19 2018	(r5289)
+++ trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.html	Tue Dec 18 23:18:40 2018	(r5290)
@@ -2,8 +2,8 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <title>WCS Transform Model</title>
-    <link rel="stylesheet" href="https://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/style/ivoa_wg.css" type="text/css">
-    <link rel="stylesheet" href="https://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/style/xmi.css" type="text/css">
+    <link rel="stylesheet" href="http://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/style/ivoa_wg.css" type="text/css">
+    <link rel="stylesheet" href="http://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/style/xmi.css" type="text/css">
   </head>
   <body>
     <h1>WCS Transform Model</h1>
@@ -44,90 +44,94 @@
         </tr>
         <tr>
           <td>2.1.6</td>
-          <td>    <a href="#PolyCoeff1D">objectType:PolyCoeff1D</a></td>
+          <td>    <a href="#Permute">objectType:Permute</a></td>
         </tr>
         <tr>
           <td>2.1.7</td>
-          <td>    <a href="#PolyCoeff2D">objectType:PolyCoeff2D</a></td>
+          <td>    <a href="#PermuteEntry">objectType:PermuteEntry</a></td>
         </tr>
         <tr>
           <td>2.1.8</td>
-          <td>    <a href="#Polynomial">objectType:Polynomial</a></td>
+          <td>    <a href="#PolyCoeff1D">objectType:PolyCoeff1D</a></td>
         </tr>
         <tr>
           <td>2.1.9</td>
-          <td>    <a href="#Polynomial1D">objectType:Polynomial1D</a></td>
+          <td>    <a href="#PolyCoeff2D">objectType:PolyCoeff2D</a></td>
         </tr>
         <tr>
           <td>2.1.10</td>
-          <td>    <a href="#Polynomial2D">objectType:Polynomial2D</a></td>
+          <td>    <a href="#Polynomial">objectType:Polynomial</a></td>
         </tr>
         <tr>
           <td>2.1.11</td>
-          <td>    <a href="#ProjectionParam">objectType:ProjectionParam</a></td>
+          <td>    <a href="#Polynomial1D">objectType:Polynomial1D</a></td>
         </tr>
         <tr>
           <td>2.1.12</td>
-          <td>    <a href="#Reorder">objectType:Reorder</a></td>
+          <td>    <a href="#Polynomial2D">objectType:Polynomial2D</a></td>
         </tr>
         <tr>
           <td>2.1.13</td>
-          <td>    <a href="#Rotate">objectType:Rotate</a></td>
+          <td>    <a href="#ProjectionParam">objectType:ProjectionParam</a></td>
         </tr>
         <tr>
           <td>2.1.14</td>
-          <td>    <a href="#Scale">objectType:Scale</a></td>
+          <td>    <a href="#Rotate">objectType:Rotate</a></td>
         </tr>
         <tr>
           <td>2.1.15</td>
-          <td>    <a href="#Shift">objectType:Shift</a></td>
+          <td>    <a href="#Scale">objectType:Scale</a></td>
         </tr>
         <tr>
           <td>2.1.16</td>
-          <td>    <a href="#SkyProjection">objectType:SkyProjection</a></td>
+          <td>    <a href="#Shift">objectType:Shift</a></td>
         </tr>
         <tr>
           <td>2.1.17</td>
-          <td>    <a href="#SkyProjectionType">enumeration:SkyProjectionType</a></td>
+          <td>    <a href="#SkyProjection">objectType:SkyProjection</a></td>
         </tr>
         <tr>
           <td>2.1.18</td>
-          <td>    <a href="#SpectralCoordType">enumeration:SpectralCoordType</a></td>
+          <td>    <a href="#SkyProjectionType">enumeration:SkyProjectionType</a></td>
         </tr>
         <tr>
           <td>2.1.19</td>
-          <td>    <a href="#SpectralProjection">objectType:SpectralProjection</a></td>
+          <td>    <a href="#SpectralCoordType">enumeration:SpectralCoordType</a></td>
         </tr>
         <tr>
           <td>2.1.20</td>
-          <td>    <a href="#SpectralProjectionType">enumeration:SpectralProjectionType</a></td>
+          <td>    <a href="#SpectralProjection">objectType:SpectralProjection</a></td>
         </tr>
         <tr>
           <td>2.1.21</td>
-          <td>    <a href="#StringEntry">objectType:StringEntry</a></td>
+          <td>    <a href="#SpectralProjectionType">enumeration:SpectralProjectionType</a></td>
         </tr>
         <tr>
           <td>2.1.22</td>
-          <td>    <a href="#TComplexOperation">objectType:TComplexOperation</a></td>
+          <td>    <a href="#StringEntry">objectType:StringEntry</a></td>
         </tr>
         <tr>
           <td>2.1.23</td>
-          <td>    <a href="#TJoin">objectType:TJoin</a></td>
+          <td>    <a href="#TComplexOperation">objectType:TComplexOperation</a></td>
         </tr>
         <tr>
           <td>2.1.24</td>
-          <td>    <a href="#TOperation">objectType:TOperation</a></td>
+          <td>    <a href="#TJoin">objectType:TJoin</a></td>
         </tr>
         <tr>
           <td>2.1.25</td>
-          <td>    <a href="#Transform">objectType:Transform</a></td>
+          <td>    <a href="#TOperation">objectType:TOperation</a></td>
         </tr>
         <tr>
           <td>2.1.26</td>
-          <td>    <a href="#Unit">objectType:Unit</a></td>
+          <td>    <a href="#Transform">objectType:Transform</a></td>
         </tr>
         <tr>
           <td>2.1.27</td>
+          <td>    <a href="#Unit">objectType:Unit</a></td>
+        </tr>
+        <tr>
+          <td>2.1.28</td>
           <td>    <a href="#WCSProjection">objectType:WCSProjection</a></td>
         </tr>
         <tr>
@@ -153,12 +157,14 @@
       <tr>
         <td align="right"><b>Authors</b></td>
         <td> : </td>
-        <td>Arnold Rots, Mark Cresitello-Dittmar</td>
+        <td>Arnold Rots, Mark Cresitello-Dittmar, David Bery, Steven Crawford, Nadia Dencheva, Perry Greenfield, Tim Jenness, Omar Laurino,
+          Stuart Mumford, Erik Tollerud
+        </td>
       </tr>
       <tr>
         <td align="right"><b>Date</b></td>
         <td> : </td>
-        <td>2018-12-12T13:02:20</td>
+        <td>2018-12-18T15:10:30</td>
       </tr>
       <tr>
         <td align="right"><b>Version</b></td>
@@ -191,33 +197,34 @@
         <td colspan="3"></td>
       </tr>
     </table><img src="STC_trans-v1.0.png" usemap="#GVmap"><map id="GVmap" name="GVmap">
-<area shape="rect" id="node1" href="#SkyProjectionType" title="{<<enumeration>>\nSkyProjectionType|+AZP\l+SZP\l+TAN\l+STG\l+SIN\l+ARC\l+ZPN\l+ZEA\l+AIR\l+CYP\l+CEA\l+CAR\l+MER\l+SFL\l+PAR\l+MOL\l+AIT\l+COP\l+COE\l+COD\l+COO\l+BON\l+PCO\l+TSC\l+CSC\l+QSC\l}" alt="" coords="117,6,221,365"/>
-<area shape="rect" id="node2" href="#SpectralProjectionType" title="{<<enumeration>>\nSpectralProjectionType|+F2W\l+F2V\l+F2A\l+W2F\l+W2V\l+W2A\l+V2F\l+V2W\l+V2A\l+A2F\l+A2W\l+A2V\l+LOG\l+GRI\l+GRA\l}" alt="" coords="246,72,369,299"/>
-<area shape="rect" id="node3" href="#SpectralCoordType" title="{<<enumeration>>\nSpectralCoordType|+FREQ\l+ENER\l+WAVN\l+VRAD\l+WAVE\l+VOPT\l+ZOPT\l+AWAV\l+VELO\l+BETA\l}" alt="" coords="395,102,501,269"/>
-<area shape="rect" id="node4" href="#Transform" title="{Transform}" alt="" coords="1208,161,1280,210"/>
-<area shape="rect" id="node27" href="#TComplexOperation" title="{TComplexOperation}" alt="" coords="1141,434,1251,483"/>
-<area shape="rect" id="node5" href="#TJoin" title="{TJoin}" alt="" coords="1112,161,1184,210"/>
-<area shape="rect" id="node6" href="#TOperation" title="{TOperation}" alt="" coords="1116,563,1188,613"/>
-<area shape="rect" id="node7" href="#Unit" title="{Unit}" alt="" coords="735,434,807,483"/>
-<area shape="rect" id="node8" href="#Shift" title="{Shift|+shift : ivoa:real\l}" alt="" coords="831,434,925,483"/>
-<area shape="rect" id="node9" href="#Scale" title="{Scale|+factor : ivoa:real\l}" alt="" coords="1276,434,1377,483"/>
-<area shape="rect" id="node10" href="#Rotate" title="{Rotate|+angle : ivoa:real\l}" alt="" coords="1401,434,1500,483"/>
-<area shape="rect" id="node11" href="#Matrix" title="{Matrix|+M : ivoa:nonnegativeInteger\l+N : ivoa:nonnegativeInteger\l}" alt="" coords="183,429,332,488"/>
-<area shape="rect" id="node12" href="#MatrixElement" title="{MatrixElement|+m : ivoa:nonnegativeInteger\l+n : ivoa:nonnegativeInteger\l+value : ivoa:real\l}" alt="" coords="183,553,331,623"/>
-<area shape="rect" id="node13" href="#Polynomial" title="{Polynomial|+order : ivoa:nonnegativeInteger\l}" alt="" coords="548,434,711,483"/>
-<area shape="rect" id="node14" href="#Polynomial1D" title="{Polynomial1D}" alt="" coords="525,161,608,210"/>
-<area shape="rect" id="node16" href="#PolyCoeff1D" title="{PolyCoeff1D|+coeff : ivoa:real\l+power : ivoa:nonnegativeInteger\l}" alt="" coords="357,429,523,488"/>
-<area shape="rect" id="node15" href="#Polynomial2D" title="{Polynomial2D}" alt="" coords="668,161,751,210"/>
-<area shape="rect" id="node17" href="#PolyCoeff2D" title="{PolyCoeff2D|+coeff : ivoa:real\l+power : ivoa:nonnegativeInteger\l}" alt="" coords="950,429,1116,488"/>
-<area shape="rect" id="node18" href="#WCSProjection" title="{WCSProjection}" alt="" coords="1525,434,1613,483"/>
-<area shape="rect" id="node19" href="#ProjectionParam" title="{ProjectionParam|+name : ivoa:string\l+value : ivoa:real\l}" alt="" coords="1517,559,1621,617"/>
-<area shape="rect" id="node20" href="#SkyProjection" title="{SkyProjection|+referenceValue : ivoa:real\l+algorithm : trans:SkyProjectionType\l}" alt="" coords="1615,156,1799,215"/>
-<area shape="rect" id="node21" href="#SpectralProjection" title="{SpectralProjection|+referenceValue : ivoa:real\l+algorithm : trans:SpectralProjectionType\l+coordType : trans:SpectralCoordType\l}" alt="" coords="1386,150,1589,221"/>
-<area shape="rect" id="node22" href="#Lookup" title="{Lookup}" alt="" coords="1639,434,1711,483"/>
-<area shape="rect" id="node23" href="#LookupEntry" title="{LookupEntry}" alt="" coords="1759,563,1837,613"/>
-<area shape="rect" id="node24" href="#NumericEntry" title="{NumericEntry|+nativeValue : ivoa:real\l+targetValue : ivoa:real\l}" alt="" coords="1735,429,1861,488"/>
-<area shape="rect" id="node25" href="#StringEntry" title="{StringEntry|+nativeValue : ivoa:integer\l+targetValue : ivoa:string\l}" alt="" coords="1886,429,2025,488"/>
-<area shape="rect" id="node26" href="#Reorder" title="{Reorder|+in : ivoa:nonnegativeInteger\l+out : ivoa:nonnegativeInteger\l}" alt="" coords="5,429,157,488"/>
+<area shape="rect" id="node1" href="#SkyProjectionType" title="{<<enumeration>>\nSkyProjectionType|+AZP\l+SZP\l+TAN\l+STG\l+SIN\l+ARC\l+ZPN\l+ZEA\l+AIR\l+CYP\l+CEA\l+CAR\l+MER\l+SFL\l+PAR\l+MOL\l+AIT\l+COP\l+COE\l+COD\l+COO\l+BON\l+PCO\l+TSC\l+CSC\l+QSC\l}" alt="" coords="5,6,109,365"/>
+<area shape="rect" id="node2" href="#SpectralProjectionType" title="{<<enumeration>>\nSpectralProjectionType|+F2W\l+F2V\l+F2A\l+W2F\l+W2V\l+W2A\l+V2F\l+V2W\l+V2A\l+A2F\l+A2W\l+A2V\l+LOG\l+GRI\l+GRA\l}" alt="" coords="134,72,257,299"/>
+<area shape="rect" id="node3" href="#SpectralCoordType" title="{<<enumeration>>\nSpectralCoordType|+FREQ\l+ENER\l+WAVN\l+VRAD\l+WAVE\l+VOPT\l+ZOPT\l+AWAV\l+VELO\l+BETA\l}" alt="" coords="283,102,389,269"/>
+<area shape="rect" id="node4" href="#Transform" title="{Transform}" alt="" coords="509,161,581,210"/>
+<area shape="rect" id="node27" href="#TComplexOperation" title="{TComplexOperation}" alt="" coords="442,434,552,483"/>
+<area shape="rect" id="node5" href="#TJoin" title="{TJoin}" alt="" coords="413,161,485,210"/>
+<area shape="rect" id="node6" href="#TOperation" title="{TOperation|+invert : ivoa:boolean\l}" alt="" coords="870,563,985,613"/>
+<area shape="rect" id="node7" href="#Unit" title="{Unit}" alt="" coords="892,434,964,483"/>
+<area shape="rect" id="node8" href="#Shift" title="{Shift|+shift : ivoa:real\l}" alt="" coords="1366,434,1460,483"/>
+<area shape="rect" id="node9" href="#Scale" title="{Scale|+factor : ivoa:real\l}" alt="" coords="1485,434,1587,483"/>
+<area shape="rect" id="node10" href="#Rotate" title="{Rotate|+angle : ivoa:real\l}" alt="" coords="577,434,676,483"/>
+<area shape="rect" id="node11" href="#Matrix" title="{Matrix|+M : ivoa:nonnegativeInteger\l+N : ivoa:nonnegativeInteger\l}" alt="" coords="144,429,293,488"/>
+<area shape="rect" id="node12" href="#MatrixElement" title="{MatrixElement|+m : ivoa:nonnegativeInteger\l+n : ivoa:nonnegativeInteger\l+value : ivoa:real\l}" alt="" coords="130,553,277,623"/>
+<area shape="rect" id="node13" href="#Polynomial" title="{Polynomial|+order : ivoa:nonnegativeInteger\l}" alt="" coords="988,434,1151,483"/>
+<area shape="rect" id="node14" href="#Polynomial1D" title="{Polynomial1D}" alt="" coords="817,161,900,210"/>
+<area shape="rect" id="node16" href="#PolyCoeff1D" title="{PolyCoeff1D|+coeff : ivoa:real\l+power : ivoa:nonnegativeInteger\l}" alt="" coords="701,429,867,488"/>
+<area shape="rect" id="node15" href="#Polynomial2D" title="{Polynomial2D}" alt="" coords="1156,161,1239,210"/>
+<area shape="rect" id="node17" href="#PolyCoeff2D" title="{PolyCoeff2D|+coeff : ivoa:real\l+power : ivoa:nonnegativeInteger\l}" alt="" coords="1175,429,1341,488"/>
+<area shape="rect" id="node18" href="#WCSProjection" title="{WCSProjection}" alt="" coords="1611,434,1700,483"/>
+<area shape="rect" id="node19" href="#ProjectionParam" title="{ProjectionParam|+name : ivoa:string\l+value : ivoa:real\l}" alt="" coords="1603,559,1708,617"/>
+<area shape="rect" id="node20" href="#SkyProjection" title="{SkyProjection|+referenceValue : ivoa:real\l+algorithm : trans:SkyProjectionType\l}" alt="" coords="1673,156,1857,215"/>
+<area shape="rect" id="node21" href="#SpectralProjection" title="{SpectralProjection|+referenceValue : ivoa:real\l+algorithm : trans:SpectralProjectionType\l+coordType : trans:SpectralCoordType\l}" alt="" coords="1445,150,1648,221"/>
+<area shape="rect" id="node22" href="#Lookup" title="{Lookup}" alt="" coords="1725,434,1797,483"/>
+<area shape="rect" id="node23" href="#LookupEntry" title="{LookupEntry}" alt="" coords="1846,563,1924,613"/>
+<area shape="rect" id="node24" href="#NumericEntry" title="{NumericEntry|+nativeValue : ivoa:real\l+targetValue : ivoa:real\l}" alt="" coords="1822,429,1948,488"/>
+<area shape="rect" id="node25" href="#StringEntry" title="{StringEntry|+nativeValue : ivoa:integer\l+targetValue : ivoa:string\l}" alt="" coords="1973,429,2112,488"/>
+<area shape="rect" id="node26" href="#Permute" title="{Permute}" alt="" coords="345,434,417,483"/>
+<area shape="rect" id="node28" href="#PermuteEntry" title="{PermuteEntry|+sourceAxis : ivoa:nonnegativeInteger\l}" alt="" coords="302,563,489,613"/>
 </map>
 
     <hr>
@@ -237,7 +244,7 @@
       </tr>
       <tr>
         <td width="20%" class="info-title">Object types</td>
-        <td colspan="2" class="feature-detail"><a href="#Lookup">Lookup</a> <a href="#LookupEntry">LookupEntry</a> <a href="#Matrix">Matrix</a> <a href="#MatrixElement">MatrixElement</a> <a href="#NumericEntry">NumericEntry</a> <a href="#PolyCoeff1D">PolyCoeff1D</a> <a href="#PolyCoeff2D">PolyCoeff2D</a> <a href="#Polynomial">Polynomial</a> <a href="#Polynomial1D">Polynomial1D</a> <a href="#Polynomial2D">Polynomial2D</a> <a href="#ProjectionParam">ProjectionParam</a> <a href="#Reorder">Reorder</a> <a href="#Rotate">Rotate</a> <a href="#Scale">Scale</a> <a href="#Shift">Shift</a> <a href="#SkyProjection">SkyProjection</a> <a href="#SpectralProjection">SpectralProjection</a> <a href="#StringEntry">StringEntry</a> <a href="#TComplexOperation">TComplexOperation</a> <a href="#TJoin">TJoin</a> <a href="#TOperation">TOperation</a> <a href="#Transform">Transform</a> <a href="#Unit">Unit</a> <a href="#WCSProjection">WCSProjection</a> 
+        <td colspan="2" class="feature-detail"><a href="#Lookup">Lookup</a> <a href="#LookupEntry">LookupEntry</a> <a href="#Matrix">Matrix</a> <a href="#MatrixElement">MatrixElement</a> <a href="#NumericEntry">NumericEntry</a> <a href="#Permute">Permute</a> <a href="#PermuteEntry">PermuteEntry</a> <a href="#PolyCoeff1D">PolyCoeff1D</a> <a href="#PolyCoeff2D">PolyCoeff2D</a> <a href="#Polynomial">Polynomial</a> <a href="#Polynomial1D">Polynomial1D</a> <a href="#Polynomial2D">Polynomial2D</a> <a href="#ProjectionParam">ProjectionParam</a> <a href="#Rotate">Rotate</a> <a href="#Scale">Scale</a> <a href="#Shift">Shift</a> <a href="#SkyProjection">SkyProjection</a> <a href="#SpectralProjection">SpectralProjection</a> <a href="#StringEntry">StringEntry</a> <a href="#TComplexOperation">TComplexOperation</a> <a href="#TJoin">TJoin</a> <a href="#TOperation">TOperation</a> <a href="#Transform">Transform</a> <a href="#Unit">Unit</a> <a href="#WCSProjection">WCSProjection</a> 
         </td>
       </tr>
       <tr>
@@ -258,6 +265,13 @@
           <td class="info-title">description</td>
           <td class="feature-detail" colspan="1">Defines a lookup table operation.  The Lookup is comprised of a series of value pairs (LookupEntry).  All members of the series
             MUST be of the same type.
+            Handling Enumerated data:
+            A common useage of a Lookup operation is to map image pixel index to an enumeration, such as a Polarization state.  This can
+            be handled by two means.  1) define a numeric equivalent for each enumeration literal, and use NumericEntry types.  Casting
+            to the corresponding literal occurs outside of the operation.  2) your local model can define a LookupEntry extension which
+            maps the native value directly the target EnumerationLiteral.  The details of either approach for particular enumerations
+            is considered outside the scope of this document.
+            
           </td>
         </tr>
         <tr>
@@ -607,7 +621,131 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="PolyCoeff1D"></a>2.1.6 objectType: PolyCoeff1D
+    </div><br><h3><a name="Permute"></a>2.1.6 objectType: Permute
+    </h3>
+    <div align="center">
+      <table border="1" width="100%" cellspacing="2">
+        <tr>
+          <td class="objecttype-title" width="20%">vodml-id</td>
+          <td class="objecttype-name" colspan="1">Permute</td>
+        </tr>
+        <tr>
+          <td class="info-title">description</td>
+          <td class="feature-detail" colspan="1">Permute the order and possibly number of dimensions between operations.  This operation facilitates the workflow through the
+            operation sequence.  It is comprised of an ordered axismap list, defining the output axis sequence in terms of the source
+            (input) axes.  It supports the reorder, duplication, and dropping of dimensions.  
+            Reorder Example:
+            We have a 3-dimensional coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane.  Define a Permute
+            operation with axismap list specifying sourceAxis [2,1,3].  The results feed into the next step ( 1D + 2D operations ).
+            Duplicate Example:
+            We have 2-dimensional coordinate (x,y) feeding two Polynomial2D operations to form (x',y').  Define a Permute operation with
+            axismap list specifying sourceAxis set [1,2,1,2].  The result feeds into the next step ( Polynomial2D + Polynomial2D  operations).
+            Drop Example:
+            We have a 5-dimensional input feeding into a 3x3 Matrix operation.  Define a Permute operation selecting the relevant axis
+            set [1,3,5], the remaining axes, [2,4], are dropped.
+          </td>
+        </tr>
+        <tr>
+          <td colspan="2">
+            <table width="100%" cellpadding="0" cellspacing="0" border="0">
+              <tr>
+                <td colspan="2" bgcolor="#cacaca">
+                  <table width="100%" border="0" cellpadding="3" cellspacing="1">
+                    <tr>
+                      <td width="20%" class="info-title">extends</td>
+                      <td colspan="3" class="feature-detail"><a href="#TOperation">TOperation [trans:TOperation]</a></td>
+                    </tr>
+                    <tr>
+                      <td colspan="3" class="info-title">compositions</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading" width="20%">name</td>
+                      <td class="feature-heading" width="10%">feature</td>
+                      <td class="feature-heading" width="70%">value</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-detail" valign="top" rowspan="5"><a name="Permute.axismap"></a><b>axismap</b></td>
+                      <td class="feature-heading">type</td>
+                      <td class="feature-detail"><a href="#PermuteEntry">PermuteEntry [trans:PermuteEntry]</a></td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">vodml-id</td>
+                      <td class="feature-detail">Permute.axismap</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">multiplicity</td>
+                      <td class="feature-detail">0..*</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">isOrdered</td>
+                      <td class="feature-detail">true</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">description</td>
+                      <td class="feature-detail">Ordered list defining the number and order of the resulting axis set.  Each entry provides the source (input) dimension for
+                        that output dimension.
+                      </td>
+                    </tr>
+                  </table>
+                </td>
+              </tr>
+            </table>
+          </td>
+        </tr>
+      </table>
+    </div><br><h3><a name="PermuteEntry"></a>2.1.7 objectType: PermuteEntry
+    </h3>
+    <div align="center">
+      <table border="1" width="100%" cellspacing="2">
+        <tr>
+          <td class="objecttype-title" width="20%">vodml-id</td>
+          <td class="objecttype-name" colspan="1">PermuteEntry</td>
+        </tr>
+        <tr>
+          <td class="info-title">description</td>
+          <td class="feature-detail" colspan="1">Entry for the Permute operation, this object defines the mapping of input dimension to output dimension.  The output dimension
+            is determined from its order in the axismap list.
+          </td>
+        </tr>
+        <tr>
+          <td colspan="2">
+            <table width="100%" cellpadding="0" cellspacing="0" border="0">
+              <tr>
+                <td colspan="2" bgcolor="#cacaca">
+                  <table width="100%" border="0" cellpadding="3" cellspacing="1">
+                    <tr>
+                      <td colspan="3" class="info-title">attributes</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading" width="20%">name</td>
+                      <td class="feature-heading" width="10%">feature</td>
+                      <td class="feature-heading" width="70%">value</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-detail" valign="top" rowspan="4"><a name="PermuteEntry.sourceAxis"></a><b>sourceAxis</b></td>
+                      <td class="feature-heading">type</td>
+                      <td class="feature-detail"><a href="#ivoa">ivoa</a>:<a href="http://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/models/ivoa/vo-dml/IVOA-v1.0.html#nonnegativeInteger">nonnegativeInteger</a></td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">vodml-id</td>
+                      <td class="feature-detail">PermuteEntry.sourceAxis</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">multiplicity</td>
+                      <td class="feature-detail">1</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">description</td>
+                      <td class="feature-detail">Source (input) dimension number, 1 based.</td>
+                    </tr>
+                  </table>
+                </td>
+              </tr>
+            </table>
+          </td>
+        </tr>
+      </table>
+    </div><br><h3><a name="PolyCoeff1D"></a>2.1.8 objectType: PolyCoeff1D
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -677,7 +815,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="PolyCoeff2D"></a>2.1.7 objectType: PolyCoeff2D
+    </div><br><h3><a name="PolyCoeff2D"></a>2.1.9 objectType: PolyCoeff2D
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -747,7 +885,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Polynomial"></a>2.1.8 objectType: Polynomial
+    </div><br><h3><a name="Polynomial"></a>2.1.10 objectType: Polynomial
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -810,7 +948,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Polynomial1D"></a>2.1.9 objectType: Polynomial1D
+    </div><br><h3><a name="Polynomial1D"></a>2.1.11 objectType: Polynomial1D
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -870,7 +1008,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Polynomial2D"></a>2.1.10 objectType: Polynomial2D
+    </div><br><h3><a name="Polynomial2D"></a>2.1.12 objectType: Polynomial2D
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -930,7 +1068,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="ProjectionParam"></a>2.1.11 objectType: ProjectionParam
+    </div><br><h3><a name="ProjectionParam"></a>2.1.13 objectType: ProjectionParam
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -973,7 +1111,7 @@
                     </tr>
                     <tr>
                       <td class="feature-heading">description</td>
-                      <td class="feature-detail">The parameter name.  This is typically, but not always, given as a "PVi_j" key.</td>
+                      <td class="feature-detail">The parameter name, typically expressed as a "PVi_j" key.</td>
                     </tr>
                     <tr>
                       <td class="feature-detail" valign="top" rowspan="4"><a name="ProjectionParam.value"></a><b>value</b></td>
@@ -999,81 +1137,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Reorder"></a>2.1.12 objectType: Reorder
-    </h3>
-    <div align="center">
-      <table border="1" width="100%" cellspacing="2">
-        <tr>
-          <td class="objecttype-title" width="20%">vodml-id</td>
-          <td class="objecttype-name" colspan="1">Reorder</td>
-        </tr>
-        <tr>
-          <td class="info-title">description</td>
-          <td class="feature-detail" colspan="1">This operation facilitates the specification of axis order shuffling between operations.  For example, if we have a 3-dimensional
-            coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane, this operation, joined, allows us to
-            define a new axis order  (y,x,z) to feed into the next step ( 1D + 2D operations).
-          </td>
-        </tr>
-        <tr>
-          <td colspan="2">
-            <table width="100%" cellpadding="0" cellspacing="0" border="0">
-              <tr>
-                <td colspan="2" bgcolor="#cacaca">
-                  <table width="100%" border="0" cellpadding="3" cellspacing="1">
-                    <tr>
-                      <td width="20%" class="info-title">extends</td>
-                      <td colspan="3" class="feature-detail"><a href="#TOperation">TOperation [trans:TOperation]</a></td>
-                    </tr>
-                    <tr>
-                      <td colspan="3" class="info-title">attributes</td>
-                    </tr>
-                    <tr>
-                      <td class="feature-heading" width="20%">name</td>
-                      <td class="feature-heading" width="10%">feature</td>
-                      <td class="feature-heading" width="70%">value</td>
-                    </tr>
-                    <tr>
-                      <td class="feature-detail" valign="top" rowspan="4"><a name="Reorder.in"></a><b>in</b></td>
-                      <td class="feature-heading">type</td>
-                      <td class="feature-detail"><a href="#ivoa">ivoa</a>:<a href="http://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/models/ivoa/vo-dml/IVOA-v1.0.html#nonnegativeInteger">nonnegativeInteger</a></td>
-                    </tr>
-                    <tr>
-                      <td class="feature-heading">vodml-id</td>
-                      <td class="feature-detail">Reorder.in</td>
-                    </tr>
-                    <tr>
-                      <td class="feature-heading">multiplicity</td>
-                      <td class="feature-detail">1</td>
-                    </tr>
-                    <tr>
-                      <td class="feature-heading">description</td>
-                      <td class="feature-detail">The input (original) axis/dimension number.</td>
-                    </tr>
-                    <tr>
-                      <td class="feature-detail" valign="top" rowspan="4"><a name="Reorder.out"></a><b>out</b></td>
-                      <td class="feature-heading">type</td>
-                      <td class="feature-detail"><a href="#ivoa">ivoa</a>:<a href="http://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/models/ivoa/vo-dml/IVOA-v1.0.html#nonnegativeInteger">nonnegativeInteger</a></td>
-                    </tr>
-                    <tr>
-                      <td class="feature-heading">vodml-id</td>
-                      <td class="feature-detail">Reorder.out</td>
-                    </tr>
-                    <tr>
-                      <td class="feature-heading">multiplicity</td>
-                      <td class="feature-detail">1</td>
-                    </tr>
-                    <tr>
-                      <td class="feature-heading">description</td>
-                      <td class="feature-detail">The output (target) axis/dimension number.</td>
-                    </tr>
-                  </table>
-                </td>
-              </tr>
-            </table>
-          </td>
-        </tr>
-      </table>
-    </div><br><h3><a name="Rotate"></a>2.1.13 objectType: Rotate
+    </div><br><h3><a name="Rotate"></a>2.1.14 objectType: Rotate
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -1118,7 +1182,7 @@
                     </tr>
                     <tr>
                       <td class="feature-heading">description</td>
-                      <td class="feature-detail">Rotation angle in degrees, applied in counter-clockwise direction.</td>
+                      <td class="feature-detail">Rotation angle, in degrees, from the positive direction of axis 1 to the positive direction of axis 2.</td>
                     </tr>
                   </table>
                 </td>
@@ -1127,7 +1191,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Scale"></a>2.1.14 objectType: Scale
+    </div><br><h3><a name="Scale"></a>2.1.15 objectType: Scale
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -1181,7 +1245,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Shift"></a>2.1.15 objectType: Shift
+    </div><br><h3><a name="Shift"></a>2.1.16 objectType: Shift
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -1235,7 +1299,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="SkyProjection"></a>2.1.16 objectType: SkyProjection
+    </div><br><h3><a name="SkyProjection"></a>2.1.17 objectType: SkyProjection
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -1247,8 +1311,10 @@
           <td class="info-title">description</td>
           <td class="feature-detail" colspan="1">This class represents a two-dimensional projection of sky as detailed in the FITS WCS paper II.  As in the paper, this operation
             picks up from the intermediate coordinate system, AFTER the application of the linear transform from pixel to intermediate
-            space.  In this model, the full transform from pixel to world is accomplished with a two-stage Transform, first applying the
-            linear operations via a Matrix or other component operations, followed by the SkyProjection operation.
+            space, and includes both the spherical projection and spherical rotation steps.  When required, LONPOLEa and LATPOLEa are
+            to be provided through the ProjectionParam list.  The full transform from pixel to world is accomplished with a two-stage
+            Transform, first applying the linear operations via a Matrix or other component operations, followed by the SkyProjection
+            operation.
           </td>
         </tr>
         <tr>
@@ -1312,7 +1378,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="SkyProjectionType"></a>2.1.17 enumeration: SkyProjectionType
+    </div><br><h3><a name="SkyProjectionType"></a>2.1.18 enumeration: SkyProjectionType
     </h3>
     <table border="1" width="100%" cellspacing="2">
       <tr>
@@ -1591,7 +1657,7 @@
         <td class="feature-heading">description</td>
         <td class="feature-detail">Quadrilateralized spherical cube</td>
       </tr>
-    </table><br><h3><a name="SpectralCoordType"></a>2.1.18 enumeration: SpectralCoordType
+    </table><br><h3><a name="SpectralCoordType"></a>2.1.19 enumeration: SpectralCoordType
     </h3>
     <table border="1" width="100%" cellspacing="2">
       <tr>
@@ -1710,7 +1776,7 @@
         <td class="feature-heading">description</td>
         <td class="feature-detail">Beta factor (v/c)</td>
       </tr>
-    </table><br><h3><a name="SpectralProjection"></a>2.1.19 objectType: SpectralProjection
+    </table><br><h3><a name="SpectralProjection"></a>2.1.20 objectType: SpectralProjection
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -1802,7 +1868,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="SpectralProjectionType"></a>2.1.20 enumeration: SpectralProjectionType
+    </div><br><h3><a name="SpectralProjectionType"></a>2.1.21 enumeration: SpectralProjectionType
     </h3>
     <table border="1" width="100%" cellspacing="2">
       <tr>
@@ -1974,7 +2040,7 @@
         <td class="feature-heading">description</td>
         <td class="feature-detail">Grism in air</td>
       </tr>
-    </table><br><h3><a name="StringEntry"></a>2.1.21 objectType: StringEntry
+    </table><br><h3><a name="StringEntry"></a>2.1.22 objectType: StringEntry
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -1984,8 +2050,8 @@
         </tr>
         <tr>
           <td class="info-title">description</td>
-          <td class="feature-detail" colspan="1">A 1-Dimensional discrete mapping of an integer counter to a corresponding string form.  A simple use case example is to transform
-            a pixel index value to a particular Polarization state represented as a string. 
+          <td class="feature-detail" colspan="1">A 1-Dimensional discrete mapping of an integer counter to a corresponding string form.  Since the result is non-numeric, a
+            Lookup table with StringEntry-s can only be used at the end of a Transform sequence.
           </td>
         </tr>
         <tr>
@@ -2047,7 +2113,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="TComplexOperation"></a>2.1.22 objectType: TComplexOperation
+    </div><br><h3><a name="TComplexOperation"></a>2.1.23 objectType: TComplexOperation
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -2116,7 +2182,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="TJoin"></a>2.1.23 objectType: TJoin
+    </div><br><h3><a name="TJoin"></a>2.1.24 objectType: TJoin
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -2149,7 +2215,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="TOperation"></a>2.1.24 objectType: TOperation
+    </div><br><h3><a name="TOperation"></a>2.1.25 objectType: TOperation
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -2175,7 +2241,34 @@
                     </tr>
                     <tr>
                       <td class="info-title" width="20%">Subclasses in this model</td>
-                      <td class="feature-detail" colspan="3"><a href="#Lookup">Lookup</a> <a href="#Matrix">Matrix</a> <a href="#Polynomial">Polynomial</a> <a href="#Reorder">Reorder</a> <a href="#Rotate">Rotate</a> <a href="#Scale">Scale</a> <a href="#Shift">Shift</a> <a href="#TComplexOperation">TComplexOperation</a> <a href="#Unit">Unit</a> <a href="#WCSProjection">WCSProjection</a> 
+                      <td class="feature-detail" colspan="3"><a href="#Lookup">Lookup</a> <a href="#Matrix">Matrix</a> <a href="#Permute">Permute</a> <a href="#Polynomial">Polynomial</a> <a href="#Rotate">Rotate</a> <a href="#Scale">Scale</a> <a href="#Shift">Shift</a> <a href="#TComplexOperation">TComplexOperation</a> <a href="#Unit">Unit</a> <a href="#WCSProjection">WCSProjection</a> 
+                      </td>
+                    </tr>
+                    <tr>
+                      <td colspan="3" class="info-title">attributes</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading" width="20%">name</td>
+                      <td class="feature-heading" width="10%">feature</td>
+                      <td class="feature-heading" width="70%">value</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-detail" valign="top" rowspan="4"><a name="TOperation.invert"></a><b>invert</b></td>
+                      <td class="feature-heading">type</td>
+                      <td class="feature-detail"><a href="#ivoa">ivoa</a>:<a href="http://volute.g-vo.org/svn/trunk/projects/dm/vo-dml/models/ivoa/vo-dml/IVOA-v1.0.html#boolean">boolean</a></td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">vodml-id</td>
+                      <td class="feature-detail">TOperation.invert</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">multiplicity</td>
+                      <td class="feature-detail">0..1</td>
+                    </tr>
+                    <tr>
+                      <td class="feature-heading">description</td>
+                      <td class="feature-detail">Boolean flag indicating that it the inverse of the specified operation should be applied.  This is most useful in building
+                        operation chains; for example, operation A followed by the inverse of operation B.  If missing, it is assumed to be "False"
                       </td>
                     </tr>
                   </table>
@@ -2185,7 +2278,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Transform"></a>2.1.25 objectType: Transform
+    </div><br><h3><a name="Transform"></a>2.1.26 objectType: Transform
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -2217,7 +2310,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="Unit"></a>2.1.26 objectType: Unit
+    </div><br><h3><a name="Unit"></a>2.1.27 objectType: Unit
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -2227,7 +2320,7 @@
         </tr>
         <tr>
           <td class="info-title">description</td>
-          <td class="feature-detail" colspan="1">The Unit transform is an n-Dimensional operation which makes no change to the inputs. ( X' = X )</td>
+          <td class="feature-detail" colspan="1">The Unit transform is an 1-Dimensional operation which makes no change to the inputs. ( X' = X )</td>
         </tr>
         <tr>
           <td colspan="2">
@@ -2246,7 +2339,7 @@
           </td>
         </tr>
       </table>
-    </div><br><h3><a name="WCSProjection"></a>2.1.27 objectType: WCSProjection
+    </div><br><h3><a name="WCSProjection"></a>2.1.28 objectType: WCSProjection
     </h3>
     <div align="center">
       <table border="1" width="100%" cellspacing="2">
@@ -2308,8 +2401,8 @@
                     <tr>
                       <td class="feature-heading">description</td>
                       <td class="feature-detail">Set of 0 or more parameters providing supplemental metadata required to execute a particular projection algorithm.  The number
-                        and meaning of the parameters depends on the algorithm.  They are typically in the from of "PVi_j" keyword/value pairs, so
-                        we provide a simple ProjectionParam element to accommodate these.  The detailed content specification is left to the WCS paper.
+                        and meaning of the parameters depends on the algorithm.  They are typically in the from of keyword/value pairs, so we provide
+                        a simple ProjectionParam element to accommodate these.  The detailed content specification is left to the WCS paper.
                       </td>
                     </tr>
                   </table>
@@ -2345,6 +2438,13 @@
         <td class="feature-detail">objectType</td>
         <td class="feature-detail">Defines a lookup table operation.  The Lookup is comprised of a series of value pairs (LookupEntry).  All members of the series
           MUST be of the same type.
+          Handling Enumerated data:
+          A common useage of a Lookup operation is to map image pixel index to an enumeration, such as a Polarization state.  This can
+          be handled by two means.  1) define a numeric equivalent for each enumeration literal, and use NumericEntry types.  Casting
+          to the corresponding literal occurs outside of the operation.  2) your local model can define a LookupEntry extension which
+          maps the native value directly the target EnumerationLiteral.  The details of either approach for particular enumerations
+          is considered outside the scope of this document.
+          
         </td>
       </tr>
       <tr>
@@ -2419,6 +2519,42 @@
         <td class="feature-detail">The target, or resulting, value of the lookup entry.</td>
       </tr>
       <tr>
+        <td class="feature-detail"><a href="#Permute">Permute</a></td>
+        <td class="feature-detail">objectType</td>
+        <td class="feature-detail">Permute the order and possibly number of dimensions between operations.  This operation facilitates the workflow through the
+          operation sequence.  It is comprised of an ordered axismap list, defining the output axis sequence in terms of the source
+          (input) axes.  It supports the reorder, duplication, and dropping of dimensions.  
+          Reorder Example:
+          We have a 3-dimensional coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane.  Define a Permute
+          operation with axismap list specifying sourceAxis [2,1,3].  The results feed into the next step ( 1D + 2D operations ).
+          Duplicate Example:
+          We have 2-dimensional coordinate (x,y) feeding two Polynomial2D operations to form (x',y').  Define a Permute operation with
+          axismap list specifying sourceAxis set [1,2,1,2].  The result feeds into the next step ( Polynomial2D + Polynomial2D  operations).
+          Drop Example:
+          We have a 5-dimensional input feeding into a 3x3 Matrix operation.  Define a Permute operation selecting the relevant axis
+          set [1,3,5], the remaining axes, [2,4], are dropped.
+        </td>
+      </tr>
+      <tr>
+        <td class="feature-detail"><a href="#Permute.axismap">Permute.axismap</a></td>
+        <td class="feature-detail">composition</td>
+        <td class="feature-detail">Ordered list defining the number and order of the resulting axis set.  Each entry provides the source (input) dimension for
+          that output dimension.
+        </td>
+      </tr>
+      <tr>
+        <td class="feature-detail"><a href="#PermuteEntry">PermuteEntry</a></td>
+        <td class="feature-detail">objectType</td>
+        <td class="feature-detail">Entry for the Permute operation, this object defines the mapping of input dimension to output dimension.  The output dimension
+          is determined from its order in the axismap list.
+        </td>
+      </tr>
+      <tr>
+        <td class="feature-detail"><a href="#PermuteEntry.sourceAxis">PermuteEntry.sourceAxis</a></td>
+        <td class="feature-detail">attribute</td>
+        <td class="feature-detail">Source (input) dimension number, 1 based.</td>
+      </tr>
+      <tr>
         <td class="feature-detail"><a href="#PolyCoeff1D">PolyCoeff1D</a></td>
         <td class="feature-detail">objectType</td>
         <td class="feature-detail">A term of the polynomial expression.  This object provides the coefficient (c) and power (p) of the term, forming the expression
@@ -2498,7 +2634,7 @@
       <tr>
         <td class="feature-detail"><a href="#ProjectionParam.name">ProjectionParam.name</a></td>
         <td class="feature-detail">attribute</td>
-        <td class="feature-detail">The parameter name.  This is typically, but not always, given as a "PVi_j" key.</td>
+        <td class="feature-detail">The parameter name, typically expressed as a "PVi_j" key.</td>
       </tr>
       <tr>
         <td class="feature-detail"><a href="#ProjectionParam.value">ProjectionParam.value</a></td>
@@ -2506,24 +2642,6 @@
         <td class="feature-detail">The value for the parameter. </td>
       </tr>
       <tr>
-        <td class="feature-detail"><a href="#Reorder">Reorder</a></td>
-        <td class="feature-detail">objectType</td>
-        <td class="feature-detail">This operation facilitates the specification of axis order shuffling between operations.  For example, if we have a 3-dimensional
-          coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane, this operation, joined, allows us to
-          define a new axis order  (y,x,z) to feed into the next step ( 1D + 2D operations).
-        </td>
-      </tr>
-      <tr>
-        <td class="feature-detail"><a href="#Reorder.in">Reorder.in</a></td>
-        <td class="feature-detail">attribute</td>
-        <td class="feature-detail">The input (original) axis/dimension number.</td>
-      </tr>
-      <tr>
-        <td class="feature-detail"><a href="#Reorder.out">Reorder.out</a></td>
-        <td class="feature-detail">attribute</td>
-        <td class="feature-detail">The output (target) axis/dimension number.</td>
-      </tr>
-      <tr>
         <td class="feature-detail"><a href="#Rotate">Rotate</a></td>
         <td class="feature-detail">objectType</td>
         <td class="feature-detail">A 2-Dimensional rotation operation.  </td>
@@ -2531,7 +2649,7 @@
       <tr>
         <td class="feature-detail"><a href="#Rotate.angle">Rotate.angle</a></td>
         <td class="feature-detail">attribute</td>
-        <td class="feature-detail">Rotation angle in degrees, applied in counter-clockwise direction.</td>
+        <td class="feature-detail">Rotation angle, in degrees, from the positive direction of axis 1 to the positive direction of axis 2.</td>
       </tr>
       <tr>
         <td class="feature-detail"><a href="#Scale">Scale</a></td>
@@ -2558,8 +2676,10 @@
         <td class="feature-detail">objectType</td>
         <td class="feature-detail">This class represents a two-dimensional projection of sky as detailed in the FITS WCS paper II.  As in the paper, this operation
           picks up from the intermediate coordinate system, AFTER the application of the linear transform from pixel to intermediate
-          space.  In this model, the full transform from pixel to world is accomplished with a two-stage Transform, first applying the
-          linear operations via a Matrix or other component operations, followed by the SkyProjection operation.
+          space, and includes both the spherical projection and spherical rotation steps.  When required, LONPOLEa and LATPOLEa are
+          to be provided through the ProjectionParam list.  The full transform from pixel to world is accomplished with a two-stage
+          Transform, first applying the linear operations via a Matrix or other component operations, followed by the SkyProjection
+          operation.
         </td>
       </tr>
       <tr>
@@ -2874,8 +2994,8 @@
       <tr>
         <td class="feature-detail"><a href="#StringEntry">StringEntry</a></td>
         <td class="feature-detail">objectType</td>
-        <td class="feature-detail">A 1-Dimensional discrete mapping of an integer counter to a corresponding string form.  A simple use case example is to transform
-          a pixel index value to a particular Polarization state represented as a string. 
+        <td class="feature-detail">A 1-Dimensional discrete mapping of an integer counter to a corresponding string form.  Since the result is non-numeric, a
+          Lookup table with StringEntry-s can only be used at the end of a Transform sequence.
         </td>
       </tr>
       <tr>
@@ -2917,6 +3037,13 @@
         </td>
       </tr>
       <tr>
+        <td class="feature-detail"><a href="#TOperation.invert">TOperation.invert</a></td>
+        <td class="feature-detail">attribute</td>
+        <td class="feature-detail">Boolean flag indicating that it the inverse of the specified operation should be applied.  This is most useful in building
+          operation chains; for example, operation A followed by the inverse of operation B.  If missing, it is assumed to be "False"
+        </td>
+      </tr>
+      <tr>
         <td class="feature-detail"><a href="#Transform">Transform</a></td>
         <td class="feature-detail">objectType</td>
         <td class="feature-detail">Typically the head of the transformation process, the Transform is a complex operation which executes the component maps in
@@ -2927,7 +3054,7 @@
       <tr>
         <td class="feature-detail"><a href="#Unit">Unit</a></td>
         <td class="feature-detail">objectType</td>
-        <td class="feature-detail">The Unit transform is an n-Dimensional operation which makes no change to the inputs. ( X' = X )</td>
+        <td class="feature-detail">The Unit transform is an 1-Dimensional operation which makes no change to the inputs. ( X' = X )</td>
       </tr>
       <tr>
         <td class="feature-detail"><a href="#WCSProjection">WCSProjection</a></td>
@@ -2941,8 +3068,8 @@
         <td class="feature-detail"><a href="#WCSProjection.param">WCSProjection.param</a></td>
         <td class="feature-detail">composition</td>
         <td class="feature-detail">Set of 0 or more parameters providing supplemental metadata required to execute a particular projection algorithm.  The number
-          and meaning of the parameters depends on the algorithm.  They are typically in the from of "PVi_j" keyword/value pairs, so
-          we provide a simple ProjectionParam element to accommodate these.  The detailed content specification is left to the WCS paper.
+          and meaning of the parameters depends on the algorithm.  They are typically in the from of keyword/value pairs, so we provide
+          a simple ProjectionParam element to accommodate these.  The detailed content specification is left to the WCS paper.
         </td>
       </tr>
     </table>

Modified: trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.png
==============================================================================
Binary file (source and/or target). No diff available.

Modified: trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.vo-dml.xml
==============================================================================
--- trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.vo-dml.xml	Tue Dec 18 21:10:19 2018	(r5289)
+++ trunk/projects/dm/STC/Trans/vo-dml/STC_trans-v1.0.vo-dml.xml	Tue Dec 18 23:18:40 2018	(r5290)
@@ -7,10 +7,10 @@
 </description>
   <uri/>
   <title>WCS Transform Model</title>
-  <author>Arnold Rots, Mark Cresitello-Dittmar</author>
+  <author>Arnold Rots, Mark Cresitello-Dittmar, David Bery, Steven Crawford, Nadia Dencheva, Perry Greenfield, Tim Jenness, Omar Laurino, Stuart Mumford, Erik Tollerud</author>
   <version>1.0</version>
   <previousVersion>0.0</previousVersion>
-  <lastModified>2018-12-12T13:02:20</lastModified>
+  <lastModified>2018-12-18T15:10:30</lastModified>
   <import>
     <name>ivoa</name>
     <url>http://www.ivoa.net/xml/VODML/20180519/IVOA-v1.0.vo-dml.xml</url>
@@ -314,12 +314,24 @@
     <vodml-id>TOperation</vodml-id>
     <name>TOperation</name>
     <description>Transform Operation (TOperation) defines a mathematical operation to be performed on its inputs.  These operations form the building blocks with which complex operations can be defined.</description>
+    <attribute>
+      <vodml-id>TOperation.invert</vodml-id>
+      <name>invert</name>
+      <description>Boolean flag indicating that it the inverse of the specified operation should be applied.  This is most useful in building operation chains; for example, operation A followed by the inverse of operation B.  If missing, 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>Unit</vodml-id>
     <name>Unit</name>
-    <description>The Unit transform is an n-Dimensional operation which makes no change to the inputs. ( X' = X )</description>
+    <description>The Unit transform is an 1-Dimensional operation which makes no change to the inputs. ( X' = X )</description>
     <extends>
       <vodml-ref>trans:TOperation</vodml-ref>
     </extends>
@@ -377,7 +389,7 @@
     <attribute>
       <vodml-id>Rotate.angle</vodml-id>
       <name>angle</name>
-      <description>Rotation angle in degrees, applied in counter-clockwise direction.</description>
+      <description>Rotation angle, in degrees, from the positive direction of axis 1 to the positive direction of axis 2.</description>
       <datatype>
         <vodml-ref>ivoa:real</vodml-ref>
       </datatype>
@@ -614,7 +626,7 @@
     <composition>
       <vodml-id>WCSProjection.param</vodml-id>
       <name>param</name>
-      <description>Set of 0 or more parameters providing supplemental metadata required to execute a particular projection algorithm.  The number and meaning of the parameters depends on the algorithm.  They are typically in the from of "PVi_j" keyword/value pairs, so we provide a simple ProjectionParam element to accommodate these.  The detailed content specification is left to the WCS paper.</description>
+      <description>Set of 0 or more parameters providing supplemental metadata required to execute a particular projection algorithm.  The number and meaning of the parameters depends on the algorithm.  They are typically in the from of keyword/value pairs, so we provide a simple ProjectionParam element to accommodate these.  The detailed content specification is left to the WCS paper.</description>
       <datatype>
         <vodml-ref>trans:ProjectionParam</vodml-ref>
       </datatype>
@@ -632,7 +644,7 @@
     <attribute>
       <vodml-id>ProjectionParam.name</vodml-id>
       <name>name</name>
-      <description>The parameter name.  This is typically, but not always, given as a "PVi_j" key.</description>
+      <description>The parameter name, typically expressed as a "PVi_j" key.</description>
       <datatype>
         <vodml-ref>ivoa:string</vodml-ref>
       </datatype>
@@ -658,7 +670,7 @@
   <objectType>
     <vodml-id>SkyProjection</vodml-id>
     <name>SkyProjection</name>
-    <description>This class represents a two-dimensional projection of sky as detailed in the FITS WCS paper II.  As in the paper, this operation picks up from the intermediate coordinate system, AFTER the application of the linear transform from pixel to intermediate space.  In this model, the full transform from pixel to world is accomplished with a two-stage Transform, first applying the linear operations via a Matrix or other component operations, followed by the SkyProjection operation.</description>
+    <description>This class represents a two-dimensional projection of sky as detailed in the FITS WCS paper II.  As in the paper, this operation picks up from the intermediate coordinate system, AFTER the application of the linear transform from pixel to intermediate space, and includes both the spherical projection and spherical rotation steps.  When required, LONPOLEa and LATPOLEa are to be provided through the ProjectionParam list.  The full transform from pixel to world is accomplished with a two-stage Transform, first applying the linear operations via a Matrix or other component operations, followed by the SkyProjection operation.</description>
     <extends>
       <vodml-ref>trans:WCSProjection</vodml-ref>
     </extends>
@@ -736,7 +748,10 @@
   <objectType>
     <vodml-id>Lookup</vodml-id>
     <name>Lookup</name>
-    <description>Defines a lookup table operation.  The Lookup is comprised of a series of value pairs (LookupEntry).  All members of the series MUST be of the same type.</description>
+    <description>Defines a lookup table operation.  The Lookup is comprised of a series of value pairs (LookupEntry).  All members of the series MUST be of the same type.
+Handling Enumerated data:
+  A common useage of a Lookup operation is to map image pixel index to an enumeration, such as a Polarization state.  This can be handled by two means.  1) define a numeric equivalent for each enumeration literal, and use NumericEntry types.  Casting to the corresponding literal occurs outside of the operation.  2) your local model can define a LookupEntry extension which maps the native value directly the target EnumerationLiteral.  The details of either approach for particular enumerations is considered outside the scope of this document.
+</description>
     <extends>
       <vodml-ref>trans:TOperation</vodml-ref>
     </extends>
@@ -797,7 +812,7 @@
   <objectType>
     <vodml-id>StringEntry</vodml-id>
     <name>StringEntry</name>
-    <description>A 1-Dimensional discrete mapping of an integer counter to a corresponding string form.  A simple use case example is to transform a pixel index value to a particular Polarization state represented as a string. </description>
+    <description>A 1-Dimensional discrete mapping of an integer counter to a corresponding string form.  Since the result is non-numeric, a Lookup table with StringEntry-s can only be used at the end of a Transform sequence.</description>
     <extends>
       <vodml-ref>trans:LookupEntry</vodml-ref>
     </extends>
@@ -828,36 +843,31 @@
   </objectType>
 
   <objectType>
-    <vodml-id>Reorder</vodml-id>
-    <name>Reorder</name>
-    <description>This operation facilitates the specification of axis order shuffling between operations.  For example, if we have a 3-dimensional coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane, this operation, joined, allows us to define a new axis order  (y,x,z) to feed into the next step ( 1D + 2D operations).</description>
+    <vodml-id>Permute</vodml-id>
+    <name>Permute</name>
+    <description>Permute the order and possibly number of dimensions between operations.  This operation facilitates the workflow through the operation sequence.  It is comprised of an ordered axismap list, defining the output axis sequence in terms of the source (input) axes.  It supports the reorder, duplication, and dropping of dimensions.  
+Reorder Example:
+   We have a 3-dimensional coordinate (x,y,z) and wish to perform a 2-dimensional transform on the (x,z) plane.  Define a Permute operation with axismap list specifying sourceAxis [2,1,3].  The results feed into the next step ( 1D + 2D operations ).
+Duplicate Example:
+   We have 2-dimensional coordinate (x,y) feeding two Polynomial2D operations to form (x',y').  Define a Permute operation with axismap list specifying sourceAxis set [1,2,1,2].  The result feeds into the next step ( Polynomial2D + Polynomial2D  operations).
+Drop Example:
+   We have a 5-dimensional input feeding into a 3x3 Matrix operation.  Define a Permute operation selecting the relevant axis set [1,3,5], the remaining axes, [2,4], are dropped.</description>
     <extends>
       <vodml-ref>trans:TOperation</vodml-ref>
     </extends>
-    <attribute>
-      <vodml-id>Reorder.in</vodml-id>
-      <name>in</name>
-      <description>The input (original) axis/dimension number.</description>
+    <composition>
+      <vodml-id>Permute.axismap</vodml-id>
+      <name>axismap</name>
+      <description>Ordered list defining the number and order of the resulting axis set.  Each entry provides the source (input) dimension for that output dimension.</description>
       <datatype>
-        <vodml-ref>ivoa:nonnegativeInteger</vodml-ref>
+        <vodml-ref>trans:PermuteEntry</vodml-ref>
       </datatype>
       <multiplicity>
-        <minOccurs>1</minOccurs>
-        <maxOccurs>1</maxOccurs>
-      </multiplicity>
-    </attribute>
-    <attribute>
-      <vodml-id>Reorder.out</vodml-id>
-      <name>out</name>
-      <description>The output (target) axis/dimension number.</description>
-      <datatype>
-        <vodml-ref>ivoa:nonnegativeInteger</vodml-ref>
-      </datatype>
-      <multiplicity>
-        <minOccurs>1</minOccurs>
-        <maxOccurs>1</maxOccurs>
+        <minOccurs>0</minOccurs>
+        <maxOccurs>-1</maxOccurs>
       </multiplicity>
-    </attribute>
+      <isOrdered>true</isOrdered>
+    </composition>
   </objectType>
 
   <objectType abstract="true">
@@ -882,4 +892,22 @@
     </composition>
   </objectType>
 
+  <objectType>
+    <vodml-id>PermuteEntry</vodml-id>
+    <name>PermuteEntry</name>
+    <description>Entry for the Permute operation, this object defines the mapping of input dimension to output dimension.  The output dimension is determined from its order in the axismap list.</description>
+    <attribute>
+      <vodml-id>PermuteEntry.sourceAxis</vodml-id>
+      <name>sourceAxis</name>
+      <description>Source (input) dimension number, 1 based.</description>
+      <datatype>
+        <vodml-ref>ivoa:nonnegativeInteger</vodml-ref>
+      </datatype>
+      <multiplicity>
+        <minOccurs>1</minOccurs>
+        <maxOccurs>1</maxOccurs>
+      </multiplicity>
+    </attribute>
+  </objectType>
+
 </vo-dml:model>
\ No newline at end of file


More information about the Volutecommits mailing list