Index: /trunk/Ohana/src/addstar/src/SkyListForStars.c
===================================================================
--- /trunk/Ohana/src/addstar/src/SkyListForStars.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/SkyListForStars.c	(revision 14401)
@@ -13,4 +13,5 @@
   ALLOCATE (list[0].filename, char *, NR);
   list[0].Nregions = Nr;
+  list[0].ownElements = FALSE; // free these elements when freeing the list
 
   sort_stars (stars, Nstars); /* sort by RA */
@@ -29,5 +30,5 @@
     list[0].regions[Nr] = here[0].regions[0];
     list[0].filename[Nr] = here[0].filename[0];
-    SkyListFree (here, FALSE); 
+    SkyListFree (here); 
     Nr ++;
     if (Nr >= NR) {
Index: /trunk/Ohana/src/addstar/src/SkyRegionUtils.c
===================================================================
--- /trunk/Ohana/src/addstar/src/SkyRegionUtils.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/SkyRegionUtils.c	(revision 14401)
@@ -11,4 +11,5 @@
   ALLOCATE (subset, SkyList, 1);
   ALLOCATE (subset[0].regions, SkyRegion *, NSUBSET);
+  subset[0].ownElements = FALSE; // free these elements when freeing the list
 
   /* match the basename against the GSCRegion file names */
Index: /trunk/Ohana/src/addstar/src/UpdateDatabase_Image.c
===================================================================
--- /trunk/Ohana/src/addstar/src/UpdateDatabase_Image.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/UpdateDatabase_Image.c	(revision 14401)
@@ -27,5 +27,5 @@
       newlist = SkyListByImage (ServerSky, -1, &images[i]);
       SkyListMerge (&skylist, newlist);
-      SkyListFree (newlist, FALSE);
+      SkyListFree (newlist);
   }
 
@@ -36,5 +36,5 @@
     SkyList *tmp;
     tmp = SkyListExistingSubset (skylist, CATDIR);
-    SkyListFree (skylist, FALSE);
+    SkyListFree (skylist);
     skylist = tmp;
   }
Index: /trunk/Ohana/src/addstar/src/UpdateDatabase_Refcat.c
===================================================================
--- /trunk/Ohana/src/addstar/src/UpdateDatabase_Refcat.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/UpdateDatabase_Refcat.c	(revision 14401)
@@ -24,5 +24,5 @@
     SkyList *tmp;
     tmp = SkyListExistingSubset (skylist, CATDIR);
-    SkyListFree (skylist, FALSE);
+    SkyListFree (skylist);
     skylist = tmp;
   }
Index: /trunk/Ohana/src/addstar/src/UpdateDatabase_Reflist.c
===================================================================
--- /trunk/Ohana/src/addstar/src/UpdateDatabase_Reflist.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/UpdateDatabase_Reflist.c	(revision 14401)
@@ -24,5 +24,5 @@
     SkyList *tmp;
     tmp = SkyListExistingSubset (skylist, CATDIR);
-    SkyListFree (skylist, FALSE);
+    SkyListFree (skylist);
     skylist = tmp;
   }
Index: /trunk/Ohana/src/addstar/src/addstar.c
===================================================================
--- /trunk/Ohana/src/addstar/src/addstar.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/addstar.c	(revision 14401)
@@ -43,5 +43,5 @@
 	SkyListMerge (&skylist, newlist);
 	if (VERBOSE) fprintf (stderr, "added %d regions to yield %d total\n", newlist[0].Nregions, skylist[0].Nregions);
-	SkyListFree (newlist, FALSE);
+	SkyListFree (newlist);
       }
       ImageOptions (&options, images, Nimages);
@@ -60,4 +60,5 @@
       ALLOCATE (skylist, SkyList, 1);
       skylist[0].Nregions = 0;
+      skylist[0].ownElements = FALSE;
       break;
 
@@ -71,5 +72,5 @@
     SkyList *tmp;
     tmp = SkyListExistingSubset (skylist, CATDIR);
-    SkyListFree (skylist, FALSE);
+    SkyListFree (skylist);
     skylist = tmp;
   }
Index: /trunk/Ohana/src/addstar/src/gettycho.c
===================================================================
--- /trunk/Ohana/src/addstar/src/gettycho.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/gettycho.c	(revision 14401)
@@ -123,5 +123,5 @@
   fclose (f);
 
-  SkyListFree (skylist, FALSE);
+  SkyListFree (skylist);
 
   free (buffer);
Index: /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c
===================================================================
--- /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 14400)
+++ /trunk/Ohana/src/addstar/src/load2mass_as_rawdata.c	(revision 14401)
@@ -181,5 +181,5 @@
       }
 
-      SkyListFree (skylist, FALSE);
+      SkyListFree (skylist);
       free (stars);
       VERBOSE = verbose;
Index: /trunk/Ohana/src/delstar/src/delete_times.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delete_times.c	(revision 14400)
+++ /trunk/Ohana/src/delstar/src/delete_times.c	(revision 14401)
@@ -22,4 +22,5 @@
   ALLOCATE (skylist, SkyList, 1);
   ALLOCATE (skylist[0].regions, SkyRegion *, NREGIONS);
+  skylist[0].ownElements = FALSE; // free these elements when freeing the list
 
   image = gfits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped);
@@ -48,5 +49,5 @@
       CHECK_REALLOCATE (skylist[0].regions, SkyRegion *, NREGIONS, Nregions, 10);
     }
-    SkyListFree (skyset, FALSE);
+    SkyListFree (skyset);
   }
 
Index: /trunk/Ohana/src/libautocode/def/average.d
===================================================================
--- /trunk/Ohana/src/libautocode/def/average.d	(revision 14400)
+++ /trunk/Ohana/src/libautocode/def/average.d	(revision 14401)
@@ -19,10 +19,4 @@
 FIELD dP,             PAR_ERR,    float,            parallax error,               arcsec
 
-# XXX drop the old primary magnitude concept
-# FIELD M,            MAG,        float,            primary mag,       	       	  mag
-# FIELD dM,           MAG_ERR,    float,            error on primary mag,         mag
-# FIELD Xm,           CHISQ_MAG,  short, 	    chisq for primary mag,        [100*log(value)]
-# FIELD Xg,           CHISQ_GAL,  short,            chisq for galaxy mags,        [100*log(value)]
-
 FIELD Xp,             SIGMA_POS,  short, 	    position scatter,   	  1/100 arcsec
 FIELD Nm,             NMEAS,      unsigned short,   number of measures
@@ -35,4 +29,6 @@
 FIELD objID_hi,       OBJ_ID_HI,    unsigned int,   ID upper bytes
 FIELD objID_lo,       OBJ_ID_LO,    unsigned int,   ID lower bytes
+
+# XXX record the number of detections used for average astrometry
 
 # this structure should only be used for internal representations
Index: /trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /trunk/Ohana/src/libdvo/include/dvo.h	(revision 14400)
+++ /trunk/Ohana/src/libdvo/include/dvo.h	(revision 14401)
@@ -153,4 +153,5 @@
 typedef struct {
   int Nregions;
+  int ownElements; 				  /* does this list own filename, regions? */
   char **filename;
   SkyRegion **regions;
@@ -428,5 +429,5 @@
 SkyList   *SkyListChildrenByBounds PROTO((SkyTable *table, int No, int depth, double Rmin, double Rmax, double Dmin, double Dmax));
 int        SkyListMerge     	   PROTO((SkyList **outlist, SkyList *newlist));
-int        SkyListFree             PROTO((SkyList *list, int ELEMENTS));
+int        SkyListFree             PROTO((SkyList *list));
 int        SkyTableFree            PROTO((SkyTable *table));
 int        SkyListSetFilenames     PROTO((SkyList *list, char *path, char *ext));
Index: /trunk/Ohana/src/libdvo/src/skyregion_ops.c
===================================================================
--- /trunk/Ohana/src/libdvo/src/skyregion_ops.c	(revision 14400)
+++ /trunk/Ohana/src/libdvo/src/skyregion_ops.c	(revision 14401)
@@ -19,4 +19,5 @@
   ALLOCATE (list[0].filename,  char *, 1);
   list[0].Nregions = 0;
+  list[0].ownElements = FALSE; // this list is only holding a view to the elements
 
   region = table[0].regions;
@@ -65,4 +66,5 @@
   ALLOCATE (list[0].filename, char *, NREGIONS);
   list[0].Nregions = N;
+  list[0].ownElements = FALSE; // this list is only holding a view to the elements
 
   region = table[0].regions;
@@ -99,4 +101,5 @@
   ALLOCATE (list[0].filename,  char *, NREGIONS);
   list[0].Nregions = N;
+  list[0].ownElements = FALSE; // this list is only holding a view to the elements
 
   region = table[0].regions;
@@ -232,5 +235,5 @@
     }
     list[0].Nregions = Ns;
-    SkyListFree (extra, FALSE);
+    SkyListFree (extra);
   } else {
     list = SkyListChildrenByBounds (table, -1, depth, Rmin, Rmax, Dmin, Dmax);
@@ -253,4 +256,5 @@
   ALLOCATE (list[0].regions, SkyRegion *, NNEW);
   ALLOCATE (list[0].filename, char *, NNEW);
+  list[0].ownElements = FALSE; // this list is only holding a view to the elements
 
   region = table[0].regions;
@@ -289,5 +293,5 @@
       }
       Nnew += children[0].Nregions;
-      SkyListFree (children, FALSE);
+      SkyListFree (children);
     } else {
       list[0].regions[Nnew] = &region[i];
@@ -332,5 +336,5 @@
 }
 
