Index: trunk/ppViz/src/ppCoord/ppCoordArguments.c
===================================================================
--- trunk/ppViz/src/ppCoord/ppCoordArguments.c	(revision 39630)
+++ trunk/ppViz/src/ppCoord/ppCoordArguments.c	(revision 41899)
@@ -58,4 +58,5 @@
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-ds9-radius", 0, "ds9 region radii", 5.0);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-ds9-color", 0, "ds9 region color", "red");
+    psMetadataAddS32(arguments, PS_LIST_TAIL, "-extra-orders", 0, "extra orders for transform inversion", -1);
     if (!psArgumentParse(arguments, &argc, argv) || argc != 1) {
         usage(argv[0], arguments, data);
@@ -84,4 +85,7 @@
     data->ds9color = psMemIncrRefCounter(psMetadataLookupStr(NULL, arguments, "-ds9-color"));
 
+    int ExtraOrders = psMetadataLookupS32(NULL, arguments, "-extra-orders");
+    if (ExtraOrders >= 0) { pmAstrometrySetExtraOrders(ExtraOrders); }
+
     psTrace("ppCoord", 1, "Done reading command-line arguments\n");
     psFree(arguments);
Index: trunk/ppViz/src/ppCoord/ppCoordLoop.c
===================================================================
--- trunk/ppViz/src/ppCoord/ppCoordLoop.c	(revision 39630)
+++ trunk/ppViz/src/ppCoord/ppCoordLoop.c	(revision 41899)
@@ -9,7 +9,13 @@
 #include "ppCoord.h"
 
+typedef struct {
+  psPlane pix;
+  psPlane fp;
+  psPlane tp;
+  psSphere sky;
+} ppCoordSet;
+
 // Convert sky coordinates to chip coordinates
-static void coordSky2Chip(float *x, float *y, // Chip coordinates (output)
-                          double ra, double dec, // Sky coordinates
+static void coordSky2Chip(ppCoordSet *src, // Sky coordinates
                           bool radians,          // Coordinates are in radians?
                           const pmFPA *astromFPA,  // Astrometry FPA
@@ -17,26 +23,16 @@
     )
 {
-    psPlane pix;                        // Pixel coordinates on chip
-    psPlane fp;                         // Focal plane coordinates
-    psPlane tp;                         // Tangent plane coordinates
-    psSphere sky;                       // Sky coordinates
-
-    sky.r = ra;
-    sky.d = dec;
-
+    // convert from src->sky to src->pix
     if (!radians) {
-        sky.r *= M_PI / 180.0;
-        sky.d *= M_PI / 180.0;
-    }
-
-    psProject(&tp, &sky, astromFPA->toSky);
-    psTrace("ppCoord",2,"sky2pix tr1: %f %f\n",tp.x,tp.y);
-    psPlaneTransformApply(&fp, astromFPA->fromTPA, &tp);
-    psTrace("ppCoord",2,"sky2pix tr2: %f %f\n",fp.x,fp.y);
-    psPlaneTransformApply(&pix, astromChip->fromFPA, &fp);
-    psTrace("ppCoord",2,"sky2pix tr3: %f %f\n",pix.x,pix.y);
-
-    *x = pix.x;
-    *y = pix.y;
+        src->sky.r *= M_PI / 180.0;
+        src->sky.d *= M_PI / 180.0;
+    }
+
+    psProject(&src->tp, &src->sky, astromFPA->toSky);
+    psTrace("ppCoord",2,"sky2pix tr1: %f %f\n", src->tp.x, src->tp.y);
+    psPlaneTransformApply(&src->fp, astromFPA->fromTPA, &src->tp);
+    psTrace("ppCoord",2,"sky2pix tr2: %f %f\n", src->fp.x, src->fp.y);
+    psPlaneTransformApply(&src->pix, astromChip->fromFPA, &src->fp);
+    psTrace("ppCoord",2,"sky2pix tr3: %f %f\n", src->pix.x, src->pix.y);
 
     return;
@@ -100,9 +96,13 @@
         psVector *ra = radec->data[0];  // RA coordinates
         long num = ra->n;               // Number of coordinates
-        radecOut = psArrayAlloc(4);
+        radecOut = psArrayAlloc(8);
         radecOut->data[0] = psArrayAlloc(num);
         radecOut->data[1] = psVectorAlloc(num, PS_TYPE_F32);
         radecOut->data[2] = psVectorAlloc(num, PS_TYPE_F32);
         radecOut->data[3] = psArrayAlloc(num);
+        radecOut->data[4] = psVectorAlloc(num, PS_TYPE_F32); // FP x
+        radecOut->data[5] = psVectorAlloc(num, PS_TYPE_F32); // FP y
+        radecOut->data[6] = psVectorAlloc(num, PS_TYPE_F32); // TP x
+        radecOut->data[7] = psVectorAlloc(num, PS_TYPE_F32); // TP y
         psVectorInit(radecOut->data[1], NAN);
         psVectorInit(radecOut->data[2], NAN);
@@ -229,4 +229,6 @@
         }
 
+	// fprintf (stderr, "chip: %s\n", chipName);
+
         // read WCS data from the corresponding header
         pmHDU *hdu = pmFPAviewThisHDU (view, astromFile->fpa);
@@ -274,5 +276,5 @@
                 }
 
