Index: /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/include/dvo.h	(revision 33214)
+++ /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/include/dvo.h	(revision 33215)
@@ -197,4 +197,5 @@
   char **filename;
   SkyRegion *regions;
+  char hosts[80];
 } SkyTable;
 
@@ -506,4 +507,5 @@
 int        SkyTableSave        	   PROTO((SkyTable *table, char *filename));
 SkyTable  *SkyTableLoad        	   PROTO((char *filename, int VERBOSE));
+char      *SkyTableFilename        PROTO((char *catdir));
 SkyTable  *SkyTableFromGSC     	   PROTO((char *filename, int depth, int VERBOSE));
 SkyTable  *SkyTableLoadOptimal 	   PROTO((char *catdir, char *SKYFILE, char *GSCFILE, int readwrite, int depth, int VERBOSE));
Index: /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/dvo_catalog_mef.c
===================================================================
--- /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/dvo_catalog_mef.c	(revision 33214)
+++ /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/dvo_catalog_mef.c	(revision 33215)
@@ -10,5 +10,6 @@
   Matrix matrix;
   FTable ftable;
-  SecFilt *primary;
+
+  SecFilt *primary = NULL;
 
   f = catalog[0].f;
Index: /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/skyregion_gsc.c
===================================================================
--- /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/skyregion_gsc.c	(revision 33214)
+++ /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/skyregion_gsc.c	(revision 33215)
@@ -91,4 +91,7 @@
   L0.regions[0].childS  =  0;
   L0.regions[0].childE  =  NDECBANDS;
+  L0.regions[0].hostFlags = 0;
+  L0.regions[0].hostID    = 0;
+  L0.regions[0].backupID  = 0;
   strcpy (L0.regions[0].name, "fullsky");
   if (DEBUG) SkyRegionPrint (&L0.regions[0]);
@@ -117,4 +120,7 @@
     L1.regions[i].child    = TRUE;
     L1.regions[i].table    = -1;
+    L1.regions[i].hostFlags = 0;
+    L1.regions[i].hostID    = 0;
+    L1.regions[i].backupID  = 0;
     strcpy (L1.regions[i].name, DecNames[i]);
     if (DEBUG) SkyRegionPrint (&L1.regions[i]);
@@ -152,4 +158,7 @@
   ALLOCATE (skytable[0].regions, SkyRegion, 1);
   skytable[0].Nregions = 0;
+
+  // define the host table filename
+  strcpy (skytable->hosts, "HostTable.dat");
 
   // L0, L1, L2, L3, L4 all have index ranges of 0 -> Nregions and parent values pointing
@@ -417,4 +426,7 @@
     L2[0].regions[Nr].childS   =  0;
     L2[0].regions[Nr].childE   =  0;
+    L2[0].regions[Nr].hostFlags = 0;
+    L2[0].regions[Nr].hostID    = 0;
+    L2[0].regions[Nr].backupID  = 0;
 
     /* define names for L2 regions */
@@ -464,4 +476,7 @@
     L3[0].regions[Nr].childS   =  0;
     L3[0].regions[Nr].childE   =  0;
+    L3[0].regions[Nr].hostFlags = 0;
+    L3[0].regions[Nr].hostID    = 0;
+    L3[0].regions[Nr].backupID  = 0;
 
     if (DEBUG >= 3) SkyRegionPrint (&L3[0].regions[Nr]);
@@ -514,4 +529,7 @@
       L4[0].regions[Nr].childS   =  0;
       L4[0].regions[Nr].childE   =  0;
+      L4[0].regions[Nr].hostFlags = 0;
+      L4[0].regions[Nr].hostID    = 0;
+      L4[0].regions[Nr].backupID  = 0;
 
       sprintf (name, "%s.%02d", L3[0].name, Nbox);
Index: /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/skyregion_io.c
===================================================================
--- /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/skyregion_io.c	(revision 33214)
+++ /branches/eam_branches/ipp-20111122/Ohana/src/libdvo/src/skyregion_io.c	(revision 33215)
@@ -39,4 +39,5 @@
 
   ALLOCATE (skytable, SkyTable, 1);
+  memset (skytable->hosts, 0, 80);
   skytable[0].regions = gfits_table_get_SkyRegion (&ftable, &skytable[0].Nregions, NULL);
   if (!skytable[0].regions) {
@@ -50,4 +51,28 @@
   }
   
