Index: trunk/psModules/src/extras/.cvsignore
===================================================================
--- trunk/psModules/src/extras/.cvsignore	(revision 10615)
+++ trunk/psModules/src/extras/.cvsignore	(revision 10615)
@@ -0,0 +1,9 @@
+.deps
+.libs
+Makefile
+Makefile.in
+libpsmodulesextras.la
+libpsmodulesextras_la-pmKapaPlots.lo
+libpsmodulesextras_la-psIOBuffer.lo
+libpsmodulesextras_la-psPipe.lo
+libpsmodulesextras_la-psVectorBracket.lo
Index: trunk/psModules/test/astrom/Makefile.am
===================================================================
--- trunk/psModules/test/astrom/Makefile.am	(revision 10612)
+++ trunk/psModules/test/astrom/Makefile.am	(revision 10615)
@@ -14,5 +14,6 @@
 
 check_PROGRAMS = \
-	tap_pmAstrometryWCS
+	tap_pmAstrometryWCS \
+	tap_pmAstrometryWCS_DVO
 
 test: check
Index: trunk/psModules/test/astrom/tap_pmAstrometryWCS_DVO.c
===================================================================
--- trunk/psModules/test/astrom/tap_pmAstrometryWCS_DVO.c	(revision 10615)
+++ trunk/psModules/test/astrom/tap_pmAstrometryWCS_DVO.c	(revision 10615)
@@ -0,0 +1,140 @@
+#include <stdio.h>
+#include <string.h>
+#include <pslib.h>
+#include <psmodules.h>
+
+#include "tap.h"
+#include "pstap.h"
+
+# if (HAVE_KAPA)
+    # include "dvo.h"
+
+    psMetadata *WriteCoordsToHeader (Coords *coords)
+{
+
+    char name[16];
+
+    // construct a header using coords as the input
+    psMetadata *header = psMetadataAlloc();
+
+    sprintf (name, "RA---", coords[0].ctype[4]);
+    psMetadataAddStr (header, PS_LIST_TAIL, "CTYPE1", PS_META_REPLACE, "", name);
+    sprintf (name, "DEC--", coords[0].ctype[4]);
+    psMetadataAddStr (header, PS_LIST_TAIL, "CTYPE2", PS_META_REPLACE, "", name);
+
+    // center coords (R,D)
+    psMetadataAddF32 (header, PS_LIST_TAIL, "CRVAL1", PS_META_REPLACE, "", coords[0].crval1);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "CRVAL2", PS_META_REPLACE, "", coords[0].crval2);
+
+    // center coords (X,Y)
+    psMetadataAddF32 (header, PS_LIST_TAIL, "CRPIX1", PS_META_REPLACE, "", coords[0].crpix1);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "CRPIX2", PS_META_REPLACE, "", coords[0].crpix2);
+
+    // degrees per pixel
+    psMetadataAddF32 (header, PS_LIST_TAIL, "CDELT1",  PS_META_REPLACE, "", coords[0].cdelt1);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "CDELT2",  PS_META_REPLACE, "", coords[0].cdelt2);
+
+    // rotation matrix
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PC001001", PS_META_REPLACE, "", coords[0].pc1_1);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PC001002", PS_META_REPLACE, "", coords[0].pc1_2);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PC002001", PS_META_REPLACE, "", coords[0].pc2_1);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PC002002", PS_META_REPLACE, "", coords[0].pc2_2);
+
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA1X2Y0", PS_META_REPLACE, "", coords[0].polyterms[0][0]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA1X1Y1", PS_META_REPLACE, "", coords[0].polyterms[1][0]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA1X0Y2", PS_META_REPLACE, "", coords[0].polyterms[2][0]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA2X2Y0", PS_META_REPLACE, "", coords[0].polyterms[0][1]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA2X1Y1", PS_META_REPLACE, "", coords[0].polyterms[1][1]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA2X0Y2", PS_META_REPLACE, "", coords[0].polyterms[2][1]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA1X3Y0", PS_META_REPLACE, "", coords[0].polyterms[3][0]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA1X2Y1", PS_META_REPLACE, "", coords[0].polyterms[4][0]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA1X1Y2", PS_META_REPLACE, "", coords[0].polyterms[5][0]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA1X0Y3", PS_META_REPLACE, "", coords[0].polyterms[6][0]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA2X3Y0", PS_META_REPLACE, "", coords[0].polyterms[3][1]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA2X2Y1", PS_META_REPLACE, "", coords[0].polyterms[4][1]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA2X1Y2", PS_META_REPLACE, "", coords[0].polyterms[5][1]);
+    psMetadataAddF32 (header, PS_LIST_TAIL, "PCA2X0Y3", PS_META_REPLACE, "", coords[0].polyterms[6][1]);
+
+    return header;
+}
+
+int main (void)
+{
+
+    pmModelGroupInit ();
+
+    plan_tests(240);
+
+    diag("pmAstrometryWCS tests compared with DVO coords routines");
+
+    {
+        diag("test pmAstromReadWCS");
+        psMemId id = psMemGetId();
+
+        // build a DVO-style coordinate system
+        Coords coords;
+        strcpy (coords.ctype, "RA---TAN");
+        coords.crval1 = 0.0;
+        coords.crval2 = 0.0;
+        coords.crpix1 = 0.0;
+        coords.crpix2 = 0.0;
+        coords.cdelt1 = 1.0/3600;
+        coords.cdelt2 = 1.0/3600;
+        coords.pc1_1  = 1.0;
+        coords.pc1_2  = 0.0;
+        coords.pc2_1  = 0.0;
+        coords.pc2_2  = 1.0;
+        coords.Npolyterms = 0;
+        for (int i = 0; i < 7; i++) {
+            coords.polyterms[i][0] = 0.0;
+            coords.polyterms[i][1] = 0.0;
+        }
+
+        psMetadata *header = WriteCoordsToHeader (&coords);
+        pmAstromWCS *wcs = pmAstromWCSfromHeader (header);
+        ok (wcs != NULL, "converted WCS keywords to WCS astrometry");
+        skip_start (!status, 1, "*** WCS Conversion FAILS *** : skipping related tests");
+
+        psSphere *sky = psSphereAlloc();
+        psPlane *chip = psPlaneAlloc();
+
+        for (double x = -2000, x <= +2000; x+= 500.0) {
+            for (double y = -2000, y <= +2000; y+= 500.0) {
+                XY_to_RD (&rDVO, &dDVO, x, y, &coords);
+                chip->x = x;
+                chip->y = y;
+                pmAstromWCStoSky (sky, wcs, chip);
+
+                ok_float(rDVO, sky->r*PS_DEG_RAD, "coordinate match: %f vs %f (delta = %f)", rDVO, sky->r*PS_DEG_RAD, rDVO - sky->r*PS_DEG_RAD);
+                ok_float(dDVO, sky->d*PS_DEG_RAD, "coordinate match: %f vs %f (delta = %f)", dDVO, sky->d*PS_DEG_RAD, dDVO - sky->d*PS_DEG_RAD);
+            }
+        }
+
+        psFree (sky);
+        psFree (chip);
+        psFree (wcs);
+        psFree (header);
+
+        skip_end();
+        ok(!psMemCheckLeaks (id, NULL, stderr, false), "no memory leaks");
+    }
+
+    return exit_status();
+}
+
+# else
+
+    int main (void)
+{
+
+    pmModelGroupInit ();
+
+    plan_tests(0);
+
+    diag("pmAstrometryWCS tests compared with DVO coords routines : SKIPPED (libdvo not available)");
+
+    return exit_status();
+}
+
+# endif
+
Index: trunk/psModules/test/extras/.cvsignore
===================================================================
--- trunk/psModules/test/extras/.cvsignore	(revision 10615)
+++ trunk/psModules/test/extras/.cvsignore	(revision 10615)
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