-int SkyListFree (SkyList *list, int ELEMENTS) {
+int SkyListFree (SkyList *list) {
 
   int i;
@@ -339,5 +343,5 @@
   if (list == NULL) return (TRUE);
   if (list[0].regions != NULL) {
-    if (ELEMENTS) {
+    if (list[0].ownElements) {
       for (i = 0; i < list[0].Nregions; i++) {
 	if (list[0].filename[i] != NULL) {
@@ -384,4 +388,5 @@
 	ALLOCATE (list[0].regions, SkyRegion *, 1);
 	ALLOCATE (list[0].filename, char *, 1);
+	list[0].ownElements = FALSE; // this list is only holding a view to the elements
 	list[0].Nregions = 0;
 	*outlist = list;
@@ -412,120 +417,2 @@
     return (TRUE);
 }
-
-# if (0)
-
-/* find regions contained within rectangular region  c1 - c2 */
-SkyRegion **SkyFindArea (SkyRegion *db, SkyCoord c1, SkyCoord c2, int *nlist) {
-
-  int Nlist;
-  SkyRegion *list, *new, *sub;
-
-  while (c1.r > 360.0) c1.r -= 360.0;
-  while (c1.r <   0.0) c1.r += 360.0;
-  while (c2.r > 360.0) c2.r -= 360.0;
-  while (c2.r <   0.0) c2.r += 360.0;
-
-  /* check on c1.r > c2.r : cross boundary */
-  if (c1.r > c2.r) {
-    c0 = c2; c0.r = 360.0;
-    list = SkyFindArea (db, c1, c0, &Nlist);
-    c0 = c1; c0.r = 0.0;
-    new  = SkyFindArea (db, c0, c2, &Nnew);
-    REALLOCATE (list, SkyRegion *, MAX (1, Nlist + Nnew));
-    memcpy (&list[Nlist], new, Nnew*sizeof(SkyRegion *));
-    free (new);
-    Nlist += Nnew;
-    *nlist = Nlist;
-    return (list);
-  }    
-
-  Ns = 0;
-  Ne = 1;
-  Nlist = 1;
-  ALLOCATE (list, SkyRegion *, Nlist);
-  list[0] = &region[0];
-  getchild = region[0].child;
-
-  while (getchild) {
-
-    getchild = FALSE;
-    Nnew = 0;
-    NNEW = 100;
-    ALLOCATE (new, SkyRegion *, NNEW);
-
-    for (i = Ns; i < Ne; i++) {
-      children = SkyFindChildren(db, list[i], c1, c2, &Nchildren);
-      if (children == NULL) continue;
-      if (Nnew + Nchildren >= NNEW) {
-	NNEW += 100;
-	REALLOCATE (new, SkyRegion *, NNEW);
-      }
-      for (i = 0; i < Nchildren; i++) {
-	getchild |= children[i][0].child;
-	new[Nnew] = children[i];
-	Nnew++;
-      }
-      free (children);
-    }
-
-    REALLOCATE (list, SkyRegion *, Nlist + Nnew);
-    memcpy (&list[Nlist], new, Nnew*sizeof(SkyRegion *));
-    free (new);
-    Nlist += Nnew;
-  }
-  return (list);
-  *nlist = Nlist;
-}
-
-/* find all children of the given sky region */
-SkyRegion **SkyFindChildren (SkyRegion *db, SkyRegion *parent, SkyCoord c1, SkyCoord c2, int *Nchildren) {
-
-  int i, Ns, Ne, Nregion, NREGIONS;
-  SkyRegion **region;
-  
-  *Nchildren = 0;
-  if (!parent[0].child) return (NULL);
-
-  Ns = parent[0].childS;
-  Ne = parent[0].childE;
-
-  Nregion = 0;
-  NREGIONS = 100;
-  ALLOCATE (region, SkyRegion *, NREGIONS);
-
-  for (i = Ns; i < Ne; i++) {
-    if (region[i].Rmax < c1.r) continue;
-    if (region[i].Rmin > c2.r) continue;
-    if (region[i].Dmax < c1.d) continue;
-    if (region[i].Dmin > c2.d) continue;
-    region[Nregion] = &region[i];
-    Nregion++;
-    if (Nregion == NREGIONS) {
-      NREGIONS += 100;
-      REALLOCATE (region, SkyRegion *, NREGIONS);
-    }      
-  }
-  *Nchildren = Nregion; 
-  return (region);
-}
-
-/* region is pointer to entry in db */
-SkyRegion *SkyExtend (SkyRegion *db, SkyRegion *region) {
-
-  fprintf (stderr, "not implemented\n");
-
-}
-
-/* region is pointer to entry in db */
-SkyRegion *SkyContract (SkyRegion *db, SkyRegion *region) {
-
-  fprintf (stderr, "not implemented\n");
-
-}
-
-SkyRegion *SkyFindGCircle (SkyRegion *db, SkyCoord c1, SkyCoord c2) {
-
-  fprintf (stderr, "not implemented\n");
-
-}
-# endif 
Index: /trunk/Ohana/src/libkapa/src/KapaWindow.c
===================================================================
--- /trunk/Ohana/src/libkapa/src/KapaWindow.c	(revision 14400)
+++ /trunk/Ohana/src/libkapa/src/KapaWindow.c	(revision 14401)
@@ -177,4 +177,9 @@
 		  &data[0].coords.cdelt2);
 
+  // XXX at some point, we need to add polynomials and 2-level mosaic
+  // astrometry here.
+
+  data[0].coords.Npolyterms = 0;
+
   KiiWaitAnswer (fd, "DONE");
   return (TRUE);
Index: /trunk/Ohana/src/opihi/dvo/ImageOps.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/ImageOps.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/ImageOps.c	(revision 14401)
@@ -2,5 +2,5 @@
 
 void image_subset (Image *image, int Nimage, int **Subset, int *Nsubset,
-		   Graphdata *graph, int RegionSelect, 
+		   SkyRegionSelection *selection, 
 		   unsigned long int tzero, double trange, int TimeSelect) 
 {
@@ -10,11 +10,25 @@
   int N, n, npts;
   double r, d, X, Y, x[4], y[4], Rmin, Rmax, Rmid;
+  Graphdata graph;
+  SkyRegion patch;
 
   Rmin = Rmax = Rmid = 0;
-  if (RegionSelect) {
-    Rmin = graph[0].coords.crval1 - 182.0;
-    Rmax = graph[0].coords.crval1 + 182.0;
+
+  if (selection->useDisplay) {
+    if (!GetGraphData (&graph, NULL, NULL)) {
+      gprint (GP_ERR, "region display not available\n");
+      return;
+    }
+    Rmin = graph.coords.crval1 - 182.0;
+    Rmax = graph.coords.crval1 + 182.0;
     Rmid = 0.5*(Rmin + Rmax);
     BuildChipMatch (image, Nimage);
+  }
+
+  if (selection->useSkyregion) {
+    get_skyregion (&patch.Rmin, &patch.Rmax, &patch.Dmin, &patch.Dmax);
+    Rmin = patch.Rmin - 182.0;
+    Rmax = patch.Rmax + 182.0;
+    Rmid = 0.5*(Rmin + Rmax);
   }
 
@@ -29,5 +43,5 @@
   for (i = 0; i < Nimage; i++) {
     if (TimeSelect && ((image[i].tzero < tzero) || (image[i].tzero+image[i].trate*image[i].NY > tzero + trange))) continue;
-    if (RegionSelect) {
+    if (selection->useDisplay) {
       if (!FindMosaicForImage (image, Nimage, i)) continue;
       /* project this image to screen display coords */
@@ -44,10 +58,37 @@
 	while (flipped && (r < Rmid)) r+= 360.0;
 	while (flipped && (r > Rmid)) r-= 360.0;
-	status = RD_to_XY (&X, &Y, r, d, &graph[0].coords);
+	status = RD_to_XY (&X, &Y, r, d, &graph.coords);
 	if (!status) continue;
-	if (X < graph[0].xmin) continue;
-	if (X > graph[0].xmax) continue;
-	if (Y < graph[0].ymin) continue;
-	if (Y > graph[0].ymax) continue;
+	if (X < graph.xmin) continue;
+	if (X > graph.xmax) continue;
+	if (Y < graph.ymin) continue;
+	if (Y > graph.ymax) continue;
+	goto in_region;
+	/** we miss any images which surround the region.  we are also
+	    missing the DIS images for which the corners don't touch
+	    the region, but which are needed for WRP images with
+	    corners touching the region **/
+      }
+      continue;
+    }
+    if (selection->useSkyregion) {
+      if (!FindMosaicForImage (image, Nimage, i)) continue;
+      /* project this image to screen display coords */
+      x[0] = 0;           y[0] = 0;
+      x[1] = image[i].NX; y[1] = 0;
+      x[2] = image[i].NX; y[2] = image[i].NY;
+      x[3] = 0;           y[3] = image[i].NY;
+      InPic = flipped = FALSE;
+      for (j = 0; j < 4; j++) {
+	XY_to_RD (&r, &d, x[j], y[j], &image[i].coords);
+	/* use same side of 0,360 boundary for all corners */
+	if ((j == 0) && (r < Rmin)) flipped = TRUE; 
+	if ((j == 0) && (r > Rmax)) flipped = TRUE; 
+	while (flipped && (r < Rmid)) r+= 360.0;
+	while (flipped && (r > Rmid)) r-= 360.0;
+	if (r < patch.Rmin) continue;
+	if (r > patch.Rmax) continue;
+	if (d < patch.Dmin) continue;
+	if (d > patch.Dmax) continue;
 	goto in_region;
 	/** we miss any images which surround the region.  we are also
Index: /trunk/Ohana/src/opihi/dvo/ImageSelection.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/ImageSelection.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/ImageSelection.c	(revision 14401)
@@ -9,8 +9,7 @@
 
 /* load images based on parameters and region, etc */
-int SetImageSelection (int mosaicMode, int RegionSelect) {
+int SetImageSelection (int mosaicMode, SkyRegionSelection *selection) {
 
   int Ngraph;
-  Graphdata graphsky;
   int TimeSelect;
   time_t tzero, tend;
@@ -19,12 +18,4 @@
   subset = NULL;
   
-  if (RegionSelect) {
-    // how does this know which sky plot to use?
-    if (!GetGraphData (&graphsky, NULL, NULL)) {
-      gprint (GP_ERR, "region display not available\n");
-      return (FALSE);
-    }
-  }
-
   TimeSelect = GetTimeSelection (&tzero, &tend);
 
@@ -41,5 +32,5 @@
   if ((image = LoadImages (&Nimage)) == NULL) return (FALSE);
   BuildChipMatch (image, Nimage);
-  image_subset (image, Nimage, &subset, &Nsubset, &graphsky, RegionSelect, tzero, (double) tend - tzero, TimeSelect);
+  image_subset (image, Nimage, &subset, &Nsubset, selection, tzero, (double) tend - tzero, TimeSelect);
   sort_image_subset (image, subset, Nsubset);
   return (TRUE);
Index: /trunk/Ohana/src/opihi/dvo/Makefile
===================================================================
--- /trunk/Ohana/src/opihi/dvo/Makefile	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/Makefile	(revision 14401)
@@ -82,6 +82,7 @@
 $(SRC)/paverage.$(ARCH).o	  	\
 $(SRC)/procks.$(ARCH).o	  	\
+$(SRC)/skycat.$(ARCH).o	  	\
 $(SRC)/skycoverage.$(ARCH).o	  	\
-$(SRC)/skycat.$(ARCH).o	  	\
+$(SRC)/skyregion.$(ARCH).o	  	\
 $(SRC)/showtile.$(ARCH).o	  	\
 $(SRC)/simage.$(ARCH).o	  	\
Index: /trunk/Ohana/src/opihi/dvo/avextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 14401)
@@ -5,5 +5,5 @@
   int i, j, n, m, N, Npts, NPTS, last, Nfields, Nreturn, Ncstack, Nstack;
   int Nsecfilt, mode, VERBOSE;
-  char *RegionName, *RegionList, *p;
+  char *p;
   char **cstack, name[1024];
   float *values;
@@ -12,4 +12,5 @@
   Catalog catalog;
   SkyList *skylist;
+  SkyRegionSelection *selection;
   PhotCode *code;
   Vector **vec;
@@ -19,10 +20,12 @@
   /* defaults */
   skylist = NULL;
-  RegionName = NULL;
-  RegionList = NULL;
+  selection = NULL;
   code = NULL;
   mode = MAG_AVE;
   fields = NULL;
   stack = NULL;
+
+  if ((N = get_argument (argc, argv, "-h"))) goto help;
+  if ((N = get_argument (argc, argv, "--help"))) goto help;
 
   VERBOSE = FALSE;
@@ -38,7 +41,6 @@
   Nsecfilt = GetPhotcodeNsecfilt ();
 
-  // remove skyregion options
-  // XXX this needs to explicitly handle -qregion and -skyregion
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
 
   // command-line is of the form: avextract field,field, field [where (field op value)...]
@@ -54,4 +56,8 @@
   stack = dbRPN (Ncstack, cstack, &Nstack);
 
+  // add the skyregion limits to the where statement (or create)
+  dbAstroRegionLimits (&stack, &Nstack, selection, DVO_TABLE_AVERAGE);
+
+  // parse stack elements into fields and scalars as needed
   Nreturn = Nfields; 
   dbCheckStack (stack, Nstack, DVO_TABLE_AVERAGE, &fields, &Nfields);
@@ -59,5 +65,5 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
 
   /* create output storage vectors */
@@ -125,18 +131,55 @@
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   return (TRUE);
 
-usage:
+ usage:
   gprint (GP_ERR, "USAGE: avextract (value) [options]\n");
   gprint (GP_ERR, "  value: average.parameter or photcode\n");
 
-escape:
+ escape:
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   dvo_catalog_free (&catalog);
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
+  return (FALSE);
+
+ help:
+  gprint (GP_ERR, "USAGE: avextract field[,field,field...] where (expression)\n");
+
+  if ((argc > N + 1) && !strcasecmp (argv[N+1], "fields")) {
+    gprint (GP_ERR, " USAGE: avextract field[,field,field...] where (expression)\n");
+    gprint (GP_ERR, "  RA : right ascension (J2000)\n");
+    gprint (GP_ERR, "  DEC : declination \n");
+    gprint (GP_ERR, "  dRA : ra scatter \n");
+    gprint (GP_ERR, "  dDEC : dec scatter\n");
+    gprint (GP_ERR, "  uRA : proper motion in ra\n");
+    gprint (GP_ERR, "  uDEC : proper motion in dec\n");
+    gprint (GP_ERR, "  duRA : proper motion error in ra\n");
+    gprint (GP_ERR, "  duDEC : proper motion error in dec\n");
+    gprint (GP_ERR, "  PAR : parallax\n");
+    gprint (GP_ERR, "  dPAR : parallax error \n");
+    gprint (GP_ERR, "  nmeas : number of measurements\n");
+    gprint (GP_ERR, "  nmiss : number of non-detections\n");
+    gprint (GP_ERR, "  xp : positional chi-square\n");
+    gprint (GP_ERR, "  flag : object flags\n");
+    gprint (GP_ERR, "  photocode:ave : average magnitude for photcode\n");
+    gprint (GP_ERR, "  photocode:ref : reference magnitude system for photcode\n");
+    gprint (GP_ERR, "  photocode:inst : first instrumental magnitude for photcode\n");
+    gprint (GP_ERR, "  photocode:cat : first catalog magnitude for photcode\n");
+    gprint (GP_ERR, "  photocode:sys : first system magnitude for photcode\n");
+    gprint (GP_ERR, "  photocode:rel : first relative magnitude for photcode\n");
+    gprint (GP_ERR, "  photocode:cal : first calibrated magnitude for photcode \n");
+    gprint (GP_ERR, "  photcode:err : magnitude error for photcode\n");
+    gprint (GP_ERR, "  photcode:chipsq : chi-square of magnitude fit\n");
+    gprint (GP_ERR, "  type : dophot type (unused)\n");
+    gprint (GP_ERR, "  typefrac : dophot type fraction (unused)\n");
+    gprint (GP_ERR, "  photcode:ncode : number of measurements in photcode \n");
+    gprint (GP_ERR, "  photcode:nphot : number of measurements used for photcode average\n");
+    return (FALSE);
+  }
+  gprint (GP_ERR, " avextract --help fields : for a complete listing of allowed fields\n");
   return (FALSE);
 }
Index: /trunk/Ohana/src/opihi/dvo/calextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/calextract.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/calextract.c	(revision 14401)
@@ -7,5 +7,4 @@
   int i, j, m, N, Nr, mode[2];
   int Nsecfilt, NSTAR;
-  char *RegionName, *RegionList;
   double M1, M2, dM2, color;
 
@@ -14,4 +13,5 @@
   Vector **vec;
   SkyList *skylist;
+  SkyRegionSelection *selection;
 
   /* these need to be freed in the end */
@@ -19,7 +19,6 @@
   catalog.secfilt = NULL;
   catalog.measure = NULL;
-  RegionName = NULL;
-  RegionList = NULL;
   skylist = NULL;
+  selection = NULL;
   vec = NULL;
 
@@ -30,5 +29,7 @@
   /* command line arguments */
   SetSelectionParam (0);
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
   if (!SetPhotSelections (&argc, argv, 2)) goto usage;
 
@@ -50,5 +51,5 @@
   if ((vec[Np] 	= SelectVector ("cal:nphot",    ANYVECTOR, TRUE)) == NULL) goto escape;
   if ((vec[Nc] 	= SelectVector ("cal:ncode",    ANYVECTOR, TRUE)) == NULL) goto escape;
-  if ((vec[Nt] 	= SelectVector ("cal:ncrit",    ANYVECTOR, TRUE)) == NULL) goto escape;
+  // if ((vec[Nt] 	= SelectVector ("cal:ncrit",    ANYVECTOR, TRUE)) == NULL) goto escape;
   if ((vec[Nx] 	= SelectVector ("cal:chisq",    ANYVECTOR, TRUE)) == NULL) goto escape;
   if ((vec[Nd1] = SelectVector ("cal:dm1",      ANYVECTOR, TRUE)) == NULL) goto escape;
@@ -56,5 +57,5 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
 
   for (Nr = 0; Nr < skylist[0].Nregions; Nr++) {
@@ -73,4 +74,5 @@
     dvo_catalog_unlock (&catalog);
 
+    # if (0)
     /* extract values, assign to vectors */
     for (i = 0; i < catalog.Naverage; i++) {
@@ -104,5 +106,5 @@
       vec[Nc ][0].elements[N] = ExtractAverages (code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], AVE_NCODE);
       vec[Np ][0].elements[N] = ExtractAverages (code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], AVE_NPHOT);
-      vec[Nt ][0].elements[N] = ExtractAverages (code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], AVE_NCRIT);
+      // vec[Nt ][0].elements[N] = ExtractAverages (code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], AVE_NCRIT);
       N ++;
       if (N == NSTAR) {
@@ -113,11 +115,14 @@
       }
     }
+    # endif
     dvo_catalog_free (&catalog);
   }
 
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
   for (i = 0; i < NVEC; i++) {
     vec[i][0].Nelements = N;
   }
+
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   return (TRUE);
   
@@ -127,7 +132,6 @@
 
 escape:
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   for (i = 0; i < NVEC; i++) {
     DeleteVector (vec[i]);
Index: /trunk/Ohana/src/opihi/dvo/calmextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/calmextract.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/calmextract.c	(revision 14401)
@@ -8,5 +8,4 @@
   int i, j, k, m, N, N1, Nr, mode[2];
   int NSTAR, Nstar, Nsecfilt;
-  char *RegionName, *RegionList;
   double *M1, M2, dM2, color;
 
@@ -14,4 +13,5 @@
   PhotCode *code[2];
   SkyList *skylist;
+  SkyRegionSelection *selection;
   Vector **vec;
 
@@ -20,7 +20,6 @@
   catalog.secfilt = NULL;
   catalog.measure = NULL;
-  RegionName = NULL;
-  RegionList = NULL;
   skylist = NULL;
+  selection = NULL;
   vec = NULL;
 
@@ -30,5 +29,5 @@
 
   /* command line arguments */
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
   if (!SetPhotSelections (&argc, argv, 2)) goto usage;
 
@@ -68,6 +67,6 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
-  if (!SetImageSelection (TRUE, ((RegionName == NULL) && (RegionList == NULL)))) goto escape;
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
+  if (!SetImageSelection (TRUE, selection)) goto escape;
 
   for (Nr = 0; Nr < skylist[0].Nregions; Nr++) {
@@ -86,4 +85,5 @@
     dvo_catalog_unlock (&catalog);
 
+    # if (0)
     /* extract values, assign to vectors */
     for (i = 0; i < catalog.Naverage; i++) {
@@ -119,5 +119,5 @@
       ConcatMeasures (vec[NT ], code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], N1, MEAS_EXPTIME); 
       ConcatMeasures (vec[NP ], code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], N1, MEAS_PHOTCODE); 
-      ConcatMeasures (vec[Nd1], code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], N1, MEAS_dMAG); 
+      // ConcatMeasures (vec[Nd1], code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], N1, MEAS_dMAG); 
       ConcatMeasures (vec[Nxc], code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], N1, MEAS_XCCD); 
       ConcatMeasures (vec[Nyc], code[0], mode[0], &catalog.average[i], &catalog.secfilt[i*Nsecfilt], &catalog.measure[m], N1, MEAS_YCCD); 
@@ -139,11 +139,13 @@
       if (M1 != NULL) free (M1);
     }
+    # endif
     dvo_catalog_free (&catalog);
   }
 
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
   for (i = 0; i < NVEC; i++) {
     vec[i][0].Nelements = N;
   }
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   FreeImageSelection ();
   return (TRUE);
@@ -154,6 +156,7 @@
 
 escape:
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   FreeImageSelection ();
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
   for (i = 0; i < NVEC; i++) {
     DeleteVector (vec[i]);
Index: /trunk/Ohana/src/opihi/dvo/ccd.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/ccd.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/ccd.c	(revision 14401)
@@ -3,5 +3,4 @@
 int ccd (int argc, char **argv) {
   
-  char *RegionName, *RegionList;
   double *M1, *M2;
   int i, m, k, Npts, NPTS, N;
@@ -12,4 +11,5 @@
   PhotCode *code[4];
   SkyList *skylist;
+  SkyRegionSelection *selection;
   Vector *xvec, *yvec;
 
@@ -18,7 +18,6 @@
   catalog.secfilt = NULL;
   catalog.measure = NULL;
-  RegionName = NULL;
-  RegionList = NULL;
   skylist = NULL;
+  selection = NULL;
 
   /* load photcode information */
@@ -27,5 +26,5 @@
 
   /* interpret command-line options */
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
   if (!SetPhotSelections (&argc, argv, 4)) goto usage;
 
@@ -48,5 +47,5 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
 
   /* init vectors to save data */
@@ -109,6 +108,8 @@
     dvo_catalog_free (&catalog);
   }
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+
   xvec[0].Nelements = yvec[0].Nelements = Npts;
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   return (TRUE);
 
@@ -118,8 +119,7 @@
 
 escape:
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   dvo_catalog_free (&catalog);
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
   return (FALSE);
 }
Index: /trunk/Ohana/src/opihi/dvo/cmd.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/cmd.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/cmd.c	(revision 14401)
@@ -3,5 +3,4 @@
 int cmd (int argc, char **argv) { /* really need to think about upper limits & how to represent them */
   
-  char *RegionName, *RegionList;
   double *M1, *M3;
   int i, j, m, i1, i3, N1, N3, N;
@@ -12,4 +11,5 @@
   Catalog catalog;
   SkyList *skylist;
+  SkyRegionSelection *selection;
   Vector *xvec, *yvec;
 
@@ -18,7 +18,6 @@
   catalog.secfilt = NULL;
   catalog.measure = NULL;
-  RegionName = NULL;
-  RegionList = NULL;
   skylist = NULL;
+  selection = NULL;
 
   /* load photcode information */
@@ -27,5 +26,5 @@
 
   /* interpret command-line options */
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
   if (!SetPhotSelections (&argc, argv, 3)) goto usage;
 
@@ -46,5 +45,5 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
 
   /* init vectors to save data */
@@ -107,6 +106,8 @@
     dvo_catalog_free (&catalog);
   }
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+
   xvec[0].Nelements = yvec[0].Nelements = Npts;
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   return (TRUE);
 
@@ -116,8 +117,7 @@
 
 escape:
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
   dvo_catalog_free (&catalog);
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   return (FALSE);
 }
Index: /trunk/Ohana/src/opihi/dvo/dbCmdlineFields.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbCmdlineFields.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dbCmdlineFields.c	(revision 14401)
@@ -70,2 +70,111 @@
   return (fields);
 }
+
+char *strfloat (float value) {
+
+  int Nbyte;
+  char *output;
+  char tmp;
+
+  Nbyte = snprintf (&tmp, 0, "%f", value);
+  ALLOCATE (output, char, Nbyte + 1);
+  snprintf (output, Nbyte + 1, "%f", value);
+  return output;
+}
+
+// identify the fields to be extracted (test for where, check syntax)
+int dbAstroRegionLimits (dbStack **stack, int *nstack, SkyRegionSelection *selection, int table) {
+  
+  int N;
+  double Rmin, Rmax, Dmin, Dmax;
+  char *Rname, *Dname;
+
+  if (!selection->useDisplay && !selection->useSkyregion) return (TRUE);
+
+  // get the ra,dec limits...
+  if (selection->useDisplay) {
+    return (TRUE);
+    // XXX fix this: be more careful with the projection & limits
+
+    Graphdata graphsky;
+    if (!GetGraphData (&graphsky, NULL, NULL)) {
+      gprint (GP_ERR, "region display not available\n");
+      return (FALSE);
+    }
+    
+    // XXX the ra and dec range depend on the projection. 
+    // XXX this is wrong...
+    int status;
+    status = XY_to_RD (&Rmin, &Dmin, graphsky.xmin, graphsky.ymin, &graphsky.coords);
+    status = XY_to_RD (&Rmax, &Dmax, graphsky.xmax, graphsky.ymax, &graphsky.coords);
+  }
+
+  if (selection->useSkyregion) {
+    get_skyregion (&Rmin, &Rmax, &Dmin, &Dmax);
+  }    
+
+  N = *nstack;
+  REALLOCATE (*stack, dbStack, N + 20);
+
+  if (table == DVO_TABLE_AVERAGE) {
+    Rname = strcreate ("RA");
+    Dname = strcreate ("DEC");
+  } else {
+    Rname = strcreate ("RA:AVE");
+    Dname = strcreate ("DEC:AVE");
+  }
+
+  // add: ((ra > rmin) && (ra < rmax) && (dec > dmin) && (dec < dmax))
+  // prepend with && if *nstack > 0
+
+  stack[0][N +  0].name = strcreate (Rname);
+  stack[0][N +  0].type = 'X';
+  stack[0][N +  1].name = strfloat (Rmin);
+  stack[0][N +  1].type = 'X';
+  stack[0][N +  2].name = strcreate (">");
+  stack[0][N +  2].type = 4;
+  // stack[0][N +  3].name = strcreate ("A");
+  // stack[0][N +  3].type = 3;
+
+  stack[0][N +  3].name = strcreate (Rname);
+  stack[0][N +  3].type = 'X';
+  stack[0][N +  4].name = strfloat (Rmax);
+  stack[0][N +  4].type = 'X';
+  stack[0][N +  5].name = strcreate ("<");
+  stack[0][N +  5].type = 4;
+  stack[0][N +  6].name = strcreate ("A");
+  stack[0][N +  6].type = 3;
+
+  stack[0][N +  7].name = strcreate (Dname);
+  stack[0][N +  7].type = 'X';
+  stack[0][N +  8].name = strfloat (Dmin);
+  stack[0][N +  8].type = 'X';
+  stack[0][N +  9].name = strcreate (">");
+  stack[0][N +  9].type = 4;
+  stack[0][N + 10].name = strcreate ("A");
+  stack[0][N + 10].type = 3;
+
+  stack[0][N + 11].name = strcreate (Dname);
+  stack[0][N + 11].type = 'X';
+  stack[0][N + 12].name = strfloat (Dmax);
+  stack[0][N + 12].type = 'X';
+  stack[0][N + 13].name = strcreate ("<");
+  stack[0][N + 13].type = 4;
+  stack[0][N + 14].name = strcreate ("A");
+  stack[0][N + 14].type = 3;
+
+  if (N == 0) {
+    N += 15;
+  } else {
+    stack[0][N + 15].name = strcreate ("A");
+    stack[0][N + 15].type = 3;
+    N += 16;
+  }    
+
+  free (Rname);
+  free (Dname);
+
+  *nstack = N;
+  return (TRUE);
+}
+
Index: /trunk/Ohana/src/opihi/dvo/dbExtractAverages.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbExtractAverages.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dbExtractAverages.c	(revision 14401)
@@ -4,5 +4,5 @@
 double dbExtractAverages (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {
 
-  int i;
+  int i, Nsec;
   double value;
 
@@ -78,4 +78,25 @@
 	  }
 	  break;
+	case MAG_CHISQ:
+	  // GetPhotcodeEquivCodebyCode (field->photcode)
+	  value = PhotXm (field->photcode, average, secfilt);
+	  break;
+	case MAG_ERR:
+	  // GetPhotcodeEquivCodebyCode (field->photcode)
+	  value = PhotdM (field->photcode, average, secfilt);
+	  break;
+	case MAG_NCODE:
+	  // XXX push these into dvo_photcode_ops APIs
+	  // XXX do I need to allow for conversion to equiv?
+	  Nsec = GetPhotcodeNsec (field->photcode->code);
+	  if (Nsec == -1) break;
+	  value = secfilt[Nsec].Ncode;
+	  break;
+	case MAG_NPHOT:
+	  Nsec = GetPhotcodeNsec (field->photcode->code);
+	  if (Nsec == -1) break;
+	  value = secfilt[Nsec].Nused;
+	  break;
+
       }
       break;
@@ -90,4 +111,5 @@
     case AVE_TYPEFRAC:
       break;
+      /*
     case AVE_NCODE:
       value = 0;
@@ -107,4 +129,5 @@
     case AVE_NCRIT:
       break;
+      */
   }
   return (value);
Index: /trunk/Ohana/src/opihi/dvo/dbExtractMeasures.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 14401)
@@ -12,5 +12,5 @@
 double dbExtractMeasures (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {
 
-  int i;
+  int i, Nsec;
   double value;
   double ra, dec, x, y;
@@ -27,5 +27,5 @@
       if ((field->photcode->type == PHOT_REF) && (measure[0].photcode == field->photcode->code)) goto valid_photcode;
       if ((field->photcode->type == PHOT_DEP) && (measure[0].photcode == field->photcode->code)) goto valid_photcode;
-      if ((field->photcode->type == PHOT_SEC) && (GetPhotcodeEquivbyCode (measure[0].photcode) == field->photcode->code)) goto valid_photcode;
+      if ((field->photcode->type == PHOT_SEC) && (GetPhotcodeEquivCodebyCode (measure[0].photcode) == field->photcode->code)) goto valid_photcode;
       break;
 
@@ -53,4 +53,20 @@
 	  value = PhotRef  (GetPhotcodeEquivbyCode (measure[0].photcode), average, secfilt, measure); 
 	  break;
+	case MAG_ERR:
+	  value = PhotdM  (GetPhotcodeEquivbyCode (measure[0].photcode), average, secfilt); 
+	  break;
+	case MAG_CHISQ:
+	  value = PhotXm  (GetPhotcodeEquivbyCode (measure[0].photcode), average, secfilt); 
+	  break;
+	case MAG_NCODE:
+	  Nsec = GetPhotcodeNsec (GetPhotcodeEquivCodebyCode (measure[0].photcode));
+	  if (Nsec == -1) break;
+	  value = secfilt[Nsec].Ncode;
+	  break;
+	case MAG_NPHOT:
+	  Nsec = GetPhotcodeNsec (GetPhotcodeEquivCodebyCode (measure[0].photcode));
+	  if (Nsec == -1) break;
+	  value = secfilt[Nsec].Nused;
+	  break;
       }
       break;
@@ -67,6 +83,64 @@
       value = average[0].D;
       break;
-    case MEAS_dMAG: /* OK */
-      value = measure[0].dM;
+    case MEAS_RA_AVE_ERR: /* OK */
+      value = average[0].dR;
+      break;
+    case MEAS_DEC_AVE_ERR: /* OK */
+      value = average[0].dD;
+      break;
+    case MEAS_U_RA: /* OK */
+      value = average[0].uR;
+      break;
+    case MEAS_U_DEC: /* OK */
+      value = average[0].uD;
+      break;
+    case MEAS_U_RA_ERR: /* OK */
+      value = average[0].duR;
+      break;
+    case MEAS_U_DEC_ERR: /* OK */
+      value = average[0].duD;
+      break;
+    case MEAS_PAR: /* OK */
+      value = average[0].R;
+      break;
+    case MEAS_PAR_ERR: /* OK */
+      value = average[0].D;
+      break;
+    case MEAS_XP: /* OK */
+      value = average[0].Xp;
+      break;
+    case MEAS_NMEAS: /* OK */
+      value = average[0].Nm;
+      break;
+    case MEAS_NMISS: /* OK */
+      value = average[0].Nn;
+      break;
+    case MEAS_NPHOT: /* OK */
+      Nsec = f(measure[0].photcode);
+      value = secfilt[Nsec].Nused;
+      break;
+    case MEAS_NCODE: /* OK */
+      Nsec = f(measure[0].photcode);
+      value = secfilt[Nsec].Ncode;
+      break;
+    case MEAS_OBJFLAGS: /* OK */
+      value = average[0].code;
+      break;
+//    case MEAS_dMAG: /* OK */
+//      value = measure[0].dM;
+//      break;
+    // note that these represent the ra displacement relative to the average, not 
+    // the error.
+    case MEAS_RA_OFFSET: /* OK */
+      value = measure[0].dR;
+      break;
+    case MEAS_DEC_OFFSET: /* OK */
+      value = measure[0].dD;
+      break;
+    case MEAS_RA_OFFSET_ERR: /* OK */
+      value = NO_MAG;
+      break;
+    case MEAS_DEC_OFFSET_ERR: /* OK */
+      value = NO_MAG;
       break;
     case MEAS_AIRMASS: /* OK */
@@ -82,18 +156,19 @@
       value = TimeValue (measure[0].t, TimeReference, TimeFormat);
       break;
-    // note that these represent the ra displacement relative to the average, not 
-    // the error.
-    case MEAS_dR: /* OK */
-      value = measure[0].dR;
-      break;
-    case MEAS_dD: /* OK */
-      value = measure[0].dD;
-      break;
     case MEAS_FWHM: /* OK */
+      value = 0.01*(measure[0].FWx + measure[0].FWy);
+      break;
+    case MEAS_FWHM_MAJ: /* OK */
       value = 0.01*measure[0].FWx;
       break;
-    case MEAS_DOPHOT: /* OK */
-      value = measure[0].dophot;
-      break;
+    case MEAS_FWHM_MIN: /* OK */
+      value = 0.01*measure[0].FWy;
+      break;
+    case MEAS_THETA: /* OK */
+      value = measure[0].theta;
+      break;
+//    case MEAS_DOPHOT: /* OK */
+//      value = measure[0].dophot;
+//      break;
     case MEAS_FLAGS: /* ? */
       value = measure[0].flags;
Index: /trunk/Ohana/src/opihi/dvo/dbFields.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 14401)
@@ -38,4 +38,6 @@
   if (!strcasecmp (string, "err"))   return (MAG_ERR);
   if (!strcasecmp (string, "chisq")) return (MAG_CHISQ);