+  // 2012.02.08 : I updated the schema for SkyTable.dat to add 3 fields by stealing the
+  // last 3 bytes of the 'name' field (going from 21 bytes to 18 bytes).  This was safe
+  // because no files had yet been defined with more than 16 bytes in the names, leave
+  // room for 1 more byte includig the EOF char.
+
+  // When we load old tables, we need to zero out the values of those 3 new fields (they
+  // may have garbage left over).  To distinguish old and new tables, I add the field
+  // 'HOSTS' to the PHU header (which also tells the location of the host table, if used).
+
+  int haveHosts = gfits_scan (&header, "HOSTS", "%s", 1, skytable->hosts);
+  if (!haveHosts) {
+    strcpy (skytable->hosts, "HostTable.dat");
+    for (i = 0; i < skytable[0].Nregions; i++) {
+      if (strlen(skytable[0].regions[i].name) > 17) {
+	fprintf (stderr, "WARNING : this skytable has some names longer than the adjusted size of 17 bytes.\n");
+	fprintf (stderr, "  This is not compatible with the current SkyTable definition\n");
+	exit (1);
+      }
+      skytable[0].regions[i].hostFlags = 0;
+      skytable[0].regions[i].hostID    = 0;
+      skytable[0].regions[i].backupID  = 0;
+    }
+  }
+
   gfits_free_header (&header);
   gfits_free_matrix (&matrix);
@@ -71,4 +96,5 @@
   gfits_create_header (&header);
   gfits_create_matrix (&header, &matrix);
+  gfits_print (&header, "HOSTS", "%s", 1, skytable->hosts);
 
   gfits_table_set_SkyRegion (&ftable, skytable[0].regions, skytable[0].Nregions);
@@ -91,10 +117,10 @@
 SkyTable *SkyTableLoadOptimal (char *catdir, char *skyfile, char *gscfile, int readwrite, int depth, int verbose) {
 
-  char filename[256];
+  char *filename;
   struct stat filestat;
   SkyTable *sky;
 
-  /* first option: CATDIR/SkyTable.fits */
-  sprintf (filename, "%s/SkyTable.fits", catdir);
+  /* first option: in CATDIR */
+  filename = SkyTableFilename (catdir);
   if (stat (filename, &filestat)) goto SKYFILE;
   if (!check_file_access (filename, FALSE, readwrite, verbose)) goto SKYFILE;
@@ -115,4 +141,5 @@
   if (sky == NULL) {
     fprintf (stderr, "error loading sky table\n");
+    free (filename);
     return (NULL);
   }
@@ -121,9 +148,12 @@
 
   /* create CATDIR copy */
-  sprintf (filename, "%s/SkyTable.fits", catdir);
   check_file_access (filename, FALSE, readwrite, verbose);
-  if (!SkyTableSave (sky, filename)) return NULL;
+  if (!SkyTableSave (sky, filename)) {
+    free (filename);
+    return NULL;
+  }
 
   gfits_convert_SkyRegion (sky[0].regions, sizeof (SkyTable), sky[0].Nregions);
+  free (filename);
   return (sky);
 
@@ -134,4 +164,5 @@
   if (gscfile == NULL) {
     fprintf (stderr, "error loading sky table from existing db (%s)\n", catdir);
+    free (filename);
     return (NULL);
   }
@@ -140,13 +171,17 @@
   if (sky == NULL) {
     fprintf (stderr, "error loading sky table\n");
+    free (filename);
     return (NULL);
   }
 
   /* create CATDIR copy */
-  sprintf (filename, "%s/SkyTable.fits", catdir);
   check_file_access (filename, FALSE, readwrite, verbose);
-  if (!SkyTableSave (sky, filename)) return NULL;
+  if (!SkyTableSave (sky, filename)) {
+    free (filename);
+    return NULL;
+  }
 
   gfits_convert_SkyRegion (sky[0].regions, sizeof (SkyRegion), sky[0].Nregions);
+  free (filename);
   return (sky);
 }
@@ -180,2 +215,13 @@
 }
 
+// given a CATDIR, return an allocated string with the full skytable name
+char *SkyTableFilename (char *catdir) {
+
+  if (!catdir) return NULL;
+  
+  char *skyfile;
+  ALLOCATE (skyfile, char, strlen(catdir) + strlen("/SkyTable.fits") + 1);
+  sprintf (skyfile, "%s/SkyTable.fits", catdir);
+
+  return skyfile;
+}
