Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/cgrid.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/cgrid.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/cgrid.c	(revision 20857)
@@ -391,5 +391,5 @@
   graphmode.ptype = 100; /* connect a pair */
   graphmode.etype = 0;
-  PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+  PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
 
   free (Xvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/cplot.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/cplot.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/cplot.c	(revision 20857)
@@ -23,4 +23,7 @@
   if ((yvec = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);
 
+  REQUIRE_VECTOR_FLT (xvec, FALSE); 
+  REQUIRE_VECTOR_FLT (yvec, FALSE); 
+
   if (xvec[0].Nelements != yvec[0].Nelements) {
     gprint (GP_ERR, "vectors are not the same length\n");
@@ -41,5 +44,5 @@
   Npts = 0;
   for (i = 0; i < Xvec.Nelements; i++, r++, d++) {
-      *r = ohana_normalize_angle (*r);
+    *r = ohana_normalize_angle (*r);
     while (*r < Rmin) *r += 360.0;
     while (*r > Rmax) *r -= 360.0;
@@ -77,5 +80,5 @@
 
   graphmode.etype = 0;
-  PlotVectorPair (kapa, Npts, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+  PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
   
   free (Xvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/czplot.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/czplot.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.astro/czplot.c	(revision 20857)
@@ -3,7 +3,7 @@
 int czplot (int argc, char **argv) {
   
-  int i, kapa, Npts;
+  int i, kapa;
   double min, range, Rmin, Rmax;
-  opihi_flt *in, *out, *r, *d, *x, *y;
+  opihi_flt *out, *r, *d, *x, *y;
   Vector Xvec, Yvec, Zvec, *xvec, *yvec, *zvec;
   Graphdata graphmode;
@@ -26,4 +26,7 @@
   if ((zvec = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
 
+  REQUIRE_VECTOR_FLT (xvec, FALSE); 
+  REQUIRE_VECTOR_FLT (yvec, FALSE); 
+
   if (xvec[0].Nelements != yvec[0].Nelements) {
     gprint (GP_ERR, "vectors %s and %s not the same length\n", argv[1], argv[2]);
@@ -43,12 +46,22 @@
   r   = xvec[0].elements.Flt;
   d   = yvec[0].elements.Flt;
-  in  = zvec[0].elements.Flt;
   x   = Xvec.elements.Flt;
   y   = Yvec.elements.Flt;
-  out = Zvec.elements.Flt;
-  for (i = 0; i < Zvec.Nelements; i++, in++, out++, r++, d++, x++, y++) {
-    *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+  for (i = 0; i < Zvec.Nelements; i++, r++, d++, x++, y++) {
     *r = ohana_normalize_angle (*r);
     RD_to_XY (x, y, *r, *d, &graphmode.coords);
+  }
+
+  out = Zvec.elements.Flt;
+  if (zvec->type == OPIHI_FLT) {
+    opihi_flt *in  = zvec[0].elements.Flt;
+    for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
+      *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+    }
+  } else {
+    opihi_int *in  = zvec[0].elements.Int;
+    for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
+      *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+    }
   }
 
@@ -56,6 +69,5 @@
   graphmode.size = -1; /* point size determined by Zvec */
   graphmode.etype = 0;
-  Npts = Xvec.Nelements;
-  PlotVectorTriplet (kapa, Npts, Xvec.elements.Flt, Yvec.elements.Flt, Zvec.elements.Flt, &graphmode);
+  PlotVectorTriplet (kapa, Xvec, Yvec, Zvec, &graphmode);
 
   free (Xvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/grid.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/grid.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/grid.c	(revision 20857)
@@ -193,5 +193,5 @@
   graphmode.ptype = 100; /* connect a pair */
   graphmode.etype = 0;
-  PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+  PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
 
   free (Xvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/interpolate.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/interpolate.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/interpolate.c	(revision 20857)
@@ -21,6 +21,8 @@
   if ((yout = SelectVector (argv[4],  ANYVECTOR, TRUE)) == NULL) return (FALSE);
 
-  yout[0].Nelements = xout[0].Nelements;
-  REALLOCATE (yout[0].elements.Flt, opihi_flt, yout[0].Nelements);
+  REQUIRE_VECTOR_FLT (in, FALSE); 
+  REQUIRE_VECTOR_FLT (xv, FALSE); 
+  REQUIRE_VECTOR_FLT (yv, FALSE); 
+  ResetVector (yout, OPIHI_FLT, xout[0].Nelements);
 
   dx = xin[0].elements.Flt[1] - xin[0].elements.Flt[0];
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/lookup.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/lookup.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/lookup.c	(revision 20857)
@@ -17,4 +17,8 @@
   if ((yv  = SelectVector (argv[4], OLDVECTOR, TRUE)) == NULL) return (FALSE);
 
+  REQUIRE_VECTOR_FLT (in, FALSE); 
+  REQUIRE_VECTOR_FLT (xv, FALSE); 
+  REQUIRE_VECTOR_FLT (yv, FALSE); 
+
   if (xv[0].Nelements != yv[0].Nelements) {
       gprint (GP_ERR, "unmatched lookup table lengths\n");
@@ -22,6 +26,5 @@
   }
 
-  out[0].Nelements = in[0].Nelements;
-  REALLOCATE (out[0].elements.Flt, opihi_flt, out[0].Nelements);
+  ResetVector (out, OPIHI_FLT, in[0].Nelements);
 
   ip = in[0].elements.Flt;
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/medacc.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/medacc.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/medacc.c	(revision 20857)
@@ -21,4 +21,7 @@
   if ((out = SelectVector (argv[2], ANYVECTOR, TRUE)) == NULL) return (FALSE);
 
+  REQUIRE_VECTOR_FLT (val, FALSE); 
+  REQUIRE_VECTOR_FLT (key, FALSE); 
+
   start = atof (argv[4]);
   end   = atof (argv[5]);
@@ -34,6 +37,5 @@
   Nbins = 1 + (int)((end - start) / delta);
 
-  out[0].Nelements = Nbins;
-  REALLOCATE (out[0].elements.Flt, opihi_flt, out[0].Nelements);
+  ResetVector (out, OPIHI_FLT, Nbins);
   bzero (out[0].elements.Flt, sizeof(opihi_flt)*out[0].Nelements);
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/mget.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/mget.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/mget.c	(revision 20857)
@@ -33,6 +33,6 @@
 
   if (xdir) {
-    vec[0].Nelements = Npix = Nx;
-    REALLOCATE (vec[0].elements.Flt, opihi_flt, Npix);
+    Npix = Nx;
+    ResetVector (vec, OPIHI_FLT, Nx);
     if (Nset >= Ny) {
       gprint (GP_ERR, "row out of range\n");
@@ -45,6 +45,6 @@
     }
   } else {
-    vec[0].Nelements = Npix = Ny;
-    REALLOCATE (vec[0].elements.Flt, opihi_flt, Npix);
+    Npix = Ny;
+    ResetVector (vec, OPIHI_FLT, Ny);
     if (Nset >= Nx) {
       gprint (GP_ERR, "column out of range\n");
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/mset.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/mset.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/mset.c	(revision 20857)
@@ -4,5 +4,4 @@
   
   int i, Nx, Ny, Npix, xdir, Nset;
-  opihi_flt *in;
   float *out;
   Buffer *buf;
@@ -43,9 +42,18 @@
     }
     out = (float *) buf[0].matrix.buffer + Nx*Nset;
-    in = vec[0].elements.Flt;
-    for (i = 0; i < Npix; i++, in++, out++) {
-      *out = *in;
+
+    if (vec[0].type == OPIHI_FLT) {
+      opihi_flt *in = vec[0].elements.Flt;
+      for (i = 0; i < Npix; i++, in++, out++) {
+	*out = *in;
+      }
+    } else {
+      opihi_int *in = vec[0].elements.Int;
+      for (i = 0; i < Npix; i++, in++, out++) {
+	*out = *in;
+      }
     }
     return (TRUE);
+
   } else {
     if (Ny != Npix) {
@@ -58,7 +66,15 @@
     }
     out = (float *) buf[0].matrix.buffer + Nset;
-    in = vec[0].elements.Flt;
-    for (i = 0; i < Npix; i++, in++, out+=Nx) {
-      *out = *in;
+
+    if (vec[0].type == OPIHI_FLT) {
+      opihi_flt *in = vec[0].elements.Flt;
+      for (i = 0; i < Npix; i++, in++, out+=Nx) {
+	*out = *in;
+      }
+    } else {
+      opihi_int *in = vec[0].elements.Int;
+      for (i = 0; i < Npix; i++, in++, out+=Nx) {
+	*out = *in;
+      }
     }
     return (TRUE);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/peak.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/peak.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/peak.c	(revision 20857)
@@ -26,23 +26,37 @@
     end   = atof (argv[4]);
   } else {
-    start = vecx[0].elements.Flt[0];
-    end   = vecx[0].elements.Flt[vecx[0].Nelements - 1];
+    start = (vecx[0].type == OPIHI_FLT) ? vecx[0].elements.Flt[0] : vecx[0].elements.Int[0];
+    end   = (vecx[0].type == OPIHI_FLT) ? vecx[0].elements.Flt[vecx[0].Nelements - 1] : vecx[0].elements.Int[vecx[0].Nelements - 1];
   }
 
-  X = vecx[0].elements.Flt;
-  Y = vecy[0].elements.Flt;
+  imax = -1;
 
-  imax = -1;
-  xmax = *X;
-  ymax = *Y;
-  for (i = 1; i < vecx[0].Nelements-1; i++, X++, Y++) {
-    if ((*X >= start) && (*X <= end)) {
-      if ((imax == -1) || (*Y > ymax)) {
-	xmax = *X;
-	ymax = *Y;
-	imax = i;
+  if (vecx[0].type == OPIHI_FLT) {
+    opihi_flt *X = vecx[0].elements.Flt;
+    xmax = X[start];
+    ymax = (vecy[0].type == OPIHI_FLT) ? vecy[0].elements.Flt[start] : vecy[0].elements.Int[start];
+    for (i = 1; i < vecx[0].Nelements-1; i++, X++, Y++) {
+      if ((*X >= start) && (*X <= end)) {
+	if ((imax == -1) || (*Y > ymax)) {
+	  xmax = *X;
+	  ymax = (vecy[0].type == OPIHI_FLT) ? vecy[0].elements.Flt[i] : vecy[0].elements.Int[i];
+	  imax = i;
+	}
       }
-    }
-  }      
+    }      
+  } else {
+    opihi_int *X = vecx[0].elements.Int;
+    xmax = X[start];
+    ymax = (vecy[0].type == OPIHI_FLT) ? vecy[0].elements.Flt[start] : vecy[0].elements.Int[start];
+    for (i = 1; i < vecx[0].Nelements-1; i++, X++, Y++) {
+      if ((*X >= start) && (*X <= end)) {
+	if ((imax == -1) || (*Y > ymax)) {
+	  xmax = *X;
+	  ymax = (vecy[0].type == OPIHI_FLT) ? vecy[0].elements.Flt[i] : vecy[0].elements.Int[i];
+	  imax = i;
+	}
+      }
+    }      
+  }
 
   set_variable ("peakval", ymax);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/periodogram.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/periodogram.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/periodogram.c	(revision 20857)
@@ -28,4 +28,7 @@
   if ((power = SelectVector (argv[6], ANYVECTOR, TRUE)) == NULL) return (FALSE);
 
+  REQUIRE_VECTOR_FLT (time, FALSE); 
+  REQUIRE_VECTOR_FLT (flux, FALSE); 
+
   /* find the max baseline, mean, and variance */
   minT = maxT = time[0].elements.Flt[0];
@@ -56,6 +59,6 @@
   Np = 0;
   NP = 100;
-  REALLOCATE (power[0].elements.Flt, opihi_flt, NP);
-  REALLOCATE (period[0].elements.Flt, opihi_flt, NP);
+  ResetVector (power,  OPIHI_FLT, NP);
+  ResetVector (period, OPIHI_FLT, NP);
 
   P = minP;
@@ -106,8 +109,6 @@
   }
 
-  power[0].Nelements = Np;
-  period[0].Nelements = Np;
-  REALLOCATE (power[0].elements.Flt, opihi_flt, Np);
-  REALLOCATE (period[0].elements.Flt, opihi_flt, Np);
+  ResetVector (power,  OPIHI_FLT, Np);
+  ResetVector (period, OPIHI_FLT, Np);
  
   return (TRUE);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/plot.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/plot.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/plot.c	(revision 20857)
@@ -58,13 +58,13 @@
   if (!KapaPrepPlot (kapa, Npts, &graphmode)) return (FALSE);
   
-  PlotVectorSingle (kapa, Npts, xvec[0].elements.Flt, "x");
-  PlotVectorSingle (kapa, Npts, yvec[0].elements.Flt, "y");
+  PlotVectorSingle (kapa, xvec, "x");
+  PlotVectorSingle (kapa, yvec, "y");
   if (graphmode.etype & 0x01) {
-    PlotVectorSingle (kapa, Npts, dymvec[0].elements.Flt, "dym");
-    PlotVectorSingle (kapa, Npts, dypvec[0].elements.Flt, "dyp");
+    PlotVectorSingle (kapa, dymvec, "dym");
+    PlotVectorSingle (kapa, dypvec, "dyp");
   }
   if (graphmode.etype & 0x02) {
-    PlotVectorSingle (kapa, Npts, dxmvec[0].elements.Flt, "dxm");
-    PlotVectorSingle (kapa, Npts, dxpvec[0].elements.Flt, "dxp");
+    PlotVectorSingle (kapa, dxmvec, "dxm");
+    PlotVectorSingle (kapa, dxpvec, "dxp");
   }
   return (TRUE);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/read_vectors.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 20857)
@@ -70,4 +70,5 @@
       return (FALSE);    
     }
+    // XXX we could allow flags (eg, N.i) to specify INT vs FLT types vectors...
     colstr = argv[2*i+2];
     for (j = 0; j < strlen (colstr); j++) {
@@ -81,8 +82,9 @@
     col[i] = atof (colstr);
   }
-  
+
+  // currently, all read vectors are forced to be type FLT
   NELEM = 1000;
   for (i = 0; i < Nvec; i++) {
-    REALLOCATE (vec[i][0].elements.Flt, opihi_flt, NELEM);
+    ResetVector (vec[i], OPIHI_FLT, NELEM);
   }
   
@@ -122,5 +124,5 @@
 	  status = dparse (&value, col[i], c0);
 	  vec[i][0].elements.Flt[N] = value;
-	  if (!status) vec[i][0].elements.Flt[N] = 0.0/0.0;
+	  if (!status) vec[i][0].elements.Flt[N] = NAN;
 	}
 	if (status) N++;
@@ -260,5 +262,11 @@
     }
     if (Nval == 0) ESCAPE ("no data for field in table");
-
+    
+    vecType = OPIHI_INT;
+    if (!strcmp (type, "double") || !strcmp (type, "float")) {
+      vecType = OPIHI_FLT;
+    }
+	
+    // define the multifield vector names
     ALLOCATE (vec, Vector *, Nval);
     for (j = 0; j < Nval; j++) {
@@ -268,6 +276,5 @@
 	sprintf (name, "%s:%d", argv[i], j);
       if ((vec[j] = SelectVector (name, ANYVECTOR, TRUE)) == NULL) ESCAPE ("bad vector name");
-      REALLOCATE (vec[j][0].elements.Flt, opihi_flt, MAX (Ny,1));
-      vec[j][0].Nelements = Ny;
+      ResetVector (vec[j], vecType, MAX (Ny,1));
     }
 
@@ -292,5 +299,5 @@
       for (j = 0; j < Ny; j++) {
 	for (k = 0; k < Nval; k++, Pi++) {
-	  vec[k][0].elements.Flt[j] = *Pi;
+	  vec[k][0].elements.Int[j] = *Pi;
 	}
       }
@@ -300,5 +307,5 @@
       for (j = 0; j < Ny; j++) {
 	for (k = 0; k < Nval; k++, Ps++) {
-	  vec[k][0].elements.Flt[j] = *Ps;
+	  vec[k][0].elements.Int[j] = *Ps;
 	}
       }
@@ -308,5 +315,5 @@
       for (j = 0; j < Ny; j++) {
 	for (k = 0; k < Nval; k++, Pc++) {
-	  vec[k][0].elements.Flt[j] = *Pc;
+	  vec[k][0].elements.Int[j] = *Pc;
 	}
       }
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/select.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/select.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/select.c	(revision 20857)
@@ -27,10 +27,51 @@
   /* check size of in1, in2, tvec: must match */
 
-  REALLOCATE (ovec[0].elements.Flt, opihi_flt, MAX (tvec[0].Nelements, 1));
-  for (i = 0; i < tvec[0].Nelements; i++) {
-    ovec[0].elements.Flt[i] = tvec[0].elements.Flt[i] ? in1[0].elements.Flt[i] : in2[0].elements.Flt[i];
+  if ((in1->type == OPIHI_INT) && (in2->type == OPIHI_INT)) {
+    ResetVector (ovec, OPIHI_INT, MAX (tvec[0].Nelements, 1));
+  } else {
+    ResetVector (ovec, OPIHI_FLT, MAX (tvec[0].Nelements, 1));
   }
-  ovec[0].Nelements = tvec[0].Nelements;
-  REALLOCATE (ovec[0].elements.Flt, opihi_flt, MAX (ovec[0].Nelements, 1));
+
+  // (in1 and in2) == (flt or int) and tvec == (flt or int)
+  if ((in1->type == OPIHI_FLT) && (in2->type == OPIHI_FLT) && (tvec->type == OPIHI_FLT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Flt[i] = tvec[0].elements.Flt[i] ? in1[0].elements.Flt[i] : in2[0].elements.Flt[i];
+    }
+  }
+  if ((in1->type == OPIHI_FLT) && (in2->type == OPIHI_FLT) && (tvec->type == OPIHI_INT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Flt[i] = tvec[0].elements.Int[i] ? in1[0].elements.Flt[i] : in2[0].elements.Flt[i];
+    }
+  }
+  if ((in1->type == OPIHI_INT) && (in2->type == OPIHI_FLT) && (tvec->type == OPIHI_FLT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Flt[i] = tvec[0].elements.Flt[i] ? in1[0].elements.Int[i] : in2[0].elements.Flt[i];
+    }
+  }
+  if ((in1->type == OPIHI_INT) && (in2->type == OPIHI_FLT) && (tvec->type == OPIHI_INT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Flt[i] = tvec[0].elements.Int[i] ? in1[0].elements.Int[i] : in2[0].elements.Flt[i];
+    }
+  }
+  if ((in1->type == OPIHI_FLT) && (in2->type == OPIHI_INT) && (tvec->type == OPIHI_FLT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Flt[i] = tvec[0].elements.Flt[i] ? in1[0].elements.Flt[i] : in2[0].elements.Int[i];
+    }
+  }
+  if ((in1->type == OPIHI_FLT) && (in2->type == OPIHI_INT) && (tvec->type == OPIHI_INT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Flt[i] = tvec[0].elements.Int[i] ? in1[0].elements.Flt[i] : in2[0].elements.Int[i];
+    }
+  }
+  if ((in1->type == OPIHI_INT) && (in2->type == OPIHI_INT) && (tvec->type == OPIHI_FLT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Int[i] = tvec[0].elements.Flt[i] ? in1[0].elements.Int[i] : in2[0].elements.Int[i];
+    }
+  }
+  if ((in1->type == OPIHI_INT) && (in2->type == OPIHI_INT) && (tvec->type == OPIHI_INT)) {
+    for (i = 0; i < tvec[0].Nelements; i++) {
+      ovec[0].elements.Int[i] = tvec[0].elements.Int[i] ? in1[0].elements.Int[i] : in2[0].elements.Int[i];
+    }
+  }
   
   DeleteVector (tvec);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/sort.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/sort.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/sort.c	(revision 20857)
@@ -1,7 +1,22 @@
 # include "data.h"
 
-void sortindex (double *X, int *IDX, int N) {
+void fsortindex (opihi_flt *X, int *IDX, int N) {
 
-# define SWAPFUNC(A,B){ double tmp; int itmp; 	\
+# define SWAPFUNC(A,B){ opihi_flt 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
+
+}
+
+void isortindex (opihi_int *X, int *IDX, int N) {
+
+# define SWAPFUNC(A,B){ opihi_int tmp; int itmp; 	\
   tmp = X[A]; X[A] = X[B]; X[B] = tmp; \
   itmp = IDX[A]; IDX[A] = IDX[B]; IDX[B] = itmp; \
@@ -19,5 +34,6 @@
   
   int i, j, Nvec, Nval;
-  opihi_flt *temp, *T, *V;
+  opihi_flt *ftemp;
+  opihi_int *itemp;
   int *index, *I;
   Vector **vec;
@@ -51,22 +67,40 @@
   }
   
-  /* create index (use float to use sortpair) */
+  /* create index */
   ALLOCATE (index, int, Nval);
   for (i = 0; i < Nval; i++) index[i] = i;
 
   /* sort key & index */
-  sortindex (vec[0][0].elements.Flt, index, Nval);
+  if (vec[0][0].type == OPIHI_FLT) {
+    fsortindex (vec[0][0].elements.Flt, index, Nval);
+  } else {
+    isortindex (vec[0][0].elements.Int, index, Nval);
+  }
 
-  ALLOCATE (temp, opihi_flt, Nval);
+  ALLOCATE (ftemp, opihi_flt, Nval);
+  ALLOCATE (itemp, opihi_int, Nval);
+
   for (i = 1; i < Nvec; i++) {
-    T = temp;
-    V = vec[i][0].elements.Flt;
-    I = index;
-    for (j = 0; j < Nval; j++, T++, I++) {
-      *T = V[*I];
+    if (vec[i][0].type == OPIHI_FLT) {
+      opihi_flt *T = ftemp;
+      opihi_flt *V = vec[i][0].elements.Flt;
+      I = index;
+      for (j = 0; j < Nval; j++, T++, I++) {
+	*T = V[*I];
+      }
+      /* swap .elements.Flt (== V) and ftemp */ 
+      vec[i][0].elements.Flt = ftemp;
+      ftemp = V;
+    } else {
+      opihi_int *T = itemp;
+      opihi_int *V = vec[i][0].elements.Int;
+      I = index;
+      for (j = 0; j < Nval; j++, T++, I++) {
+	*T = V[*I];
+      }
+      /* swap .elements.Flt (== V) and itemp */ 
+      vec[i][0].elements.Flt = itemp;
+      itemp = V;
     }
-    /* swap .elements.Flt (== V) and temp */ 
-    vec[i][0].elements.Flt = temp;
-    temp = V;
   }
   free (temp);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/subset.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/subset.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/subset.c	(revision 20857)
@@ -6,5 +6,5 @@
   
   char *out;
-  int  i, j, size;
+  int  i, Npts, size;
   Vector *ivec, *ovec, *tvec;
 
@@ -28,13 +28,47 @@
   /* check size of ivec, tvec: must match */
 
-  REALLOCATE (ovec[0].elements.Flt, opihi_flt, MAX (tvec[0].Nelements, 1));
-  for (j = i = 0; i < tvec[0].Nelements; i++) {
-    if (tvec[0].elements.Flt[i]) {
-      ovec[0].elements.Flt[j] = ivec[0].elements.Flt[i];
-      j++;
+  // ovec matches ivec in type
+  ResetVector (ovec, ivec->type, MAX (tvec[0].Nelements, 1));
+
+  // we have four cases: (ivec == flt or int) and (tvec == flt or int)
+  if ((ivec->type == OPIHI_FLT) && (tvec->type == OPIHI_FLT)) {
+    opihi_flt *vi = ivec[0].elements.Flt;
+    opihi_flt *vt = tvec[0].elements.Flt;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Flt[Npts] = *vi;
+      Npts++;
     }
   }
-  ovec[0].Nelements = j;
-  REALLOCATE (ovec[0].elements.Flt, opihi_flt, MAX (ovec[0].Nelements, 1));
+  if ((ivec->type == OPIHI_FLT) && (tvec->type == OPIHI_INT)) {
+    opihi_flt *vi = ivec[0].elements.Flt;
+    opihi_int *vt = tvec[0].elements.Int;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Flt[Npts] = *vi;
+      Npts++;
+    }
+  }
+  if ((ivec->type == OPIHI_INT) && (tvec->type == OPIHI_FLT)) {
+    opihi_int *vi = ivec[0].elements.Int;
+    opihi_flt *vt = tvec[0].elements.Flt;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Int[Npts] = *vi;
+      Npts++;
+    }
+  }
+  if ((ivec->type == OPIHI_INT) && (tvec->type == OPIHI_INT)) {
+    opihi_int *vi = ivec[0].elements.Int;
+    opihi_int *vt = tvec[0].elements.Int;
+    for (Npts = i = 0; i < tvec[0].Nelements; i++, vi++, vt++) {
+      if (!*vt) continue;
+      ovec[0].elements.Int[Npts] = *vi;
+      Npts++;
+    }
+  }
+
+  // free up unused memory
+  ResetVector (ovec, ivec->type, MAX (Npts, 1));
 
   DeleteVector (tvec);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/svd.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/svd.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/svd.c	(revision 20857)
@@ -43,6 +43,5 @@
 
   /* w is Nx */
-  Vw[0].Nelements = Nx;
-  REALLOCATE (Vw[0].elements.Flt, opihi_flt, Nx);
+  ResetVector (Vw, OPIHI_FLT, Nx);
 
   /* pointers to the various arrays */
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/ungridify.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/ungridify.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/ungridify.c	(revision 20857)
@@ -1,4 +1,5 @@
 # include "data.h"
 
+// XXX adapt this to accept an optional region to limit the areas, otherwise use the whole image
 int ungridify (int argc, char **argv) {
 
@@ -13,4 +14,5 @@
   if (argc != 9) {
     gprint (GP_ERR, "USAGE: ungridify buffer Xmin Xmax Ymin Ymax x y z\n");
+    gprint (GP_ERR, "  convert a portion of an image to a collection a triplet of vectors\n");
     return (FALSE);
   }
@@ -30,7 +32,8 @@
   if ((vy = SelectVector (argv[7], ANYVECTOR, TRUE)) == NULL) return (FALSE);
   if ((vz = SelectVector (argv[8], ANYVECTOR, TRUE)) == NULL) return (FALSE);
-  REALLOCATE (vx[0].elements.Flt, opihi_flt, Nx*Ny);
-  REALLOCATE (vy[0].elements.Flt, opihi_flt, Nx*Ny);
-  REALLOCATE (vz[0].elements.Flt, opihi_flt, Nx*Ny);
+
+  ResetVector (vx, OPIHI_FLT, Nx*Ny);
+  ResetVector (vy, OPIHI_FLT, Nx*Ny);
+  ResetVector (vz, OPIHI_FLT, Nx*Ny);
 
   x = vx[0].elements.Flt;
@@ -52,4 +55,5 @@
   if (n != Nx*Ny) {
     gprint (GP_ERR, "error in ungrid: %d vs %d (%d x %d)\n", n, Nx*Ny, Nx, Ny);
+    gprint (GP_ERR, "(this is probably a programming error in ungridify)\n");
   }
   vx[0].Nelements = vy[0].Nelements = vz[0].Nelements = n;
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/uniq.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/uniq.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/uniq.c	(revision 20857)
@@ -4,5 +4,4 @@
   
   int Nnew, i, j, found;
-  opihi_flt *v1, *v2;
   Vector *ivec, *ovec;
 
@@ -16,22 +15,38 @@
 
   /* allocate the maximum possible needed */
-  ALLOCATE (ovec[0].elements.Flt, opihi_flt, ivec[0].Nelements);
+  ResetVector (out, ivec->type, ivec->Nelements);
 
   Nnew = 0;
-  v1 = ivec[0].elements.Flt;
-  for (i = 0; i < ivec[0].Nelements; i++, v1++) {
-    v2 = ovec[0].elements.Flt;
-    found = FALSE;
-    for (j = 0; !found && (j < Nnew); j++, v2++) {
-      if (*v1 == *v2) found = TRUE;
+
+  if (ivec->type == OPIHI_FLT) {
+    opihi_flt *v1 = ivec[0].elements.Flt;
+    for (i = 0; i < ivec[0].Nelements; i++, v1++) {
+      opihi_flt *v2 = ovec[0].elements.Flt;
+      found = FALSE;
+      for (j = 0; !found && (j < Nnew); j++, v2++) {
+	if (*v1 == *v2) found = TRUE;
+      }
+      if (!found) {
+	ovec[0].elements.Flt[Nnew] = *v1;
+	Nnew ++;
+      }
     }
-    if (!found) {
-      ovec[0].elements.Flt[Nnew] = *v1;
-      Nnew ++;
+  } else {
+    opihi_int *v1 = ivec[0].elements.Int;
+    for (i = 0; i < ivec[0].Nelements; i++, v1++) {
+      opihi_int *v2 = ovec[0].elements.Int;
+      found = FALSE;
+      for (j = 0; !found && (j < Nnew); j++, v2++) {
+	if (*v1 == *v2) found = TRUE;
+      }
+      if (!found) {
+	ovec[0].elements.Int[Nnew] = *v1;
+	Nnew ++;
+      }
     }
   }
 
-  ovec[0].Nelements = Nnew;
-  REALLOCATE (ovec[0].elements.Flt, opihi_flt, ovec[0].Nelements);
+  // free up extra memory
+  ResetVector (out, ivec->type, Nnew);
 
   return (TRUE);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vbin.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vbin.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vbin.c	(revision 20857)
@@ -42,22 +42,43 @@
   Nout = Nin / scale;
 
-  REALLOCATE (out[0].elements.Flt, opihi_flt, Nout);
-  out[0].Nelements = Nout;
+  // re-binning creates a float vector
+  ResetVector (out, OPIHI_FLT, in[0].Nelements);
 
-  Vin  = in[0].elements.Flt;
   Vout = out[0].elements.Flt;
-  for (n = j = 0; j < Nout; j++, Vout++) {
-    *Vout = 0;
-    for (N = i = 0; (i < scale) && (n < Nin); n++, i++, Vin++) {
-      if (!finite (*Vin)) continue;
-      if (Ignore && (*Vin == IgnoreValue)) continue;
-      *Vout += *Vin;
-      N ++;
-    } 
-    if (Normalize) {
-      if (N > 0) { 
-	*Vout /= (opihi_flt) N; 
-      } else {
-	*Vout = 0;
+
+  if (in[0].type == OPIHI_FLT) {
+    opihi_flt *Vin  = in[0].elements.Flt;
+    for (n = j = 0; j < Nout; j++, Vout++) {
+      *Vout = 0;
+      for (N = i = 0; (i < scale) && (n < Nin); n++, i++, Vin++) {
+	if (!finite (*Vin)) continue;
+	if (Ignore && (*Vin == IgnoreValue)) continue;
+	*Vout += *Vin;
+	N ++;
+      } 
+      if (Normalize) {
+	if (N > 0) { 
+	  *Vout /= (opihi_flt) N; 
+	} else {
+	  *Vout = 0;
+	}
+      }
+    }
+  } else {
+    opihi_int *Vin  = in[0].elements.Int;
+    for (n = j = 0; j < Nout; j++, Vout++) {
+      *Vout = 0;
+      for (N = i = 0; (i < scale) && (n < Nin); n++, i++, Vin++) {
+	if (!finite (*Vin)) continue;
+	if (Ignore && (*Vin == IgnoreValue)) continue;
+	*Vout += *Vin;
+	N ++;
+      } 
+      if (Normalize) {
+	if (N > 0) { 
+	  *Vout /= (opihi_flt) N; 
+	} else {
+	  *Vout = 0;
+	}
       }
     }
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vclip.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vclip.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vclip.c	(revision 20857)
@@ -3,5 +3,5 @@
 int vclip (int argc, char **argv) {
 
-  int i, Npix, DO_NAN, DO_INF, N;
+  int i, Npix, DO_NAN, DO_INF, DO_CLIP, N;
   double min, Vmin, max, Vmax, nan_val, inf_val;
   opihi_flt *in;
@@ -33,4 +33,5 @@
   if ((vec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
 
+  DO_CLIP = FALSE;
   if (argc == 6) {
     min = atof (argv[2]);
@@ -38,36 +39,46 @@
     max = atof (argv[4]);
     Vmax = atof (argv[5]);
+    DO_CLIP = TRUE;
   }
 
+  if (DO_NAN && vec[0].type == OPIHI_INT) {
+    gprint (GP_ERR, "  warning : clipping on NAN is invalid for INT vectors\n");
+    return (FALSE);
+  }
+    
+  if (DO_INF && vec[0].type == OPIHI_INT) {
+    gprint (GP_ERR, "  warning : clipping on INF is invalid for INT vectors\n");
+    return (FALSE);
+  }
+    
   Npix = vec[0].Nelements;
-  in =   vec[0].elements.Flt;
 
-  if (argc == 6) {
+  if (vec[0].type == OPIHI_FLT) {
+    opihi_flt *in =  vec[0].elements.Flt;
     for (i = 0; i < Npix; i++, in++) {
-      if (*in < min) 
+      if (DO_CLIP && (*in < min)) {
 	*in = Vmin;
-      if (*in > max)
+      }
+      if (DO_CLIP && (*in > max)) {
 	*in = Vmax;
-    }
-  }
-  in = vec[0].elements.Flt;
-  if (DO_NAN) {
-    for (i = 0; i < Npix; i++, in++) {
-      if (isnan (*in)) {
+      }
+      if (!finite (*in) && DO_INF) {
+	*in = inf_val;
+      }
+      if (isnan (*in) && DO_NAN) {
 	*in = nan_val;
       }
     }
-  }
-  in = vec[0].elements.Flt;
-  if (DO_INF) {
+  } else {
+    opihi_int *in =  vec[0].elements.Int;
     for (i = 0; i < Npix; i++, in++) {
-      if (!finite (*in)) {
-	*in = inf_val;
+      if (DO_CLIP && (*in < min)) {
+	*in = Vmin;
+      }
+      if (DO_CLIP && (*in > max)) {
+	*in = Vmax;
       }
     }
   }
   return (TRUE);
-
 }
-
-
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vgauss.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vgauss.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vgauss.c	(revision 20857)
@@ -42,7 +42,12 @@
   if ((ovec = SelectVector (argv[4], ANYVECTOR, TRUE)) == NULL) return (FALSE);
 
+  REQUIRE_VECTOR_FLT (xvec, FALSE); 
+  REQUIRE_VECTOR_FLT (yvec, FALSE); 
+  REQUIRE_VECTOR_FLT (svec, FALSE); 
+
   Npts = xvec[0].Nelements;
+  ResetVector (ovec, OPIHI_FLT, Npts);
+
   ALLOCATE (dy, opihi_flt, Npts);
-  REALLOCATE (ovec[0].elements.Flt, opihi_flt, Npts);
 
   GET_VAR (par[0], "C0");
@@ -52,4 +57,5 @@
   Npar = 4;
 
+  // mrqmin takes the inverse variance (do not generate NANs)
   v1 = svec[0].elements.Flt;
   v2 = dy;
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vgrid.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vgrid.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vgrid.c	(revision 20857)
@@ -13,4 +13,6 @@
   if (argc != 11) {
     gprint (GP_ERR, "USAGE: vgrid x y z buffer Xmin Xmax dX Ymin Ymax dY\n");
+    gprint (GP_ERR, "  re-grid values from a triplet of vectors (x,y,z) into an image\n");
+    gprint (GP_ERR, "  the vectors must be floating-point type\n");
     return (FALSE);
   }
@@ -23,4 +25,8 @@
   if (vx[0].Nelements != vy[0].Nelements) return (FALSE);
   if (vx[0].Nelements != vz[0].Nelements) return (FALSE);
+
+  REQUIRE_VECTOR_FLT (vx, FALSE); 
+  REQUIRE_VECTOR_FLT (vy, FALSE); 
+  REQUIRE_VECTOR_FLT (vz, FALSE); 
 
   Xmin = atof (argv[5]);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vload.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vload.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vload.c	(revision 20857)
@@ -82,6 +82,8 @@
     overlay[i].type = type;
     overlay[i].text = NULL;
-    overlay[i].x = vecx[0].elements.Flt[i]+0.5;
-    overlay[i].y = vecy[0].elements.Flt[i]+0.5;
+    overlay[i].x = (vec[0].type == OPIHI_FLT) ? vecx[0].elements.Flt[i] : vecx[0].elements.Int[i];
+    overlay[i].y = (vec[0].type == OPIHI_FLT) ? vecy[0].elements.Flt[i] : vecy[0].elements.Int[i];
+    overlay[i].x += 0.5;
+    overlay[i].y += 0.5;
     overlay[i].dx = dx;
     overlay[i].dy = dy;
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vmaxwell.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vmaxwell.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vmaxwell.c	(revision 20857)
@@ -42,7 +42,11 @@
   if ((ovec = SelectVector (argv[4], ANYVECTOR, TRUE)) == NULL) return (FALSE);
 
+  REQUIRE_VECTOR_FLT (xvec, FALSE); 
+  REQUIRE_VECTOR_FLT (yvec, FALSE); 
+  REQUIRE_VECTOR_FLT (svec, FALSE); 
+
   Npts = xvec[0].Nelements;
   ALLOCATE (dy, opihi_flt, Npts);
-  REALLOCATE (ovec[0].elements.Flt, opihi_flt, Npts);
+  ResetVector (ovec, OPIHI_FLT, Npts);
 
   GET_VAR (par[0], "C0");
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vpop.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vpop.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vpop.c	(revision 20857)
@@ -17,5 +17,9 @@
 
   if (Npix > 1) {
-    memmove (&vec[0].elements.Flt[0], &vec[0].elements.Flt[1], Npix*sizeof(opihi_flt));
+    if (vec[0].type == OPIHI_FLT) {
+      memmove (&vec[0].elements.Flt[0], &vec[0].elements.Flt[1], Npix*sizeof(opihi_flt));
+    } else {
+      memmove (&vec[0].elements.Int[0], &vec[0].elements.Int[1], Npix*sizeof(opihi_int));
+    }
   }
   vec[0].Nelements = Npix - 1;
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vroll.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vroll.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vroll.c	(revision 20857)
@@ -17,7 +17,13 @@
   if (Npix < 2) return (TRUE);
 
-  first = vec[0].elements.Flt[0];
-  memmove (&vec[0].elements.Flt[0], &vec[0].elements.Flt[1], Npix*sizeof(opihi_flt));
-  vec[0].elements.Flt[Npix-1] = first;
+  if (vec[0].type == OPIHI_FLT) {
+    first = vec[0].elements.Flt[0];
+    memmove (&vec[0].elements.Flt[0], &vec[0].elements.Flt[1], Npix*sizeof(opihi_flt));
+    vec[0].elements.Flt[Npix-1] = first;
+  } else {
+    first = vec[0].elements.Int[0];
+    memmove (&vec[0].elements.Int[0], &vec[0].elements.Int[1], Npix*sizeof(opihi_int));
+    vec[0].elements.Int[Npix-1] = first;
+  }
   return (TRUE);
 }
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vsmooth.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vsmooth.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vsmooth.c	(revision 20857)
@@ -3,7 +3,8 @@
 int vsmooth (int argc, char **argv) {
   
-  int i, n, N, Nx, Ns, Ngauss;
-  opihi_flt *vi, *vo, *gauss, *gaussnorm;
-  float g, s, sigma, Nsigma;
+  int i, n, N, Nx, Ns, Ngauss, isFloat;
+  opihi_flt *vf, *vo, *gauss, *gaussnorm;
+  opihi_int *vi;
+  float g, s, sigma, Nsigma, value;
   Vector *in;
 
@@ -23,5 +24,4 @@
   sigma = atof (argv[2]);
   Nx = in[0].Nelements;
-  vi = in[0].elements.Flt;
 
   /* build a 1D gaussian */
@@ -36,4 +36,8 @@
   ALLOCATE (vo, opihi_flt, Nx);
 
+  isFloat = (in[0].type == OPIHI_FLT);
+  vf = in[0].elements.Flt;
+  vi = in[0].elements.Int;
+
   for (i = 0; i < Nx; i++) {
     g = s = 0;
@@ -41,5 +45,6 @@
       if (i+n < 0) continue;
       if (i+n >= Nx) continue;
-      s += gauss[n]*vi[i+n];
+      value = isFloat ? vf[i+n] : vi[i+n];
+      s += gauss[n]*value;
       g += gauss[n];
     }
@@ -47,7 +52,14 @@
   }
 
-  free (in[0].elements.Flt);
   free (gaussnorm);
 
+  if (isFloat) {
+    free (in[0].elements.Flt);
+  } else {
+    free (in[0].elements.Int);
+  }
+
+  // smoothing an int vector results in a float vector
+  in[0].type = OPIHI_FLT;
   in[0].elements.Flt = vo;
   return (TRUE);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vstat.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vstat.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vstat.c	(revision 20857)
@@ -5,5 +5,5 @@
   int i, N;
   double max, min, sum, var, dvar, mean, stdev;
-  opihi_flt *X, IgnoreValue;
+  float IgnoreValue;
   int Ignore, Quiet;
 
@@ -41,16 +41,28 @@
 
   /* calculate max, min, mean, sum, npix */
-  X = vec[0].elements.Flt;
   max = -HUGE_VAL;
   min = HUGE_VAL;
   sum = N = 0;
-  for (i = 0; i < vec[0].Nelements; i++, X++) {
-    if (!finite (*X)) continue;
-    if (Ignore && (*X == IgnoreValue)) continue;
-    max = MAX (*X, max);
-    min = MIN (*X, min);
-    sum += *X;
-    N++;
-  }      
+  if (vec[0].type == OPIHI_FLT) {
+    opihi_flt *X = vec[0].elements.Flt;
+    for (i = 0; i < vec[0].Nelements; i++, X++) {
+      if (!finite (*X)) continue;
+      if (Ignore && (*X == IgnoreValue)) continue;
+      max = MAX (*X, max);
+      min = MIN (*X, min);
+      sum += *X;
+      N++;
+    }      
+  } else {
+    opihi_int *X = vec[0].elements.Int;
+    for (i = 0; i < vec[0].Nelements; i++, X++) {
+      if (!finite (*X)) continue;
+      if (Ignore && (*X == IgnoreValue)) continue;
+      max = MAX (*X, max);
+      min = MIN (*X, min);
+      sum += *X;
+      N++;
+    }      
+  }
   mean = sum / N;
 
@@ -65,14 +77,26 @@
   ALLOCATE (Nval, int, 1002);
   bzero (Nval, 1000*sizeof(int));
-  X = vec[0].elements.Flt;
   var = 0;
-  for (i = 0; i < vec[0].Nelements; i++, X++) {
-    if (!finite (*X)) continue;
-    if (Ignore && (*X == IgnoreValue)) continue;
-    bin = MAX (0, MIN (1000, (*X - min) / dx));
-    Nval[bin] ++;
-    dvar = (*X - mean);
-    var += dvar*dvar;
-  }      
+  if (vec[0].type == OPIHI_FLT) {
+    opihi_flt *X = vec[0].elements.Flt;
+    for (i = 0; i < vec[0].Nelements; i++, X++) {
+      if (!finite (*X)) continue;
+      if (Ignore && (*X == IgnoreValue)) continue;
+      bin = MAX (0, MIN (1000, (*X - min) / dx));
+      Nval[bin] ++;
+      dvar = (*X - mean);
+      var += dvar*dvar;
+    }      
+  } else {
+    opihi_int *X = vec[0].elements.Int;
+    for (i = 0; i < vec[0].Nelements; i++, X++) {
+      if (!finite (*X)) continue;
+      if (Ignore && (*X == IgnoreValue)) continue;
+      bin = MAX (0, MIN (1000, (*X - min) / dx));
+      Nval[bin] ++;
+      dvar = (*X - mean);
+      var += dvar*dvar;
+    }      
+  }
   stdev = sqrt (var / N);
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vzload.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vzload.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/vzload.c	(revision 20857)
@@ -58,11 +58,16 @@
 
   for (i = N = 0; i < Noverlay; i++) {
-    size = MIN (MAX_OUTPUT_SIZE, (vecz[0].elements.Flt[i] - min) / range);
+    float z = (vecz[0].type == OPIHI_FLT) ? vecz[0].elements.Flt[i] : vecz[0].elements.Int[i];
+    size = MIN (MAX_OUTPUT_SIZE, (z - min) / range);
     if (size < 0.1) continue;
 
     overlay[N].type = type;
     overlay[N].text = NULL;
-    overlay[N].x = vecx[0].elements.Flt[i]+0.5;
-    overlay[N].y = vecy[0].elements.Flt[i]+0.5;
+    overlay[N].x = (vecx[0].type == OPIHI_FLT) ? vecx[0].elements.Flt[i] : vecx[0].elements.Int[i];
+    overlay[N].y = (vecy[0].type == OPIHI_FLT) ? vecy[0].elements.Flt[i] : vecy[0].elements.Int[i];
+
+    overlay[N].x += 0.5;
+    overlay[N].y += 0.5;
+
     overlay[N].angle = 0.0;
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/write_vectors.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/write_vectors.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/write_vectors.c	(revision 20857)
@@ -78,5 +78,9 @@
     for (i = 0; i < vec[0][0].Nelements; i++) {
       for (j = 0; j < Nvec; j++) {
-	fprintf (f, "%.10g ", vec[j][0].elements.Flt[i]);
+	if (vec[j][0].type == OPIHI_FLT) {
+	  fprintf (f, "%.12g ", vec[j][0].elements.Flt[i]);
+	} else {
+	  fprintf (f, "%d ", vec[j][0].elements.Int[i]);
+	}
       }
       fprintf (f, "\n");
@@ -135,8 +139,16 @@
     for (j = 0; j < Nvec; j++) {
       if (fmttype[j] == 'd') {
-	fprintf (f, fmtlist[j], (int)(vec[j][0].elements.Flt[i]));
+	if (vec[j][0].type == OPIHI_FLT) {
+	  fprintf (f, fmtlist[j], (int)(vec[j][0].elements.Flt[i]));
+	} else {
+	  fprintf (f, fmtlist[j], (int)(vec[j][0].elements.Int[i]));
+	}
       } 
       if (fmttype[j] == 'f') {
-	fprintf (f, fmtlist[j], (float)(vec[j][0].elements.Flt[i]));
+	if (vec[j][0].type == OPIHI_FLT) {
+	  fprintf (f, fmtlist[j], (float)(vec[j][0].elements.Flt[i]));
+	} else {
+	  fprintf (f, fmtlist[j], (float)(vec[j][0].elements.Int[i]));
+	}
       } 
     }
Index: /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/zplot.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/zplot.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/cmd.data/zplot.c	(revision 20857)
@@ -3,6 +3,6 @@
 int zplot (int argc, char **argv) {
   
-  int i, kapa, Npts;
-  opihi_flt *in, *out;
+  int i, kapa;
+  opihi_flt *out;
   double min, range;
   Graphdata graphmode;
@@ -33,9 +33,16 @@
   Zvec.Nelements = zvec[0].Nelements;
   ALLOCATE (Zvec.elements.Flt, opihi_flt, Zvec.Nelements);
+  out = Zvec.elements.Flt;
  
-  in = zvec[0].elements.Flt;
-  out = Zvec.elements.Flt;
-  for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
-    *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+  if (zvec[0].type == OPIHI_FLT) {
+    opihi_flt *in = zvec[0].elements.Flt;
+    for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
+      *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+    }
+  } else {
+    opihi_int *in = zvec[0].elements.Flt;
+    for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
+      *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+    }
   }
 
@@ -44,6 +51,5 @@
   graphmode.size = -1; /* point size determined by Zvec */
   graphmode.etype = 0; /* no errorbars */
-  Npts = xvec[0].Nelements;
-  PlotVectorTriplet (kapa, Npts, xvec[0].elements.Flt, yvec[0].elements.Flt, Zvec.elements.Flt, &graphmode);
+  PlotVectorTriplet (kapa, xvec, yvec, Zvec, &graphmode);
 
   free (Zvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/Makefile
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/Makefile	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/Makefile	(revision 20857)
@@ -113,5 +113,4 @@
 
 # deprecated functions: verify & delete
-#$(SRC)/catalog.$(ARCH).o	  	\
 #$(SRC)/abszero.$(ARCH).o \
 #$(SRC)/cals.$(ARCH).o \
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/avextract.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/avextract.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/avextract.c	(revision 20857)
@@ -7,5 +7,5 @@
   int Nsecfilt, mode, VERBOSE;
   char **cstack, name[1024];
-  float *values;
+  dbValue *values;
   void *Signal;
 
@@ -117,5 +117,9 @@
       if (!dbBooleanCond (stack, Nstack, values)) continue;
       for (n = 0; n < Nreturn; n++) {
-	vec[n][0].elements.Flt[Npts] = values[n];
+	if (vec[n][0].type == OPIHI_FLT) {
+	  vec[n][0].elements.Flt[Npts] = values[n].Flt;
+	} else {
+	  vec[n][0].elements.Int[Npts] = values[n].Int;
+	}
       }
       Npts++;
@@ -136,4 +140,5 @@
   }
 
+  free (values);
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
@@ -144,4 +149,5 @@
 
  escape:
+  free (values);
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbBooleanCond.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbBooleanCond.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbBooleanCond.c	(revision 20857)
@@ -3,4 +3,5 @@
 // evaluate the expression in inStack as a boolean; necessary db field values are
 // supplied by fields, in order 0 - Nfields (validate before calling)
+// XXX fields needs to be typed (dbValue), stack math needs to deal with the type cases
 int dbBooleanCond (dbStack *inStack, int NinStack, float *fields) {
   
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbExtractAverages.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbExtractAverages.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbExtractAverages.c	(revision 20857)
@@ -40,18 +40,19 @@
 
 /* return average.field based on the selection */
-double dbExtractAverages (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {
+dbValue dbExtractAverages (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {
 
   int i, Nsec;
-  double value;
-
-  value = NAN;
+  dbValue value;
+
+  value.Flt = NAN;
+  value.Int =   0;
 
   /* assign vector values */
   switch (field->ID) {
     case AVE_RA:
-      value = average[0].R;
+      value.Flt = average[0].R;
       break;
     case AVE_DEC:
-      value = average[0].D;
+      value.Flt = average[0].D;
       break;
     case AVE_GLON:
@@ -60,5 +61,5 @@
 	haveGalactic = TRUE;
       }
-      value = GLON;
+      value.Flt = GLON;
       break;
     case AVE_GLAT:
@@ -67,5 +68,5 @@
 	haveGalactic = TRUE;
       }
-      value = GLAT;
+      value.Flt = GLAT;
       break;
     case AVE_ELON:
@@ -74,5 +75,5 @@
 	haveEcliptic = TRUE;
       }
-      value = ELON;
+      value.Flt = ELON;
       break;
     case AVE_ELAT:
@@ -81,44 +82,44 @@
 	haveEcliptic = TRUE;
       }
-      value = ELAT;
+      value.Flt = ELAT;
       break;
     case AVE_RA_ERR:
-      value = average[0].dR;
+      value.Flt = average[0].dR;
       break;
     case AVE_DEC_ERR:
-      value = average[0].dD;
+      value.Flt = average[0].dD;
       break;
 
     case AVE_U_RA:
-      value = average[0].uR;
+      value.Flt = average[0].uR;
       break;
     case AVE_U_DEC:
-      value = average[0].uD;
+      value.Flt = average[0].uD;
       break;
     case AVE_U_RA_ERR:
-      value = average[0].duR;
+      value.Flt = average[0].duR;
       break;
     case AVE_U_DEC_ERR:
-      value = average[0].duD;
+      value.Flt = average[0].duD;
       break;
 
     case AVE_PAR:
-      value = average[0].P;
+      value.Flt = average[0].P;
       break;
     case AVE_PAR_ERR:
-      value = average[0].dP;
+      value.Flt = average[0].dP;
       break;
 
     case AVE_NMEAS:
-      value = average[0].Nmeasure;
+      value.Int = average[0].Nmeasure;
       break;
     case AVE_NMISS:
-      value = average[0].Nmissing;
+      value.Int = average[0].Nmissing;
       break;
     case AVE_Xp:
-      value = 0.01*average[0].Xp;
+      value.Flt = 0.01*average[0].Xp;
       break;
     case AVE_FLAG:
-      value = average[0].code;
+      value.Int = average[0].code;
       break;
 
@@ -126,8 +127,8 @@
       switch (field->magMode) {
 	case MAG_AVE:
-	  value = PhotAve  (field->photcode, average, secfilt);
+	  value.Flt = PhotAve  (field->photcode, average, secfilt);
 	  break;
 	case MAG_REF:
-	  value = PhotRef  (field->photcode, average, secfilt, measure);
+	  value.Flt = PhotRef  (field->photcode, average, secfilt, measure);
 	  break;
 	case MAG_INST:
@@ -137,8 +138,8 @@
 	case MAG_CAL:
 	  // XXX need to code this correctly: this returns just the first matching value
-	  value = NAN;
+	  value.Flt = NAN;
 	  for (i = 0; i < average[0].Nmeasure; i++) {
 	    if (field->photcode->code != measure[i].photcode) continue;
-	    value = measure[i].M;
+	    value.Flt = measure[i].M;
 	    break;
 	  }
@@ -146,16 +147,16 @@
 	case MAG_CHISQ:
 	  // GetPhotcodeEquivCodebyCode (field->photcode)
-	  value = PhotXm (field->photcode, average, secfilt);
+	  value.Flt = PhotXm (field->photcode, average, secfilt);
 	  break;
 	case MAG_ERR:
 	  // GetPhotcodeEquivCodebyCode (field->photcode)
-	  if (field->photcode->type == PHOT_REF) {
+	  if ((field->photcode->type == PHOT_REF) || (field->photcode->type == PHOT_DEP)) {
 	    for (i = 0; i < average[0].Nmeasure; i++) {
 	      if (field->photcode->code != measure[i].photcode) continue;
-	      value = measure[i].dM;
+	      value.Flt = measure[i].dM;
 	      break;
 	    }
 	  } else {
-	    value = PhotdM (field->photcode, average, secfilt);
+	    value.Flt = PhotdM (field->photcode, average, secfilt);
 	  }
 	  break;
@@ -165,10 +166,10 @@
 	  Nsec = GetPhotcodeNsec (field->photcode->code);
 	  if (Nsec == -1) break;
-	  value = secfilt[Nsec].Ncode;
+	  value.Int = secfilt[Nsec].Ncode;
 	  break;
 	case MAG_NPHOT:
 	  Nsec = GetPhotcodeNsec (field->photcode->code);
 	  if (Nsec == -1) break;
-	  value = secfilt[Nsec].Nused;
+	  value.Int = secfilt[Nsec].Nused;
 	  break;
 
@@ -176,8 +177,8 @@
       break;
     case AVE_dMAG:
-      value = PhotdM (field->photcode, average, secfilt);
+      value.Flt = PhotdM (field->photcode, average, secfilt);
       break;
     case AVE_Xm:
-      value = PhotXm (field->photcode, average, secfilt);
+      value.Flt = PhotXm (field->photcode, average, secfilt);
       break;
     case AVE_TYPE:
@@ -187,16 +188,16 @@
       /*
     case AVE_NCODE:
-      value = 0;
+      value.Int = 0;
       for (i = 0; i < average[0].Nm; i++) {
 	if (field->photcode->code != GetPhotcodeEquivCodebyCode (measure[i].photcode)) continue;
-	value ++;
+	value.Int ++;
       }
       break;
     case AVE_NPHOT:
-      value = 0;
+      value.Int = 0;
       for (i = 0; i < average[0].Nm; i++) {
 	if (field->photcode->code != GetPhotcodeEquivCodebyCode (measure[i].photcode)) continue;
 	if (measure[i].flags & (ID_MEAS_POOR_PHOTOM | ID_MEAS_SKIP_PHOTOM)) continue;
-	value ++;
+	value.Int ++;
       }
       break;
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbExtractMeasures.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 20857)
@@ -70,8 +70,8 @@
 
 /* return measure.field based on the selection */
-double dbExtractMeasures (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {
+dbValue dbExtractMeasures (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {
 
   int Nsec;
-  double value;
+  dbValue value;
   double ra, dec, x, y, dT;
 
@@ -79,5 +79,6 @@
   PhotCode *equiv;
 
-  value = NAN;
+  value.Flt = NAN;
+  value.Int =   0;
 
   switch (field->ID) {
@@ -96,65 +97,65 @@
       switch (field->magMode) {
 	case MAG_INST:
-	  value = PhotInst (measure);  
+	  value.Flt = PhotInst (measure);  
 	  break;
 	case MAG_CAT:
-	  value = PhotCat  (measure); 
+	  value.Flt = PhotCat  (measure); 
 	  break;
 	case MAG_SYS:
-	  value = PhotSys  (measure, average, secfilt); 
+	  value.Flt = PhotSys  (measure, average, secfilt); 
 	  break;
 	case MAG_REL:
-	  value = PhotRel  (measure, average, secfilt); 
+	  value.Flt = PhotRel  (measure, average, secfilt); 
 	  break;
 	case MAG_CAL:
-	  value = PhotCal  (measure, average, secfilt, measure, equiv); 
+	  value.Flt = PhotCal  (measure, average, secfilt, measure, equiv); 
 	  break;
 	case MAG_AVE:
-	  value = PhotAve  (equiv, average, secfilt); 
+	  value.Flt = PhotAve  (equiv, average, secfilt); 
 	  break;
 	case MAG_REF:
-	  value = PhotRef  (equiv, average, secfilt, measure); 
+	  value.Flt = PhotRef  (equiv, average, secfilt, measure); 
 	  break;
 	case MAG_ERR:
 	  if (field->photcode->type == PHOT_SEC) {
-	    value = PhotdM  (equiv, average, secfilt); 
+	    value.Flt = PhotdM  (equiv, average, secfilt); 
 	  } else {
-	    value = measure[0].dM;
+	    value.Flt = measure[0].dM;
 	  }
 	  break;
 	case MAG_CHISQ:
-	  value = PhotXm  (equiv, average, secfilt); 
+	  value.Flt = PhotXm  (equiv, average, secfilt); 
 	  break;
 	case MAG_NCODE:
 	  if (equiv == NULL) {
-	    value = NAN;
+	    value.Int = 0;
 	    break;
 	  }
 	  Nsec = GetPhotcodeNsec (equiv->code);
 	  if (Nsec == -1) break;
-	  value = secfilt[Nsec].Ncode;
+	  value.Int = secfilt[Nsec].Ncode;
 	  break;
 	case MAG_NPHOT:
 	  if (equiv == NULL) {
-	    value = NAN;
+	    value.Int = NAN;
 	    break;
 	  }
 	  Nsec = GetPhotcodeNsec (equiv->code);
 	  if (Nsec == -1) break;
-	  value = secfilt[Nsec].Nused;
+	  value.Int = secfilt[Nsec].Nused;
 	  break;
       }
       break;
     case MEAS_RA: /* OK */
-      value = average[0].R - measure[0].dR / 3600.0;
+      value.Flt = average[0].R - measure[0].dR / 3600.0;
       break;
     case MEAS_DEC: /* OK */
-      value = average[0].D - measure[0].dD / 3600.0;
+      value.Flt = average[0].D - measure[0].dD / 3600.0;
       break;
     case MEAS_RA_AVE: /* OK */
-      value = average[0].R;
+      value.Flt = average[0].R;
       break;
     case MEAS_DEC_AVE: /* OK */
-      value = average[0].D;
+      value.Flt = average[0].D;
       break;
 
@@ -164,5 +165,5 @@
 	haveGalacticMeas = TRUE;
       }
-      value = GLON_MEAS;
+      value.Flt = GLON_MEAS;
       break;
     case MEAS_GLAT:
@@ -171,5 +172,5 @@
 	haveGalacticMeas = TRUE;
       }
-      value = GLAT_MEAS;
+      value.Flt = GLAT_MEAS;
       break;
     case MEAS_ELON:
@@ -178,5 +179,5 @@
 	haveEclipticMeas = TRUE;
       }
-      value = ELON_MEAS;
+      value.Flt = ELON_MEAS;
       break;
     case MEAS_ELAT:
@@ -185,5 +186,5 @@
 	haveEclipticMeas = TRUE;
       }
-      value = ELAT_MEAS;
+      value.Flt = ELAT_MEAS;
       break;
 
@@ -193,5 +194,5 @@
 	haveGalacticAve = TRUE;
       }
-      value = GLON_AVE;
+      value.Flt = GLON_AVE;
       break;
     case MEAS_GLAT_AVE:
@@ -200,5 +201,5 @@
 	haveGalacticAve = TRUE;
       }
-      value = GLAT_AVE;
+      value.Flt = GLAT_AVE;
       break;
     case MEAS_ELON_AVE:
@@ -207,5 +208,5 @@
 	haveEclipticAve = TRUE;
       }
-      value = ELON_AVE;
+      value.Flt = ELON_AVE;
       break;
     case MEAS_ELAT_AVE:
@@ -214,105 +215,105 @@
 	haveEclipticAve = TRUE;
       }
-      value = ELAT_AVE;
+      value.Flt = ELAT_AVE;
       break;
 
     case MEAS_RA_AVE_ERR: /* OK */
-      value = average[0].dR;
+      value.Flt = average[0].dR;
       break;
     case MEAS_DEC_AVE_ERR: /* OK */
-      value = average[0].dD;
+      value.Flt = average[0].dD;
       break;
     case MEAS_U_RA: /* OK */
-      value = average[0].uR;
+      value.Flt = average[0].uR;
       break;
     case MEAS_U_DEC: /* OK */
-      value = average[0].uD;
+      value.Flt = average[0].uD;
       break;
     case MEAS_U_RA_ERR: /* OK */
-      value = average[0].duR;
+      value.Flt = average[0].duR;
       break;
     case MEAS_U_DEC_ERR: /* OK */
-      value = average[0].duD;
+      value.Flt = average[0].duD;
       break;
     case MEAS_PAR: /* OK */
-      value = average[0].R;
+      value.Flt = average[0].R;
       break;
     case MEAS_PAR_ERR: /* OK */
-      value = average[0].D;
+      value.Flt = average[0].D;
       break;
     case MEAS_XP: /* OK */
-      value = average[0].Xp;
+      value.Flt = average[0].Xp;
       break;
     case MEAS_NMEAS: /* OK */
-      value = average[0].Nmeasure;
+      value.Int = average[0].Nmeasure;
       break;
     case MEAS_NMISS: /* OK */
-      value = average[0].Nmissing;
+      value.Int = average[0].Nmissing;
       break;
     case MEAS_OBJFLAGS: /* OK */
-      value = average[0].code;
+      value.Int = average[0].code;
       break;
     // note that these represent the ra displacement relative to the average, not 
     // the error.
     case MEAS_RA_OFFSET: /* OK */
-      value = measure[0].dR;
+      value.Flt = measure[0].dR;
       break;
     case MEAS_DEC_OFFSET: /* OK */
-      value = measure[0].dD;
+      value.Flt = measure[0].dD;
       break;
     case MEAS_RA_FIT_OFFSET: /* OK */
       dT = (measure[0].t - TimeRefPM) / (86400*365.25);
-      value = average[0].uR * dT + measure[0].dR;
+      value.Flt = average[0].uR * dT + measure[0].dR;
       break;
     case MEAS_DEC_FIT_OFFSET: /* OK */
       dT = (measure[0].t - TimeRefPM) / (86400*365.25);
-      value = average[0].uD * dT + measure[0].dD;
+      value.Flt = average[0].uD * dT + measure[0].dD;
       break;
     case MEAS_RA_OFFSET_ERR: /* OK */
-      value = NAN;
+      value.Flt = NAN;
       break;
     case MEAS_DEC_OFFSET_ERR: /* OK */
-      value = NAN;
+      value.Flt = NAN;
       break;
     case MEAS_AIRMASS: /* OK */
-      value = measure[0].airmass;
+      value.Flt = measure[0].airmass;
       break;
     case MEAS_AZ: /* OK */
-      value = measure[0].az;
+      value.Flt = measure[0].az;
       break;
     case MEAS_EXPTIME: /* OK */
-      value = pow (10.0, measure[0].dt * 0.4);
+      value.Flt = pow (10.0, measure[0].dt * 0.4);
       break;
     case MEAS_PHOTCODE: /* OK */
-      value = measure[0].photcode;
+      value.Int = measure[0].photcode;
       break;
     case MEAS_TIME: /* OK */
-      value = TimeValue (measure[0].t, TimeReference, TimeFormat);
+      value.Flt = TimeValue (measure[0].t, TimeReference, TimeFormat);
       break;
     case MEAS_FWHM: /* OK */
-      value = 0.01*(measure[0].FWx + measure[0].FWy) / 2.0;
+      value.Flt = 0.01*(measure[0].FWx + measure[0].FWy) / 2.0;
       break;
     case MEAS_FWHM_MAJ: /* OK */
-      value = 0.01*measure[0].FWx;
+      value.Flt = 0.01*measure[0].FWx;
       break;
     case MEAS_FWHM_MIN: /* OK */
-      value = 0.01*measure[0].FWy;
+      value.Flt = 0.01*measure[0].FWy;
       break;
     case MEAS_THETA: /* OK */
-      value = measure[0].theta;
+      value.Flt = measure[0].theta;
       break;
     case MEAS_DOPHOT: /* OK */
-      value = measure[0].dophot;
+      value.Flt = measure[0].dophot;
       break;
     case MEAS_DB_FLAGS: /* ? */
-      value = measure[0].dbFlags;
+      value.Int = measure[0].dbFlags;
       break;
     case MEAS_PHOT_FLAGS: /* ? */
-      value = measure[0].photFlags;
+      value.Int = measure[0].photFlags;
       break;
     case MEAS_XCCD: /* OK */
 /* I need to perform this conversion for ELIXIR and LONEOS formats on load */      
 # if 1
-      value = measure[0].Xccd;
+      value.Flt = measure[0].Xccd;
 # else
       { 
@@ -323,5 +324,5 @@
 	if (image == NULL) break;
 	RD_to_XY (&x, &y, ra, dec, &image[0].coords);
-	value = x;
+	value.Flt = x;
       }
 # endif
@@ -330,5 +331,5 @@
 /* I need to perform this conversion for ELIXIR and LONEOS formats on load */      
 # if 1
-      value = measure[0].Yccd;
+      value.Flt = measure[0].Yccd;
 # else
       {
@@ -339,5 +340,5 @@
 	if (image == NULL) break;
 	RD_to_XY (&x, &y, ra, dec, &image[0].coords);
-	value = y;
+	value.Flt = y;
       }
 # endif
@@ -349,5 +350,5 @@
       if (mosaic == NULL) break;
       RD_to_XY (&x, &y, ra, dec, mosaic);
-      value = x;
+      value.Flt = x;
       break;
     case MEAS_YMOSAIC: /* OK */
@@ -357,37 +358,39 @@
       if (mosaic == NULL) break;
       RD_to_XY (&x, &y, ra, dec, mosaic);
-      value = y;
+      value.Flt = y;
       break;
 
     case MEAS_SKY: /* OK */
-      value = measure[0].Sky;
+      value.Flt = measure[0].Sky;
       break;
     case MEAS_dSKY: /* OK */
-      value = measure[0].dSky;
+      value.Flt = measure[0].dSky;
       break;
     case MEAS_DET_ID: /* OK */
-      value = measure[0].detID;
+      value.Int = measure[0].detID;
       break;
     case MEAS_OBJ_ID: /* OK */
-      value = measure[0].averef;
+      value.Int = measure[0].averef;
       break;
     case MEAS_IMAGE_ID: /* OK */
-      value = measure[0].imageID;
+      value.Int = measure[0].imageID;
       break;
     case MEAS_PSF_QF: /* OK */
-      value = measure[0].qPSF;
+      value.Flt = measure[0].qPSF;
       break;
     case MEAS_PSF_CHISQ: /* OK */
-      value = measure[0].psfChisq;
+      value.Flt = measure[0].psfChisq;
       break;
     case MEAS_CR_NSIGMA: /* OK */
-      value = measure[0].crNsigma;
+      value.Flt = measure[0].crNsigma;
       break;
     case MEAS_EXT_NSIGMA: /* OK */
-      value = measure[0].extNsigma;
+      value.Flt = measure[0].extNsigma;
       break;
     case MEAS_STARGAL: /* OK */
-      value = measure[0].stargal;
-      break;
+      value.Flt = measure[0].stargal;
+      break;
+
+      // add the star/galaxy sep -- 
   }
   return (value);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbFields.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbFields.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/dbFields.c	(revision 20857)
@@ -23,4 +23,5 @@
   field->table = 0;
   field->ID = 0;
+  field->type = OPIHI_FLT;
   field->magMode = 0;
   field->photcode = NULL;
@@ -89,7 +90,8 @@
 }
 
-# define ESCAPE(F,M) { \
+# define ESCAPE(F,M,T) { \
   field->ID = (F); \
   field->magMode = (M); \
+  field->type = (T); \
   field->photcode = NULL; \
   return (TRUE); }
@@ -137,58 +139,57 @@
   }
 
-  if (!strcasecmp (fieldName, "RA"))         ESCAPE (MEAS_RA,   	MAG_NONE);
-  if (!strcasecmp (fieldName, "DEC"))        ESCAPE (MEAS_DEC,  	MAG_NONE);
-  if (!strcasecmp (fieldName, "RA:AVE"))     ESCAPE (MEAS_RA_AVE,      	MAG_NONE);
-  if (!strcasecmp (fieldName, "DEC:AVE"))    ESCAPE (MEAS_DEC_AVE,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "RA:ERR"))     ESCAPE (MEAS_RA_AVE_ERR,  	MAG_NONE);
-  if (!strcasecmp (fieldName, "DEC:ERR"))    ESCAPE (MEAS_DEC_AVE_ERR, 	MAG_NONE);
-
-  if (!strcasecmp (fieldName, "uRA"))        ESCAPE (MEAS_U_RA,        	MAG_NONE);
-  if (!strcasecmp (fieldName, "uDEC"))       ESCAPE (MEAS_U_DEC,       	MAG_NONE);
-  if (!strcasecmp (fieldName, "duRA"))       ESCAPE (MEAS_U_RA_ERR,    	MAG_NONE);
-  if (!strcasecmp (fieldName, "duDEC"))      ESCAPE (MEAS_U_DEC_ERR,   	MAG_NONE);
-  if (!strcasecmp (fieldName, "PAR"))        ESCAPE (MEAS_PAR,         	MAG_NONE);
-  if (!strcasecmp (fieldName, "dPAR"))       ESCAPE (MEAS_PAR_ERR,      MAG_NONE);
-  if (!strcasecmp (fieldName, "dR"))         ESCAPE (MEAS_RA_OFFSET,   	MAG_NONE);
-  if (!strcasecmp (fieldName, "dD"))         ESCAPE (MEAS_DEC_OFFSET,  	MAG_NONE);
-  if (!strcasecmp (fieldName, "dR:FIT"))     ESCAPE (MEAS_RA_FIT_OFFSET,  MAG_NONE);
-  if (!strcasecmp (fieldName, "dD:FIT"))     ESCAPE (MEAS_DEC_FIT_OFFSET, MAG_NONE);
-  if (!strcasecmp (fieldName, "dR:ERR"))     ESCAPE (MEAS_RA_OFFSET_ERR,  MAG_NONE);
-  if (!strcasecmp (fieldName, "dD:ERR"))     ESCAPE (MEAS_DEC_OFFSET_ERR, MAG_NONE);
-  if (!strcasecmp (fieldName, "xp"))         ESCAPE (MEAS_XP,          	MAG_NONE);
-  if (!strcasecmp (fieldName, "nmeas"))      ESCAPE (MEAS_NMEAS,       	MAG_NONE);
-  if (!strcasecmp (fieldName, "nmiss"))      ESCAPE (MEAS_NMISS,       	MAG_NONE);
-  if (!strcasecmp (fieldName, "objflags"))   ESCAPE (MEAS_OBJFLAGS,     MAG_NONE);
-  if (!strcasecmp (fieldName, "AIRMASS"))    ESCAPE (MEAS_AIRMASS,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "ALT"))        ESCAPE (MEAS_ALT,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "AZ"))         ESCAPE (MEAS_AZ,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "EXPTIME"))    ESCAPE (MEAS_EXPTIME,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "PHOTCODE"))   ESCAPE (MEAS_PHOTCODE,    	MAG_NONE);
-  if (!strcasecmp (fieldName, "TIME"))       ESCAPE (MEAS_TIME,        	MAG_NONE);
-  if (!strcasecmp (fieldName, "FWHM"))       ESCAPE (MEAS_FWHM,        	MAG_NONE);
-  if (!strcasecmp (fieldName, "FWHM_MAJ"))   ESCAPE (MEAS_FWHM_MAJ,    	MAG_NONE);
-  if (!strcasecmp (fieldName, "FWHM_MIN"))   ESCAPE (MEAS_FWHM_MIN,    	MAG_NONE);
-  if (!strcasecmp (fieldName, "THETA"))      ESCAPE (MEAS_THETA,       	MAG_NONE);
-  if (!strcasecmp (fieldName, "DOPHOT"))     ESCAPE (MEAS_DOPHOT,      	MAG_NONE);
-  if (!strcasecmp (fieldName, "DB_FLAGS"))   ESCAPE (MEAS_DB_FLAGS,    	MAG_NONE);
-  if (!strcasecmp (fieldName, "PHOT_FLAGS")) ESCAPE (MEAS_PHOT_FLAGS, 	MAG_NONE);
-  if (!strcasecmp (fieldName, "XCCD"))       ESCAPE (MEAS_XCCD, 	MAG_NONE);
-  if (!strcasecmp (fieldName, "YCCD"))       ESCAPE (MEAS_YCCD, 	MAG_NONE);
-  if (!strcasecmp (fieldName, "XMOSAIC"))    ESCAPE (MEAS_XMOSAIC,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "YMOSAIC"))    ESCAPE (MEAS_YMOSAIC,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "XCHIP"))      ESCAPE (MEAS_XCCD, 	MAG_NONE);
-  if (!strcasecmp (fieldName, "YCHIP"))      ESCAPE (MEAS_YCCD, 	MAG_NONE);
-  if (!strcasecmp (fieldName, "XFPA"))       ESCAPE (MEAS_XMOSAIC,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "YFPA"))       ESCAPE (MEAS_YMOSAIC,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "DETID"))      ESCAPE (MEAS_DET_ID,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "OBJID"))      ESCAPE (MEAS_OBJ_ID,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "IMAGEID"))    ESCAPE (MEAS_IMAGE_ID,     MAG_NONE);
-  if (!strcasecmp (fieldName, "PSF_QF"))     ESCAPE (MEAS_PSF_QF,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "PSF_CHISQ"))  ESCAPE (MEAS_PSF_CHISQ,    MAG_NONE);
-  if (!strcasecmp (fieldName, "CR_NSIGMA"))  ESCAPE (MEAS_CR_NSIGMA,    MAG_NONE);
-  if (!strcasecmp (fieldName, "EXT_NSIGMA")) ESCAPE (MEAS_EXT_NSIGMA,   MAG_NONE);
-  if (!strcasecmp (fieldName, "SKY"))        ESCAPE (MEAS_SKY,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "SKY_ERR"))    ESCAPE (MEAS_dSKY,     	MAG_NONE);
-  if (!strcasecmp (fieldName, "STARGAL"))    ESCAPE (MEAS_STARGAL,     	MAG_NONE);
+  if (!strcasecmp (fieldName, "RA"))         ESCAPE (MEAS_RA,   	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "DEC"))        ESCAPE (MEAS_DEC,  	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "RA:AVE"))     ESCAPE (MEAS_RA_AVE,      	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "DEC:AVE"))    ESCAPE (MEAS_DEC_AVE,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "RA:ERR"))     ESCAPE (MEAS_RA_AVE_ERR,  	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "DEC:ERR"))    ESCAPE (MEAS_DEC_AVE_ERR, 	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "uRA"))        ESCAPE (MEAS_U_RA,        	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "uDEC"))       ESCAPE (MEAS_U_DEC,       	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "duRA"))       ESCAPE (MEAS_U_RA_ERR,    	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "duDEC"))      ESCAPE (MEAS_U_DEC_ERR,   	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "PAR"))        ESCAPE (MEAS_PAR,         	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dPAR"))       ESCAPE (MEAS_PAR_ERR,        MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dR"))         ESCAPE (MEAS_RA_OFFSET,   	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dD"))         ESCAPE (MEAS_DEC_OFFSET,  	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dR:FIT"))     ESCAPE (MEAS_RA_FIT_OFFSET,  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dD:FIT"))     ESCAPE (MEAS_DEC_FIT_OFFSET, MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dR:ERR"))     ESCAPE (MEAS_RA_OFFSET_ERR,  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dD:ERR"))     ESCAPE (MEAS_DEC_OFFSET_ERR, MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "xp"))         ESCAPE (MEAS_XP,          	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "nmeas"))      ESCAPE (MEAS_NMEAS,       	  MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "nmiss"))      ESCAPE (MEAS_NMISS,       	  MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "objflags"))   ESCAPE (MEAS_OBJFLAGS,       MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "AIRMASS"))    ESCAPE (MEAS_AIRMASS,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "ALT"))        ESCAPE (MEAS_ALT,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "AZ"))         ESCAPE (MEAS_AZ,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "EXPTIME"))    ESCAPE (MEAS_EXPTIME,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "PHOTCODE"))   ESCAPE (MEAS_PHOTCODE,    	  MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "TIME"))       ESCAPE (MEAS_TIME,        	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "FWHM"))       ESCAPE (MEAS_FWHM,        	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "FWHM_MAJ"))   ESCAPE (MEAS_FWHM_MAJ,    	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "FWHM_MIN"))   ESCAPE (MEAS_FWHM_MIN,    	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "THETA"))      ESCAPE (MEAS_THETA,       	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "DOPHOT"))     ESCAPE (MEAS_DOPHOT,      	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "DB_FLAGS"))   ESCAPE (MEAS_DB_FLAGS,    	  MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "PHOT_FLAGS")) ESCAPE (MEAS_PHOT_FLAGS, 	  MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "XCCD"))       ESCAPE (MEAS_XCCD, 	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "YCCD"))       ESCAPE (MEAS_YCCD, 	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "XMOSAIC"))    ESCAPE (MEAS_XMOSAIC,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "YMOSAIC"))    ESCAPE (MEAS_YMOSAIC,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "XCHIP"))      ESCAPE (MEAS_XCCD, 	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "YCHIP"))      ESCAPE (MEAS_YCCD, 	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "XFPA"))       ESCAPE (MEAS_XMOSAIC,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "YFPA"))       ESCAPE (MEAS_YMOSAIC,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "DETID"))      ESCAPE (MEAS_DET_ID,     	  MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "OBJID"))      ESCAPE (MEAS_OBJ_ID,     	  MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "IMAGEID"))    ESCAPE (MEAS_IMAGE_ID,       MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "PSF_QF"))     ESCAPE (MEAS_PSF_QF,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "PSF_CHISQ"))  ESCAPE (MEAS_PSF_CHISQ,      MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "CR_NSIGMA"))  ESCAPE (MEAS_CR_NSIGMA,      MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "EXT_NSIGMA")) ESCAPE (MEAS_EXT_NSIGMA,     MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "SKY"))        ESCAPE (MEAS_SKY,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "SKY_ERR"))    ESCAPE (MEAS_dSKY,     	  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "STARGAL"))    ESCAPE (MEAS_STARGAL,     	  MAG_NONE, OPIHI_FLT);
 
   // for words that don't parse, try a photcode
@@ -200,4 +201,5 @@
   field->ID = MEAS_MAG;
   field->magMode = mode;
+  field->type = OPIHI_FLT;
   field->photcode = code;
   return (TRUE);
@@ -234,20 +236,20 @@
   }
 