+  if (!strcasecmp (string, "ncode")) return (MAG_NCODE);
+  if (!strcasecmp (string, "nphot")) return (MAG_NPHOT);
   return (MAG_NONE);
 }
@@ -101,21 +103,52 @@
   field->name  = strcreate (fieldName);
 
-  if (!strcasecmp (fieldName, "RA"))       ESCAPE (MEAS_RA,   	  MAG_NONE);
-  if (!strcasecmp (fieldName, "DEC"))      ESCAPE (MEAS_DEC,  	  MAG_NONE);
-  if (!strcasecmp (fieldName, "RA:AVE"))   ESCAPE (MEAS_RA_AVE,   MAG_NONE);
-  if (!strcasecmp (fieldName, "DEC:AVE"))  ESCAPE (MEAS_DEC_AVE,  MAG_NONE);
-  if (!strcasecmp (fieldName, "AIRMASS"))  ESCAPE (MEAS_AIRMASS,  MAG_NONE);
-  if (!strcasecmp (fieldName, "EXPTIME"))  ESCAPE (MEAS_EXPTIME,  MAG_NONE);
-  if (!strcasecmp (fieldName, "PHOTCODE")) ESCAPE (MEAS_PHOTCODE, MAG_NONE);
-  if (!strcasecmp (fieldName, "TIME"))     ESCAPE (MEAS_TIME,     MAG_NONE);
-  if (!strcasecmp (fieldName, "dR"))       ESCAPE (MEAS_dR, 	  MAG_NONE);
-  if (!strcasecmp (fieldName, "dD"))       ESCAPE (MEAS_dD, 	  MAG_NONE);
-  if (!strcasecmp (fieldName, "FWHM"))     ESCAPE (MEAS_FWHM,     MAG_NONE);
-  if (!strcasecmp (fieldName, "DOPHOT"))   ESCAPE (MEAS_DOPHOT,   MAG_NONE);
-  if (!strcasecmp (fieldName, "FLAGS"))    ESCAPE (MEAS_FLAGS,    MAG_NONE);
-  if (!strcasecmp (fieldName, "XCCD"))     ESCAPE (MEAS_XCCD, 	  MAG_NONE);
-  if (!strcasecmp (fieldName, "YCCD"))     ESCAPE (MEAS_YCCD, 	  MAG_NONE);
-  if (!strcasecmp (fieldName, "XMOSAIC"))  ESCAPE (MEAS_XMOSAIC,  MAG_NONE);
-  if (!strcasecmp (fieldName, "YMOSAIC"))  ESCAPE (MEAS_YMOSAIC,  MAG_NONE);
+  if (!strcasecmp (fieldName, "RA"))       ESCAPE (MEAS_RA,   	     	MAG_NONE);
+  if (!strcasecmp (fieldName, "DEC"))      ESCAPE (MEAS_DEC,  	     	MAG_NONE);
+  if (!strcasecmp (fieldName, "RA:AVE"))   ESCAPE (MEAS_RA_AVE,      	MAG_NONE);
+  if (!strcasecmp (fieldName, "DEC:AVE"))  ESCAPE (MEAS_DEC_AVE,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "RA:ERR"))   ESCAPE (MEAS_RA_AVE_ERR,  	MAG_NONE);
+  if (!strcasecmp (fieldName, "DEC:ERR"))  ESCAPE (MEAS_DEC_AVE_ERR, 	MAG_NONE);
+  if (!strcasecmp (fieldName, "uRA"))      ESCAPE (MEAS_U_RA,        	MAG_NONE);
+  if (!strcasecmp (fieldName, "uDEC"))     ESCAPE (MEAS_U_DEC,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "duRA"))     ESCAPE (MEAS_U_RA_ERR,    	MAG_NONE);
+  if (!strcasecmp (fieldName, "duDEC"))    ESCAPE (MEAS_U_DEC_ERR,   	MAG_NONE);
+  if (!strcasecmp (fieldName, "PAR"))      ESCAPE (MEAS_PAR,         	MAG_NONE);
+  if (!strcasecmp (fieldName, "dPAR"))     ESCAPE (MEAS_PAR_ERR,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "dR"))       ESCAPE (MEAS_RA_OFFSET,   	MAG_NONE);
+  if (!strcasecmp (fieldName, "dD"))       ESCAPE (MEAS_DEC_OFFSET,  	MAG_NONE);
+  if (!strcasecmp (fieldName, "dR:ERR"))   ESCAPE (MEAS_RA_OFFSET_ERR,  MAG_NONE);
+  if (!strcasecmp (fieldName, "dD:ERR"))   ESCAPE (MEAS_DEC_OFFSET_ERR, MAG_NONE);
+  if (!strcasecmp (fieldName, "xp"))       ESCAPE (MEAS_XP,          	MAG_NONE);
+  if (!strcasecmp (fieldName, "nmeas"))    ESCAPE (MEAS_NMEAS,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "nmiss"))    ESCAPE (MEAS_NMISS,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "nphot"))    ESCAPE (MEAS_NPHOT,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "ncode"))    ESCAPE (MEAS_NCODE,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "objflags")) ESCAPE (MEAS_OBJFLAGS,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "AIRMASS"))  ESCAPE (MEAS_AIRMASS,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "ALT"))      ESCAPE (MEAS_ALT,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "AZ"))       ESCAPE (MEAS_AZ,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "EXPTIME"))  ESCAPE (MEAS_EXPTIME,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "PHOTCODE")) ESCAPE (MEAS_PHOTCODE,    	MAG_NONE);
+  if (!strcasecmp (fieldName, "TIME"))     ESCAPE (MEAS_TIME,        	MAG_NONE);
+  if (!strcasecmp (fieldName, "FWHM"))     ESCAPE (MEAS_FWHM,        	MAG_NONE);
+  if (!strcasecmp (fieldName, "FWHM_MAJ")) ESCAPE (MEAS_FWHM_MAJ,    	MAG_NONE);
+  if (!strcasecmp (fieldName, "FWHM_MIN")) ESCAPE (MEAS_FWHM_MIN,    	MAG_NONE);
+  if (!strcasecmp (fieldName, "THETA"))    ESCAPE (MEAS_THETA,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "FLAGS"))    ESCAPE (MEAS_FLAGS,       	MAG_NONE);
+  if (!strcasecmp (fieldName, "XCCD"))     ESCAPE (MEAS_XCCD, 	     	MAG_NONE);
+  if (!strcasecmp (fieldName, "YCCD"))     ESCAPE (MEAS_YCCD, 	     	MAG_NONE);
+  if (!strcasecmp (fieldName, "XMOSAIC"))  ESCAPE (MEAS_XMOSAIC,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "YMOSAIC"))  ESCAPE (MEAS_YMOSAIC,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "XCHIP"))    ESCAPE (MEAS_XCCD, 	     	MAG_NONE);
+  if (!strcasecmp (fieldName, "YCHIP"))    ESCAPE (MEAS_YCCD, 	     	MAG_NONE);
+  if (!strcasecmp (fieldName, "XFPA"))     ESCAPE (MEAS_XMOSAIC,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "YFPA"))     ESCAPE (MEAS_YMOSAIC,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "DETID"))    ESCAPE (MEAS_DETID,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "OBJID"))    ESCAPE (MEAS_OBJID,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "IMAGEID"))  ESCAPE (MEAS_IMAGEID,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "stargal"))  ESCAPE (MEAS_IMAGEID,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "psfqf"))    ESCAPE (MEAS_IMAGEID,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "sky"))      ESCAPE (MEAS_IMAGEID,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "sky_err"))  ESCAPE (MEAS_IMAGEID,     	MAG_NONE);
 
   // for words that don't parse, try a photcode
