Index: /trunk/Ohana/src/opihi/cmd.data/Makefile
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 35109)
@@ -42,4 +42,5 @@
 $(SRC)/dbconnect.$(ARCH).o	\
 $(SRC)/dbselect.$(ARCH).o	\
+$(SRC)/dbinsert.$(ARCH).o	\
 $(SRC)/erase.$(ARCH).o		\
 $(SRC)/extract.$(ARCH).o	\
Index: /trunk/Ohana/src/opihi/cmd.data/dbconnect.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/dbconnect.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/dbconnect.c	(revision 35109)
@@ -8,7 +8,14 @@
 int dbconnect (int argc, char **argv) {
   
+  int N;
   char query[256];
-  char password[1024];
   MYSQL_RES *result;
+
+  char *password = NULL;
+  if ((N = get_argument (argc, argv, "-p"))) {
+    remove_argument (N, &argc, argv);
+    password = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
 
   if (argc != 4) {
@@ -17,20 +24,23 @@
   }
 
-  fprintf (stdout, "Enter password: ");
-  scan_line (stdin, password);
+  if (!password) {
+      ALLOCATE (password, char, 1024);
+      fprintf (stdout, "Enter password: ");
+      scan_line (stdin, password);
 
 # if (0)
-  int i;
-  char c;
+      int i;
+      char c;
 
-  initscr();
-  noecho();
-  i = 0;
-  while (((c = getch()) != EOF) && (c != '\n')) {
-    password[i] = c;
-    i++;
+      initscr();
+      noecho();
+      i = 0;
+      while (((c = getch()) != EOF) && (c != '\n')) {
+	  password[i] = c;
+	  i++;
+      }
+      password[i] = 0;
+# endif
   }
-  password[i] = 0;
-# endif
 
   // XXX do I need to call mysql_library_init()?
Index: /trunk/Ohana/src/opihi/cmd.data/dbinsert.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/dbinsert.c	(revision 35109)
+++ /trunk/Ohana/src/opihi/cmd.data/dbinsert.c	(revision 35109)
@@ -0,0 +1,57 @@
+# include "data.h"
+# if (HAVE_MYSQL_H) 
+# include "mysql.h"
+
+int dbinsert (int argc, char **argv) {
+  
+  int i, Nbytes;
+  char *query;
+
+  MYSQL *connection = NULL;
+
+  if (argc < 4) {
+    gprint (GP_ERR, "USAGE: dbinsert into (table) (fields,..) values (values,...)\n");
+    return FALSE;
+  }
+
+  connection = db_getConnection ();
+  if (connection == NULL) {
+    gprint (GP_ERR, "database not defined; use dbconnect\n");
+    return (FALSE);
+  }
+
+  // generate the query line (concat the argv[i] entries)
+  Nbytes = 0;
+  for (i = 1; i < argc; i++) {
+    Nbytes += strlen(argv[i]) + 1;
+  }
+  Nbytes += 10;
+
+  ALLOCATE (query, char, Nbytes);
+  bzero (query, Nbytes);
+  strcat (query, "insert ");
+  for (i = 1; i < argc; i++) {
+    strcat (query, argv[i]);
+    strcat (query, " ");
+  }
+  
+  fprintf (stderr, "query: %s\n", query);
+
+  if (mysql_query (connection, query)) {
+    gprint (GP_ERR, "problem with query\n");
+    gprint (GP_ERR, "%s\n", mysql_error (connection));
+    free (query);
+    return (FALSE);
+  }
+  free (query);
+  return (TRUE);
+}
+# else 
+
+int dbinsert (int argc, char **argv) {
+
+  gprint (GP_ERR, "mysql library is not available\n");
+  return FALSE;
+}
+
+# endif
Index: /trunk/Ohana/src/opihi/cmd.data/init.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/init.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/init.c	(revision 35109)
@@ -24,4 +24,5 @@
 int dbconnect        PROTO((int, char **));
 int dbselect         PROTO((int, char **));
+int dbinsert         PROTO((int, char **));
 int delete           PROTO((int, char **));
 int densify          PROTO((int, char **));
@@ -170,4 +171,5 @@
   {1, "dbconnect",    dbconnect,        "setup mysql db connection"},
   {1, "dbselect",     dbselect,         "extract vectors from mysql database table"},
+  {1, "dbinsert",     dbinsert,         "sql insert command"},
   {1, "delete",       delete,           "delete vectors or images"},
   {1, "densify",      densify,          "create an image histogram from a set of vectors"},
Index: /trunk/Ohana/src/opihi/cmd.data/spline.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/spline.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/spline.c	(revision 35109)
@@ -2,4 +2,5 @@
 
 int spline_list (int argc, char **argv);
+int spline_help (int argc, char **argv);
 int spline_create (int argc, char **argv);
 int spline_apply (int argc, char **argv);
@@ -7,7 +8,9 @@
 int spline_save (int argc, char **argv);
 int spline_delete (int argc, char **argv);
+int spline_rename (int argc, char **argv);
 int spline_getspline (int argc, char **argv);
 
 static Command spline_commands[] = {
+  {1, "help",       spline_help,       "list spline help info"},
   {1, "list",       spline_list,       "list splines"},
   {1, "create",     spline_create,     "create a spline"},
@@ -16,5 +19,21 @@
   {1, "save",       spline_save,       "read a spline from a FITS file"},
   {1, "delete",     spline_delete,     "delete a spline"},
+  {1, "rename",     spline_rename,     "rename a spline"},
 };
+
+int spline_help (int argc, char **argv) {
+
+  gprint (GP_ERR, "USAGE: spline (command)\n");
+  gprint (GP_ERR, "    spline help                                  : this listing\n");
+  gprint (GP_ERR, "    spline list                                  : list splines\n");
+  gprint (GP_ERR, "    spline create (spline) (Xknots) (Yknots)     : create a spline\n");
+  gprint (GP_ERR, "    spline apply  (spline) (Xpts) (Ypts)         : apply a spline to Xpts to get Ypts\n");
+  gprint (GP_ERR, "    spline delete (spline)                       : delete named spline\n");
+  gprint (GP_ERR, "    spline rename (spline) (new)                 : change spline name to new name\n");
+  gprint (GP_ERR, "    spline load   (spline) (filename)            : load a spline from a FITS file\n");
+  gprint (GP_ERR, "    spline save   (spline) (filename) [-append]  : save a spline in FITS format\n");
+
+  return FALSE;
+}
 
 int spline_command (int argc, char **argv) {
@@ -23,8 +42,5 @@
 
   if (argc < 2) {
-    gprint (GP_ERR, "USAGE: spline (command)\n");
-    gprint (GP_ERR, "    spline list                                    : list splines\n");
-    gprint (GP_ERR, "    spline create   (spline)                       : create a spline\n");
-    gprint (GP_ERR, "    spline delete   (spline)                       : delete a spline\n");
+    spline_help(0,NULL);
     return (FALSE);
   }
Index: /trunk/Ohana/src/opihi/cmd.data/spline_commands.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/spline_commands.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/spline_commands.c	(revision 35109)
@@ -126,4 +126,24 @@
 }
 
+int spline_rename (int argc, char **argv) {
+
+  Spline *spline;
+
+  if (argc != 3) {
+    gprint (GP_ERR, "USAGE: spline rename (spline) (newname)\n");
+    return FALSE;
+  }
+
+  spline = FindSpline (argv[1]);
+  if (spline == NULL) {
+    gprint (GP_ERR, "spline %s not found\n", argv[1]);
+    return FALSE;
+  }
+
+  free (spline->name);
+  spline->name = strcreate (argv[2]);
+  return TRUE;
+}
+
 /* 
 int spline_listspline (int argc, char **argv) {
Index: /trunk/Ohana/src/opihi/cmd.data/subset.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/subset.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/subset.c	(revision 35109)
@@ -35,5 +35,9 @@
   }
   if ((tvec = SelectVector (out, OLDVECTOR, TRUE)) == NULL) goto error;
-  /* check size of ivec, tvec: must match */
+  if (ivec->Nelements != tvec->Nelements) {
+    /* check size of ivec, tvec: must match */
+    gprint (GP_ERR, "logical expression has different length from input vector\n");
+    goto error;
+  }
 
   // ovec matches ivec in type
Index: /trunk/Ohana/src/opihi/cmd.data/vgauss.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/vgauss.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/vgauss.c	(revision 35109)
@@ -31,6 +31,13 @@
   }
 
+//   Guess = FALSE;
+//   if ((N = get_argument (argc, argv, "-guess"))) {
+//     Guess = TRUE;
+//     remove_argument (N, &argc, argv);
+//   }
+
   if (argc != 5) {
     gprint (GP_ERR, "USAGE: vgauss <x> <y> <dy> (out)\n");
+    gprint (GP_ERR, "  <dy> may be the words 'con[stant]' or 'poi[sson]', in which case the error is constructed'\n");
     gprint (GP_ERR, " uses guesses: C0 (mean), C1 (sigma), C2 (norm), C3 (sky)\n");
     return (FALSE);
@@ -39,6 +46,26 @@
   if ((xvec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
   if ((yvec = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);
-  if ((svec = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
   if ((ovec = SelectVector (argv[4], ANYVECTOR, TRUE)) == NULL) return (FALSE);
+
+  int Nsvec = strlen(argv[3]);
+
+  if ((Nsvec >= 3) && (!strncasecmp ("poisson", argv[3], Nsvec) || !strncasecmp ("constant", argv[3], Nsvec))) {
+    svec = SelectVector ("vgauss_err", ANYVECTOR, TRUE);
+    if (svec == NULL) return (FALSE);
+    MatchVector (svec, xvec, OPIHI_FLT);
+    v1 = svec[0].elements.Flt;
+    v2 = yvec[0].elements.Flt;
+    if (!strncasecmp ("poisson", argv[3], Nsvec)) {
+      for (i = 0; i < svec[0].Nelements; i++) {
+	v1[i] = (isfinite(v2[i]) && (v2[i] > 0)) ? sqrt(v2[i]) : 1.0;
+      }
+    } else {
+      for (i = 0; i < svec[0].Nelements; i++) {
+	v1[i] = 1.0;
+      }
+    }
+  } else {
+    if ((svec = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  }
 
   CastVector (xvec, OPIHI_FLT);
@@ -46,5 +73,4 @@
   CastVector (svec, OPIHI_FLT);
   // XXX Cast is failing.
-    
 
   Npts = xvec[0].Nelements;
@@ -58,4 +84,5 @@
   GET_VAR (par[3], "C3");
   Npar = 4;
+
 
   // mrqmin takes the inverse variance (do not generate NANs)
Index: /trunk/Ohana/src/opihi/cmd.data/vstats.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/vstats.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/vstats.c	(revision 35109)
@@ -123,5 +123,5 @@
 
     ALLOCATE (Nval, int, Nbin + 2);
-    bzero (Nval, Nbin*sizeof(int));
+    bzero (Nval, (Nbin + 2)*sizeof(int));
     var = 0;
     if (vec[0].type == OPIHI_FLT) {
Index: /trunk/Ohana/src/opihi/cmd.data/write_vectors.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/write_vectors.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/cmd.data/write_vectors.c	(revision 35109)
@@ -10,4 +10,9 @@
   Vector **vec;
 
+  if ((N = get_argument (argc, argv, "-h"))) goto usage;
+  if ((N = get_argument (argc, argv, "--h"))) goto usage;
+  if ((N = get_argument (argc, argv, "-help"))) goto usage;
+  if ((N = get_argument (argc, argv, "--help"))) goto usage;
+
   /* look for format option */
   format = (char *) NULL;
@@ -17,13 +22,18 @@
     remove_argument (N, &argc, argv);
   }
+  if ((N = get_argument (argc, argv, "-format"))) {
+    if (format) {
+      gprint (GP_ERR, "ERROR: do not mix -f and -format\n");
+      free (format);
+      return (FALSE);
+    }
+    remove_argument (N, &argc, argv);
+    format = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
 
   /* option generate a FITS output table */
   FITS = NULL;
   if ((N = get_argument (argc, argv, "-fits"))) {
-    if (format) {
-      gprint (GP_ERR, "ERROR: do not mix -fits and -format\n");
-      free (format);
-      return (FALSE);
-    }
     remove_argument (N, &argc, argv);
     FITS = strcreate (argv[N]);
@@ -61,5 +71,6 @@
 
   if (argc < 3) {
-    gprint (GP_ERR, "USAGE: write [-append] [-f \"format\"] file vector vector ...\n");
+    gprint (GP_ERR, "USAGE: write [options] file vector vector ...\n");
+    gprint (GP_ERR, "OPTIONS: [-header] [-append] [-f \"format\"] [-fits NAME] [-csv] [-h,--help]\n");
     return (FALSE);
   }
@@ -222,4 +233,30 @@
   return (TRUE);
 
+ usage:
+    gprint (GP_ERR, "USAGE: write [options] file vector vector ...\n");
+    gprint (GP_ERR, "OPTIONS: [-header] [-append] [-f \"format\"] [-fits NAME] [-csv] [-h,--help]\n\n");
+
+    gprint (GP_ERR, "OPTIONS: \n");
+    gprint (GP_ERR, "  -header : add a descriptive header line to ascii or csv output\n");
+    gprint (GP_ERR, "  -append : write to the end of the existing file\n");
+    gprint (GP_ERR, "  -fits NAME : write a fits table (extention name is NAME, column names match vector names)\n");
+    gprint (GP_ERR, "  -csv : write a comma-separated values file (eg, to read in excel)\n");
+    gprint (GP_ERR, "  -f \"format\" : provide formatting codes for output:\n");
+    gprint (GP_ERR, "    ascii / csv : format consists of c-style format codes in form %NN.Md\n");
+    gprint (GP_ERR, ",     the following codes are allowed\n");
+    gprint (GP_ERR, "        %e -- double, %f -- float\n");
+    gprint (GP_ERR, "        %d -- int, %c -- char, %x -- hex int\n");
+    gprint (GP_ERR, "    FITS : format consists of the following FITS binary table format codes:\n");
+    gprint (GP_ERR, "      B : 1 byte int\n");    
+    gprint (GP_ERR, "      I : 2 byte int\n");    
+    gprint (GP_ERR, "      J : 4 byte int\n");    
+    gprint (GP_ERR, "      K : 8 byte int\n");    
+    gprint (GP_ERR, "      D : 4 byte float\n");    
+    gprint (GP_ERR, "      F : 1 byte float\n");    
+    gprint (GP_ERR, "   -h : this help listing\n");
+    gprint (GP_ERR, "   --h : this help listing\n");
+    gprint (GP_ERR, "   -help : this help listing\n");
+    gprint (GP_ERR, "   --help : this help listing\n");
+    return FALSE;
 }
 
Index: /trunk/Ohana/src/opihi/dvo/dvo_host_utils.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dvo_host_utils.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/dvo/dvo_host_utils.c	(revision 35109)
@@ -295,2 +295,60 @@
   return TRUE;
 }
+
+// re-gather the remote results files: this can be used in case one of the clients failed,
+// and has since been re-run
+int HostTableGetResults (char *uniquer, int VERBOSE) {
+
+  int i;
+
+  // load the list of hosts
+  SkyTable *sky = GetSkyTable();
+  if (!sky) {
+    gprint (GP_ERR, "failed to load sky table for database\n");
+    return FALSE;
+  }
+
+  char *CATDIR = GetCATDIR ();
+  if (!CATDIR) {
+    gprint (GP_ERR, "failed to get CATDIR for database\n");
+    return FALSE;
+  }
+
+  HostTable *table = HostTableLoad (CATDIR, sky->hosts);
+  if (!table) {
+    gprint (GP_ERR, "ERROR: failure reading Host Table %s for database %s\n", sky->hosts, CATDIR);
+    return FALSE;
+  }    
+
+  // create the result file list
+  char name[256];
+  snprintf (name, 256, "RESULT_FILE:n");
+  set_int_variable (name, table->Nhosts);
+  snprintf (name, 256, "RESULT_DATA:n");
+  set_int_variable (name, table->Nhosts);
+  snprintf (name, 256, "RESULT_STATUS:n");
+  set_int_variable (name, table->Nhosts);
+
+  char results[DVO_MAX_PATH];
+
+  // load fields from file
+  for (i = 0; i < table->Nhosts; i++) {
+
+    // need to save the results filename with the uniquer
+    snprintf (results, DVO_MAX_PATH, "%s/dvo.results.%s.fits", table->hosts[i].pathname, uniquer);
+
+    snprintf (name, 256, "RESULT_FILE:%d", i);
+    set_str_variable (name, results);
+
+    // DATA : 0 (unread), 1 (read)
+    snprintf (name, 256, "RESULT_DATA:%d", i);
+    set_int_variable (name, 0);
+
+    // STATUS : 0 (normal exit), -1 (crash), N (failure exit status)
+    snprintf (name, 256, "RESULT_STATUS:%d", i);
+    set_int_variable (name, table->hosts[i].status);
+  }
+
+  free (table);
+  return TRUE;
+}
Index: /trunk/Ohana/src/opihi/dvo/gstar.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/gstar.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/dvo/gstar.c	(revision 35109)
@@ -1,3 +1,9 @@
 # include "dvoshell.h"
+
+typedef enum {
+  GSTAR_BY_SEQ,
+  GSTAR_BY_TIME,
+  GSTAR_BY_PHOTCODE,
+} GSTAR_SORT_CODES;
 
 typedef enum {
@@ -7,4 +13,5 @@
   GSTAR_FILTER_NAMES,
   GSTAR_SECF_FLAGS,
+  GSTAR_UCDIST,
   GSTAR_AVE_AP_MAG,
   GSTAR_AVE_MAG_20,
@@ -22,4 +29,19 @@
 void printPhotcodeSequence (Average *average, SecFilt *secfilt, int entry, int type);
 
+void sort_index_float (float *X, int *IDX, int N) {
+
+# define SWAPFUNC(A,B){ float tmp; int itmp; 	\
+  tmp = X[A]; X[A] = X[B]; X[B] = tmp; \
+  itmp = IDX[A]; IDX[A] = IDX[B]; IDX[B] = itmp; \
+}
+# define COMPARE(A,B)(X[A] < X[B])
+
+  OHANA_SORT (N, COMPARE, SWAPFUNC);
+
+# undef SWAPFUNC
+# undef COMPARE
+
+}
+
 int gstar (int argc, char **argv) {
   
@@ -30,5 +52,5 @@
   off_t i, Nstars, *N1;
   off_t j, k, m, N, Nlo, Nhi;
-  int Nsecfilt, NPTS, QUIET, FULL_OUTPUT, STACK_OUTPUT, INST;
+  int Nsecfilt, NPTS, QUIET, FULL_OUTPUT, STACK_OUTPUT, INST, SHOW_MASKS;
   int found, GetMeasures;
   int SaveVectors;
@@ -43,4 +65,16 @@
   Nsecfilt = GetPhotcodeNsecfilt ();
 
+  GSTAR_SORT_CODES sortCode = GSTAR_BY_SEQ;
+  if ((N = get_argument (argc, argv, "-sort"))) {
+    remove_argument (N, &argc, argv);
+    if (!strcasecmp (argv[N], "time")) {
+      sortCode = GSTAR_BY_TIME;
+    }
+    if (!strcasecmp (argv[N], "photcode")) {
+      sortCode = GSTAR_BY_PHOTCODE;
+    }
+    remove_argument (N, &argc, argv);
+  }
+
   QUIET = FALSE;
   if ((N = get_argument (argc, argv, "-q"))) {
@@ -52,4 +86,10 @@
   if ((N = get_argument (argc, argv, "-inst"))) {
     INST = TRUE;
+    remove_argument (N, &argc, argv);
+  }
+
+  SHOW_MASKS = FALSE;
+  if ((N = get_argument (argc, argv, "-masks"))) {
+    SHOW_MASKS = TRUE;
     remove_argument (N, &argc, argv);
   }
@@ -275,4 +315,8 @@
 	  gprint (GP_LOG, "\n");
 
+	  /* UCDIST */
+	  for (j = 0; j < Nsecfilt; j++) printPhotcodeSequence (&catalog.average[k], &catalog.secfilt[Nsecfilt*k], j, GSTAR_UCDIST);;
+	  gprint (GP_LOG, "\n");
+
 	  /* secfilt flags */
 	  for (j = 0; j < Nsecfilt; j++) printPhotcodeSequence (&catalog.average[k], &catalog.secfilt[Nsecfilt*k], j, GSTAR_SECF_FLAGS);
@@ -300,57 +344,96 @@
       }
       if (GetMeasures || SaveVectors) {
+
+	if (catalog.average[k].Nmeasure == 0) continue;
+
 	m = catalog.average[k].measureOffset;
+
+	int *index = NULL;
+	float *value = NULL;
+	ALLOCATE (index, int, catalog.average[k].Nmeasure);
+	ALLOCATE (value, float, catalog.average[k].Nmeasure);
+	for (j = 0; j < catalog.average[k].Nmeasure; j++) {
+	  index[j] = j + m;
+	  switch (sortCode) {
+	    case GSTAR_BY_SEQ:
+	      value[j] = j + m;
+	      break;
+	    case GSTAR_BY_PHOTCODE:
+	      value[j] = catalog.measure[j + m].photcode;
+	      break;
+	    case GSTAR_BY_TIME:
+	      value[j] = catalog.measure[j + m].t;
+	      break;
+	  }
+	}
+
+	sort_index_float (value, index, catalog.average[k].Nmeasure);
+
 	for (j = 0; j < catalog.average[k].Nmeasure; j++, m++) {
 
-	  Mcat = PhotCat (&catalog.measure[m]);
+	  int Nv = index[j];
+
+	  Mcat = PhotCat (&catalog.measure[Nv]);
 	  if (INST) {
-	    Mrel = PhotInst (&catalog.measure[m]);
+	    Mrel = PhotInst (&catalog.measure[Nv]);
 	  } else {
-	    Mrel = PhotRel (&catalog.measure[m], &catalog.average[k], &catalog.secfilt[k*Nsecfilt]);
+	    Mrel = PhotRel (&catalog.measure[Nv], &catalog.average[k], &catalog.secfilt[k*Nsecfilt]);
 	  }
 
 	  if (GetMeasures && !QUIET) {
-	    date = ohana_sec_to_date (catalog.measure[m].t);
+	    date = ohana_sec_to_date (catalog.measure[Nv].t);
 	    gprint (GP_LOG, "%6.3f ",  Mcat);
 	    gprint (GP_LOG, "%6.3f ",  Mrel);
-	    gprint (GP_LOG, "%5.3f  ", catalog.measure[m].dM);
+	    gprint (GP_LOG, "%6.3f  ", catalog.measure[Nv].dM);
 	    gprint (GP_LOG, "%20s  ",  date);
-	    gprint (GP_LOG, "%7.4f ",  catalog.measure[m].dR);
-	    gprint (GP_LOG, "%7.4f ",  catalog.measure[m].dD);
-	    gprint (GP_LOG, "0x%08x ", catalog.measure[m].photFlags);
-	    gprint (GP_LOG, "0x%08x ", catalog.measure[m].dbFlags);
-	    gprint (GP_LOG, "%5d ",    catalog.measure[m].photcode);
-	    gprint (GP_LOG, "%-20s ",  GetPhotcodeNamebyCode (catalog.measure[m].photcode));
- 	    gprint (GP_LOG, "%5.2f ",  FromShortPixels(catalog.measure[m].FWx));
-	    gprint (GP_LOG, "%5.2f ",  FromShortPixels(catalog.measure[m].FWy));
+	    gprint (GP_LOG, "%7.4f ",  catalog.measure[Nv].dR);
+	    gprint (GP_LOG, "%7.4f ",  catalog.measure[Nv].dD);
+	    gprint (GP_LOG, "0x%08x ", catalog.measure[Nv].photFlags);
+	    gprint (GP_LOG, "0x%08x ", catalog.measure[Nv].dbFlags);
+	    if (SHOW_MASKS) {
+	      gprint (GP_LOG, "%5d ",    catalog.measure[Nv].photcode);
+	      PhotCode *code = GetPhotcodebyCode (catalog.measure[Nv].photcode);
+	      int badMask = 0;
+	      int poorMask = 0;
+	      if (code) {
+		badMask = catalog.measure[Nv].photFlags & code->photomBadMask;
+		poorMask = catalog.measure[Nv].photFlags & code->photomPoorMask;
+	      }
+	      gprint (GP_LOG, "0x%08x ", poorMask);
+	      gprint (GP_LOG, "0x%08x ", badMask);
+	    }
+	    gprint (GP_LOG, "%5d ",    catalog.measure[Nv].photcode);
+	    gprint (GP_LOG, "%-20s ",  GetPhotcodeNamebyCode (catalog.measure[Nv].photcode));
+ 	    gprint (GP_LOG, "%5.2f ",  FromShortPixels(catalog.measure[Nv].FWx));
+	    gprint (GP_LOG, "%5.2f ",  FromShortPixels(catalog.measure[Nv].FWy));
 
 	    if (FULL_OUTPUT) {
-		gprint (GP_LOG, "%6.3f ", catalog.measure[m].Mcal);
-		gprint (GP_LOG, "%6.3f ", catalog.measure[m].Map);
-		gprint (GP_LOG, "%6.3f ", catalog.measure[m].Mkron);
-		gprint (GP_LOG, "%6.3f ", catalog.measure[m].dMkron);
-		gprint (GP_LOG, "%5.1f ", pow(10.0, 0.4*catalog.measure[m].dt));
-		gprint (GP_LOG, "%5.3f ", catalog.measure[m].airmass);
-		gprint (GP_LOG, "%6.1f ", catalog.measure[m].az);
-		gprint (GP_LOG, "%6.1f ", catalog.measure[m].Xccd);
-		gprint (GP_LOG, "%6.1f ", catalog.measure[m].Yccd);
-		gprint (GP_LOG, "%3.1f ", FromShortPixels(catalog.measure[m].dXccd));
-		gprint (GP_LOG, "%3.1f ", FromShortPixels(catalog.measure[m].dYccd));
-		gprint (GP_LOG, "%6.1f ", catalog.measure[m].Sky);
-		gprint (GP_LOG, "%5.1f ", catalog.measure[m].dSky);
-		gprint (GP_LOG, "%8d ", catalog.measure[m].averef);
-		gprint (GP_LOG, "0x%08x ", catalog.measure[m].detID);
-		gprint (GP_LOG, "0x%08x ", catalog.measure[m].imageID);
-		gprint (GP_LOG, "%.3f ", catalog.measure[m].psfQF);
-		gprint (GP_LOG, "%.1f ", catalog.measure[m].psfChisq);
-		gprint (GP_LOG, "%.1f ", catalog.measure[m].crNsigma);
-		gprint (GP_LOG, "%.1f ", catalog.measure[m].extNsigma);
-		gprint (GP_LOG, "%.1f ", FromShortDegrees(catalog.measure[m].theta));
+		gprint (GP_LOG, "%6.3f ", catalog.measure[Nv].Mcal);
+		gprint (GP_LOG, "%6.3f ", catalog.measure[Nv].Map);
+		gprint (GP_LOG, "%6.3f ", catalog.measure[Nv].Mkron);
+		gprint (GP_LOG, "%6.3f ", catalog.measure[Nv].dMkron);
+		gprint (GP_LOG, "%5.1f ", pow(10.0, 0.4*catalog.measure[Nv].dt));
+		gprint (GP_LOG, "%5.3f ", catalog.measure[Nv].airmass);
+		gprint (GP_LOG, "%6.1f ", catalog.measure[Nv].az);
+		gprint (GP_LOG, "%6.1f ", catalog.measure[Nv].Xccd);
+		gprint (GP_LOG, "%6.1f ", catalog.measure[Nv].Yccd);
+		gprint (GP_LOG, "%3.1f ", FromShortPixels(catalog.measure[Nv].dXccd));
+		gprint (GP_LOG, "%3.1f ", FromShortPixels(catalog.measure[Nv].dYccd));
+		gprint (GP_LOG, "%6.1f ", catalog.measure[Nv].Sky);
+		gprint (GP_LOG, "%5.1f ", catalog.measure[Nv].dSky);
+		gprint (GP_LOG, "%8d ", catalog.measure[Nv].averef);
+		gprint (GP_LOG, "0x%08x ", catalog.measure[Nv].detID);
+		gprint (GP_LOG, "0x%08x ", catalog.measure[Nv].imageID);
+		gprint (GP_LOG, "%.3f ", catalog.measure[Nv].psfQF);
+		gprint (GP_LOG, "%.1f ", catalog.measure[Nv].psfChisq);
+		gprint (GP_LOG, "%.1f ", catalog.measure[Nv].crNsigma);
+		gprint (GP_LOG, "%.1f ", catalog.measure[Nv].extNsigma);
+		gprint (GP_LOG, "%.1f ", FromShortDegrees(catalog.measure[Nv].theta));
 	    }
 	    if (STACK_OUTPUT) {
-		gprint (GP_LOG, "%10.3e ", catalog.measure[m].FluxPSF);
-		gprint (GP_LOG, "%10.3e ", catalog.measure[m].dFluxPSF);
-		gprint (GP_LOG, "%10.3e ", catalog.measure[m].FluxKron);
-		gprint (GP_LOG, "%10.3e ", catalog.measure[m].dFluxKron);
+		gprint (GP_LOG, "%10.3e ", catalog.measure[Nv].FluxPSF);
+		gprint (GP_LOG, "%10.3e ", catalog.measure[Nv].dFluxPSF);
+		gprint (GP_LOG, "%10.3e ", catalog.measure[Nv].FluxKron);
+		gprint (GP_LOG, "%10.3e ", catalog.measure[Nv].dFluxKron);
 	    }
 	    gprint (GP_LOG, "\n");
@@ -361,9 +444,9 @@
 	  if (SaveVectors) {
 	    vec1[0].elements.Flt[N] = Mcat;
-	    vec2[0].elements.Flt[N] = TimeValue (catalog.measure[m].t, TimeReference, TimeFormat);
-	    vec3[0].elements.Flt[N] = catalog.measure[m].airmass;
-	    vec4[0].elements.Flt[N] = catalog.measure[m].photcode;
-	    vec5[0].elements.Flt[N] = catalog.measure[m].dR;
-	    vec6[0].elements.Flt[N] = catalog.measure[m].dD;
+	    vec2[0].elements.Flt[N] = TimeValue (catalog.measure[Nv].t, TimeReference, TimeFormat);
+	    vec3[0].elements.Flt[N] = catalog.measure[Nv].airmass;
+	    vec4[0].elements.Flt[N] = catalog.measure[Nv].photcode;
+	    vec5[0].elements.Flt[N] = catalog.measure[Nv].dR;
+	    vec6[0].elements.Flt[N] = catalog.measure[Nv].dD;
 	    N ++;
 	    if (N == NPTS - 1) {
@@ -378,4 +461,6 @@
 	  }
 	}
+	free (value);
+	free (index);
       }
     }
@@ -495,4 +580,12 @@
       break;
 
+    case GSTAR_UCDIST: /* ubercal distance */
+      if (seq == -1) {
+	gprint (GP_LOG, "%5d ", 0);
+      } else {
+	gprint (GP_LOG, "%5d ", secfilt[seq].ubercalDist);
+      }
+      break;
+
     case GSTAR_AVE_AP_MAG: /* average ap mags */
       if (seq == -1) {
Index: /trunk/Ohana/src/opihi/dvo/remote.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/remote.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/dvo/remote.c	(revision 35109)
@@ -26,4 +26,5 @@
     gprint (GP_ERR, "  -v : verbose mode:\n");
     gprint (GP_ERR, "OR:    remote -reload (uniquer)\n");
+    gprint (GP_ERR, "OR:    remote -get-results (uniquer)\n");
     return FALSE;
   }
@@ -48,4 +49,16 @@
   }
 
+  if ((N = get_argument (argc, argv, "-get-results"))) {
+    remove_argument (N, &argc, argv);
+    if (argc != 2) {
+      gprint (GP_ERR, "USAGE: remote -get-results (uniquer)\n");
+      gprint (GP_ERR, " (uniquer) is the element in the middle of the results file\n");
+      gprint (GP_ERR, " eg: dvo.results.XXXXX.YYYYY.fits\n");
+      return FALSE;
+    }
+    int status = HostTableGetResults (argv[1], VERBOSE);
+    return status;
+  }
+
   // strip of the 'remote' and send the remaining arguments to the remote machine
   int status = HostTableParallelOps (argc - 1, &argv[1], NULL, ReadVectors, 0, VERBOSE);
Index: /trunk/Ohana/src/opihi/include/dvoshell.h
===================================================================
--- /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 35108)
+++ /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 35109)
@@ -102,4 +102,5 @@
 int          HostTableParallelOps   PROTO((int argc, char **argv, char *ResultFile, int ReadVectors, int Nelements, int VERBOSE));
 int          HostTableReloadResults PROTO((char *uniquer, int VERBOSE));
+int          HostTableGetResults    PROTO((char *uniquer, int VERBOSE));
 
 # endif // DVOSHELL_H
Index: /trunk/Ohana/src/opihi/lib.shell/VectorIO.c
===================================================================
--- /trunk/Ohana/src/opihi/lib.shell/VectorIO.c	(revision 35108)
+++ /trunk/Ohana/src/opihi/lib.shell/VectorIO.c	(revision 35109)
@@ -23,5 +23,5 @@
 	goto escape;
       }
-      if ((*ptr != 'B') && (*ptr != 'I') && (*ptr != 'J') && (*ptr != 'D') && (*ptr != 'E')) {
+      if ((*ptr != 'B') && (*ptr != 'I') && (*ptr != 'J') && (*ptr != 'K') && (*ptr != 'D') && (*ptr != 'E')) {
 	gprint (GP_ERR, "error in binary table format %s: invalid character %c\n", format, *ptr);
 	goto escape;