-  if (!strcasecmp (fieldName, "RA"))    ESCAPE (AVE_RA,        MAG_NONE);
-  if (!strcasecmp (fieldName, "DEC"))   ESCAPE (AVE_DEC,       MAG_NONE);
-  if (!strcasecmp (fieldName, "dRA"))   ESCAPE (AVE_RA_ERR,    MAG_NONE);
-  if (!strcasecmp (fieldName, "dDEC"))  ESCAPE (AVE_DEC_ERR,   MAG_NONE);
-  if (!strcasecmp (fieldName, "uRA"))   ESCAPE (AVE_U_RA,      MAG_NONE);
-  if (!strcasecmp (fieldName, "uDEC"))  ESCAPE (AVE_U_DEC,     MAG_NONE);
-  if (!strcasecmp (fieldName, "duRA"))  ESCAPE (AVE_U_RA_ERR,  MAG_NONE);
-  if (!strcasecmp (fieldName, "duDEC")) ESCAPE (AVE_U_DEC_ERR, MAG_NONE);
-  if (!strcasecmp (fieldName, "PAR"))   ESCAPE (AVE_PAR,       MAG_NONE);
-  if (!strcasecmp (fieldName, "dPAR"))  ESCAPE (AVE_PAR_ERR,   MAG_NONE);
-  if (!strcasecmp (fieldName, "Xp"))    ESCAPE (AVE_Xp,        MAG_NONE);
-  if (!strcasecmp (fieldName, "NMEAS")) ESCAPE (AVE_NMEAS,     MAG_NONE);
-  if (!strcasecmp (fieldName, "NMISS")) ESCAPE (AVE_NMISS,     MAG_NONE);
-  if (!strcasecmp (fieldName, "FLAG"))  ESCAPE (AVE_FLAG,      MAG_NONE);
-  if (!strcasecmp (fieldName, "TYPE"))  ESCAPE (AVE_TYPE,      MAG_NONE);
-  if (!strcasecmp (fieldName, "OBJID")) ESCAPE (AVE_OBJID,     MAG_NONE);
+  if (!strcasecmp (fieldName, "RA"))    ESCAPE (AVE_RA,        MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "DEC"))   ESCAPE (AVE_DEC,       MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dRA"))   ESCAPE (AVE_RA_ERR,    MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dDEC"))  ESCAPE (AVE_DEC_ERR,   MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "uRA"))   ESCAPE (AVE_U_RA,      MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "uDEC"))  ESCAPE (AVE_U_DEC,     MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "duRA"))  ESCAPE (AVE_U_RA_ERR,  MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "duDEC")) ESCAPE (AVE_U_DEC_ERR, MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "PAR"))   ESCAPE (AVE_PAR,       MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "dPAR"))  ESCAPE (AVE_PAR_ERR,   MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "Xp"))    ESCAPE (AVE_Xp,        MAG_NONE, OPIHI_FLT);
+  if (!strcasecmp (fieldName, "NMEAS")) ESCAPE (AVE_NMEAS,     MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "NMISS")) ESCAPE (AVE_NMISS,     MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "FLAG"))  ESCAPE (AVE_FLAG,      MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "TYPE"))  ESCAPE (AVE_TYPE,      MAG_NONE, OPIHI_INT);
+  if (!strcasecmp (fieldName, "OBJID")) ESCAPE (AVE_OBJID,     MAG_NONE, OPIHI_INT);
 
   // for words that don't parse, try a photcode