@@ -125,10 +158,5 @@
   if (code == NULL) return (FALSE);
 
-  if (mode == MAG_ERR) {
-    field->ID = MEAS_dMAG;
-  } else {
-    field->ID = MEAS_MAG;
-  }    
-  
+  field->ID = MEAS_MAG;
   field->magMode = mode;
   field->photcode = code;
@@ -154,13 +182,10 @@
   if (!strcasecmp (fieldName, "PAR"))   ESCAPE (AVE_PAR,       MAG_NONE);
   if (!strcasecmp (fieldName, "dPAR"))  ESCAPE (AVE_PAR_ERR,   MAG_NONE);
+  if (!strcasecmp (fieldName, "Xp"))    ESCAPE (AVE_Xp,        MAG_NONE);
   if (!strcasecmp (fieldName, "NMEAS")) ESCAPE (AVE_NMEAS,     MAG_NONE);
   if (!strcasecmp (fieldName, "NMISS")) ESCAPE (AVE_NMISS,     MAG_NONE);
-  if (!strcasecmp (fieldName, "Xp"))    ESCAPE (AVE_Xp,        MAG_NONE);
-  if (!strcasecmp (fieldName, "Xm"))    ESCAPE (AVE_Xm,        MAG_CHISQ);
   if (!strcasecmp (fieldName, "FLAG"))  ESCAPE (AVE_FLAG,      MAG_NONE);
   if (!strcasecmp (fieldName, "TYPE"))  ESCAPE (AVE_TYPE,      MAG_NONE);
