Index: trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvo.h	(revision 5445)
+++ 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 5445)
+++ 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 5445)
+++ 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 5445)
+++ 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);
   }