@@ -264,4 +266,5 @@
   field->ID = AVE_MAG;
   field->magMode = mode;
+  field->type = OPIHI_FLT;
   field->photcode = code;
   return (TRUE);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/fitcolors.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/fitcolors.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/fitcolors.c	(revision 20857)
@@ -18,5 +18,5 @@
   double *M1, *M2;
   float *out;
-  opihi_flt *colorFit, *deltaFit, dColor, C0, C1;
+  float *colorFit, *deltaFit, dColor, C0, C1;
   opihi_flt minDelta, maxDelta, minColor, maxColor;
   int kapa, Npx, Npy, NPX, NPY, Nplot, PLOT;
@@ -100,6 +100,6 @@
     KapaSetFont (kapa, "helvetica", 14);
 
-    ALLOCATE (colorFit, opihi_flt, 11);
-    ALLOCATE (deltaFit, opihi_flt, 11);
+    ALLOCATE (colorFit, float, 11);
+    ALLOCATE (deltaFit, float, 11);
     dColor = (maxColor - minColor) / 10.0;
     for (i = 0; i < 11; i++) {
@@ -177,7 +177,10 @@
   /* vectors to save data */
   Npts = 0;
-  NPTS = 1;
+  NPTS = 64;
   if ((xvec = SelectVector ("tmp_x", ANYVECTOR, TRUE)) == NULL) goto escape;
   if ((yvec = SelectVector ("tmp_y", ANYVECTOR, TRUE)) == NULL) goto escape;
+
+  ResetVector (xvec, OPIHI_FLT, NPTS);
+  ResetVector (yvec, OPIHI_FLT, NPTS);
 
   // set up basic windows
@@ -307,5 +310,5 @@
 	KapaBox (kapa, &graphdata);
 
-	PlotVectorPair (kapa, Npts, xvec[0].elements.Flt, yvec[0].elements.Flt, &graphdata);
+	PlotVectorPair (kapa, xvec, yvec, &graphdata);
 
 	for (i = 0; i < 11; i++) {
@@ -315,5 +318,7 @@
 	graphdata.color = KapaColorByName ("red");
 
-	PlotVectorPair (kapa, 11, colorFit, deltaFit, &graphdata);
+	KapaPrepPlot (kapa, 11, graphmode);
+	KapaPlotVector (kapa, 11, colorFit, "x");
+	KapaPlotVector (kapa, 11, deltaFit, "y");
 
 	KapaSetFont (kapa, "helvetica", 8);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/images.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/images.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/images.c	(revision 20857)
@@ -280,5 +280,5 @@
     graphmode.ptype = 100; /* connect pairs of points */
     graphmode.etype = 0;
-    PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+    PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
   }
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imbox.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imbox.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imbox.c	(revision 20857)
@@ -104,5 +104,5 @@
       graphmode.ptype = 100; /* connect pairs of points */
       graphmode.etype = 0;
-      PlotVectorPair (kapa, 8, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+      PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
     }
   skip:
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imdense.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imdense.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imdense.c	(revision 20857)
@@ -63,5 +63,5 @@
     graphmode.style = 2; /* points */
     graphmode.etype = 0;
-    PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+    PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
   }
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imstats.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imstats.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/imstats.c	(revision 20857)
@@ -54,5 +54,5 @@
   graphmode.style = 2;
   graphmode.etype = 0;