-  if (!strcasecmp (fieldName, "NPHOT")) ESCAPE (AVE_NPHOT,     MAG_NONE);
-  if (!strcasecmp (fieldName, "NCODE")) ESCAPE (AVE_NCODE,     MAG_NONE);
-  if (!strcasecmp (fieldName, "NCRIT")) ESCAPE (AVE_NCRIT,     MAG_NONE);
+  if (!strcasecmp (fieldName, "OBJID")) ESCAPE (AVE_OBJID,     MAG_NONE);
 
   // for words that don't parse, try a photcode
@@ -175,11 +200,5 @@
   }
 
-  // need to distinguish phot, sys errors and scatter
-  if (mode == MAG_ERR) {
-    field->ID = AVE_dMAG;
-  } else {
-    field->ID = AVE_MAG;
-  }    
-  
+  field->ID = AVE_MAG;
   field->magMode = mode;
   field->photcode = code;
Index: /trunk/Ohana/src/opihi/dvo/ddmags.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/ddmags.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/ddmags.c	(revision 14401)
@@ -3,4 +3,10 @@
 int ddmags (int argc, char **argv) {
   
+  gprint (GP_ERR, "this function is deprecated\n");
+  return (FALSE);
+
+} 
+
+# if (0) 
   char *RegionName, *RegionList;
   double *M1, *M2;
@@ -113,5 +119,5 @@
     dvo_catalog_free (&catalog);
   }
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   xvec[0].Nelements = yvec[0].Nelements = Npts;
   return (TRUE);
@@ -121,5 +127,5 @@
 
 escape:
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   dvo_catalog_free (&catalog);
   if (RegionName != NULL) free (RegionName);
@@ -128,2 +134,3 @@
 }
 
+# endif
Index: /trunk/Ohana/src/opihi/dvo/dmagaves.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dmagaves.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dmagaves.c	(revision 14401)
@@ -3,4 +3,10 @@
 int dmagaves (int argc, char **argv) {
   
+  gprint (GP_ERR, "this function is deprecated\n");
+  return (FALSE);
+
+} 
+
+# if (0) 
   char *RegionName, *RegionList;
   double *M1, M2;
@@ -89,5 +95,5 @@
     dvo_catalog_free (&catalog);
   }
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   xvec[0].Nelements = yvec[0].Nelements = Npts;
   return (TRUE);
@@ -98,5 +104,5 @@
 
 escape:
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   dvo_catalog_free (&catalog);
   if (RegionName != NULL) free (RegionName);
@@ -104,2 +110,4 @@
   return (FALSE);
 }
+
+# endif
Index: /trunk/Ohana/src/opihi/dvo/dmagmeas.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dmagmeas.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dmagmeas.c	(revision 14401)
@@ -3,4 +3,10 @@
 int dmagmeas (int argc, char **argv) {
   
+  gprint (GP_ERR, "this function is deprecated\n");
+  return (FALSE);
+
+} 
+
+# if (0) 
   char *RegionName, *RegionList;
   double *M1, *M3;
@@ -110,5 +116,5 @@
   }
   FreeImageSelection ();
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   xvec[0].Nelements = yvec[0].Nelements = Npts;
   return (TRUE);
@@ -120,5 +126,5 @@
 escape:
   FreeImageSelection ();
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   dvo_catalog_free (&catalog);
   if (RegionName != NULL) free (RegionName);
@@ -127,2 +133,3 @@
 }
 
+# endif
Index: /trunk/Ohana/src/opihi/dvo/dmags.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dmags.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dmags.c	(revision 14401)
@@ -3,4 +3,10 @@
 int dmags (int argc, char **argv) {
   
+  gprint (GP_ERR, "this function is deprecated\n");
+  return (FALSE);
+
+} 
+
+# if (0) 
   char *RegionName, *RegionList;
   double *M1, *M3;
@@ -109,5 +115,5 @@
 
   /* need to free SkyList / or free all regions as well */
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   xvec[0].Nelements = yvec[0].Nelements = Npts;
   return (TRUE);
@@ -122,5 +128,5 @@
 
 escape:
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
   dvo_catalog_free (&catalog);
   if (RegionName != NULL) free (RegionName);
@@ -128,2 +134,3 @@
   return (FALSE);
 }
+# endif
Index: /trunk/Ohana/src/opihi/dvo/dvo.c.in
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dvo.c.in	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/dvo.c.in	(revision 14401)
@@ -18,7 +18,8 @@
   InitDVO ();
 
-  if (!SetCATDIR (NULL, FALSE)) {
-    gprint (GP_ERR, "CATDIR is not defined\n");
-  }
+  // XXX don't open the catdir until needed
+  // if (!SetCATDIR (NULL, FALSE)) {
+  //  gprint (GP_ERR, "CATDIR is not defined\n");
+  // }
 
   rl_readline_name = opihi_name;
Index: /trunk/Ohana/src/opihi/dvo/fitcolors.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/fitcolors.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/fitcolors.c	(revision 14401)
@@ -14,5 +14,4 @@
   int Nsecfilt, status;
   void *oldsignal;
-  char *RegionName, *RegionList;
   char *cmd, *outcmd, *camera;
   char name[64], filename[64], plotname[64], label[64];
@@ -27,4 +26,5 @@
   PhotCode **codelist, *tcode, *code[4];
   SkyList *skylist;
+  SkyRegionSelection *selection;
   Vector *xvec, *yvec;
   Buffer *buf;
@@ -33,4 +33,5 @@
   catalog  = NULL;
   skylist  = NULL;
+  selection = NULL;
   codelist = NULL;
   xvec = yvec = NULL;
@@ -46,5 +47,5 @@
 
   /* interpret command-line options */
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
   if (!SetPhotSelections (&argc, argv, 4)) goto usage;
 
