Index: /trunk/Ohana/src/opihi/dvo/imextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 12728)
+++ /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 12729)
@@ -1,5 +1,5 @@
 # include "dvoshell.h"
 
-enum {ZERO, RA, DEC, Xm, AIRMASS, MCAL, dMCAL, PHOTCODE, TIME, FWHM, EXPTIME, NSTAR, SKY, NCAL, FLAG};
+enum {ZERO, RA, DEC, Xm, AIRMASS, MCAL, dMCAL, PHOTCODE, TIME, FWHM, EXPTIME, NSTAR, SKY, NCAL, FLAG, NX_PIX, NY_PIX, THETA, SKEW, SCALE, DSCALE};
 
 int imextract (int argc, char **argv) {
@@ -91,4 +91,10 @@
   if (!strcasecmp (argv[1], "sky")) mode = SKY;
   if (!strcasecmp (argv[1], "flag")) mode = FLAG;
+  if (!strcasecmp (argv[1], "NX")) mode = NX_PIX;
+  if (!strcasecmp (argv[1], "NY")) mode = NY_PIX;
+  if (!strcasecmp (argv[1], "theta")) mode = THETA;
+  if (!strcasecmp (argv[1], "skew")) mode = SKEW;
+  if (!strcasecmp (argv[1], "scale")) mode = SCALE;
+  if (!strcasecmp (argv[1], "dscale")) mode = DSCALE;
   if (mode == ZERO) {
     gprint (GP_ERR, "value may be one of the following:\n");
@@ -121,56 +127,90 @@
     if (FlagSelect && (FlagValue != image[j].code)) continue;
     switch (mode) {
-    case (RA):
-      if (!FindMosaicForImage (image, Nimage, j)) continue;
-      x = 0.5*image[j].NX;
-      y = 0.5*image[j].NY;
-      XY_to_RD (&ra, &dec, x, y, &image[j].coords);
-      vec[0].elements[N] = ra;
-      break;
-    case (DEC):
-      if (!FindMosaicForImage (image, Nimage, j)) continue;
-      x = 0.5*image[j].NX;
-      y = 0.5*image[j].NY;
-      XY_to_RD (&ra, &dec, x, y, &image[j].coords);
-      vec[0].elements[N] = dec;
-      break;
-    case (Xm):
-      vec[0].elements[N] = pow(10.0, 0.01*image[j].Xm);
-      break;
-    case (AIRMASS):
-      vec[0].elements[N] = image[j].secz;
-      break;
-    case (MCAL):
-      vec[0].elements[N] = image[j].Mcal;
-      break;
-    case (dMCAL):
-      vec[0].elements[N] = image[j].dMcal;
-      break;
-    case (PHOTCODE):
-      vec[0].elements[N] = image[j].photcode;
-      break;
-    case (TIME):
-      t = image[j].tzero + 0.5*image[j].NY * image[j].trate / 10000;
-      vec[0].elements[N] = TimeValue (t, TimeReference, TimeFormat);
-      break;
-    case (FWHM):
-      vec[0].elements[N] = image[j].fwhm_x / 25.0;
-      break;
-    case (EXPTIME):
-      vec[0].elements[N] = image[j].exptime;
-      break;
-    case (NSTAR):
-      vec[0].elements[N] = image[j].nstar;
-      break;
-    case (NCAL):
-      vec[0].elements[N] = image[j].Mxxxx;
-      break;
-    case (SKY):
-      vec[0].elements[N] = image[j].Myyyy + 0x8000;
-      break;
-    case (FLAG):
-      vec[0].elements[N] = image[j].code;
-      break;
-    }
+      case RA:
+	if (!FindMosaicForImage (image, Nimage, j)) continue;
+	x = 0.5*image[j].NX;
+	y = 0.5*image[j].NY;
+	XY_to_RD (&ra, &dec, x, y, &image[j].coords);
+	vec[0].elements[N] = ra;
+	break;
+      case DEC:
+	if (!FindMosaicForImage (image, Nimage, j)) continue;
+	x = 0.5*image[j].NX;
+	y = 0.5*image[j].NY;
+	XY_to_RD (&ra, &dec, x, y, &image[j].coords);
+	vec[0].elements[N] = dec;
+	break;
+      case Xm:
+	vec[0].elements[N] = pow(10.0, 0.01*image[j].Xm);
+	break;
+      case AIRMASS:
+	vec[0].elements[N] = image[j].secz;
+	break;
+      case MCAL:
+	vec[0].elements[N] = image[j].Mcal;
+	break;
+      case dMCAL:
+	vec[0].elements[N] = image[j].dMcal;
+	break;
+      case PHOTCODE:
+	vec[0].elements[N] = image[j].photcode;
+	break;
+      case TIME:
+	t = image[j].tzero + 0.5*image[j].NY * image[j].trate / 10000;
+	vec[0].elements[N] = TimeValue (t, TimeReference, TimeFormat);
+	break;
+      case FWHM:
+	vec[0].elements[N] = image[j].fwhm_x / 25.0;
+	break;
+      case EXPTIME:
+	vec[0].elements[N] = image[j].exptime;
+	break;
+      case NSTAR:
+	vec[0].elements[N] = image[j].nstar;
+	break;
+      case NCAL:
+	vec[0].elements[N] = image[j].Mxxxx;
+	break;
+      case SKY:
+	vec[0].elements[N] = image[j].Myyyy + 0x8000;
+	break;
+      case FLAG:
+	vec[0].elements[N] = image[j].code;
+	break;
+      case NX_PIX:
+	vec[0].elements[N] = image[j].NX;
+	break;
+      case NY_PIX:
+	vec[0].elements[N] = image[j].NY;
+	break;
+      case THETA: {
+	double theta1, theta2, s1, s2;
+	s1 = SIGN(image[j].coords.pc1_1);
+	s2 = SIGN(image[j].coords.pc2_2);
+	theta1 = DEG_RAD*atan2 (+s1*image[j].coords.pc1_2, s1*image[j].coords.pc1_1);
+	theta2 = DEG_RAD*atan2 (-s2*image[j].coords.pc2_1, s2*image[j].coords.pc2_2);
+	vec[0].elements[N] = 0.5*(theta1+theta2);
+	break; }
+      case SKEW: {
+	double theta1, theta2, s1, s2;
+	s1 = SIGN(image[j].coords.pc1_1);
+	s2 = SIGN(image[j].coords.pc2_2);
+	theta1 = DEG_RAD*atan2 (+s1*image[j].coords.pc1_2, s1*image[j].coords.pc1_1);
+	theta2 = DEG_RAD*atan2 (-s2*image[j].coords.pc2_1, s2*image[j].coords.pc2_2);
+	vec[0].elements[N] = (theta1-theta2);
+	break; }
+      case SCALE: {
+	double scale1, scale2;
+	scale1 = fabs(image[j].coords.cdelt1);
+	scale2 = fabs(image[j].coords.cdelt2);
+	vec[0].elements[N] = 0.5*(scale1+scale2);
+	break; }
+      case DSCALE: {
+	double scale1, scale2;
+	scale1 = fabs(image[j].coords.cdelt1);
+	scale2 = fabs(image[j].coords.cdelt2);
+	vec[0].elements[N] = (scale1-scale2);
+	break; }
+	  }
     N++;
   }
