Index: /trunk/Ohana/src/addstar/doc/notes.txt
===================================================================
--- /trunk/Ohana/src/addstar/doc/notes.txt	(revision 5447)
+++ /trunk/Ohana/src/addstar/doc/notes.txt	(revision 5448)
@@ -21,5 +21,9 @@
   with .cpm, .cpn, .cps as needed.
 
-  
+  *** I need to fix the name method: common function to set it once 
+  in the dvo functions.  perhaps a pointer in the SkyRegion structure.
+  This needs some 32/64 bit care, though.  use a long long (or other 
+  type guaranteed to be 64 bit), and case to the appropriate type (size_t) 
+  when it is used?  also needs to be freed.
 
 todo:
Index: /trunk/Ohana/src/addstar/src/SkyRegionUtils.c
===================================================================
--- /trunk/Ohana/src/addstar/src/SkyRegionUtils.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/SkyRegionUtils.c	(revision 5448)
@@ -15,6 +15,5 @@
   /* match the basename against the GSCRegion file names */
   for (i = 0; i < input[0].Nregions; i++) {
-    sprintf (filename, "%s/%s.cpt", path, input[0].regions[i][0].name);
-    status = stat (filename, &filestats);
+    status = stat (input[0].regions[i][0].filename, &filestats);
     if ((status == -1) && (errno == ENOENT)) continue;
     /* give an error for other conditions? */
@@ -26,20 +25,4 @@
   }
   return (subset);
-}
-
-int SkyListSetPath (SkyList *list, char *path) {
-
-  int i;
-  char line[256];
-
-  for (i = 0; i < list[0].Nregions; i++) {
-    fprintf (stderr, "region: %s\n", list[0].regions[i][0].name);
-    sprintf (line, "%s/%s", path, list[0].regions[i][0].name);
-    fprintf (stderr, "line: %s\n", line);
-    strcpy (list[0].regions[i][0].name, line);
-    fprintf (stderr, "catalog: %s\n", list[0].regions[i][0].name);
-  }
-
-  return (TRUE);
 }
 
@@ -54,58 +37,2 @@
 }
 
-SkyTable *SkyTableLoadOptimal () {
-
-  char filename[256];
-  struct stat filestat;
-  SkyTable *sky;
-  int status;
-
-  /* first option: CATDIR/SkyTable.fits */
-  sprintf (filename, "%s/SkyTable.fits", CATDIR);
-  check_permissions (filename);
-
-  /* check for file existance */
-  status = stat (filename, &filestat);
-  if (status == 0) { /* file exists, are permissions OK? */
-    sky = SkyTableLoad (filename, VERBOSE);
-    if (sky == NULL) {
-      fprintf (stderr, "error loading sky table\n");
-      exit (1);
-    }
-    return (sky);
-  }
-
-  /* first option: SKY_TABLE */
-  if (SKY_TABLE[0]) {
-    status = stat (SKY_TABLE, &filestat);
-    if (status == 0) { /* file exists, are permissions OK? */
-      sky = SkyTableLoad (SKY_TABLE, VERBOSE);
-      if (sky == NULL) {
-	fprintf (stderr, "error loading sky table\n");
-	exit (1);
-      }
-      SkyTableSetDepth (sky, SKY_DEPTH);
-
-      /* write CATDIR copy */
-      sprintf (filename, "%s/SkyTable.fits", CATDIR);
-      check_permissions (filename);
-      SkyTableSave (sky, filename);
-      fits_convert_SkyRegion (sky[0].regions, sizeof (SkyTable), sky[0].Nregions);
-      return (sky);
-    }
-  }
-
-  sky = SkyTableFromGSC (GSCFILE, SKY_DEPTH, VERBOSE);
-  if (sky == NULL) {
-    fprintf (stderr, "error loading sky table\n");
-    exit (1);
-  }
-
-  /* write CATDIR copy */
-  sprintf (filename, "%s/SkyTable.fits", CATDIR);
-  check_permissions (filename);
-  SkyTableSave (sky, filename);
-  fits_convert_SkyRegion (sky[0].regions, sizeof (SkyRegion), sky[0].Nregions);
-
-  return (sky);
-}
Index: /trunk/Ohana/src/addstar/src/UpdateDatabase_Image.c
===================================================================
--- /trunk/Ohana/src/addstar/src/UpdateDatabase_Image.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/UpdateDatabase_Image.c	(revision 5448)
@@ -44,8 +44,8 @@
 
   /* find correpsonding regions for image */
-  skylist = SkyListByImage (ServerSky, -1, image, mosaic);
+  RegisterMosaic (mosaic);
+  skylist = SkyListByImage (ServerSky, -1, image);
 
   /* reduce regions to existing subset, if necessary */