@@ -152,5 +153,5 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
 
   /* loop over regions, extract data for each region */
@@ -345,7 +346,6 @@
   }
   if (skylist != NULL) free_catalog (catalog, skylist[0].Nregions);
-  if (skylist != NULL) SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   if (codelist != NULL) free (codelist);
   if (colorFit != NULL) free (colorFit);
@@ -368,7 +368,6 @@
 escape:
   if (skylist != NULL) free_catalog (catalog, skylist[0].Nregions);
-  if (skylist != NULL) SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   if (codelist != NULL) free (codelist);
   if (colorFit != NULL) free (colorFit);
Index: /trunk/Ohana/src/opihi/dvo/fitsed.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/fitsed.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/fitsed.c	(revision 14401)
@@ -27,5 +27,4 @@
   int Nsecfilt, status;
   void *oldsignal;
-  char *RegionName, *RegionList;
   char name[64], line[1024], key[20];
   float *fitmags, *fiterrs, *wavecode, *vegaToAB;
@@ -43,4 +42,6 @@
   Catalog catalog, outcat;
   SkyList *skylist;
+  SkyRegionSelection *selection;
+
   SEDtableRow *SEDtableRaw, **SEDtable;
   SEDtableRow sourceValue, sourceError;
@@ -49,4 +50,6 @@
   /* defaults */
   skylist  = NULL;
+  selection = NULL;
+
   catalog.average = NULL;
   catalog.measure = NULL;
@@ -63,6 +66,4 @@
   wavecode = NULL;
   hashcode = NULL;
-  RegionName = NULL;
-  RegionList = NULL;
   magSection.name = NULL;
   resSection.name = NULL;
@@ -81,5 +82,5 @@
 
   /* interpret command-line options */
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
   if (!SetPhotSelections (&argc, argv, 4)) goto usage;
 
@@ -179,5 +180,5 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
 
   /* loop over regions, extract data for each region */
@@ -361,7 +362,6 @@
 
 finish:
-  if (skylist != NULL) SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   if (wavecode != NULL) free (wavecode);
   if (hashcode != NULL) free (hashcode);
Index: /trunk/Ohana/src/opihi/dvo/gcat.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/gcat.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/gcat.c	(revision 14401)
@@ -35,4 +35,4 @@
 
   return (TRUE);
-  SkyListFree (skylist, FALSE);
+  SkyListFree (skylist);
 }
Index: /trunk/Ohana/src/opihi/dvo/gimages.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/gimages.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/gimages.c	(revision 14401)
@@ -10,4 +10,5 @@
   char name[64], *date;
   int typehash;
+  SkyRegionSelection *selection;
 
   PhotCode *code;
@@ -17,4 +18,10 @@
 
   GetTimeFormat (&TimeReference, &TimeFormat);
+
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) {
+    gprint (GP_ERR, "invalid sky region selection\n");
+    return FALSE;
+  }
 
   TimeSelect = FALSE;
@@ -74,5 +81,5 @@
 
   if ((image = LoadImages (&Nimage)) == NULL) return (FALSE);
-  image_subset (image, Nimage, &subset, &Nsubset, (Graphdata *) NULL, FALSE, tzero, trange, TimeSelect);
+  image_subset (image, Nimage, &subset, &Nsubset, selection, tzero, trange, TimeSelect);
   BuildChipMatch (image, Nimage);
 
Index: /trunk/Ohana/src/opihi/dvo/imdata.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imdata.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/imdata.c	(revision 14401)
@@ -14,4 +14,11 @@
   SkyList *skylist, *skyset;
   Vector *vec;
+  SkyRegionSelection *selection;
+
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) {
+    gprint (GP_ERR, "invalid sky region selection\n");
+    return FALSE;
+  }
 
   start = stop = 0;
@@ -78,5 +85,5 @@
 
   if ((image = LoadImages (&Nimage)) == NULL) return (FALSE);
-  image_subset (image, Nimage, &subset, &Nsubset, (Graphdata *) NULL, FALSE, tzero, trange, TimeSelect);
+  image_subset (image, Nimage, &subset, &Nsubset, selection, tzero, trange, TimeSelect);
   BuildChipMatch (image, Nimage);
   GetTimeFormat (&TimeReference, &TimeFormat);
@@ -89,4 +96,5 @@
   ALLOCATE (skylist, SkyList, 1);
   ALLOCATE (skylist[0].regions, SkyRegion *, NREGIONS);
+  skylist[0].ownElements = FALSE;
 
   /* for each image of interest, find the appropriate region files */
@@ -107,5 +115,5 @@
       CHECK_REALLOCATE (skylist[0].regions, SkyRegion *, NREGIONS, Nregions, 10);
     }
-    SkyListFree (skyset, FALSE);
+    SkyListFree (skyset);
   }	
   free (subset);
Index: /trunk/Ohana/src/opihi/dvo/imextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/imextract.c	(revision 14401)
@@ -9,12 +9,17 @@
   double x, y, ra, dec, t, trange;
   time_t tzero, TimeReference;
+  SkyRegionSelection *selection;
 
   PhotCode *code;
-  Graphdata graphsky;
   Image *image;
   Vector *vec;
 
-  if (!GetGraphData (&graphsky, NULL, NULL)) return (FALSE);
   if (!InitPhotcodes ()) return (FALSE);
+
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) {
+    gprint (GP_ERR, "invalid sky region selection\n");
+    return FALSE;
+  }
 
   /* check for time-based selection */
@@ -33,11 +38,4 @@
     remove_argument (N, &argc, argv);
     TimeSelect = TRUE;
-  }
-
-  /* check for region-based selection */
-  RegionSelect = FALSE;
-  if ((N = get_argument (argc, argv, "-region"))) {
-    remove_argument (N, &argc, argv);
-    RegionSelect = TRUE;
   }
 
@@ -104,5 +102,5 @@
 
   if ((image = LoadImages (&Nimage)) == NULL) return (FALSE);
-  image_subset (image, Nimage, &subset, &Nsubset, &graphsky, RegionSelect, tzero, trange, TimeSelect);
+  image_subset (image, Nimage, &subset, &Nsubset, selection, tzero, trange, TimeSelect);
   if ((mode == RA) || (mode == DEC)) BuildChipMatch (image, Nimage);
 
Index: /trunk/Ohana/src/opihi/dvo/imlist.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imlist.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/imlist.c	(revision 14401)
@@ -9,8 +9,12 @@
   char *name;
   Image *image;
-  Graphdata graphmode;
   PhotCode *PhotcodeValue;
+  SkyRegionSelection *selection;
 
-  if (!GetGraphData (&graphmode, NULL, NULL)) return (FALSE);
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) {
+    gprint (GP_ERR, "invalid sky region selection\n");
+    return FALSE;
+  }
 
   TimeSelect = FALSE;
@@ -65,5 +69,5 @@
   
   if ((image = LoadImages (&Nimage)) == NULL) return (FALSE);
-  image_subset (image, Nimage, &subset, &Nsubset, &graphmode, RegionSelect, tzero, trange, TimeSelect);
+  image_subset (image, Nimage, &subset, &Nsubset, selection, tzero, trange, TimeSelect);
   BuildChipMatch (image, Nimage);
 
Index: /trunk/Ohana/src/opihi/dvo/imphot.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imphot.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/imphot.c	(revision 14401)
@@ -12,4 +12,5 @@
   Image *image;
   Buffer *buf;
+  SkyRegionSelection *selection;
 
   GreyScale = FALSE;
@@ -19,4 +20,10 @@
     remove_argument (N, &argc, argv);
     GreyScale = TRUE;
+  }
+
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) {
+    gprint (GP_ERR, "invalid sky region selection\n");
+    return FALSE;
   }
 
@@ -44,5 +51,5 @@
   
   if ((image = LoadImages (&Nimage)) == NULL) return (FALSE);
-  image_subset (image, Nimage, &subset, &Nsubset, (Graphdata *) NULL, FALSE, tzero, trange, TRUE);
+  image_subset (image, Nimage, &subset, &Nsubset, selection, tzero, trange, TRUE);
 
   if ((Nsubset > 1) && GreyScale) {
Index: /trunk/Ohana/src/opihi/dvo/init.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/init.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/init.c	(revision 14401)
@@ -48,14 +48,8 @@
 int skycat	    PROTO((int, char **));
 int skycoverage	    PROTO((int, char **));
+int skyregion	    PROTO((int, char **));
 int simage	    PROTO((int, char **));
 int subpix	    PROTO((int, char **));
 int version         PROTO((int, char **));
-
-/* temporarily exclude
-int addxtra	    PROTO((int, char **));
-  {"addxtra",     addxtra,      "add extra data to object"},
-  {"getxtra",     getxtra,      "get extra data from object"},
-  {"catalog",     catlog,       "plot catalog stars"},
-*/
 
 static Command cmds[] = {  
@@ -104,7 +98,10 @@
   {"skycat",      skycat,       "show sky catalog boundaries"},
   {"skycoverage", skycoverage,  "measure image union on sky"},
+  {"skyregion",   skyregion,    "set sky region for db queries"},
   {"simage",      simage,       "plot stars in an image"},
   {"subpix",      subpix,       "get subpixel positions"},
   {"version",     version,      "show version information"},
+//{"addxtra",     addxtra,      "add extra data to object"},
+//{"getxtra",     getxtra,      "get extra data from object"},
 }; 
 
Index: /trunk/Ohana/src/opihi/dvo/lcat.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/lcat.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/lcat.c	(revision 14401)
@@ -41,5 +41,5 @@
   }
 
-  SkyListFree (skylist, FALSE);
+  SkyListFree (skylist);
   return (TRUE);
 }
Index: /trunk/Ohana/src/opihi/dvo/lcurve.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/lcurve.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/lcurve.c	(revision 14401)
@@ -188,5 +188,5 @@
   dvo_catalog_free (&catalog);
 
-  SkyListFree (skylist, FALSE);
+  SkyListFree (skylist);
   return (TRUE);
 }
Index: /trunk/Ohana/src/opihi/dvo/lightcurve.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/lightcurve.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/lightcurve.c	(revision 14401)
@@ -141,5 +141,5 @@
   free (N1);
   dvo_catalog_free (&catalog);
-  SkyListFree (skylist, FALSE);
+  SkyListFree (skylist);
   return (TRUE);
 }
Index: /trunk/Ohana/src/opihi/dvo/mextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/mextract.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/mextract.c	(revision 14401)
@@ -5,5 +5,5 @@
   int i, j, k, m, n, N, N1, Npts, NPTS, last, Nfields, Nreturn, Ncstack, Nstack;
   int Nsecfilt, VERBOSE, loadImages, mosaicMode;
-  char *RegionName, *RegionList, *p;
+  char *p;
   double *M1;
   char **cstack, name[1024];
@@ -17,9 +17,8 @@
   dbField *fields;
   dbStack *stack;
+  SkyRegionSelection *selection;
 
   /* defaults */
   skylist = NULL;
-  RegionName = NULL;
-  RegionList = NULL;
   code = NULL;
   fields = NULL;
@@ -41,7 +40,6 @@
   dbExtractMeasuresInit();
 
-  // remove skyregion options
-  // XXX this needs to explicitly handle -qregion and -skyregion
-  if (!SetRegionSelection (&argc, argv, &RegionName, &RegionList)) goto escape;
+  // parse skyregion options
+  if ((selection = SetRegionSelection (&argc, argv)) == NULL) goto escape;
 
   // command-line is of the form: avextract field,field, field [where (field op value)...]
@@ -50,4 +48,6 @@
   fields = dbCmdlineFields (argc, argv, DVO_TABLE_MEASURE, &last, &Nfields);
   if (fields == NULL) return (FALSE);
+
+  // XXX add the skyregion limits as if it were a where statement
 
   // parse the remainder of the line as a boolean math expression
@@ -61,4 +61,8 @@
   }
 
+  // add the skyregion limits to the where statement (or create)
+  dbAstroRegionLimits (&stack, &Nstack, selection, DVO_TABLE_MEASURE);
+
+  // parse stack elements into fields and scalars as needed
   Nreturn = Nfields; 
   dbCheckStack (stack, Nstack, DVO_TABLE_MEASURE, &fields, &Nfields);
