Index: /trunk/Ohana/src/opihi/dvo/imextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 17245)
+++ /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 17246)
@@ -3,5 +3,43 @@
 // need to upgrade this to support multiple fields and WHERE clauses
 
-enum {ZERO, RA, DEC, Xm, AIRMASS, MCAL, dMCAL, PHOTCODE, TIME, FWHM, EXPTIME, NSTAR, SKY, NCAL, FLAG, NX_PIX, NY_PIX, THETA, SKEW, SCALE, DSCALE, IMAGE_ID};
+enum {ZERO, 
+      RA, 
+      DEC, 
+      Xm, 
+      AIRMASS, 
+      MCAL, 
+      dMCAL, 
+      PHOTCODE, 
+      TIME, 
+      FWHM, 
+      EXPTIME, 
+      NSTAR, 
+      NCAL, 
+      SKY, 
+      FLAG, 
+      NX_PIX, 
+      NY_PIX, 
+      THETA, 
+      SKEW, 
+      SCALE, 
+      DSCALE, 
+      IMAGE_ID,
+      X_LL_CHIP,
+      X_LR_CHIP,
+      X_UL_CHIP,
+      X_UR_CHIP,
+      Y_LL_CHIP,
+      Y_LR_CHIP,
+      Y_UL_CHIP,
+      Y_UR_CHIP,
+      X_LL_FP,
+      X_LR_FP,
+      X_UL_FP,
+      X_UR_FP,
+      Y_LL_FP,
+      Y_LR_FP,
+      Y_UL_FP,
+      Y_UR_FP,
+};
 
 int imextract (int argc, char **argv) {
@@ -76,25 +114,41 @@
   /* identify selection */
   mode = ZERO;
-  if (!strcasecmp (argv[1], "ra")) mode = RA;
-  if (!strcasecmp (argv[1], "dec")) mode = DEC;
-  if (!strcasecmp (argv[1], "Xm")) mode = Xm;
-  if (!strcasecmp (argv[1], "airmass")) mode = AIRMASS;
-  if (!strcasecmp (argv[1], "Mcal")) mode = MCAL;
-  if (!strcasecmp (argv[1], "dMcal")) mode = dMCAL;
-  if (!strcasecmp (argv[1], "photcode")) mode = PHOTCODE;
-  if (!strcasecmp (argv[1], "time")) mode = TIME;
-  if (!strcasecmp (argv[1], "FWHM")) mode = FWHM;
-  if (!strcasecmp (argv[1], "exptime")) mode = EXPTIME;
-  if (!strcasecmp (argv[1], "nstar")) mode = NSTAR;
-  if (!strcasecmp (argv[1], "ncal")) mode = NCAL;
-  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 (!strcasecmp (argv[1], "imageID")) mode = IMAGE_ID;
+  if (!strcasecmp (argv[1], "ra"       )) mode = RA;
+  if (!strcasecmp (argv[1], "dec"      )) mode = DEC;
+  if (!strcasecmp (argv[1], "Xm"       )) mode = Xm;
+  if (!strcasecmp (argv[1], "airmass"  )) mode = AIRMASS;
+  if (!strcasecmp (argv[1], "Mcal"     )) mode = MCAL;
+  if (!strcasecmp (argv[1], "dMcal"    )) mode = dMCAL;
+  if (!strcasecmp (argv[1], "photcode" )) mode = PHOTCODE;
+  if (!strcasecmp (argv[1], "time"     )) mode = TIME;
+  if (!strcasecmp (argv[1], "FWHM"     )) mode = FWHM;
+  if (!strcasecmp (argv[1], "exptime"  )) mode = EXPTIME;
+  if (!strcasecmp (argv[1], "nstar"    )) mode = NSTAR;
+  if (!strcasecmp (argv[1], "ncal"     )) mode = NCAL;
+  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 (!strcasecmp (argv[1], "imageID"  )) mode = IMAGE_ID;
+  if (!strcasecmp (argv[1], "X_LL_CHIP")) mode = X_LL_CHIP;
+  if (!strcasecmp (argv[1], "X_LR_CHIP")) mode = X_LR_CHIP;
+  if (!strcasecmp (argv[1], "X_UL_CHIP")) mode = X_UL_CHIP;
+  if (!strcasecmp (argv[1], "X_UR_CHIP")) mode = X_UR_CHIP;
+  if (!strcasecmp (argv[1], "Y_LL_CHIP")) mode = Y_LL_CHIP;
+  if (!strcasecmp (argv[1], "Y_LR_CHIP")) mode = Y_LR_CHIP;
+  if (!strcasecmp (argv[1], "Y_UL_CHIP")) mode = Y_UL_CHIP;
+  if (!strcasecmp (argv[1], "Y_UR_CHIP")) mode = Y_UR_CHIP;
+  if (!strcasecmp (argv[1], "X_LL_FP"  )) mode = X_LL_FP;
+  if (!strcasecmp (argv[1], "X_LR_FP"  )) mode = X_LR_FP;
+  if (!strcasecmp (argv[1], "X_UL_FP"  )) mode = X_UL_FP;
+  if (!strcasecmp (argv[1], "X_UR_FP"  )) mode = X_UR_FP;
+  if (!strcasecmp (argv[1], "Y_LL_FP"  )) mode = Y_LL_FP;
+  if (!strcasecmp (argv[1], "Y_LR_FP"  )) mode = Y_LR_FP;
+  if (!strcasecmp (argv[1], "Y_UL_FP"  )) mode = Y_UL_FP;
+  if (!strcasecmp (argv[1], "Y_UR_FP"  )) mode = Y_UR_FP;
   if (mode == ZERO) {
     gprint (GP_ERR, "value may be one of the following:\n");
@@ -215,5 +269,42 @@
 	vec[0].elements[N] = (scale1-scale2);
 	break; }
-	  }
+
+    // reference pixel extractions
+    case X_LL_CHIP:
+    case Y_LL_CHIP:
+    case Y_LR_CHIP:
+    case X_UL_CHIP:
+      vec[0].elements[N] = 0.0;
+      break;
+    case X_LR_CHIP:
+    case X_UR_CHIP:
+      vec[0].elements[N] = image[j].NX;
+      break;
+    case Y_UL_CHIP:
+    case Y_UR_CHIP:
+      vec[0].elements[N] = image[j].NX;
+      break;
+
+    case X_LL_FP:
+    case Y_LL_FP:
+      XY_to_LM (&x, &y, 0.0, 0.0, &image[j].coords);
+      vec[0].elements[N] = (mode == X_LL_FP) ? x : y;
+      break;
+    case X_LR_FP:
+    case Y_LR_FP:
+      XY_to_LM (&x, &y, image[j].NX, 0.0, &image[j].coords);
+      vec[0].elements[N] = (mode == X_LR_FP) ? x : y;
+      break;
+    case X_UL_FP:
+    case Y_UL_FP:
+      XY_to_LM (&x, &y, 0.0, image[j].NY, &image[j].coords);
+      vec[0].elements[N] = (mode == X_UL_FP) ? x : y;
+      break;
+    case X_UR_FP:
+    case Y_UR_FP:
+      XY_to_LM (&x, &y, image[j].NX, image[j].NY, &image[j].coords);
+      vec[0].elements[N] = (mode == X_UR_FP) ? x : y;
+      break;
+    }
     N++;
   }