-  SkyListSetPath (skylist, CATDIR);
   if (options[0].only_match || options[0].existing_regions) {
     SkyList *tmp;
Index: /trunk/Ohana/src/addstar/src/UpdateDatabase_Refcat.c
===================================================================
--- /trunk/Ohana/src/addstar/src/UpdateDatabase_Refcat.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/UpdateDatabase_Refcat.c	(revision 5448)
@@ -6,11 +6,5 @@
   Catalog catalog;
   Stars *stars, **subset;
-  // SkyTable *sky;
   SkyList *skylist;
-
-  /* this should be loaded by addstard on start -- keep static? */
-  /* need to load the correct sky table (GSC default or local verison) */
-  /* XXX EAM : check on memory usage */
-  // sky = SkyTableFromGSC (GSCFILE, SKY_DEPTH, VERBOSE);
 
   if (options[0].update) {
@@ -48,5 +42,4 @@
 
   /* reduce regions to existing subset, if necessary */
-  SkyListSetPath (skylist, CATDIR);
   if (options[0].only_match || options[0].existing_regions) {
     SkyList *tmp;
Index: /trunk/Ohana/src/addstar/src/addstar.c
===================================================================
--- /trunk/Ohana/src/addstar/src/addstar.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/addstar.c	(revision 5448)
@@ -23,5 +23,6 @@
   options = args (argc, argv, options);
 
-  sky = SkyTableLoadOptimal ();
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
   
   stars = NULL;
@@ -44,5 +45,6 @@
     stars = gstars (argv[1], &Nstars, options.photcode, &image);
     if ((DUMP != NULL) && !strcmp (DUMP, "rawstars")) dump_rawstars (stars, Nstars);
-    skylist = SkyListByImage (sky, -1, &image, MOSAIC);
+    RegisterMosaic (MOSAIC);
+    skylist = SkyListByImage (sky, -1, &image);
     overlap = gimages (&db, &image, MOSAIC, &Noverlap);
     break;
Index: /trunk/Ohana/src/addstar/src/addstard.c
===================================================================
--- /trunk/Ohana/src/addstar/src/addstard.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/addstard.c	(revision 5448)
@@ -11,6 +11,7 @@
   args_server (argc, argv);
 
-  /* store the sky table in a global? */
-  ServerSky = SkyTableLoadOptimal ();
+  /* store the sky table in a global for internal use */
+  ServerSky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
+  SkyTableSetFilename (ServerSky, CATDIR, "cpt");
 
   /* if we separate the incoming data from db update, spawn db thread here */
Index: /trunk/Ohana/src/addstar/src/get2mass.c
===================================================================
--- /trunk/Ohana/src/addstar/src/get2mass.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/get2mass.c	(revision 5448)
@@ -56,5 +56,5 @@
 
   int Nregions, NREGIONS;
-  char accelfile[1024], line[256], filename[128];
+  char accelfile[1024], line[256], filename[128], datafile[256];
   FILE *f;
   double Rs, Re, Ds, De;
@@ -83,5 +83,6 @@
     if (Ds > patch[0].Dmax) continue;
     if (De < patch[0].Dmin) continue;
-    sprintf (regions[Nregions].name, "%s/%s", path, filename);
+    sprintf (datafile, "%s/%s", path, filename);
+    regions[Nregions].filename = strcreate (datafile);
     regions[Nregions].Rmin = Rs;
     regions[Nregions].Rmax = Re;
Index: /trunk/Ohana/src/addstar/src/get2mass_as.c
===================================================================
--- /trunk/Ohana/src/addstar/src/get2mass_as.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/get2mass_as.c	(revision 5448)
@@ -51,5 +51,5 @@
   if (!FilterSkip) Shutdown ("invalid photcode %s", GetPhotcodeNamebyCode(photcode));
 
-  filename = region[0].name;
+  filename = region[0].filename;
   gf = gzopen (filename, "rb");
   if (gf == NULL) Shutdown ("can't read 2mass data file: %s", filename);
Index: /trunk/Ohana/src/addstar/src/get2mass_dr2.c
===================================================================
--- /trunk/Ohana/src/addstar/src/get2mass_dr2.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/get2mass_dr2.c	(revision 5448)
@@ -27,5 +27,5 @@
   fprintf (stderr, "overlap: %f - %f, %f - %f\n", RA0, RA1, DEC0, DEC1);
 
-  filename = region[0].name;
+  filename = region[0].filename;
   gf = gzopen (filename, "rb");
   if (gf == NULL) Shutdown ("can't read 2mass data file: %s", filename);
Index: /trunk/Ohana/src/addstar/src/getgsc.c
===================================================================
--- /trunk/Ohana/src/addstar/src/getgsc.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/getgsc.c	(revision 5448)
@@ -18,6 +18,6 @@
   /* load regions from GSC table, restrict to patch */
   sky = SkyTableFromGSC (GSCFILE, 2, VERBOSE);
+  SkyTableSetPath (sky, GSCDIR, "cpt");
   skylist = SkyListByPatch (sky, -1, patch);
-  SkyListSetPath (skylist, GSCDIR);
   
   Nstars = 0;
@@ -25,5 +25,5 @@
   
   for (i = 0; i < skylist[0].Nregions; i++) {
-    gsc = rd_gsc (skylist[0].regions[i][0].name, &Ngsc);
+    gsc = rd_gsc (skylist[0].regions[i][0].filename, &Ngsc);
 
     REALLOCATE (stars, Stars, MAX (1, Nstars + Ngsc));
@@ -34,4 +34,5 @@
   }
   
+  SkyTableFree (sky);
   if (VERBOSE) fprintf (stderr, "%d stars from HST GSC\n", Nstars);
   *NSTARS = Nstars;
Index: /trunk/Ohana/src/addstar/src/load_pt_catalog.c
===================================================================
--- /trunk/Ohana/src/addstar/src/load_pt_catalog.c	(revision 5447)
+++ /trunk/Ohana/src/addstar/src/load_pt_catalog.c	(revision 5448)
@@ -5,10 +5,8 @@
   char filename[256];
 
-  sprintf (filename, "%s/%s.cpt", path, region[0].name);
+  catalog[0].filename = region[0].filename;
 
-  check_permissions (filename);
-  if (VERBOSE) fprintf (stderr, "adding to %s\n", filename);
-
-  catalog[0].filename = strcreate (filename);
+  check_permissions (catalog[0].filename);
+  if (VERBOSE) fprintf (stderr, "adding to %s\n", catalog[0].filename);
     
   switch (lock_catalog (catalog, LCK_XCLD)) {
Index: /trunk/Ohana/src/delstar/src/delete_imagefile.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delete_imagefile.c	(revision 5447)
+++ /trunk/Ohana/src/delstar/src/delete_imagefile.c	(revision 5448)
@@ -8,16 +8,21 @@
   time_t start, stop;
   Image *image;
-  GSCRegion *region;
   Catalog catalog;
+  SkyList *skylist;
+  SkyTable *sky;
+
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
 
   /* load information about file - time/photcode */
   image = gimages (filename);
   
+  /* need to define method to get the mosaic (look up from table) */
   if (VERBOSE) fprintf (stderr, "deleting %s\n", image[0].name);
-  region = gregion_image (image, &Nregions);
 
-  for (i = 0; i < Nregions; i++) {
-    if (VERBOSE) fprintf (stderr, "deleting from %s\n", region[i].filename);
-    catalog.filename = region[i].filename;  /* don't free region before catalog! */
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    if (VERBOSE) fprintf (stderr, "deleting from %s\n", skylist[0].region[i][0].filename);
+    catalog.filename = skylist[0].region[i][0].filename;  /* don't free region before catalog! */
     switch (lock_catalog (&catalog, LCK_XCLD)) {
       case 0:
@@ -46,4 +51,5 @@
 
   /* find and delete matching images */
+  // XXX EAM : load image data above, find mosaic?
   imlist = find_images_data (db, image, &Nimlist);
   if (!Nimlist) Shutdown ("image %s not found in db", filename);
Index: /trunk/Ohana/src/delstar/src/delete_imagename.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delete_imagename.c	(revision 5447)
+++ /trunk/Ohana/src/delstar/src/delete_imagename.c	(revision 5448)
@@ -4,11 +4,16 @@
 
   int i, j, k;
-  int Nregions, Nimlist, Nimage;
+  int Nimlist, Nimage;
   int *imlist;
   double trange;
   time_t start, stop;
   Image *image;
-  GSCRegion *region;
   Catalog catalog;
+  SkyList *skylist;
+  SkyTable *sky;
+
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
 
   image = fits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped);
@@ -22,9 +27,12 @@
     j = imlist[k];
     if (VERBOSE) fprintf (stderr, "deleting %s\n", image[j].name);
-    region = gregion_image (&image[j], &Nregions);
+    
+    // XXX EAM : need to handle failure
+    FindMosaicForImage (image, Nimage, j);
+    skylist = SkyListByImage (sky, -1, &image[j]);
 
-    for (i = 0; i < Nregions; i++) {
-      if (VERBOSE) fprintf (stderr, "deleting from %s\n", region[i].filename);
-      catalog.filename = region[i].filename;  /* don't free region before catalog! */
+    for (i = 0; i < skylist[0].Nregions; i++) {
+      if (VERBOSE) fprintf (stderr, "deleting from %s\n", skylist[0].region[i][0].filename);
+      catalog.filename = skylist[0].region[i][0].filename;  /* don't free region before catalog! */
       switch (lock_catalog (&catalog, LCK_XCLD)) {
 	case 0:
Index: /trunk/Ohana/src/delstar/src/delete_times.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delete_times.c	(revision 5447)
+++ /trunk/Ohana/src/delstar/src/delete_times.c	(revision 5448)
@@ -7,5 +7,6 @@
   int Ntregions, Nregions, NREGIONS;
   int *imlist;
-  GSCRegion *region, *tregion;
+  SkyList *skylist, *skyset;
+  SkyTable *sky;
   Image *image;
   Catalog catalog;
@@ -13,7 +14,12 @@
   code = (PHOTCODE == NULL) ? -1 : PHOTCODE[0].code;
 
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+
   Nregions = 0;
   NREGIONS = 10;
-  ALLOCATE (region, GSCRegion, NREGIONS);
+  ALLOCATE (skylist, SkyList, 1);
+  ALLOCATE (skylist[0].regions, SkyRegions *, NREGIONS);
 
   image = fits_table_get_Image (&db[0].ftable, &Nimage, &db[0].swapped);
@@ -27,30 +33,26 @@
     if (VERBOSE) fprintf (stderr, "finding regions for %s\n", image[j].name);
 
-    tregion = gregion_image (&image[j], &Ntregions);
-    for (i = 0; i < Ntregions; i++) {
+    // XXX EAM : need to handle failure
+    FindMosaicForImage (image, Nimage, j);
+    skyset = SkyListByImage (sky, -1, &image[j]);
+
+    // tregion = gregion_image (&image[j], &Ntregions);
+    for (i = 0; i < skyset[0].Nregions; i++) {
       found = FALSE;
-      for (k = 0; (k < Nregions) && !found; k++) {
-	found = !strcmp (region[k].filename, tregion[i].filename);
+      for (k = 0; (k < skylist[0].Nregions) && !found; k++) {
+	found = !strcmp (skylist[0].region[k][0].name, skyset[0].region[i][0].name);
       }
-      if (!found) {
-	strcpy (region[Nregions].filename, tregion[i].filename);
-	region[Nregions].RA[0] = tregion[i].RA[0];
-	region[Nregions].RA[1] = tregion[i].RA[1];
-	region[Nregions].DEC[0] = tregion[i].DEC[0];
-	region[Nregions].DEC[1] = tregion[i].DEC[1];
-	Nregions ++;
-	if (Nregions >= NREGIONS) {
-	  NREGIONS += 10;
-	  REALLOCATE (region, GSCRegion, NREGIONS);
-	}
-      }
+      if (found) continue;
+      skylist[0].regions[Nregions] = skyset[0].regions[i];
+      Nregions ++;
+      CHECK_REALLOCATE (skylist[0].regions, SkyRegions *, NREGIONS, Nregions, 10);
     }
-    free (tregion);
+    SkyListFree (skyset);
   }
 
   /* delete from all identified regions */
-  for (i = 0; i < Nregions; i++) {
-    if (VERBOSE) fprintf (stderr, "deleting from %s\n", region[i].filename);
-    catalog.filename = region[i].filename;  /* don't free region before catalog! */
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    if (VERBOSE) fprintf (stderr, "deleting from %s\n", skylist[0].region[i][0].filename);
+    catalog.filename = skylist[0].region[i][0].filename;  /* don't free region before catalog! */
     switch (lock_catalog (&catalog, LCK_XCLD)) {
       case 0:
Index: /trunk/Ohana/src/libautocode/def/SkyRegion.d
===================================================================
--- /trunk/Ohana/src/libautocode/def/SkyRegion.d	(revision 5447)
+++ /trunk/Ohana/src/libautocode/def/SkyRegion.d	(revision 5448)
@@ -2,5 +2,5 @@
 EXTNAME SKY_REGION
 TYPE    BINTABLE
-SIZE    56
+SIZE    64
 
 FIELD   Rmin,	   R_MIN,	   float, 
@@ -16,2 +16,3 @@
 FIELD   table,	   TABLE,	   char,          does this entry have a table?
 FIELD   name,      NAME,           char[21],      name / filename
+FIELD   filename,  FILENAME,       e_void,        filename pointer
Index: /trunk/Ohana/src/libautocode/generate
===================================================================
--- /trunk/Ohana/src/libautocode/generate	(revision 5447)
+++ /trunk/Ohana/src/libautocode/generate	(revision 5448)
@@ -119,4 +119,6 @@
 	if ($type eq "unsigned int")  { $pt1 = "J"; }
 	if ($type eq "e_time") 	      { $pt1 = "J"; }
+	if ($type eq "e_void") 	      { $pt1 = "L"; }
+	# e_void is a 64 bit pointer, cast to size_t
 	if ($type eq "float")  	      { $pt1 = "E"; }
 	if ($type eq "double") 	      { $pt1 = "D"; }
@@ -188,4 +190,5 @@
 	if ($type eq "unsigned int")  { $pt1 = sprintf "I%s", $length; }
 	if ($type eq "e_time") 	      { $pt1 = sprintf "I%s", $length; }
+	if ($type eq "e_void") 	      { $pt1 = sprintf "I%s", $length; }
 	if ($type eq "float")  	      { $pt1 = sprintf "F%s", $length; }
 	if ($type eq "double") 	      { $pt1 = sprintf "F%s", $length; }
@@ -255,4 +258,5 @@
 	if ($type eq "unsigned int")  { $T = "WORD"; $n = 4; }
 	if ($type eq "e_time") 	      { $T = "WORD"; $n = 4; }
+	if ($type eq "e_void") 	      { $T = "DBLE"; $n = 8; }
 	if ($type eq "float")  	      { $T = "WORD"; $n = 4; }
 	if ($type eq "double") 	      { $T = "DBLE"; $n = 8; }
@@ -285,4 +289,5 @@
 	if ($type eq "unsigned int")   { $Nbytes += 4*$Np; $valid = 1; }
 	if ($type eq "e_time") 	       { $Nbytes += 4*$Np; $valid = 1; }
+	if ($type eq "e_void") 	       { $Nbytes += 8*$Np; $valid = 1; }
 	if ($type eq "float")  	       { $Nbytes += 4*$Np; $valid = 1; }
 	if ($type eq "double") 	       { $Nbytes += 8*$Np; $valid = 1; }
Index: /trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /trunk/Ohana/src/libdvo/include/dvo.h	(revision 5447)
+++ /trunk/Ohana/src/libdvo/include/dvo.h	(revision 5448)
@@ -338,4 +338,5 @@
 SkyTable *SkyTableLoad (char *filename, int VERBOSE);
 SkyTable *SkyTableFromGSC (char *filename, int depth, int VERBOSE);
+SkyTable *SkyTableLoadOptimal (char *catdir, char *SKY_TABLE, char *GSCFILE, int VERBOSE);
 SkyRegion *SkyRegionByPoint (SkyTable *table, int depth, double ra, double dec);
 SkyList *SkyListByPoint (SkyTable *table, double ra, double dec);
Index: /trunk/Ohana/src/libdvo/src/skyregion_gsc.c
===================================================================
--- /trunk/Ohana/src/libdvo/src/skyregion_gsc.c	(revision 5447)
+++ /trunk/Ohana/src/libdvo/src/skyregion_gsc.c	(revision 5448)
@@ -56,10 +56,12 @@
   regions[Nr].Dmin 	= -90;
   regions[Nr].Dmax 	= +90;
-  regions[Nr].index  =  0;
-  regions[Nr].depth  =  0;
-  regions[Nr].parent = -1;
-  regions[Nr].child  =  TRUE;
-  regions[Nr].table  =  (depth == 0);
+  regions[Nr].index  	=  0;
+  regions[Nr].depth  	=  0;
+  regions[Nr].parent 	= -1;
+  regions[Nr].child  	=  TRUE;
+  regions[Nr].table  	=  (depth == 0);
+  regions[Nr].filename  =  NULL;
   strcpy (regions[Nr].name, "fullsky");
+  
   
   No = Nr;
@@ -70,26 +72,28 @@
   /* first north */
   for (i = 0; i < 12; i++, Nr++) {
-    regions[Nr].Rmin   =   0;
-    regions[Nr].Rmax   = 360;
-    regions[Nr].Dmin   = DecBands[i];
-    regions[Nr].Dmax   = DecBands[i+1];
-    regions[Nr].index  =  i+1;
-    regions[Nr].depth  =  1;
-    regions[Nr].parent =  0;
-    regions[Nr].child  =  TRUE;
-    regions[Nr].table  =  (depth == 1);
+    regions[Nr].Rmin   	  =   0;
+    regions[Nr].Rmax   	  = 360;
+    regions[Nr].Dmin   	  = DecBands[i];
+    regions[Nr].Dmax   	  = DecBands[i+1];
+    regions[Nr].index  	  =  i+1;
+    regions[Nr].depth  	  =  1;
+    regions[Nr].parent 	  =  0;
+    regions[Nr].child  	  =  TRUE;
+    regions[Nr].table  	  =  (depth == 1);
+    regions[Nr].filename  =  NULL;
     strcpy (regions[Nr].name, DecNames[i]);
   }
   /* now south */
   for (i = 0; i < 12; i++, Nr++) {
-    regions[Nr].Rmin   =   0;
-    regions[Nr].Rmax   = 360;
-    regions[Nr].Dmin   = DecBands[i+14];
-    regions[Nr].Dmax   = DecBands[i+13];
-    regions[Nr].index  =  i+1;
-    regions[Nr].depth  =  1;
-    regions[Nr].parent =  0;
-    regions[Nr].child  =  TRUE;
-    regions[Nr].table  =  (depth == 1);
+    regions[Nr].Rmin   	  =   0;
+    regions[Nr].Rmax   	  = 360;
+    regions[Nr].Dmin   	  = DecBands[i+14];
+    regions[Nr].Dmax   	  = DecBands[i+13];
+    regions[Nr].index  	  =  i+1;
+    regions[Nr].depth  	  =  1;
+    regions[Nr].parent 	  =  0;
+    regions[Nr].child  	  =  TRUE;
+    regions[Nr].table  	  =  (depth == 1);
+    regions[Nr].filename  =  NULL;
     strcpy (regions[Nr].name, DecNames[i+13]);
   }
@@ -134,11 +138,12 @@
       regions[Nr].Rmax = RA1;
 
-      regions[Nr].index  =  Nr;
-      regions[Nr].depth  =  2;
-      regions[Nr].parent =  No;
-      regions[Nr].child  =  TRUE;
-      regions[Nr].table  =  (depth == 2);
-      regions[Nr].childS =  0;
-      regions[Nr].childE =  0;
+      regions[Nr].index    =  Nr;
+      regions[Nr].depth    =  2;
+      regions[Nr].parent   =  No;
+      regions[Nr].child    =  TRUE;
+      regions[Nr].table    =  (depth == 2);
+      regions[Nr].filename =  NULL;
+      regions[Nr].childS   =  0;
+      regions[Nr].childE   =  0;
 
       temp[5] = 0;
@@ -166,16 +171,17 @@
     for (ny = 0; ny < NDIV; ny ++) {
       for (nx = 0; nx < NDIV; nx ++) {
-	regions[Nr].Rmin = RA0  + (nx + 0)*dR;
-	regions[Nr].Rmax = RA0  + (nx + 1)*dR;
-	regions[Nr].Dmin = DEC0 + (ny + 0)*dD;
-	regions[Nr].Dmax = DEC0 + (ny + 1)*dD;
-
-	regions[Nr].index  =  Nr;
-	regions[Nr].depth  =  3;
-	regions[Nr].parent =  i;
-	regions[Nr].child  =  FALSE;
-	regions[Nr].table  =  (depth == 3);
-	regions[Nr].childS =  0;
-	regions[Nr].childE =  0;
+	regions[Nr].Rmin     = RA0  + (nx + 0)*dR;
+	regions[Nr].Rmax     = RA0  + (nx + 1)*dR;
+	regions[Nr].Dmin     = DEC0 + (ny + 0)*dD;
+	regions[Nr].Dmax     = DEC0 + (ny + 1)*dD;
+
+	regions[Nr].index    =  Nr;
+	regions[Nr].depth    =  3;
+	regions[Nr].parent   =  i;
+	regions[Nr].child    =  FALSE;
+	regions[Nr].table    =  (depth == 3);
+	regions[Nr].filename =  NULL;
+	regions[Nr].childS   =  0;
+	regions[Nr].childE   =  0;
 
 	temp[5] = 0;
Index: /trunk/Ohana/src/libdvo/src/skyregion_io.c
===================================================================
--- /trunk/Ohana/src/libdvo/src/skyregion_io.c	(revision 5447)
+++ /trunk/Ohana/src/libdvo/src/skyregion_io.c	(revision 5448)
@@ -39,4 +39,7 @@
   ALLOCATE (skytable, SkyTable, 1);
   skytable[0].regions = fits_table_get_SkyRegion (&ftable, &skytable[0].Nregions, NULL);
+  for (i = 0; i < skytable[0].Nregions; i++) {
+    skytable[0].regions[i].filename = NULL;
+  }
   
   fits_free_header (&header);
@@ -79,2 +82,73 @@
 }
 
+SkyTable *SkyTableLoadOptimal (char *catdir, char *SKY_TABLE, char *GSCFILE, int SKY_DEPTH, int VERBOSE) {
+
+  char filename[256];
+  struct stat filestat;
+  SkyTable *sky;
+  int status;
+
+  /* first option: CATDIR/SkyTable.fits */
+  sprintf (filename, "%s/SkyTable.fits", CATDIR);
+  check_permissions (filename);
+
+  /* check for file existence */
+  status = stat (filename, &filestat);
+  if (status == 0) { /* file exists, are permissions OK? */
+    sky = SkyTableLoad (filename, VERBOSE);
+    if (sky == NULL) {
+      fprintf (stderr, "error loading sky table\n");
+      exit (1);
+    }
+    return (sky);
+  }
+
+  /* first option: SKY_TABLE */
+  if ((SKY_TABLE != NULL) && (SKY_TABLE[0] != 0)) {
+    status = stat (SKY_TABLE, &filestat);
+    if (status == 0) { /* file exists, are permissions OK? */
+      sky = SkyTableLoad (SKY_TABLE, VERBOSE);
+      if (sky == NULL) {
+	fprintf (stderr, "error loading sky table\n");
+	exit (1);
+      }
+      SkyTableSetDepth (sky, SKY_DEPTH);
+
+      /* write CATDIR copy */
+      sprintf (filename, "%s/SkyTable.fits", CATDIR);
+      check_permissions (filename);
+      SkyTableSave (sky, filename);
+      fits_convert_SkyRegion (sky[0].regions, sizeof (SkyTable), sky[0].Nregions);
+      return (sky);
+    }
+  }
+
+  sky = SkyTableFromGSC (GSCFILE, SKY_DEPTH, VERBOSE);
+  if (sky == NULL) {
+    fprintf (stderr, "error loading sky table\n");
+    exit (1);
+  }
+
+  /* write CATDIR copy */
+  sprintf (filename, "%s/SkyTable.fits", CATDIR);
+  check_permissions (filename);
+  SkyTableSave (sky, filename);
+  fits_convert_SkyRegion (sky[0].regions, sizeof (SkyRegion), sky[0].Nregions);
+
+  return (sky);
+}
+
+int SkyListSetFilenames (SkyList *list, char *path, char *ext) {
+
+  int i;
+  char line[256];
+
+  // this generates the names, be sure to free when not needed
+  for (i = 0; i < list[0].Nregions; i++) {
+    sprintf (line, "%s/%s.%s", path, list[0].regions[i][0].name, ext);
+    list[0].regions[i][0].filename = strcreate (line);
+  }
+
+  return (TRUE);
+}
+
Index: /trunk/Ohana/src/libdvo/src/skyregion_ops.c
===================================================================
--- /trunk/Ohana/src/libdvo/src/skyregion_ops.c	(revision 5447)
+++ /trunk/Ohana/src/libdvo/src/skyregion_ops.c	(revision 5448)
@@ -119,5 +119,5 @@
 
 /* user must be careful about mosaic registration */
-SkyList *SkyListByImage (SkyTable *table, int depth, Image *image, Coords *mosaic) {
+SkyList *SkyListByImage (SkyTable *table, int depth, Image *image) {
 
   int i, j;
@@ -126,5 +126,5 @@
   double Rmin, Rmax, Dmin, Dmax;
   
-  RegisterMosaic (mosaic);
+  // XXX EAM : image/mosaic MUST be registered (if WRP) 
   SetImageCorners (X, Y, image);
 
@@ -269,4 +269,9 @@
   if (table == NULL) return (TRUE);
   if (table[0].regions != NULL) {
+    for (i = 0; i < table[0].Nregions; i++) {
+      if (table[0].regions[i].filename != NULL) {
+	free (table[0].regions[i].filename);
+      }
+    }
     free (table[0].regions);
   }
Index: /trunk/Ohana/src/opihi/dvo/catalog.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/catalog.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/catalog.c	(revision 5448)
@@ -9,4 +9,5 @@
 # define MISSCALE 2
 
+// XXX EAM : should this function be dropped? 
 int catlog (int argc, char **argv) {
   
Index: /trunk/Ohana/src/opihi/dvo/dmt.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dmt.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/dmt.c	(revision 5448)
@@ -4,5 +4,5 @@
 int dmt (int argc, char **argv) {
   
-  int i, m, k, N, Nregions, Ngraph, SaveVectors;
+  int i, m, k, N, Ngraph, SaveVectors;
   int Ns, Nsec, NPTS;
   char catdir[256], filename[256];
@@ -13,5 +13,6 @@
   Catalog catalog;
   Graphdata graphmode, graphsky;
-  RegionFile *regions;
+  SkyTable *sky;
+  SkyList *skylist;
   Vector Xvec, Yvec, Zvec, Rvec, Dvec;
   Vector *vec1, *vec2, *vec3, *vec4, *vec5;
@@ -53,6 +54,10 @@
   Ns = GetPhotcodeNsec (code[0].code);
 
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+
   Radius = MAX (fabs(graphsky.xmax), fabs(graphsky.ymax));
-  regions = find_regions (graphsky.coords.crval1, graphsky.coords.crval2, Radius, &Nregions);
+  skylist = SkyListByRadius (sky, -1, graphsky.coords.crval1, graphsky.coords.crval2, Radius);
   
   N = 0;
@@ -66,9 +71,8 @@
   }
 
-  for (k = 0; k < Nregions; k++) {
+  for (k = 0; k < skylist[0].Nregions; k++) {
 
-    sprintf (filename, "%s/%s", catdir, regions[k].name);
     /* lock, load, unlock catalog */
-    catalog.filename = filename;
+    catalog.filename = skylist[0].regions[k][0].filename;
     switch (lock_catalog (&catalog, LCK_SOFT)) {
     case 2:
Index: /trunk/Ohana/src/opihi/dvo/extract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/extract.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/extract.c	(revision 5448)
@@ -1,3 +1,4 @@
 # include "dvo1.h"
+// XXX EAM : this function is deprecated
 
 enum {ZERO, RA, DEC, MAG, dMAG, Xm, Xp, NMEAS, NMISS, REF, TYPE, NPHOT, NCODE, FLAG};
Index: /trunk/Ohana/src/opihi/dvo/gcat.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/gcat.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/gcat.c	(revision 5448)
@@ -3,9 +3,9 @@
 int gcat (int argc, char **argv) {
   
-  int i, Nregions;
-  RegionFile *regions;
-  char filename[128];
+  int i;
   struct stat filestat;
   double Ra, Dec, Radius;
+  SkyTable *sky;
+  SkyList *skylist;
   char catdir[256];
 
@@ -17,4 +17,8 @@
   }
 
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+
   Ra = atof (argv[1]);
   Dec = atof (argv[2]);
@@ -24,9 +28,8 @@
     Radius = 0.0001;
 
-  regions = find_regions (Ra, Dec, Radius, &Nregions);
+  skylist = SkyListByRadius (sky, -1, Ra, Dec, Radius);
 
-  for (i = 0; i < Nregions; i++) {
-    sprintf (filename, "%s/%s", catdir, regions[i].name);
-    if (stat (filename, &filestat) != -1) {
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    if (stat (skylist[0].regions[i][0].filename, &filestat) != -1) {
       fprintf (stderr, "%3d %s *\n", i, regions[i].name);
     } else {
@@ -37,6 +40,4 @@
 
   return (TRUE);
-  free (regions);
-
+  SkyListFree (regions);
 }
-
Index: /trunk/Ohana/src/opihi/dvo/gstar.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/gstar.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/gstar.c	(revision 5448)
@@ -9,9 +9,10 @@
   double Mcat, Mrel;
   float *RA, *DEC;
-  int i, j, k, m, N, *N1, Nregions, Nsec, NPTS;
+  int i, j, k, m, N, *N1, Nsec, NPTS;
   int Nstars, found, GetMeasures, Nlo, Nhi;
   int SaveVectors;
   Vector *vec1, *vec2, *vec3, *vec4;
-  RegionFile *regions;
+  SkyTable *sky;
+  SkyList *skylist;
   Catalog catalog;
   PhotCode *code;
@@ -52,14 +53,15 @@
   while (Ra > 360.0) Ra -= 360.0;
   
-  regions = find_regions (Ra, Dec, Radius, &Nregions);
-
-  if (Nregions > 1) {
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+  skylist = SkyListByRadius (sky, -1, Ra, Dec, Radius);
+
+  if (skylist[0].Nregions > 1) {
     fprintf (stderr, "warning, radius overlaps region boundary, not yet implemented\n");
   }
 
-  /* set filename, read in header */
-  sprintf (filename, "%s/%s", catdir, regions[0].name);
   /* lock, load, unlock catalog */
-  catalog.filename = filename;
+  catalog.filename = skylist[0].regions[0][0].filename;
   switch (lock_catalog (&catalog, LCK_SOFT)) {
   case 2:
Index: /trunk/Ohana/src/opihi/dvo/imdata.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/imdata.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/imdata.c	(revision 5448)
@@ -1,4 +1,3 @@
 # include "dvo1.h"
-void copy_region (GSCRegion *in, GSCRegion *out);
 
 int imdata (int argc, char **argv) {
@@ -13,5 +12,6 @@
   Image *image;
   Catalog catalog;
-  GSCRegion *region, *tregion;
+  SkyTable *sky;
+  SkyList *skylist, *skyset;
   Vector *vec;
 
@@ -80,27 +80,35 @@
   GetTimeFormat (&TimeReference, &TimeFormat);
 
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+
+  Nregions = 0;
+  NREGIONS = 10;
+  ALLOCATE (skylist, SkyList, 1);
+  ALLOCATE (skylist[0].regions, SkyRegions *, NREGIONS);
+
   /* for each image of interest, find the appropriate region files */
-  Nregion = 0;
-  ALLOCATE (region, GSCRegion, 1);
   for (i = 0; i < Nsubset; i++) {
     I = subset[i];
+
     if (!FindMosaicForImage (image, Nimage, I)) continue;
-    tregion = get_regions (&image[I], &Ntregion);
-    REALLOCATE (region, GSCRegion, MAX (1, Nregion + Ntregion));
-    for (j = 0; j < Ntregion; j++) {
-      skip = FALSE;
-      for (k = 0; (k < Nregion) && !skip; k++) {
-	if (!strcmp (region[k].filename, tregion[j].filename)) skip = TRUE;
-      }
-      if (!skip) {
-	copy_region (&tregion[j], &region[Nregion]);
-	Nregion ++;
-      }
-    }
-    free (tregion);
+    skyset = SkyListByImage (table, -1, &image[I]);
+
+    for (j = 0; j < skyset[0].Nregions; j++) {
+      found = FALSE;
+      for (k = 0; (k < skylist[0].Nregion) && !found; k++) {
+	found = !strcmp (skylist[0].regions[k].name, skyset[0].regions[j].name);
+      }
+      if (found) continue;
+      skylist[0].regions[Nregions] = skyset[0].regions[j];
+      Nregions ++;
+      CHECK_REALLOCATE (skylist[0].regions, SkyRegions *, NREGIONS, Nregions, 10);
+    }
+    SkyListFree (skyset);
   }	
   free (subset);
-  for (i = 0; i < Nregion; i++) {
-    fprintf (stderr, "try %s\n", region[i].filename);
+  for (i = 0; i < skylist[0].Nregions; i++) {
+    fprintf (stderr, "try %s\n", skylist[0].regions[i][0].name);
   } 
   
@@ -111,9 +119,8 @@
 
   /* for each region file, extract the data of interest in the right time range */
-  for (j = 0; j < Nregion; j++) {
+  for (j = 0; j < skylist[0].Nregions; j++) {
 
     /* get file name and open */
-    strcpy (filename, region[j].filename);
-    catalog.filename = filename;
+    catalog.filename = skylist[0].regions[j][0].filename;
     switch (lock_catalog (&catalog, LCK_SOFT)) {
     case 2:
@@ -210,13 +217,2 @@
   return (TRUE);
 }
-
-
-void copy_region (GSCRegion *in, GSCRegion *out) {
-    
-  out[0].RA[0]  = in[0].RA[0];
-  out[0].RA[1]  = in[0].RA[1];
-  out[0].DEC[0] = in[0].DEC[0];
-  out[0].DEC[1] = in[0].DEC[1];
-  strcpy (out[0].filename, in[0].filename);
-}
-
Index: /trunk/Ohana/src/opihi/dvo/init.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/init.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/init.c	(revision 5448)
@@ -53,4 +53,5 @@
   {"addxtra",     addxtra,      "add extra data to object"},
   {"getxtra",     getxtra,      "get extra data from object"},
+  {"catalog",     catlog,       "plot catalog stars"},
 */
 
@@ -60,5 +61,4 @@
   {"calextract",  calextract,   "extract photometry calibration"},
   {"calmextract", calmextract,  "extract photometry calibration"},
-  {"catalog",     catlog,       "plot catalog stars"},
   {"ccd",         ccd,          "plot color-color diagram"},
   {"cmatch",      cmatch,       "match two catalogs"},
@@ -91,5 +91,5 @@
   {"lightcurve",  lightcurve,   "extract lightcurve for a star"},
   {"mextract",    mextract,     "extract measure data values"},
-  {"pcat",    	  pcat,         "plot catalog boundaries"},
+  {"pcat",    	  skycat,       "plot catalog boundaries"},
   {"photcodes",   photcodes,    "list photometry codes"},
   {"pmeasure",    pmeasure,     "plot individual measurements"},
Index: /trunk/Ohana/src/opihi/dvo/lcat.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/lcat.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/lcat.c	(revision 5448)
@@ -5,5 +5,4 @@
   double Radius;
   int i, N, Nregions, ShowAll;
-  RegionFile *regions;
   char filename[128], exists;
   struct stat filestat;
@@ -11,4 +10,6 @@
   Graphdata graphmode;
   int Ngraph;
+  SkyTable *sky;
+  SkyList *skylist;
 
   Ngraph = 0;
@@ -16,4 +17,8 @@
 
   VarConfig ("CATDIR", "%s", catdir);
+
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
 
   ShowAll = FALSE;
@@ -28,15 +33,14 @@
 
   Radius = MAX (fabs(graphmode.xmax), fabs(graphmode.ymax));
-  regions = find_regions (graphmode.coords.crval1, graphmode.coords.crval2, Radius, &Nregions);
+  skylist = SkyListByRadius (sky, -1, graphmode.coords.crval1, graphmode.coords.crval2, Radius);
 
-  for (i = 0; i < Nregions; i++) {
-    sprintf (filename, "%s/%s", catdir, regions[i].name);
+  for (i = 0; i < skylist[0].Nregions; i++) {
     exists = 'Y';
-    if (stat (filename, &filestat) == -1) exists = 'N';
+    if (stat (skylist[0].regions[i][0].filename, &filestat) == -1) exists = 'N';
     if (ShowAll) {
-      fprintf (stderr, "%3d %s  %c\n", i, regions[i].name, exists);
+      fprintf (stderr, "%3d %s  %c\n", i, skylist[0].regions[i][0].name, exists);
     } else {
       if (exists == 'Y') {
-	fprintf (stderr, "%3d %s\n", i, regions[i].name);
+	fprintf (stderr, "%3d %s\n", i, skylist[0].regions[i][0].name);
       }
     }
@@ -44,7 +48,5 @@
 
   return (TRUE);
-
-  free (regions);
-
+  SkyListFree (regions);
 }
 
Index: /trunk/Ohana/src/opihi/dvo/lcurve.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/lcurve.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/lcurve.c	(revision 5448)
@@ -8,12 +8,13 @@
   int Ngraph, Xgraph, TimeFormat;
   int Nstars, found, AutoLimits, ErrorBars, GalMag, AbsPhot, SaveVectors;
-  int i, j, m, N, NPTS, *N1, Nregions;
+  int i, j, m, N, NPTS, *N1;
   time_t TimeReference;
   struct tm *timeptr;
-  RegionFile *regions;
   Vector *xvec, *yvec;
   Vector Xvec, Yvec, dYvec;
   Catalog catalog;
   Graphdata graphmode;
+  SkyTable *sky;
+  SkyList *skylist;
 
   VarConfig ("CATDIR", "%s", catdir);
@@ -69,17 +70,20 @@
   }
   
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+
   Ra = atof (argv[1]);
   Dec = atof (argv[2]);
   Radius = atof (argv[3]);
 
-  regions = find_regions (Ra, Dec, Radius, &Nregions);
-
-  if (Nregions > 1) {
+  skylist = SkyListByRadius (sky, -1, Ra, Dec, Radius);
+
+  if (skylist[0].Nregions > 1) {
     fprintf (stderr, "warning, radius overlaps region boundary, not yet implemented\n");
   }
 
   /* set filename, read in header */
-  sprintf (filename, "%s/%s", catdir, regions[0].name);
-  catalog.filename = filename;
+  catalog.filename = skylist[0].regions[0][0].filename;
   switch (lock_catalog (&catalog, LCK_SOFT)) {
   case 2:
@@ -198,5 +202,5 @@
   if (catalog.measure != 0) free (catalog.measure);
  
+  SkyListFree (skylist);
   return (TRUE);
-
 }
Index: /trunk/Ohana/src/opihi/dvo/lightcurve.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/lightcurve.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/lightcurve.c	(revision 5448)
@@ -7,7 +7,6 @@
   float *RA, *DEC;
   int Nstars, found, PhotCodeSelect;
-  int i, j, k, m, N, NPTS, Nsec, RELPHOT, *N1, Nregions, TimeFormat;
+  int i, j, k, m, N, NPTS, Nsec, RELPHOT, *N1, TimeFormat;
   time_t TimeReference;
-  RegionFile *regions;
   Vector *tvec, *mvec, *dmvec;
   Catalog catalog;
@@ -50,13 +49,14 @@
   Radius = atof (argv[3]);
 
-  regions = find_regions (Ra, Dec, Radius, &Nregions);
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+  skylist = SkyListByRadius (sky, -1, Ra, Dec, Radius);
 
-  if (Nregions > 1) {
+  if (skylist[0].Nregions > 1) {
     fprintf (stderr, "warning, radius overlaps region boundary, not yet implemented\n");
   }
 
   /* set filename, read in header */
-  sprintf (filename, "%s/%s", catdir, regions[0].name);
-  catalog.filename = filename;
+  catalog.filename = skylist[0].regions[0][0].filename;
   switch (lock_catalog (&catalog, LCK_SOFT)) {
   case 2:
@@ -148,5 +148,5 @@
   if (catalog.secfilt != 0) free (catalog.secfilt);
  
+  SkyListFree (skylist);
   return (TRUE);
-
 }
Index: /trunk/Ohana/src/opihi/dvo/pcat.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/pcat.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/pcat.c	(revision 5448)
@@ -2,4 +2,5 @@
 int RD_to_XYpic (double *x, double *y, double r, double d, Coords *coords, double Rmin, double Rmax, double Rmid, int *leftside);
 
+// XXX EAM : this function is deprecated (now points at skycat)
 int pcat (int argc, char **argv) {
   
Index: /trunk/Ohana/src/opihi/dvo/pmeasure.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/pmeasure.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/pmeasure.c	(revision 5448)
@@ -5,5 +5,5 @@
   FILE *f;
   int i, j, k, m, N;
-  int InRegion, Nregions, Ngraph;
+  int Ngraph;
   char filename[128], catdir[256];
   double Mz, Mr, mag;
@@ -13,6 +13,7 @@
   int PhotcodeClip;
 
+  SkyTable *sky;
+  SkyList *skylist;
   Catalog catalog;
-  RegionFile *regions;
   Graphdata graphmode;
   Vector Xvec, Yvec, Zvec;
@@ -23,5 +24,4 @@
   if (VarConfig ("CATDIR", "%s", catdir) == NULL) return (FALSE);
 
-  regions = (RegionFile *) NULL;
   f = (FILE *) NULL;
   Mz = 17.0;
@@ -68,33 +68,21 @@
   }
 
-  InRegion = FALSE;
-  if ((N = get_argument (argc, argv, "-all"))) {
-    remove_argument (N, &argc, argv);
-    InRegion = TRUE;
-  }
-
-  if ((InRegion || (argc != 2)) && (!InRegion || (argc != 1))) {
-    fprintf (stderr, "USAGE: catalog (filename / -all) [-m M M] [-n N N] [-g] [-a RA DEC MAG] \n");
+  if (argc != 2) {
+    fprintf (stderr, "USAGE: pmeasure (-all) [-m M M] [-p photcode] [-ID ID] [-flag value] [-x]\n");
     return (FALSE);
   }
   
-  if (InRegion) {
-    Radius = MAX (fabs(graphmode.xmax), fabs(graphmode.ymax));
-    regions = find_regions (graphmode.coords.crval1, graphmode.coords.crval2, Radius, &Nregions);
-  } else {
-    Nregions = 1;
-  }
+  Radius = MAX (fabs(graphmode.xmax), fabs(graphmode.ymax));
+
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+  skylist = SkyListByRadius (sky, -1, graphmode.coords.crval1, graphmode.coords.crval2, Radius);
   
-  for (j = 0; j < Nregions; j++) {
+  for (j = 0; j < skylist[0].Nregions; j++) {
     catalog.average = 0;
     
-    if (InRegion) {
-      sprintf (filename, "%s/%s", catdir, regions[j].name);
-    } else {
-      sprintf (filename, "%s/%s", catdir, argv[1]);
-    }
-    
     /* lock, load, unlock catalog */
-    catalog.filename = filename;
+    catalog.filename = skylist[0].regions[j][0].filename;
     switch (lock_catalog (&catalog, LCK_SOFT)) {
     case 2:
Index: /trunk/Ohana/src/opihi/dvo/region_list.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/region_list.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/region_list.c	(revision 5448)
@@ -1,3 +1,7 @@
 # include "dvo1.h"
+
+/* XXX note : for RegionName or RegionList, we need to free the skylist
+   elements, but not in the case of radius selection - this implies 
+   information carried back up */
 
 static int RegionSelect;
@@ -42,25 +46,29 @@
 }
 
-RegionFile *SelectRegions (char *RegionName, char *RegionList, int *nregions) {
+SkyList *SelectRegions (char *RegionName, char *RegionList) {
 
   double Radius;
   int Ngraph;
   Graphdata graphsky;
-  RegionFile *regions;
+  SkyTable *sky;
+  SkyList *skylist;
 
   /* determine region-file names */
   if (RegionName != NULL) {
-    *nregions = 1;
-    ALLOCATE (regions, RegionFile, 1);
-    strcpy (regions[0].name, RegionName);
+    ALLOCATE (skylist, SkyList, 1);
+    ALLOCATE (skylist[0].regions[0], SkyRegion *, 1);
+    ALLOCATE (skylist[0].regions[0][0], SkyRegion, 1);
+    strcpy (skylist[0].regions[0][0].name, RegionName);
+    sprintf (filename, "%s/%s.cpt", CATDIR, RegionName);
+    skylist[0].regions[0][0].filename = strcreate (filename);
     free (RegionName);
     RegionName = NULL;
-    return (regions);
+    return (skylist);
   } 
   if (RegionList != NULL) {
-    regions = region_list (RegionList, nregions);
+    skylist = SkyListLoadFile (RegionList);
     free (RegionList);
     RegionList = NULL;
-    return (regions);
+    return (skylist);
   }
 
@@ -72,31 +80,42 @@
 
   Radius = MAX (fabs(graphsky.xmax), fabs(graphsky.ymax));
-  regions = find_regions (graphsky.coords.crval1, graphsky.coords.crval2, Radius, nregions);
-  return (regions);
+
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+  skylist = SkyListByRadius (sky, -1, graphmode.coords.crval1, graphmode.coords.crval2, Radius);
+
+  return (skylist);
 }
 
+/* XXX EAM this should perhaps return a skytable? */
 /* returns a list of region files names from file */
-RegionFile *region_list (char *filename, int *Nregions) {
+SkyList *SkyListFromFile (char *filename) {
   
+  FILE *f;
   int NREGIONS, nregion;
-  RegionFile *regions;
-  FILE *f;
+  SkyList *skylist;
+
+  ALLOCATE (skylist, SkyList, 1);
 
   f = fopen (filename, "r");
   if (f == NULL) {
     fprintf (stderr, "ERROR: can't find region list file %s\n", filename);
-    *Nregions = 0;
-    return (NULL);
+    skylist[0].Nregions = 0;
+    skylist[0].regions = NULL;
+    return (skylist);
   }
   
+  Nregions = 0;
   NREGIONS = 50;
-  ALLOCATE (regions, RegionFile, NREGIONS);
-  nregion = 0;
+  ALLOCATE (skylist[0].regions, SkyRegion *, NREGIONS);
 
-  while (fscanf (f, "%s", regions[nregion].name) != EOF) {
-    nregion ++;
-    if (nregion == NREGIONS) {
-      NREGIONS += 50;
-      REALLOCATE (regions, RegionFile, NREGIONS);
+  while (fscanf (f, "%s", filename) != EOF) {
+    ALLOCATE (skylist[0].regions[Nregions], SkyRegion, 1);
+    strcpy (skylist[0].regions[Nregions][0].name, filename);
+    sprintf (filename, "%s/%s.cpt", CATDIR, skylist[0].regions[Nregions][0].name);
+    skylist[0].regions[Nregions][0].filename = strcreate (filename);
+    Nregions ++;
+    CHECK_REALLOCATE (skylist[0].regions, SkyRegion *, NREGIONS, Nregions, 50);
     }
   }
Index: /trunk/Ohana/src/opihi/dvo/subpix.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/subpix.c	(revision 5447)
+++ /trunk/Ohana/src/opihi/dvo/subpix.c	(revision 5448)
@@ -5,5 +5,5 @@
 int subpix (int argc, char **argv) {
   
-  int i, j, I, Nlo, Nhi, Nentry, Nstars, Nregions, Nimage, Nmeasure;
+  int i, j, I, Nlo, Nhi, Nentry, Nstars, Nimage, Nmeasure;
   int *index, *entry;
   int Nmin, Nsub, NSUB, status;
@@ -17,5 +17,4 @@
   Measure *measure;
   Image *image;
-  RegionFile *regions;
   Catalog catalog;
 
@@ -35,13 +34,16 @@
   Radius = atof (argv[3]);
 
+  /* load sky from correct table */
+  sky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+
   /* load star nearest position */
-  regions = find_regions (Ra, Dec, Radius, &Nregions);
-  if (Nregions > 1) {
+  skylist = SkyListByRadius (sky, -1, Ra, Dec, Radius);
+  if (skylist[0].Nregions > 1) {
     fprintf (stderr, "warning, radius overlaps region boundary, not yet implemented\n");
   }
 
   /* lock, load, unlock catalog */
-  sprintf (filename, "%s/%s", catdir, regions[0].name);
-  catalog.filename = filename;
+  catalog.filename = skylist[0].regions[0][0].filename;
   switch (lock_catalog (&catalog, LCK_SOFT)) {
   case 2:
@@ -92,5 +94,5 @@
     if (catalog.average != 0) free (catalog.average);
     if (catalog.measure != 0) free (catalog.measure);
-    free (regions);
+    SkyListFree (skylist);
     return (TRUE);
   }
@@ -158,5 +160,5 @@
   free (image);
   free (index);
-  free (regions);
+  SkyListFree (regions);
 
   return (TRUE);
Index: /trunk/Ohana/src/relphot/src/relphot.c
===================================================================
--- /trunk/Ohana/src/relphot/src/relphot.c	(revision 5447)
+++ /trunk/Ohana/src/relphot/src/relphot.c	(revision 5448)
@@ -16,4 +16,5 @@
 
   /* load regions and images based on seed region */
+  // XXX EAM : load images and regions based on bounds, not name
   region = load_images (&db, argv[1], &Ncatalog, &fullregion);
 