@@ -66,7 +70,7 @@
 
   /* load region corresponding to selection above */
-  if ((skylist = SelectRegions (RegionName, RegionList)) == NULL) goto escape;
-
-  // XXX is this still needed?
+  if ((skylist = SelectRegions (selection)) == NULL) goto escape;
+
+  // load image data if needed (for fields listed below)
   loadImages = FALSE;
   mosaicMode = FALSE;
@@ -77,5 +81,5 @@
     if (fields[i].ID == MEAS_YMOSAIC) loadImages = mosaicMode = TRUE;
   }
-  if (loadImages && !SetImageSelection (mosaicMode, ((RegionName == NULL) && (RegionList == NULL)))) goto escape;
+  if (loadImages && !SetImageSelection (mosaicMode, selection)) goto escape;
 
   /* create storage vector */
@@ -148,12 +152,10 @@
     REALLOCATE (vec[n][0].elements, float, MAX(1,Npts));
   }
+
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
-
   FreeImageSelection ();
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
-
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   return (TRUE);
 
@@ -167,8 +169,63 @@
   dbFreeStack (stack, Nstack);
   FreeImageSelection ();
-  SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+  SkyListFree (skylist);
+  FreeSkyRegionSelection (selection);
   dvo_catalog_free (&catalog);
-  if (RegionName != NULL) free (RegionName);
-  if (RegionList != NULL) free (RegionList);
+  return (FALSE);
+
+ help:
+  gprint (GP_ERR, "USAGE: mextract field[,field,field...] where (expression)\n");
+
+  if ((argc > N + 1) && !strcasecmp (argv[N+1], "fields")) {
+    gprint (GP_ERR, " USAGE: avextract field[,field,field...] where (expression)\n");
+    gprint (GP_ERR, "  RA : right ascension (J2000) for detection\n");
+    gprint (GP_ERR, "  DEC : declination for detection\n");
+    gprint (GP_ERR, "  RA:ave : average right ascension (J2000) for object\n");
+    gprint (GP_ERR, "  DEC:ave : average declination for object\n");
+    gprint (GP_ERR, "  RA:err : ra scatter \n");
+    gprint (GP_ERR, "  DEC:err : dec scatter\n");
+    gprint (GP_ERR, "  uRA : proper motion in ra\n");
+    gprint (GP_ERR, "  uDEC : proper motion in dec\n");
+    gprint (GP_ERR, "  duRA : proper motion error in ra\n");
+    gprint (GP_ERR, "  duDEC : proper motion error in dec\n");
+    gprint (GP_ERR, "  PAR : parallax\n");
+    gprint (GP_ERR, "  dPAR : parallax error \n");
+    gprint (GP_ERR, "  nmeas : number of measurements\n");
+    gprint (GP_ERR, "  nmiss : number of non-detections\n");
+    gprint (GP_ERR, "  xp : positional chi-square\n");
+    gprint (GP_ERR, "  objflag : object flags\n");
+    gprint (GP_ERR, "  photcode:ave : average magnitude for photcode (or equivalent)\n");
+    gprint (GP_ERR, "  photcode:ref : reference magnitude system for photcode (or equivalent)\n");
+    gprint (GP_ERR, "  photcode:inst : instrumental magnitude for photcode\n");
+    gprint (GP_ERR, "  photcode:cat :  catalog magnitude for photcode\n");
+    gprint (GP_ERR, "  photcode:sys :  system magnitude for photcode\n");
+    gprint (GP_ERR, "  photcode:rel :  relative magnitude for photcode\n");
+    gprint (GP_ERR, "  photcode:cal :  calibrated magnitude for photcode \n");
+    gprint (GP_ERR, "  photcode:err : magnitude error for photcode\n");
+    gprint (GP_ERR, "  photcode:chisq : chi-square of magnitude fit\n");
+    gprint (GP_ERR, "  photcode:ncode : number of measurements in photcode\n");
+    gprint (GP_ERR, "  photcode:nphot : number of measurements used for average magnitude\n");
+    gprint (GP_ERR, "  airmass : airmass of detection\n");
+    gprint (GP_ERR, "  exptime : exposure time\n");
+    gprint (GP_ERR, "  photcode : photcode \n");
+    gprint (GP_ERR, "  time : time of exposure\n");
+    gprint (GP_ERR, "  dR : ra offset\n");
+    gprint (GP_ERR, "  dD : dec offset\n");
+    gprint (GP_ERR, "  fwhm : fwhm (average)\n");
+    gprint (GP_ERR, "  fwhm_maj : fwhm (major axis)\n");
+    gprint (GP_ERR, "  fwhm_min : fwhm (minor axis)\n");
+    gprint (GP_ERR, "  theta : position angle\n");
+    gprint (GP_ERR, "  flags : detection flags\n");
+    gprint (GP_ERR, "  xccd : ccd x position\n");
+    gprint (GP_ERR, "  yccd : ccd y position\n");
+    gprint (GP_ERR, "  xmosaic : mosaic x position\n");
+    gprint (GP_ERR, "  ymosaic : mosaic y position\n");
+    gprint (GP_ERR, "  xchip : chip x position\n");
+    gprint (GP_ERR, "  ychip : chip y position\n");
+    gprint (GP_ERR, "  xfpa : fpa x position\n");
+    gprint (GP_ERR, "  yfpa : fpa y position\n");
+    return (FALSE);
+  }
+  gprint (GP_ERR, " mextract --help fields : for a complete listing of allowed fields\n");
   return (FALSE);
 }
Index: /trunk/Ohana/src/opihi/dvo/photometry.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/photometry.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/photometry.c	(revision 14401)
@@ -174,22 +174,4 @@
 }
 
-// XXX moved to dbFields
-# if (0)
-int GetMagMode (char *string) {
-
-  int mode;
-
-  mode = MAG_NONE;
-  if (!strcasecmp (string, "inst"))   mode = MAG_INST;
-  if (!strcasecmp (string, "cat"))    mode = MAG_CAT;
-  if (!strcasecmp (string, "sys"))    mode = MAG_SYS;
-  if (!strcasecmp (string, "rel"))    mode = MAG_REL;
-  if (!strcasecmp (string, "cal"))    mode = MAG_CAL;
-  if (!strcasecmp (string, "ave"))    mode = MAG_AVE;
-  if (!strcasecmp (string, "ref"))    mode = MAG_REF;
-  return (mode);
-}
-# endif
-
 int GetMeasureParam (char *parname) {
 
@@ -200,13 +182,13 @@
   if (!strcasecmp (parname, "dec"))  	 param = MEAS_DEC;
   if (!strcasecmp (parname, "mag")) 	 param = MEAS_MAG;
-  if (!strcasecmp (parname, "dmag")) 	 param = MEAS_dMAG;
+  // if (!strcasecmp (parname, "dmag")) 	 param = MEAS_dMAG;
   if (!strcasecmp (parname, "airmass"))  param = MEAS_AIRMASS;
   if (!strcasecmp (parname, "exptime"))  param = MEAS_EXPTIME;
   if (!strcasecmp (parname, "photcode")) param = MEAS_PHOTCODE;
   if (!strcasecmp (parname, "time"))     param = MEAS_TIME;
-  if (!strcasecmp (parname, "dR")) 	 param = MEAS_dR;
-  if (!strcasecmp (parname, "dD")) 	 param = MEAS_dD;
+  if (!strcasecmp (parname, "dR")) 	 param = MEAS_RA_OFFSET;
+  if (!strcasecmp (parname, "dD")) 	 param = MEAS_DEC_OFFSET;
   if (!strcasecmp (parname, "fwhm"))   	 param = MEAS_FWHM;
-  if (!strcasecmp (parname, "dophot")) 	 param = MEAS_DOPHOT;
+  // if (!strcasecmp (parname, "dophot")) 	 param = MEAS_DOPHOT;
   if (!strcasecmp (parname, "FLAGS"))    param = MEAS_FLAGS;
   if (!strcasecmp (parname, "XCCD"))   	 param = MEAS_XCCD;
@@ -259,5 +241,5 @@
   if (!strcasecmp (parname, "Nphot")) param = AVE_NPHOT;
   if (!strcasecmp (parname, "Ncode")) param = AVE_NCODE;
-  if (!strcasecmp (parname, "Ncrit")) param = AVE_NCRIT;
+  // if (!strcasecmp (parname, "Ncrit")) param = AVE_NCRIT;
   return (param);
 }
@@ -710,4 +692,5 @@
       }
       break;
+# if (0)
     case AVE_NCRIT:
       value = 0;
@@ -721,4 +704,5 @@
       }
       break;
+# endif
   }
   return (value);
@@ -1155,7 +1139,12 @@
       value = average[0].D - measure[0].dD / 3600.0;
       break;
+# if (0)
     case MEAS_dMAG: /* OK */
       value = measure[0].dM;
       break;
+    case MEAS_DOPHOT: /* OK */
+      value = measure[0].dophot;
+      break;
+# endif
     case MEAS_AIRMASS: /* OK */
       value = measure[0].airmass;
@@ -1170,15 +1159,12 @@
       value = TimeValue (measure[0].t, TimeReference, TimeFormat);
       break;
-    case MEAS_dR: /* OK */
+    case MEAS_RA_OFFSET: /* OK */
       value = measure[0].dR;
       break;
-    case MEAS_dD: /* OK */
+    case MEAS_DEC_OFFSET: /* OK */
       value = measure[0].dD;
       break;
     case MEAS_FWHM: /* OK */
       value = 0.01*measure[0].FWx;
-      break;
-    case MEAS_DOPHOT: /* OK */
-      value = measure[0].dophot;
       break;
     case MEAS_FLAGS: /* ? */
Index: /trunk/Ohana/src/opihi/dvo/region_list.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/region_list.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/region_list.c	(revision 14401)
@@ -61,72 +61,117 @@
 }
 
-int SetRegionSelection (int *argc, char **argv, char **RegionName, char **RegionList) {
+void FreeSkyRegionSelection (SkyRegionSelection *selection) {
+
+  if (selection == NULL) return;
+  if (selection[0].name != NULL) free (selection[0].name);
+  if (selection[0].list != NULL) free (selection[0].list);
+  free (selection);
+}
+
+SkyRegionSelection *SetRegionSelection (int *argc, char **argv) {
   
   int N;
-
-  /* check for Region selection */
-  *RegionName = NULL;
+  SkyRegionSelection *selection;
+
+  ALLOCATE (selection, SkyRegionSelection, 1);
+  selection[0].name = NULL;
+  selection[0].list = NULL;
+  selection[0].useDisplay = FALSE;
+  selection[0].useSkyregion = FALSE;
+
+  /* check for Region selection (named dvo catalog file) */
   if ((N = get_argument (*argc, argv, "-cpt"))) {
     remove_argument (N, argc, argv);
-    *RegionName = strcreate (argv[N]);
-    remove_argument (N, argc, argv);
-    return (TRUE);
-  }    
-  /* check for Region list */
-  *RegionList = NULL;
+    selection[0].name = strcreate (argv[N]);
+    remove_argument (N, argc, argv);
+    return selection;
+  }    
+
+  /* check for Region list (file containing dvo catalog file list)*/
   if ((N = get_argument (*argc, argv, "-cptlist"))) {
     remove_argument (N, argc, argv);
-    *RegionList = strcreate (argv[N]);
-    remove_argument (N, argc, argv);
-    return (TRUE);
+    selection[0].list = strcreate (argv[N]);
+    remove_argument (N, argc, argv);
+    return selection;
   } 
-  if ((*RegionName == NULL) && (*RegionList == NULL)) return (TRUE);
-
-  gprint (GP_ERR, "-cpt and -cptlist are incompatible\n");
-  free (*RegionName);
-  free (*RegionList);
-  *RegionName = NULL;
-  *RegionList = NULL;
-  return (FALSE);
+
+  /* check for Region selection from display */
+  if ((N = get_argument (*argc, argv, "-region"))) {
+    remove_argument (N, argc, argv);
+    selection[0].useDisplay = TRUE;
+    return selection;
+  }    
+
+  /* check for Region selection from display */
+  if ((N = get_argument (*argc, argv, "-skyregion"))) {
+    if (N + 5 >= *argc) {
+      gprint (GP_ERR, "USAGE: -skyregion (RA) (RA) (DEC) (DEC)\n");
+      FreeSkyRegionSelection (selection);
+      return NULL;
+    }
+    remove_argument (N, argc, argv);
+    selection[0].useSkyregion = TRUE;
+    set_skyregion (atof(argv[N]), atof(argv[N+1]), atof(argv[N+2]), atof(argv[N+3]));
+    remove_argument (N, argc, argv);
+    remove_argument (N, argc, argv);
+    remove_argument (N, argc, argv);
+    remove_argument (N, argc, argv);
+    return selection;
+  }    
+
+  /* default to pre-defined sky region */
+  selection[0].useSkyregion = TRUE;
+  return selection;
 }
 
 /* given possible options (by name, by list, by graph region), select SkyRegions */
