Index: trunk/Ohana/src/opihi/cmd.data/Makefile
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 34844)
+++ 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 34844)
+++ 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 34844)
+++ 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 34844)
+++ 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 34844)
+++ 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 34844)
+++ 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 34844)
+++ 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 34844)
+++ 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 34844)
+++ 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;
 }
 