-  PlotVectorPair (kapa, Nimage, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+  PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
   
   free (Xvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/lcurve.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/lcurve.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/lcurve.c	(revision 20857)
@@ -155,7 +155,7 @@
 
   if (ErrorBars) {
-    PlotVectorPairErrors (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, dYvec.elements.Flt, &graphmode);
+    PlotVectorPairErrors (kapa, Xvec, Yvec, dYvec, &graphmode);
   } else {
-    PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+    PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
   }
 
@@ -173,4 +173,6 @@
 
   if (SaveVectors) {
+    xvec->type = OPIHI_FLT;
+    yvec->type = OPIHI_FLT;
     free (xvec[0].elements.Flt);
     free (yvec[0].elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/mextract.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/mextract.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/mextract.c	(revision 20857)
@@ -6,5 +6,5 @@
   int Nsecfilt, VERBOSE, loadImages, mosaicMode;
   char **cstack, name[1024];
-  float *values;
+  dbValue *values;
   void *Signal;
 
@@ -88,5 +88,5 @@
 
   /* create storage vector */
-  ALLOCATE (values, float, Nfields);
+  ALLOCATE (values, dbValue, Nfields);
   ALLOCATE (vec, Vector *, Nreturn);
   for (i = 0; i < Nreturn; i++) {
@@ -140,5 +140,9 @@
 	if (!dbBooleanCond (stack, Nstack, values)) continue;
 	for (n = 0; n < Nreturn; n++) {
-	  vec[n][0].elements.Flt[Npts] = values[n];
+	  if (vec[n][0].type == OPIHI_FLT) {
+	    vec[n][0].elements.Flt[Npts] = values[n].Flt;
+	  } else {
+	    vec[n][0].elements.Int[Npts] = values[n].Int;
+	  }
 	  // fprintf (stderr, "keep : field: %s, value: %f\n", fields[n].name, values[n]);
 	}
@@ -166,4 +170,5 @@
   }
 
+  free (values);
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
@@ -175,4 +180,5 @@
 
 escape:
+  free (values);
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/mmextract.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/mmextract.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/mmextract.c	(revision 20857)
@@ -8,5 +8,5 @@
   int Nsecfilt, VERBOSE, loadImages, mosaicMode;
   char **cstack1, **cstack2, name1[1024], name2[1024];
-  float *values, **table1, **table2;
+  dbValue *values, **table1, **table2;
   void *Signal;
 
@@ -139,5 +139,5 @@
 
   /* create storage vector */
-  ALLOCATE (values, float, Nfields);
+  ALLOCATE (values, dbValue, Nfields);
   ALLOCATE (vec, Vector *, Nreturn);
 
@@ -152,6 +152,6 @@
     if ((vec[2*i+0] = SelectVector (name1, ANYVECTOR, TRUE)) == NULL) goto escape;
     if ((vec[2*i+1] = SelectVector (name2, ANYVECTOR, TRUE)) == NULL) goto escape;
-    ResetVector (vec[2*i+0], fields[i].type, NNN);
-    ResetVector (vec[2*i+1], fields[i].type, NNN);
+    ResetVector (vec[2*i+0], fields[i].type, fields[i].type);
+    ResetVector (vec[2*i+1], fields[i].type, fields[i].type);
   }
 
@@ -160,10 +160,11 @@
 
   // we save the selected measures for each average to temporary tables 1 and 2
+  // XXX need to deal with the INT / DBL difference here...
   NTABLE = 100;
-  ALLOCATE (table1, float *, Nreturn_base);
-  ALLOCATE (table2, float *, Nreturn_base);
+  ALLOCATE (table1, dbValue *, Nreturn_base);
+  ALLOCATE (table2, dbValue *, Nreturn_base);
   for (i = 0; i < Nreturn_base; i++) {
-    ALLOCATE (table1[i], float, NTABLE);
-    ALLOCATE (table2[i], float, NTABLE);
+    ALLOCATE (table1[i], dbValue, NTABLE);
+    ALLOCATE (table2[i], dbValue, NTABLE);
   }
 
@@ -196,6 +197,6 @@
 	NTABLE = catalog.average[j].Nmeasure;
 	for (n = 0; n < Nreturn_base; n++) {
-	  REALLOCATE (table1[n], float, NTABLE);
-	  REALLOCATE (table2[n], float, NTABLE);
+	  REALLOCATE (table1[n], dbValue, NTABLE);
+	  REALLOCATE (table2[n], dbValue, NTABLE);
 	}
       }
@@ -208,4 +209,5 @@
 	dbExtractMeasuresInitMeas (); // reset counters for saved fields 
 	for (n = 0; n < Nfields; n++) {
+	  // values needs to be a pointer to a type with FLT and INT (with a union, we would save a bit of memory...)
 	  values[n] = dbExtractMeasures (&catalog.average[j], &catalog.secfilt[j*Nsecfilt], &catalog.measure[m], &fields[n]);
 	}
@@ -234,6 +236,11 @@
 	for (n2 = 0; n2 < Nt2; n2++) {
 	  for (n = 0; n < Nreturn_base; n++) {
-	    vec[2*n+0][0].elements.Flt[Npts] = table1[n][n1];
-	    vec[2*n+1][0].elements.Flt[Npts] = table2[n][n2];
+	    if (vec[2*n+0][0].type == OPIHI_FLT) {
+	      vec[2*n+0][0].elements.Flt[Npts] = table1[n][n1].Flt;
+	      vec[2*n+1][0].elements.Flt[Npts] = table2[n][n2].Flt;
+	    } else {
+	      vec[2*n+0][0].elements.Int[Npts] = table1[n][n1].Int;
+	      vec[2*n+1][0].elements.Int[Npts] = table2[n][n2].Int;
+	    }
 	  }
 	  Npts++;
@@ -241,5 +248,9 @@
 	    NPTS += 2000;
 	    for (n = 0; n < Nreturn; n++) {
-	      REALLOCATE (vec[n][0].elements.Flt, opihi_flt, NPTS);
+	      if (vec[n][0].type == OPIHI_FLT) {
+		REALLOCATE (vec[n][0].elements.Flt, opihi_flt, NPTS);
+	      } else {
+		REALLOCATE (vec[n][0].elements.Int, opihi_int, NPTS);
+	      }
 	    }
 	  }
@@ -257,7 +268,12 @@
   interrupt = FALSE;
 
+  // free excess memory
   for (n = 0; n < Nreturn; n++) {
     vec[n][0].Nelements = Npts;
-    REALLOCATE (vec[n][0].elements.Flt, opihi_flt, MAX(1,Npts));
+    if (vec[n][0].type == OPIHI_FLT) {
+      REALLOCATE (vec[n][0].elements.Flt, opihi_flt, MAX(1,Npts));
+    } else {
+      REALLOCATE (vec[n][0].elements.Int, opihi_int, MAX(1,Npts));
+    }
   }
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/paverage.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/paverage.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/paverage.c	(revision 20857)
@@ -10,5 +10,5 @@
   double Radius, Rmin, Rmax, R, D;
   unsigned IDclip, IDchoice, LimExclude;
-  opihi_flt *Xvec, *Yvec, *Zvec;
+  float *Xvec, *Yvec, *Zvec;
   void *Signal;
 
@@ -38,12 +38,12 @@
     photcode = GetPhotcodebyName (argv[Narg]);
     if (!photcode) {
-	fprintf (stderr, "unknown photcode %s\n", argv[Narg]);
-	return (FALSE);
+      fprintf (stderr, "unknown photcode %s\n", argv[Narg]);
+      return (FALSE);
     }
     remove_argument (Narg, &argc, argv);
     Nsec = GetPhotcodeNsec (photcode[0].code);
     if (Nsec == -1) {
-	fprintf (stderr, "photcode %s is not an AVERAGE photcode\n", argv[Narg]);
-	return (FALSE);
+      fprintf (stderr, "photcode %s is not an AVERAGE photcode\n", argv[Narg]);
+      return (FALSE);
     }
   }
@@ -96,7 +96,7 @@
   Npts = 0;
   NPTS = 1000;
-  ALLOCATE (Xvec, opihi_flt, NPTS);
-  ALLOCATE (Yvec, opihi_flt, NPTS);
-  ALLOCATE (Zvec, opihi_flt, NPTS);
+  ALLOCATE (Xvec, float, NPTS);
+  ALLOCATE (Yvec, float, NPTS);
+  ALLOCATE (Zvec, float, NPTS);
 
   // prepare to handle interrupt signals
@@ -133,18 +133,21 @@
       R = average[i].R;
       D = average[i].D;
-      status = RD_to_XY (&Xvec[Npts], &Yvec[Npts], R, D, &graphmode.coords);
+      status = fRD_to_XY (&Xvec[Npts], &Yvec[Npts], R, D, &graphmode.coords);
       if (!status) continue;
       Npts ++;
 
       if (Npts == NPTS - 1) {
-	  NPTS += 1000;
-	  REALLOCATE (Xvec, opihi_flt, NPTS);
-	  REALLOCATE (Yvec, opihi_flt, NPTS);
-	  REALLOCATE (Zvec, opihi_flt, NPTS);
+	NPTS += 1000;
+	REALLOCATE (Xvec, float, NPTS);
+	REALLOCATE (Yvec, float, NPTS);
+	REALLOCATE (Zvec, float, NPTS);
       }
       if ((Npts > NCHUNK) || (Nloaded >= 25)) {
-	  PlotVectorTriplet (kapa, Npts, Xvec, Yvec, Zvec, &graphmode);
-	  Npts = 0;
-	  Nloaded = 0;
+	KapaPrepPlot (kapa, Npts, graphmode);
+	KapaPlotVector (kapa, Npts, Xvec, "x");
+	KapaPlotVector (kapa, Npts, Yvec, "y");
+	KapaPlotVector (kapa, Npts, Zvec, "z");
+	Npts = 0;
+	Nloaded = 0;
       }
     }