-SkyList *SelectRegions (char *RegionName, char *RegionList) {
-
-  double Radius;
-  Graphdata graphsky;
+SkyList *SelectRegions (SkyRegionSelection *selection) {
+
   SkyList *skylist;
-  char filename[256];
 
   /* determine region-file names */
-  if (RegionName != NULL) {
+  if (selection->name != NULL) {
+    char filename[256];
+
     ALLOCATE (skylist, SkyList, 1);
     ALLOCATE (skylist[0].regions, SkyRegion *, 1);
     ALLOCATE (skylist[0].regions[0], SkyRegion, 1);
     ALLOCATE (skylist[0].filename, char *, 1);
+    skylist[0].ownElements = TRUE; // free these elements when freeing the list
     
-    strcpy (skylist[0].regions[0][0].name, RegionName);
-    sprintf (filename, "%s/%s.cpt", CATDIR, RegionName);
+    strcpy (skylist[0].regions[0][0].name, selection->name);
+    sprintf (filename, "%s/%s.cpt", CATDIR, selection->name);
     skylist[0].filename[0] = strcreate (filename);
-    free (RegionName);
-    RegionName = NULL;
     return (skylist);
   } 
-  if (RegionList != NULL) {
-    skylist = SkyListLoadFile (RegionList);
-    free (RegionList);
-    RegionList = NULL;
-    return (skylist);
-  }
-
-  if (!GetGraphData (&graphsky, NULL, NULL)) {
-    gprint (GP_ERR, "region display not available\n");
-    return (NULL);
-  }
-
-  Radius = MAX (fabs(graphsky.xmax), fabs(graphsky.ymax));
-  skylist = SkyListByRadius (sky, -1, graphsky.coords.crval1, graphsky.coords.crval2, Radius);
-
-  return (skylist);
+
+  if (selection->list != NULL) {
+    skylist = SkyListLoadFile (selection->list);
+    return (skylist);
+  }
+
+  if (selection->useDisplay) {
+    double Radius;
+    Graphdata graphsky;
+
+    if (!GetGraphData (&graphsky, NULL, NULL)) {
+      gprint (GP_ERR, "region display not available\n");
+      return (NULL);
+    }
+
+    Radius = MAX (fabs(graphsky.xmax), fabs(graphsky.ymax));
+    skylist = SkyListByRadius (sky, -1, graphsky.coords.crval1, graphsky.coords.crval2, Radius);
+    return (skylist);
+  }
+
+  if (selection->useSkyregion) {
+    double Rmin, Rmax, Dmin, Dmax;
+
+    get_skyregion (&Rmin, &Rmax, &Dmin, &Dmax);
+    skylist = SkyListByBounds (sky, -1, Rmin, Rmax, Dmin, Dmax);
+    return (skylist);
+  }    
+
+  return NULL;
 }
 
@@ -152,4 +197,5 @@
   ALLOCATE (skylist[0].regions, SkyRegion *, NREGIONS);
   ALLOCATE (skylist[0].filename, char *, NREGIONS);
+  skylist[0].ownElements = TRUE; // free these elements when freeing the list
 
   while (fscanf (f, "%s", filename) != EOF) {
Index: /trunk/Ohana/src/opihi/dvo/subpix.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/subpix.c	(revision 14400)
+++ /trunk/Ohana/src/opihi/dvo/subpix.c	(revision 14401)
@@ -86,5 +86,5 @@
     free (index);
     dvo_catalog_free (&catalog);
-    SkyListFree (skylist, FALSE);
+    SkyListFree (skylist);
     return (TRUE);
   }
@@ -151,5 +151,5 @@
   free (image);
   free (index);
-  SkyListFree (skylist, FALSE);
+  SkyListFree (skylist);
 
   return (TRUE);
Index: /trunk/Ohana/src/opihi/include/dvoshell.h
===================================================================
--- /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 14400)
+++ /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 14401)
@@ -7,19 +7,103 @@
 
 /* magnitude types */
-enum {MAG_NONE, MAG_INST, MAG_CAT, MAG_SYS, MAG_REL, MAG_CAL, MAG_AVE, MAG_REF, MAG_ERR, MAG_CHISQ};
+enum {MAG_NONE, 
+      MAG_INST, 
+      MAG_CAT, 
+      MAG_SYS, 
+      MAG_REL, 
+      MAG_CAL, 
+      MAG_AVE, 
+      MAG_REF, 
+      MAG_ERR, 
+      MAG_CHISQ,
+      MAG_NCODE,
+      MAG_NPHOT,
+};
 
 /* measure fields */
-enum {MEAS_ZERO, MEAS_RA, MEAS_DEC, MEAS_MAG, MEAS_dMAG, MEAS_MINST, MEAS_MCAT, 
-      MEAS_MSYS, MEAS_MREL, MEAS_MCAL, MEAS_PHOTCODE, MEAS_TIME, MEAS_dR, MEAS_dD, 
-      MEAS_FWHM, MEAS_DOPHOT, MEAS_XCCD, MEAS_YCCD, MEAS_XMOSAIC, MEAS_YMOSAIC, 
-      MEAS_FLAGS, MEAS_EXPTIME, MEAS_AIRMASS, MEAS_RA_AVE, MEAS_DEC_AVE};
+enum {MEAS_ZERO, 
+      MEAS_RA, 
+      MEAS_DEC, 
+      MEAS_RA_AVE, 
+      MEAS_DEC_AVE,
+      MEAS_RA_AVE_ERR, 
+      MEAS_DEC_AVE_ERR, 
+      MEAS_U_RA, 
+      MEAS_U_DEC, 
+      MEAS_U_RA_ERR, 
+      MEAS_U_DEC_ERR, 
+      MEAS_PAR, 
+      MEAS_PAR_ERR, 
+      MEAS_RA_OFFSET, 
+      MEAS_DEC_OFFSET, 
+      MEAS_RA_OFFSET_ERR, 
+      MEAS_DEC_OFFSET_ERR, 
+      MEAS_XP, 
+      MEAS_NMEAS, 
+      MEAS_NMISS, 
+      MEAS_NPHOT, 
+      MEAS_NCODE, 
+      MEAS_OBJFLAGS, 
+      MEAS_MAG, 
+      MEAS_MINST, 
+      MEAS_MCAT, 
+      MEAS_MSYS, 
+      MEAS_MREL, 
+      MEAS_MCAL, 
+      MEAS_EXPTIME, 
+      MEAS_AIRMASS, 
+      MEAS_ALT, 
+      MEAS_AZ, 
+      MEAS_PHOTCODE, 
+      MEAS_TIME, 
+      MEAS_FWHM, 
+      MEAS_FWHM_MAJ, 
+      MEAS_FWHM_MIN, 
+      MEAS_THETA, 
+      MEAS_FLAGS, 
+      MEAS_XCCD, 
+      MEAS_YCCD, 
+      MEAS_XMOSAIC, 
+      MEAS_YMOSAIC, 
+      MEAS_DETID, 
+      MEAS_OBJID, 
+      MEAS_IMAGEID, 
+};
 
 /* average fields */
-enum {AVE_ZERO, AVE_RA, AVE_DEC, AVE_RA_ERR, AVE_DEC_ERR, AVE_U_RA, AVE_U_DEC, 
-      AVE_U_RA_ERR, AVE_U_DEC_ERR, AVE_PAR, AVE_PAR_ERR, AVE_MAG, AVE_REF, AVE_dMAG, 
-      AVE_Xm, AVE_Xp, AVE_NMEAS, AVE_NMISS, AVE_TYPE, AVE_NPHOT, AVE_NCODE, AVE_NCRIT, 
-      AVE_FLAG, AVE_TYPEFRAC};
+enum {AVE_ZERO, 
+      AVE_RA, 
+      AVE_DEC, 
+      AVE_RA_ERR, 
+      AVE_DEC_ERR, 
+      AVE_U_RA, 
+      AVE_U_DEC, 
+      AVE_U_RA_ERR, 
+      AVE_U_DEC_ERR, 
+      AVE_PAR, 
+      AVE_PAR_ERR, 
+      AVE_Xp, 
+      AVE_NMEAS, 
+      AVE_NMISS, 
+      AVE_NPHOT, 
+      AVE_NCODE, 
+      AVE_MAG, 
+      AVE_dMAG, 
+      AVE_Xm, 
+      AVE_FLAG, 
+      AVE_TYPE, 
+      AVE_TYPEFRAC,
+      AVE_OBJID
+};
 
 enum {DVO_TABLE_AVERAGE, DVO_TABLE_MEASURE};
+
+// options for selecting the ra,dec limits of the db selections
+typedef struct {
+  char *name;
+  char *list;
+  int useDisplay;
+  int useSkyregion;
+} SkyRegionSelection;
 
 // a single db field 
@@ -91,5 +175,5 @@
 int           SelectMags            PROTO((int Nphot, int Tphot, int Ns, Average *average, Measure *measure, SecFilt *secfilt, int UL));
 
-SkyList      *SelectRegions         PROTO((char *RegionName, char *RegionList));
+SkyList      *SelectRegions         PROTO((SkyRegionSelection *selection));
 SkyList      *SkyListLoadFile       PROTO((char *filename));
 int           SetCATDIR             PROTO((char *path, int verbose));
@@ -97,7 +181,7 @@
 SkyTable     *GetSkyTable           PROTO(());
 SkyList      *SkyListFromFile       PROTO((char *filename));
-int           SetRegionSelection    PROTO((int *argc, char **argv, char **RegionName, char **RegionList));
-
-int           SetImageSelection     PROTO((int mode, int RegionSelect));
+SkyRegionSelection *SetRegionSelection    PROTO((int *argc, char **argv));
+
+int           SetImageSelection     PROTO((int mode, SkyRegionSelection *selection));
 int           SetPhotSelections     PROTO((int *argc, char **argv, int Nparams));
 int           SetSelectionParam     PROTO((int param));
@@ -106,5 +190,5 @@
 void          compare               PROTO((Catalog *catlog1, Catalog *catlog2, Vector *rvec,  Vector *dvec,  Vector *mvec, Vector *drvec, Vector *ddvec, Vector *dmvec, double radius));
 void          cprecess              PROTO((Average *average, int Naverage, double in_epoch, double out_epoch));
-void          image_subset          PROTO((Image *image, int Nimage, int **Subset, int *Nsubset, Graphdata *graph, int RegionSelect, unsigned long int tzero, double trange, int TimeSelect));
+void          image_subset          PROTO((Image *image, int Nimage, int **Subset, int *Nsubset, SkyRegionSelection *selection, unsigned long int tzero, double trange, int TimeSelect));
 int           match_image           PROTO((Image *image, int Nimage, unsigned int T, short int S));
 int           match_image_subset    PROTO((Image *image, int *subset, int Nsubset, unsigned int T, short int S));
@@ -140,4 +224,6 @@
 void 	     dbInitField            PROTO((dbField *field));
 void 	     dbFreeFields           PROTO((dbField *fields, int Nfields));
+int          dbAstroRegionLimits    PROTO((dbStack **stack, int *nstack, SkyRegionSelection *selection, int table));
+char        *strfloat               PROTO((float value));
 
 # endif