-                fprintf(stdout, "%s %.3f %.3f --> %.10lf %.10lf\n", chipName, pix->x, pix->y, sky->r, sky->d);
+                fprintf(stdout, "%s %10.3f %10.3f --> %14.10lf %14.10lf : %11.4f %11.4f : %11.4f %11.4f\n", chipName, pix->x, pix->y, sky->r, sky->d, tp->x, tp->y, fp->x, fp->y);
             }
             psFree(pix);
@@ -358,10 +360,16 @@
             psVector *yPix = radecOut->data[2];   // y coordinate for pixels
             psArray *cellPix = radecOut->data[3]; // Cell for pixels
+            psVector *xFP = radecOut->data[4];   // x coordinate for FP
+            psVector *yFP = radecOut->data[5];   // y coordinate for FP
+            psVector *xTP = radecOut->data[6];   // x coordinate for TP
+            psVector *yTP = radecOut->data[7];   // y coordinate for TP
 
             for (long i = 0; i < num; i++) {
-                float x, y;             // Pixel coordinates
-                coordSky2Chip(&x, &y, ra->data.F64[i], dec->data.F64[i],
-                                data->radians, astromFile->fpa, chip);
-                if ((x < 0 || x > numCols || y < 0 || y > numRows)) {
+		ppCoordSet src;
+		src.sky.r = ra->data.F64[i];
+		src.sky.d = dec->data.F64[i];
+                coordSky2Chip(&src, data->radians, astromFile->fpa, chip);
+		// fprintf (stderr, "x,y: %.2f %.2f\n", src.pix.x, src.pix.y);
+                if ((src.pix.x < 0 || src.pix.x > numCols || src.pix.y < 0 || src.pix.y > numRows)) {
                     // Not on this chip
                     continue;
@@ -369,13 +377,20 @@
 
                 if (rawChip) {
+		    float x, y;
                     psString cellName = NULL; // Name of cell
-                    coordChip2Cell(&cellName, &x, &y, x, y, cellNames, cellBounds,
+                    coordChip2Cell(&cellName, &x, &y, src.pix.x, src.pix.y, cellNames, cellBounds,
                                    cellX0, cellY0, cellParityX, cellParityY, cellBinX, cellBinY);
                     cellPix->data[i] = cellName;
-                }
-
+		    xPix->data.F32[i] = x;
+		    yPix->data.F32[i] = y;
+                } else {
+		    xPix->data.F32[i] = src.pix.x;
+		    yPix->data.F32[i] = src.pix.y;
+		}
                 chipPix->data[i] = psStringCopy(chipName);
-                xPix->data.F32[i] = x;
-                yPix->data.F32[i] = y;
+		xFP->data.F32[i] = src.fp.x;
+		yFP->data.F32[i] = src.fp.y;
+		xTP->data.F32[i] = src.tp.x;
+		yTP->data.F32[i] = src.tp.y;
             }
         }
@@ -406,6 +421,10 @@
             for (long i = 0; i < xPix1->n; i++) {
                 float x1, y1;   // Coordinates of point 1
-                coordSky2Chip(&x1, &y1, ra1->data.F64[i], dec1->data.F64[i],
-                              true, astromFile->fpa, chip);
+		ppCoordSet src;
+		src.sky.r = ra1->data.F64[i];
+		src.sky.d = dec1->data.F64[i];
+                coordSky2Chip(&src, true, astromFile->fpa, chip);
+		x1 = src.pix.x;
+		y1 = src.pix.y;
                 if ((x1 >= 0 && x1 < numCols && y1 >= 0 && y1 < numRows)) {
                     if (rawChip) {
@@ -421,6 +440,9 @@
 
                 float x2, y2;   // Coordinates of point 2
-                coordSky2Chip(&x2, &y2, ra2->data.F64[i], dec2->data.F64[i],
-                              true, astromFile->fpa, chip);
+		src.sky.r = ra2->data.F64[i];
+		src.sky.d = dec2->data.F64[i];
+                coordSky2Chip(&src, true, astromFile->fpa, chip);
+		x2 = src.pix.x;
+		y2 = src.pix.y;
                 if ((x2 >= 0 && x2 < numCols && y2 >= 0 && y2 < numRows)) {
                     if (rawChip) {
@@ -455,6 +477,10 @@
             for (long i = 0; i < num; i++) {
                 float x, y;             // Pixel coordinates
-                coordSky2Chip(&x, &y, ra->data.F64[i], dec->data.F64[i],
-                                false, astromFile->fpa, chip);
+		ppCoordSet src;
+		src.sky.r = ra->data.F64[i];
+		src.sky.d = dec->data.F64[i];
+                coordSky2Chip(&src, false, astromFile->fpa, chip);
+		x = src.pix.x;
+		y = src.pix.y;
                 if ((x < 0 || x > numCols || y < 0 || y > numRows)) {
                     // Not on this chip
@@ -503,4 +529,8 @@
         psVector *ra = radec->data[0];        // RA coordinate
         psVector *dec = radec->data[1];       // Dec coordinate
+	psVector *xFP = radecOut->data[4];   // x coordinate for FP
+	psVector *yFP = radecOut->data[5];   // y coordinate for FP
+	psVector *xTP = radecOut->data[6];   // x coordinate for TP
+	psVector *yTP = radecOut->data[7];   // y coordinate for TP
 
         for (long i = 0; i < chipPix->n; i++) {
@@ -516,9 +546,10 @@
                         xPix->data.F32[i], yPix->data.F32[i], data->ds9radius, data->ds9color);
             } else {
-                fprintf(stdout, "%.10lf %.10lf --> %.3f %.3f %s%s%s\n",
+                fprintf(stdout, "%14.10lf %14.10lf --> %10.3f %10.3f %s%s%s : %11.4f %11.4f : %11.4f %11.4f\n",
                         ra->data.F64[i], dec->data.F64[i], xPix->data.F32[i], yPix->data.F32[i],
                         chipName ? chipName : "UNKNOWN",
                         rawFile ? " " : "",
-                        rawFile && cellName ? cellName : (rawFile ? "UNKNOWN" : ""));
+                        rawFile && cellName ? cellName : (rawFile ? "UNKNOWN" : ""),
+			xFP->data.F32[i], yFP->data.F32[i], xTP->data.F32[i], yTP->data.F32[i] );
             }
         }