@@ -152,5 +155,10 @@
     dvo_catalog_free (&catalog);
   }
-  if (Npts > 0) PlotVectorTriplet (kapa, Npts, Xvec, Yvec, Zvec, &graphmode);
+  if (Npts > 0) {
+    KapaPrepPlot (kapa, Npts, graphmode);
+    KapaPlotVector (kapa, Npts, Xvec, "x");
+    KapaPlotVector (kapa, Npts, Yvec, "y");
+    KapaPlotVector (kapa, Npts, Zvec, "z");
+  }
 
   free (Xvec);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/pmeasure.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/pmeasure.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/pmeasure.c	(revision 20857)
@@ -14,5 +14,5 @@
   unsigned photFlagChoice, photFlagClip;
   int PhotcodeClip;
-  opihi_flt *Xvec, *Yvec, *Zvec;
+  float *Xvec, *Yvec, *Zvec;
   time_t tzero, tend;
   void *Signal;
@@ -169,7 +169,7 @@
   Npts = 0;
   NPTS = 1000;
-  ALLOCATE (Xvec, opihi_flt, NPTS);
-  ALLOCATE (Yvec, opihi_flt, NPTS);
-  ALLOCATE (Zvec, opihi_flt, NPTS);
+  ALLOCATE (Xvec, float, NPTS);
+  ALLOCATE (Yvec, float, NPTS);
+  ALLOCATE (Zvec, float, NPTS);
 
   // prepare to handle interrupt signals
@@ -218,18 +218,21 @@
 	  free (date);
 	}
-	status = RD_to_XY (&Xvec[Npts], &Yvec[Npts], R, D, &graphmode.coords);
+	status = fRD_to_XY (&Xvec[Npts], &Yvec[Npts], R, D, &graphmode.coords);
 	if (!status) continue;
 	Npts ++;
 
 	if (Npts == NPTS - 1) {
-	    NPTS += 1000;
-	    REALLOCATE (Xvec, opihi_flt, NPTS);
-	    REALLOCATE (Yvec, opihi_flt, NPTS);
-	    REALLOCATE (Zvec, opihi_flt, NPTS);
+	  NPTS += 1000;
+	  REALLOCATE (Xvec, float, NPTS);
+	  REALLOCATE (Yvec, float, NPTS);
+	  REALLOCATE (Zvec, float, NPTS);
 	}
 	if ((Npts > NCHUNK) || (Nloaded >= 25)) {
-	    PlotVectorTriplet (kapa, Npts, Xvec, Yvec, Zvec, &graphmode);
-	    Npts = 0;
-	    Nloaded = 0;
+	  KapaPrepPlot (kapa, Npts, graphmode);
+	  KapaPlotVector (kapa, Npts, Xvec, "x");
+	  KapaPlotVector (kapa, Npts, Yvec, "y");
+	  KapaPlotVector (kapa, Npts, Zvec, "z");
+	  Npts = 0;
+	  Nloaded = 0;
 	}
       }
@@ -238,6 +241,10 @@
     dvo_catalog_free (&catalog);
   }
-  if (Npts > 0) PlotVectorTriplet (kapa, Npts, Xvec, Yvec, Zvec, &graphmode);
-
+  if (Npts > 0) {
+    KapaPrepPlot (kapa, Npts, graphmode);
+    KapaPlotVector (kapa, Npts, Xvec, "x");
+    KapaPlotVector (kapa, Npts, Yvec, "y");
+    KapaPlotVector (kapa, Npts, Zvec, "z");
+  }
   free (Xvec);
   free (Yvec);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/procks.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/procks.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/procks.c	(revision 20857)
@@ -114,5 +114,5 @@
   graphmode.style = 2; /* set style to points */
   graphmode.etype = 0; /* no errorbars */
-  PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+  PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
 
   /* now plot vectors between two extrema */
@@ -147,5 +147,5 @@
   graphmode.etype = 0; /* no errorbars */
 
-  PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+  PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
 
   free (Xvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/showtile.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/showtile.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/showtile.c	(revision 20857)
@@ -86,5 +86,5 @@
     graphmode.ptype = 100; /* connect pairs of points */
     graphmode.etype = 0;
-    PlotVectorPair (kapa, N, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+    PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
   }
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/simage.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/simage.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/simage.c	(revision 20857)
@@ -155,5 +155,5 @@
   Npts = Xvec.Nelements;
 
-  PlotVectorTriplet (kapa, Npts, Xvec.elements.Flt, Yvec.elements.Flt, Zvec.elements.Flt, &graphmode);
+  PlotVectorTriplet (kapa, Xvec, Yvec, Zvec, &graphmode);
 
   free (Xvec.elements.Flt);
Index: /branches/eam_branch_20081124/Ohana/src/opihi/dvo/skycat.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/dvo/skycat.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/dvo/skycat.c	(revision 20857)
@@ -101,5 +101,5 @@
     graphmode.ptype = 100; /* connect pairs of points */
     graphmode.etype = 0;
-    PlotVectorPair (kapa, Npts, Xvec.elements.Flt, Yvec.elements.Flt, &graphmode);
+    PlotVectorPair (kapa, Xvec, Yvec, &graphmode);
   }
 
Index: /branches/eam_branch_20081124/Ohana/src/opihi/include/display.h
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/include/display.h	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/include/display.h	(revision 20857)
@@ -7,8 +7,8 @@
 
 /*** kapa graph functions ***/
-int           PlotVectorSingle      PROTO((int kapa, int Npts, opihi_flt *values, char *mode));
-int           PlotVectorPair        PROTO((int kapa, int Npts, opihi_flt *xValues, opihi_flt *yValues, Graphdata *graphmode));
-int           PlotVectorPairErrors  PROTO((int kapa, int Npts, opihi_flt *xValues, opihi_flt *yValues, opihi_flt *dyValues, Graphdata *graphmode));
-int           PlotVectorTriplet     PROTO((int kapa, int Npts, opihi_flt *xValues, opihi_flt *yValues, opihi_flt *zValues, Graphdata *graphmode));
+int           PlotVectorSingle      PROTO((int kapa, Vector *vec, char *mode));
+int           PlotVectorPair        PROTO((int kapa, Vector *xVec, Vector *yVec, Graphdata *graphmode));
+int           PlotVectorPairErrors  PROTO((int kapa, Vector *xVec, Vector *yVec, Vector *dyValues, Graphdata *graphmode));
+int           PlotVectorTriplet     PROTO((int kapa, Vector *xVec, Vector *yVec, Vector *zValues, Graphdata *graphmode));
 int           GetGraphData          PROTO((Graphdata *data, int *kapa, char *name));
 int           GetGraph              PROTO((Graphdata *data, int *kapa, char *name));
Index: /branches/eam_branch_20081124/Ohana/src/opihi/include/dvomath.h
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/include/dvomath.h	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/include/dvomath.h	(revision 20857)
@@ -9,4 +9,16 @@
 # define opihi_flt double
 # define opihi_int unsigned int
+
+# define REQUIRE_VECTOR_FLT(VECT,RVAL) { \
+  if (VECT->type != OPIHI_FLT) { \
+    gprint (GP_ERR, "function requires vector of type FLT\n"); \
+    return (RVAL); \
+  }
+
+# define REQUIRE_VECTOR_INT(VECT,RVAL) { \
+  if (VECT->type != OPIHI_INT) { \
+    gprint (GP_ERR, "function requires vector of type INT\n"); \
+    return (RVAL); \
+  }
 
 enum {ANYVECTOR, NEWVECTOR, OLDVECTOR};
Index: /branches/eam_branch_20081124/Ohana/src/opihi/include/dvoshell.h
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/include/dvoshell.h	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/include/dvoshell.h	(revision 20857)
@@ -136,4 +136,5 @@
   int ID;
   int magMode;
+  char type;
   PhotCode *photcode;
 } dbField;
@@ -146,4 +147,9 @@
   float   Float;
 } dbStack;
+
+typedef struct {
+  opihi_flt Flt;
+  opihi_int Int;
+} dbValue;
 
 typedef struct {
Index: /branches/eam_branch_20081124/Ohana/src/opihi/lib.data/PlotVectors.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/lib.data/PlotVectors.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/lib.data/PlotVectors.c	(revision 20857)
@@ -1,12 +1,22 @@
 # include "display.h"
 
-int PlotVectorSingle (int kapa, int Npts, opihi_flt *values, char *mode) {
+int PlotVectorSingle (int kapa, Vector *vec, char *mode) {
 
-  int i;
+  int i, Npts;
   float *temp;
+
+  Npts = vec->Nelements;
   ALLOCATE (temp, float, Npts);
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = values[i];
+  if (vec->type == OPIHI_FLT) {
+    opihi_flt *value = vec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = vec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, mode);
@@ -17,19 +27,39 @@
 }
 
-int PlotVectorPair (int kapa, int Npts, opihi_flt *xValues, opihi_flt *yValues, Graphdata *graphmode) {
+int PlotVectorPair (int kapa, Vector *xVec, Vector *yVec, Graphdata *graphmode) {
 
-  int i;
+  int i, Npts;
   float *temp;
+
+  if (xVec->Nelements != yVec->Nelements) return (FALSE);
+  Npts = xVec->Nelements;
+
   ALLOCATE (temp, float, Npts);
 
   KapaPrepPlot (kapa, Npts, graphmode);
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = xValues[i];
+  if (xVec->type == OPIHI_FLT) {
+    opihi_flt *value = xVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = xVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "x");
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = yValues[i];
+  if (yVec->type == OPIHI_FLT) {
+    opihi_flt *value = yVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = yVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "y");
@@ -40,24 +70,53 @@
 }
 
-int PlotVectorTriplet (int kapa, int Npts, opihi_flt *xValues, opihi_flt *yValues, opihi_flt *zValues, Graphdata *graphmode) {
+int PlotVectorTriplet (int kapa, Vector *xVec, Vector *yVec, Vector *zVec, Graphdata *graphmode) {
 
-  int i;
+  int i, Npts;
   float *temp;
+
+  if (xVec->Nelements != yVec->Nelements) return (FALSE);
+  if (xVec->Nelements != zVec->Nelements) return (FALSE);
+  Npts = xVec->Nelements;
+
   ALLOCATE (temp, float, Npts);
 
-  KapaPrepPlot   (kapa, Npts, graphmode);
+  KapaPrepPlot (kapa, Npts, graphmode);
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = xValues[i];
+  if (xVec->type == OPIHI_FLT) {
+    opihi_flt *value = xVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = xVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "x");
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = yValues[i];
+  if (yVec->type == OPIHI_FLT) {
+    opihi_flt *value = yVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = yVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "y");
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = zValues[i];
+  if (zVec->type == OPIHI_FLT) {
+    opihi_flt *value = zVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = zVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "z");
@@ -68,24 +127,53 @@
 }
 
-int PlotVectorPairErrors (int kapa, int Npts, opihi_flt *xValues, opihi_flt *yValues, opihi_flt *dyValues, Graphdata *graphmode) {
+int PlotVectorPairErrors (int kapa, Vector *xVec, Vector *yVec, Vector *dyVec, Graphdata *graphmode) {
 
-  int i;
+  int i, Npts;
   float *temp;
+
+  if (xVec->Nelements != yVec->Nelements) return (FALSE);
+  if (xVec->Nelements != dyVec->Nelements) return (FALSE);
+  Npts = xVec->Nelements;
+
   ALLOCATE (temp, float, Npts);
 
   KapaPrepPlot (kapa, Npts, graphmode);
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = xValues[i];
+  if (xVec->type == OPIHI_FLT) {
+    opihi_flt *value = xVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = xVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "x");
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = yValues[i];
+  if (yVec->type == OPIHI_FLT) {
+    opihi_flt *value = yVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = yVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "y");
 
-  for (i = 0; i < Npts; i++) {
-    temp[i] = dyValues[i];
+  if (dyVec->type == OPIHI_FLT) {
+    opihi_flt *value = dyVec->elements.Flt;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
+  } else {
+    opihi_int *value = dyVec->elements.Int;
+    for (i = 0; i < Npts; i++) {
+      temp[i] = value[i];
+    }
   }
   KapaPlotVector (kapa, Npts, temp, "dym");
Index: /branches/eam_branch_20081124/Ohana/src/opihi/lib.shell/expand_vectors.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/lib.shell/expand_vectors.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/lib.shell/expand_vectors.c	(revision 20857)
@@ -126,9 +126,5 @@
 	}
 	if (I < 0) I += vec[0].Nelements;
-	if (vec[0].type == OPIHI_FLT) {
-	    f1 = vec[0].elements.Flt[I];
-	} else {
-	    f1 = vec[0].elements.Int[I];
-	}
+	f1 = (vec[0].type == OPIHI_FLT) ? vec[0].elements.Flt[I] : vec[0].elements.Int[I];
       }
     }
@@ -136,7 +132,7 @@
     free (tmpline);
     if ((int)f1 == f1) 
-      snprintf (strValue, 128, "%.0f", f1);
+      snprintf (strValue, 128, "%.0f", f1); 
     else
-      snprintf (strValue, 128, "%.9g", f1);
+      snprintf (strValue, 128, "%.12g", f1);
 
     /* interpolate vector element into newline (being accumulated) */
Index: /branches/eam_branch_20081124/Ohana/src/opihi/lib.shell/parse.c
===================================================================
--- /branches/eam_branch_20081124/Ohana/src/opihi/lib.shell/parse.c	(revision 20856)
+++ /branches/eam_branch_20081124/Ohana/src/opihi/lib.shell/parse.c	(revision 20857)
@@ -191,7 +191,7 @@
       if (Nx < 0) Nx += vec[0].Nelements;
       if (vec[0].type == OPIHI_FLT) {
-	  vec[0].elements.Flt[Nx] = atof (val);
+	vec[0].elements.Flt[Nx] = atof (val);
       } else {
-	  vec[0].elements.Int[Nx] = atol (val);
+	vec[0].elements.Int[Nx] = atol (val);
       }
     }
