Index: trunk/Ohana/src/opihi/cmd.data/accum.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/accum.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/accum.c	(revision 20936)
@@ -5,5 +5,6 @@
   int i, Nbins, bin, N, Normalize;
   float start, end, delta;
-  float *V, *K, *O, *NV;
+  int *NV;
+  opihi_flt *V, *K, *O;
   Vector *val, *key, *out;
 
@@ -29,4 +30,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]);
@@ -45,15 +49,14 @@
   Nbins = (end - start) / delta;
 
-  out[0].Nelements = Nbins;
-  REALLOCATE (out[0].elements, float, out[0].Nelements);
-  bzero (out[0].elements, sizeof(float)*out[0].Nelements);
+  ResetVector (out, OPIHI_FLT, Nbins);
+  bzero (out[0].elements.Flt, sizeof(opihi_flt)*out[0].Nelements);
   if (Normalize) {
-    ALLOCATE (NV, float, Nbins);
-    bzero (NV, sizeof(float)*Nbins);
+    ALLOCATE (NV, int, Nbins);
+    bzero (NV, sizeof(int)*Nbins);
   }
 
-  V = val[0].elements;
-  K = key[0].elements;
-  O = out[0].elements;
+  V = val[0].elements.Flt;
+  K = key[0].elements.Flt;
+  O = out[0].elements.Flt;
 
   for (i = 0; i < val[0].Nelements; i++, V++, K++) {
Index: trunk/Ohana/src/opihi/cmd.data/applyfit.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/applyfit.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/applyfit.c	(revision 20936)
@@ -1,5 +1,3 @@
 # include "data.h"
-
-char *get_variable (char *);
 
 int applyfit (int argc, char **argv) {
@@ -8,5 +6,5 @@
   char *c, name[64];
   double *C, X;
-  float *x, *y;
+  opihi_flt *y;
   Vector *xvec, *yvec;
 
@@ -38,15 +36,26 @@
     free (c);
   }
-  yvec[0].Nelements = xvec[0].Nelements;
-  REALLOCATE (yvec[0].elements, float, yvec[0].Nelements);
-  bzero (yvec[0].elements, sizeof(float)*yvec[0].Nelements);
-  x = xvec[0].elements;
-  y = yvec[0].elements;
 
-  for (j = 0; j < xvec[0].Nelements; j++, x++, y++) {
-    X = 1;
-    for (i = 0; i < order + 1; i++) {
-      *y += C[i]*X;
-      X = X * (*x);
+  ResetVector (yvec, OPIHI_FLT, xvec[0].Nelements);
+  bzero (yvec[0].elements.Flt, sizeof(opihi_flt)*yvec[0].Nelements);
+  y = yvec[0].elements.Flt;
+
+  if (xvec[0].type == OPIHI_FLT) {
+    opihi_flt *x = xvec[0].elements.Flt;
+    for (j = 0; j < xvec[0].Nelements; j++, x++, y++) {
+      X = 1;
+      for (i = 0; i < order + 1; i++) {
+	*y += C[i]*X;
+	X = X * (*x);
+      }
+    }
+  } else {
+    opihi_int *x = xvec[0].elements.Int;
+    for (j = 0; j < xvec[0].Nelements; j++, x++, y++) {
+      X = 1;
+      for (i = 0; i < order + 1; i++) {
+	*y += C[i]*X;
+	X = X * (*x);
+      }
     }
   }
Index: trunk/Ohana/src/opihi/cmd.data/applyfit2d.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/applyfit2d.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/applyfit2d.c	(revision 20936)
@@ -1,5 +1,3 @@
 # include "data.h"
-
-char *get_variable (char *);
 
 int applyfit2d (int argc, char **argv) {
@@ -8,5 +6,5 @@
   char *c, name[64];
   double **C, X, Y;
-  float *x, *y, *z;
+  opihi_flt *z;
   Vector *xvec, *yvec, *zvec;
 
@@ -45,22 +43,70 @@
   }
 
-  zvec[0].Nelements = xvec[0].Nelements;
-  REALLOCATE (zvec[0].elements, float, zvec[0].Nelements);
-  bzero (zvec[0].elements, sizeof(float)*zvec[0].Nelements);
-  x = xvec[0].elements;
-  y = yvec[0].elements;
-  z = zvec[0].elements;
+  ResetVector (zvec, OPIHI_FLT, xvec[0].Nelements);
+  bzero (zvec[0].elements.Flt, sizeof(opihi_flt)*zvec[0].Nelements);
+  z = zvec[0].elements.Flt;
 
-  for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
-    Y = X = 1;
-    for (j = 0; j < order + 1; j++) {
-      X = Y;
-      for (i = 0; i < order + 1 - j; i++) {
-	*z += C[i][j]*X;
-	X = X * (*x);
+  // we have four cases (x == flt or int) and (y == flt or int)
+  if ((xvec[0].type == OPIHI_FLT) && (yvec[0].type == OPIHI_FLT)) {
+    opihi_flt *x = xvec[0].elements.Flt;
+    opihi_flt *y = yvec[0].elements.Flt;
+    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
+      Y = X = 1;
+      for (j = 0; j < order + 1; j++) {
+	X = Y;
+	for (i = 0; i < order + 1 - j; i++) {
+	  *z += C[i][j]*X;
+	  X = X * (*x);
+	}
+	Y = Y * (*y);
       }
-      Y = Y * (*y);
     }
   }
+  if ((xvec[0].type == OPIHI_FLT) && (yvec[0].type == OPIHI_INT)) {
+    opihi_flt *x = xvec[0].elements.Flt;
+    opihi_int *y = yvec[0].elements.Int;
+    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
+      Y = X = 1;
+      for (j = 0; j < order + 1; j++) {
+	X = Y;
+	for (i = 0; i < order + 1 - j; i++) {
+	  *z += C[i][j]*X;
+	  X = X * (*x);
+	}
+	Y = Y * (*y);
+      }
+    }
+  }
+  if ((xvec[0].type == OPIHI_INT) && (yvec[0].type == OPIHI_FLT)) {
+    opihi_int *x = xvec[0].elements.Int;
+    opihi_flt *y = yvec[0].elements.Flt;
+    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
+      Y = X = 1;
+      for (j = 0; j < order + 1; j++) {
+	X = Y;
+	for (i = 0; i < order + 1 - j; i++) {
+	  *z += C[i][j]*X;
+	  X = X * (*x);
+	}
+	Y = Y * (*y);
+      }
+    }
+  }
+  if ((xvec[0].type == OPIHI_INT) && (yvec[0].type == OPIHI_INT)) {
+    opihi_int *x = xvec[0].elements.Int;
+    opihi_int *y = yvec[0].elements.Int;
+    for (n = 0; n < xvec[0].Nelements; n++, x++, y++, z++) {
+      Y = X = 1;
+      for (j = 0; j < order + 1; j++) {
+	X = Y;
+	for (i = 0; i < order + 1 - j; i++) {
+	  *z += C[i][j]*X;
+	  X = X * (*x);
+	}
+	Y = Y * (*y);
+      }
+    }
+  }
+
   for (i = 0; i < order + 1; i++) free (C[i]);
   free (C);
Index: trunk/Ohana/src/opihi/cmd.data/concat.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/concat.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/concat.c	(revision 20936)
@@ -5,4 +5,5 @@
   int  i, j, Nin;
   double value;
+  opihi_flt *temp;
   Vector *ivec, *ovec;
 
@@ -19,6 +20,11 @@
     Nin = ovec[0].Nelements;
     ovec[0].Nelements++;
-    REALLOCATE (ovec[0].elements, float, ovec[0].Nelements);
-    ovec[0].elements[Nin] = value;
+    if (ovec[0].type == OPIHI_FLT) {
+      REALLOCATE (ovec[0].elements.Flt, opihi_flt, ovec[0].Nelements);
+      ovec[0].elements.Flt[Nin] = value;
+    } else {
+      REALLOCATE (ovec[0].elements.Int, opihi_int, ovec[0].Nelements);
+      ovec[0].elements.Int[Nin] = value;
+    }
     return (TRUE);
   } 
@@ -26,11 +32,39 @@
   if ((ivec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
   
-  REALLOCATE (ovec[0].elements, float, ovec[0].Nelements + ivec[0].Nelements);
-  for (j = ovec[0].Nelements, i = 0; i < ivec[0].Nelements; i++, j++) {
-    ovec[0].elements[j] = ivec[0].elements[i];
+  // we have 4 cases: (ivec == flt or int) and (ovec == flt or int)
+  if ((ovec[0].type == OPIHI_FLT) && (ivec[0].type == OPIHI_FLT)) {
+    REALLOCATE (ovec[0].elements.Flt, opihi_flt, ovec[0].Nelements + ivec[0].Nelements);
+    for (j = ovec[0].Nelements, i = 0; i < ivec[0].Nelements; i++, j++) {
+      ovec[0].elements.Flt[j] = ivec[0].elements.Flt[i];
+    }
   }
+  if ((ovec[0].type == OPIHI_FLT) && (ivec[0].type == OPIHI_INT)) {
+    REALLOCATE (ovec[0].elements.Flt, opihi_flt, ovec[0].Nelements + ivec[0].Nelements);
+    for (j = ovec[0].Nelements, i = 0; i < ivec[0].Nelements; i++, j++) {
+      ovec[0].elements.Flt[j] = ivec[0].elements.Int[i];
+    }
+  }
+  if ((ovec[0].type == OPIHI_INT) && (ivec[0].type == OPIHI_INT)) {
+    REALLOCATE (ovec[0].elements.Int, opihi_int, ovec[0].Nelements + ivec[0].Nelements);
+    for (j = ovec[0].Nelements, i = 0; i < ivec[0].Nelements; i++, j++) {
+      ovec[0].elements.Int[j] = ivec[0].elements.Int[i];
+    }
+  }
+
+  // this case forces ovec to be raised to FLT
+  if ((ovec[0].type == OPIHI_INT) && (ivec[0].type == OPIHI_FLT)) {
+    ALLOCATE (temp, opihi_flt, ovec[0].Nelements + ivec[0].Nelements);
+    for (i = 0; i < ovec[0].Nelements; i++) {
+      temp[i] = ovec[0].elements.Int[i];
+    }
+    ovec[0].type = OPIHI_FLT;
+    free (ovec[0].elements.Int);
+    ovec[0].elements.Flt = temp;
+    for (j = ovec[0].Nelements, i = 0; i < ivec[0].Nelements; i++, j++) {
+      ovec[0].elements.Flt[j] = ivec[0].elements.Flt[i];
+    }
+  }
+
   ovec[0].Nelements += ivec[0].Nelements;
-  
   return (TRUE);
-    
 }
Index: trunk/Ohana/src/opihi/cmd.data/contour.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/contour.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/contour.c	(revision 20936)
@@ -44,11 +44,10 @@
 int N, NVEC;
 
-void DUMP (float x, float y, float dx, float dy) {
-  
-  xv[0].elements[N]   = x;
-  xv[0].elements[N+1] = x+dx;
-  
-  yv[0].elements[N]   = y;
-  yv[0].elements[N+1] = y+dy;
+void DUMP (opihi_flt x, opihi_flt y, opihi_flt dx, opihi_flt dy) {
+  
+  xv[0].elements.Flt[N]   = x;
+  xv[0].elements.Flt[N+1] = x+dx;
+  yv[0].elements.Flt[N]   = y;
+  yv[0].elements.Flt[N+1] = y+dy;
   
   N+=2;
@@ -56,6 +55,6 @@
   if (N >= NVEC - 2) {
     NVEC += 100;
-    REALLOCATE (xv[0].elements, float, NVEC);
-    REALLOCATE (yv[0].elements, float, NVEC);
+    REALLOCATE (xv[0].elements.Flt, opihi_flt, NVEC);
+    REALLOCATE (yv[0].elements.Flt, opihi_flt, NVEC);
   }
 }
@@ -64,6 +63,6 @@
 
   int i, j, Nx, Ny;
+  opihi_flt x, y, dx, dy;
   float level, d00, d01, d10, d11, tmp;
-  float x, y, dx, dy;
   float *v00, *v01, *v10, *v11;
   float *matrix;
@@ -93,6 +92,6 @@
   N = 0;
   NVEC = 100;
-  REALLOCATE (xv[0].elements, float, NVEC);
-  REALLOCATE (yv[0].elements, float, NVEC);
+  ResetVector (xv, OPIHI_FLT, NVEC);
+  ResetVector (yv, OPIHI_FLT, NVEC);
 
   for (j = 1; j < Ny; j++) {
Index: trunk/Ohana/src/opihi/cmd.data/create.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/create.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/create.c	(revision 20936)
@@ -3,8 +3,14 @@
 int create (int argc, char **argv) {
   
-  int i;
+  int i, N, INT;
   float start, end, delta;
   Vector *vec;
   
+  INT = FALSE;
+  if ((N = get_argument (argc, argv, "-int"))) {
+    INT = TRUE;
+    remove_argument (N, &argc, argv);
+  }
+
   if ((argc != 5) && (argc != 4)) {
     gprint (GP_ERR, "USAGE: create vector start end [delta]\n");
@@ -27,9 +33,23 @@
   }
 
+  if (INT && (delta != (int)delta)) {
+    gprint (GP_ERR, "integer vector requested but fractional step-size specified\n");
+    return (FALSE);
+  }
+
   vec[0].Nelements = (end - start) / delta;
-  REALLOCATE (vec[0].elements, float, vec[0].Nelements);
 
-  for (i = 0; i < vec[0].Nelements; i++) {
-    vec[0].elements[i] = start + i*delta;
+  if (INT) {
+    vec[0].type = OPIHI_INT;
+    REALLOCATE (vec[0].elements.Int, opihi_int, vec[0].Nelements);
+    for (i = 0; i < vec[0].Nelements; i++) {
+      vec[0].elements.Int[i] = start + i*delta;
+    }
+  } else {
+    vec[0].type = OPIHI_FLT;
+    REALLOCATE (vec[0].elements.Flt, opihi_flt, vec[0].Nelements);
+    for (i = 0; i < vec[0].Nelements; i++) {
+      vec[0].elements.Flt[i] = start + i*delta;
+    }
   }
 
Index: trunk/Ohana/src/opihi/cmd.data/cumulative.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/cumulative.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/cumulative.c	(revision 20936)
@@ -4,5 +4,5 @@
   
   int i;
-  float *Vi, *Vo;
+  opihi_flt *Vo;
   Vector *ivec, *ovec;
 
@@ -14,15 +14,23 @@
   if ((ivec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
   if ((ovec = SelectVector (argv[2], ANYVECTOR, TRUE)) == NULL) return (FALSE);
-  ovec[0].Nelements = ivec[0].Nelements;
-    
-  REALLOCATE (ovec[0].elements, float, ovec[0].Nelements);
-  bzero (ovec[0].elements, sizeof(float)*ovec[0].Nelements);
 
-  Vi = ivec[0].elements;
-  Vo = ovec[0].elements;
-  *Vo = *Vi;
-  for (i = 1; i < ivec[0].Nelements; i++, Vi++, Vo++) {
-    *Vo = Vo[-1] + *Vi;
-  }      
+  ResetVector (ovec, OPIHI_FLT, ivec[0].Nelements);
+  bzero (ovec[0].elements.Flt, sizeof(opihi_flt)*ovec[0].Nelements);
+
+  Vo = ovec[0].elements.Flt;
+
+  if (ivec[0].type == OPIHI_FLT) {
+    opihi_flt *Vi = ivec[0].elements.Flt;
+    *Vo = *Vi;
+    for (i = 1; i < ivec[0].Nelements; i++, Vi++, Vo++) {
+      *Vo = Vo[-1] + *Vi;
+    }      
+  } else {
+    opihi_int *Vi = ivec[0].elements.Int;
+    *Vo = *Vi;
+    for (i = 1; i < ivec[0].Nelements; i++, Vi++, Vo++) {
+      *Vo = Vo[-1] + *Vi;
+    }      
+  }
   return (TRUE);
 }
Index: trunk/Ohana/src/opihi/cmd.data/cut.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/cut.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/cut.c	(revision 20936)
@@ -48,10 +48,9 @@
   case 'X':
     /* create output vectors */
-    xvec[0].Nelements = yvec[0].Nelements = nx;
-    REALLOCATE (xvec[0].elements, float, MAX (nx, 1));
-    REALLOCATE (yvec[0].elements, float, MAX (nx, 1));
-    bzero (yvec[0].elements, nx*sizeof(float));
+    ResetVector (xvec, OPIHI_FLT, MAX (nx, 1));
+    ResetVector (yvec, OPIHI_FLT, MAX (nx, 1));
+    bzero (yvec[0].elements.Flt, nx*sizeof(opihi_flt));
     for (i = 0; i < nx; i++) {
-      xvec[0].elements[i] = i + sx; 
+      xvec[0].elements.Flt[i] = i + sx; 
     }
     ALLOCATE (Vbuf, float, MAX (ny, 1));
@@ -74,5 +73,5 @@
 	if (Mode == MEAN) { value /= ny; }
       }
-      yvec[0].elements[i] = value;
+      yvec[0].elements.Flt[i] = value;
     }
     free (Vbuf);
@@ -81,10 +80,9 @@
   case 'y':
   case 'Y':
-    xvec[0].Nelements = yvec[0].Nelements = ny;
-    REALLOCATE (xvec[0].elements, float, ny);
-    REALLOCATE (yvec[0].elements, float, ny);
-    bzero (yvec[0].elements, ny*sizeof(float));
+    ResetVector (xvec, OPIHI_FLT, MAX (ny, 1));
+    ResetVector (yvec, OPIHI_FLT, MAX (ny, 1));
+    bzero (yvec[0].elements.Flt, ny*sizeof(opihi_flt));
     for (i = 0; i < ny; i++) {
-      xvec[0].elements[i] = i + sy; 
+      xvec[0].elements.Flt[i] = i + sy; 
     }
     ALLOCATE (Vbuf, float, MAX (nx, 1));
@@ -107,5 +105,5 @@
 	if (Mode == MEAN) { value /= nx; }
       }
-      yvec[0].elements[i] = value;
+      yvec[0].elements.Flt[i] = value;
     }
     free (Vbuf);
Index: trunk/Ohana/src/opihi/cmd.data/dbselect.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/dbselect.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/dbselect.c	(revision 20936)
@@ -67,6 +67,24 @@
       return (FALSE);
     }
-    REALLOCATE (vec[i][0].elements, float, Nrows);
-    vec[i][0].Nelements = Nrows;
+    switch (fields[i].type) {
+      case FIELD_TYPE_TINY:
+      case FIELD_TYPE_SHORT:
+      case FIELD_TYPE_LONG:
+      case FIELD_TYPE_INT24:
+      case FIELD_TYPE_LONGLONG:
+	ResetVector (vec[i], OPIHI_INT, Nrows);
+	break;
+      case FIELD_TYPE_DECIMAL:
+      case FIELD_TYPE_FLOAT:
+      case FIELD_TYPE_DOUBLE:
+      case FIELD_TYPE_TIME:
+      case FIELD_TYPE_DATE:
+      case FIELD_TYPE_DATETIME:
+	ResetVector (vec[i], OPIHI_FLT, Nrows);
+	break;
+      default:
+	ResetVector (vec[i], OPIHI_FLT, Nrows);
+	break;
+    }
   }
 
@@ -88,8 +106,10 @@
 	  case FIELD_TYPE_INT24:
 	  case FIELD_TYPE_LONGLONG:
+	    vec[i][0].elements.Int[j] = atol (row[i]);
+	    break;
 	  case FIELD_TYPE_DECIMAL:
 	  case FIELD_TYPE_FLOAT:
 	  case FIELD_TYPE_DOUBLE:
-	    vec[i][0].elements[j] = atof (row[i]);
+	    vec[i][0].elements.Flt[j] = atof (row[i]);
 	    break;
 	  case FIELD_TYPE_TIME:
@@ -97,11 +117,11 @@
 	  case FIELD_TYPE_DATETIME:
 	    seconds = ohana_date_to_sec (row[i]);
-	    vec[i][0].elements[j] = ohana_sec_to_mjd (seconds);
+	    vec[i][0].elements.Flt[j] = ohana_sec_to_mjd (seconds);
 	    break;
 	  default:
-	    vec[i][0].elements[j] = NAN;
+	    vec[i][0].elements.Flt[j] = NAN;
 	}
       } else {
-	vec[i][0].elements[j] = NAN;
+	vec[i][0].elements.Flt[j] = NAN;
       }
     }
Index: trunk/Ohana/src/opihi/cmd.data/dimendown.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/dimendown.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/dimendown.c	(revision 20936)
@@ -6,5 +6,6 @@
   
   int i, Nx, Ny, Npix, N, mode;
-  float *in, *out;
+  float *in;
+  opihi_flt *out;
   Vector *vec;
   Buffer *buf;
@@ -29,9 +30,8 @@
   Npix = Nx * Ny;
 
-  vec[0].Nelements = Npix;
-  REALLOCATE (vec[0].elements, float, Npix);
+  ResetVector (vec, OPIHI_FLT, Npix);
 
   in = (float *) buf[0].matrix.buffer;
-  out = vec[0].elements;
+  out = vec[0].elements.Flt;
 
   switch (mode) {
Index: trunk/Ohana/src/opihi/cmd.data/dimenup.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/dimenup.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/dimenup.c	(revision 20936)
@@ -4,5 +4,5 @@
   
   int i, Nx, Ny, Npix;
-  float *in, *out;
+  float *out;
   Vector *vec;
   Buffer *buf;
@@ -29,8 +29,15 @@
 
   out = (float *) buf[0].matrix.buffer;
-  in = vec[0].elements;
 
-  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;
+    }
   }
 
Index: trunk/Ohana/src/opihi/cmd.data/fft1d.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/fft1d.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/fft1d.c	(revision 20936)
@@ -25,4 +25,7 @@
   if ((Ire = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
   
+  REQUIRE_VECTOR_FLT (Ire, FALSE); 
+  if (Iim) { REQUIRE_VECTOR_FLT (Iim, FALSE); }
+
   // check the input data (match lengths? binary length?)
   Npix = Ire[0].Nelements;
@@ -40,21 +43,19 @@
   if ((Oim = SelectVector (argv[5], ANYVECTOR, TRUE)) == NULL) return (FALSE);
 
-  // allocate sufficient output space
-  Ore[0].Nelements = Npix;
-  Oim[0].Nelements = Npix;
-  REALLOCATE (Ore[0].elements, float, Npix);
-  REALLOCATE (Oim[0].elements, float, Npix);
+  // allocate sufficient output space, force output to be FLT
+  ResetVector (Ore, OPIHI_FLT, Npix);
+  ResetVector (Oim, OPIHI_FLT, Npix);
  
   // copy data to output vectors (fft is done in place)
-  memcpy (Ore[0].elements, Ire[0].elements, Npix*sizeof(float));
+  memcpy (Ore[0].elements.Flt, Ire[0].elements.Flt, Npix*sizeof(opihi_flt));
 
   // copy imaginary vector or create a zero vector
   if (ZeroImaginary) {
-    memset (Oim[0].elements, 0, Npix*sizeof(float));
+    memset (Oim[0].elements.Flt, 0, Npix*sizeof(opihi_flt));
   } else {
-    memcpy (Oim[0].elements, Iim[0].elements, Npix*sizeof(float));
+    memcpy (Oim[0].elements.Flt, Iim[0].elements.Flt, Npix*sizeof(opihi_flt));
   }    
 
-  fft1D (Ore[0].elements, Oim[0].elements, Npix, Nbit, forward); 
+  dfft1D (Ore[0].elements.Flt, Oim[0].elements.Flt, Npix, Nbit, forward); 
   
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/fit.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/fit.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/fit.c	(revision 20936)
@@ -8,5 +8,5 @@
   int N, Weight, Quiet, ClipNiter;
   Vector *xvec, *yvec, *dyvec;
-  float *x, *y, *dy, *yf, *yfit;
+  opihi_flt *x, *y, *dy, *yf, *yfit;
   char name[64], *mask;
 
@@ -53,9 +53,16 @@
     return (FALSE);
   }
-  if (Weight && xvec[0].Nelements != dyvec[0].Nelements) {
-    gprint (GP_ERR, "vectors must have same length\n");
-    return (FALSE);
-  }
-  
+  REQUIRE_VECTOR_FLT (xvec, FALSE); 
+  REQUIRE_VECTOR_FLT (yvec, FALSE); 
+
+  if (Weight) {
+    REQUIRE_VECTOR_FLT (dyvec, FALSE); 
+    if (xvec[0].Nelements != dyvec[0].Nelements) {
+      gprint (GP_ERR, "vectors must have same length\n");
+      return (FALSE);
+    }
+  }
+ 
+
   /* nterm is number of polynomial terms, starting at x^0 */
   order = atof (argv[3]);
@@ -63,5 +70,5 @@
   mterm = 2*nterm;
 
-  ALLOCATE (yfit, float, xvec[0].Nelements);
+  ALLOCATE (yfit, opihi_flt, xvec[0].Nelements);
   ALLOCATE (mask, char, xvec[0].Nelements);
   memset (mask, 0, xvec[0].Nelements);
@@ -88,7 +95,7 @@
 
     /* perform linear fit */
-    x = xvec[0].elements;
-    y = yvec[0].elements;
-    if (Weight) dy = dyvec[0].elements;
+    x = xvec[0].elements.Flt;
+    y = yvec[0].elements.Flt;
+    if (Weight) dy = dyvec[0].elements.Flt;
 
     for (i = 0; i < xvec[0].Nelements; i++, x++, y++) {
@@ -121,5 +128,5 @@
 
     /* generate fitted values */
-    x = xvec[0].elements;
+    x = xvec[0].elements.Flt;
     yf = yfit;
     for (i = 0; i < xvec[0].Nelements; i++, x++, yf++) {
@@ -134,6 +141,6 @@
 
     /* measure fit residual scatter */
-    x  = xvec[0].elements;
-    y  = yvec[0].elements;
+    x  = xvec[0].elements.Flt;
+    y  = yvec[0].elements.Flt;
     yf = yfit;
     dY = dY2 = 0;
@@ -150,6 +157,6 @@
 
     /* mask outlier points */
-    x  = xvec[0].elements;
-    y  = yvec[0].elements;
+    x  = xvec[0].elements.Flt;
+    y  = yvec[0].elements.Flt;
     yf = yfit;
     Nmask = 0;
@@ -193,12 +200,12 @@
     if ((fvec = SelectVector ("yfit", ANYVECTOR, TRUE)) == NULL) return (FALSE);    
     if ((mvec = SelectVector ("mask", ANYVECTOR, TRUE)) == NULL) return (FALSE);    
-    free (fvec[0].elements);
-    fvec[0].elements = yfit;
+    free (fvec[0].elements.Flt);
+    fvec[0].elements.Flt = yfit;
     fvec[0].Nelements = xvec[0].Nelements;
     mvec[0].Nelements = xvec[0].Nelements;
 
-    REALLOCATE (mvec[0].elements, float, xvec[0].Nelements);
+    REALLOCATE (mvec[0].elements.Flt, opihi_flt, xvec[0].Nelements);
     for (i = 0; i < xvec[0].Nelements; i++) {
-      mvec[0].elements[i] = mask[i];
+      mvec[0].elements.Flt[i] = mask[i];
     }
   } else {
Index: trunk/Ohana/src/opihi/cmd.data/fit2d.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/fit2d.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/fit2d.c	(revision 20936)
@@ -7,5 +7,5 @@
   int k, K, i, j, n, Npt, Nmask, nx, ny, nterm, mterm, wterm, order;
   int N, Weight, Quiet, ClipNiter, VERBOSE;
-  float *x, *y, *z, *dz, *zfit, *zf; 
+  opihi_flt *x, *y, *z, *dz, *zfit, *zf; 
   char name[64], *mask;
   Vector *xvec, *yvec, *zvec, *dzvec;
@@ -64,7 +64,14 @@
     return (FALSE);
   }
-  if (Weight && xvec[0].Nelements != dzvec[0].Nelements) {
-    gprint (GP_ERR, "vectors must have same length\n");
-    return (FALSE);
+  REQUIRE_VECTOR_FLT (xvec, FALSE); 
+  REQUIRE_VECTOR_FLT (yvec, FALSE); 
+  REQUIRE_VECTOR_FLT (zvec, FALSE); 
+
+  if (Weight) {
+    REQUIRE_VECTOR_FLT (dzvec, FALSE); 
+    if (xvec[0].Nelements != dzvec[0].Nelements) {
+      gprint (GP_ERR, "vectors must have same length\n");
+      return (FALSE);
+    }
   }
   
@@ -74,5 +81,5 @@
   mterm = 2*order + 1;
 
-  ALLOCATE (zfit, float, xvec[0].Nelements);
+  ALLOCATE (zfit, opihi_flt, xvec[0].Nelements);
   ALLOCATE (mask, char, xvec[0].Nelements);
   memset (mask, 0, xvec[0].Nelements);
@@ -102,8 +109,8 @@
     }
 
-    x = xvec[0].elements;
-    y = yvec[0].elements;
-    z = zvec[0].elements;
-    if (Weight) dz = dzvec[0].elements;
+    x = xvec[0].elements.Flt;
+    y = yvec[0].elements.Flt;
+    z = zvec[0].elements.Flt;
+    if (Weight) dz = dzvec[0].elements.Flt;
 
     /* add up the x,y values */
@@ -128,7 +135,7 @@
 
     /* add up the z values */
-    x = xvec[0].elements;
-    y = yvec[0].elements;
-    z = zvec[0].elements;
+    x = xvec[0].elements.Flt;
+    y = yvec[0].elements.Flt;
+    z = zvec[0].elements.Flt;
     for (i = 0; i < xvec[0].Nelements; i++, x++, y++, z++) {
       if (mask[i]) continue;
@@ -179,6 +186,6 @@
     */
     /* generate fitted values */
-    x = xvec[0].elements;
-    y = yvec[0].elements;
+    x = xvec[0].elements.Flt;
+    y = yvec[0].elements.Flt;
     zf = zfit;
     for (n = 0; n < xvec[0].Nelements; n++, x++, y++, zf++) {
@@ -197,7 +204,7 @@
 
     /* measure fit residual scatter */
-    x  = xvec[0].elements;
-    y  = yvec[0].elements;
-    z  = zvec[0].elements;
+    x  = xvec[0].elements.Flt;
+    y  = yvec[0].elements.Flt;
+    z  = zvec[0].elements.Flt;
     zf = zfit;
     dZ = dZ2 = 0;
@@ -216,7 +223,7 @@
 
     /* mask outlier points */
-    x  = xvec[0].elements;
-    y  = yvec[0].elements;
-    z  = zvec[0].elements;
+    x  = xvec[0].elements.Flt;
+    y  = yvec[0].elements.Flt;
+    z  = zvec[0].elements.Flt;
     zf = zfit;
     Nmask = 0;
Index: trunk/Ohana/src/opihi/cmd.data/gaussdeviate.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/gaussdeviate.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/gaussdeviate.c	(revision 20936)
@@ -15,10 +15,9 @@
   sigma = atof (argv[4]);
 
-  vec[0].Nelements = Npts;
-  REALLOCATE (vec[0].elements, float, Npts);
+  ResetVector (vec, OPIHI_FLT, Npts);
 
   gauss_init (2048);
   for (i = 0; i < Npts; i++) {
-    vec[0].elements[i] = rnd_gauss (mean, sigma);
+    vec[0].elements.Flt[i] = rnd_gauss (mean, sigma);
   }
   return (TRUE);
@@ -46,10 +45,9 @@
   sigma = atof (argv[4]);
 
-  vec[0].Nelements = Npts;
-  REALLOCATE (vec[0].elements, float, Npts);
+  ResetVector (vec, OPIHI_FLT, Npts);
 
   gauss_init (Npts);
   for (i = 0; i < Npts; i++) {
-    vec[0].elements[i] = int_gauss (i);
+    vec[0].elements.Flt[i] = int_gauss (i);
   }
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/gaussj.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/gaussj.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/gaussj.c	(revision 20936)
@@ -2,8 +2,10 @@
 
 int gaussjordan (int argc, char **argv) {
-  
-  float *m, *v;
+
+  float *m;
+  opihi_flt *vf;
+  opihi_int *vi;
   double **a, **b;
-  int i, j, N, status, QUIET;
+  int i, j, N, status, QUIET, isFloat;
   Vector *B;
   Buffer *A;
@@ -31,14 +33,21 @@
   }
 
+  isFloat = (B[0].type == OPIHI_FLT);
+  vf = B[0].elements.Flt;
+  vi = B[0].elements.Int;
+
   m = (float *) A[0].matrix.buffer;
-  v = B[0].elements;
   for (i = 0; i < N; i++) {
     for (j = 0; j < N; j++) {
       a[i][j] = m[i+j*N];
     }
-    b[i][0] = v[i]; 
+    b[i][0] = isFloat ? vf[i] : vi[i]; 
   }
 
   status = dgaussjordan (a, b, N, 1);
+
+  // output vector needs to be float, so re-cast it
+  ResetVector (B, OPIHI_FLT, N);
+  vf = B[0].elements.Flt;
 
   for (i = 0; i < N; i++) {
@@ -46,5 +55,5 @@
        m[i+j*N] = a[i][j];
     }
-    v[i] = b[i][0]; 
+    vf[i] = b[i][0]; 
   }
 
Index: trunk/Ohana/src/opihi/cmd.data/grid.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/grid.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/grid.c	(revision 20936)
@@ -23,8 +23,6 @@
 
   N = 0;
-  Xvec.Nelements = 200;
-  Yvec.Nelements = 200;
-  ALLOCATE (Xvec.elements, float, Xvec.Nelements);
-  ALLOCATE (Yvec.elements, float, Yvec.Nelements);
+  SetVector (&Xvec, OPIHI_FLT, 200);
+  SetVector (&Yvec, OPIHI_FLT, 200);
 
   major = minor = 1;
@@ -64,21 +62,21 @@
       if (MajorTick) {
 	/* major tick */
-	Xvec.elements[N] = next;
-	Yvec.elements[N] = graphmode.ymin;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
-	}
-	Xvec.elements[N] = next;
-	Yvec.elements[N] = graphmode.ymax;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
+	Xvec.elements.Flt[N] = next;
+	Yvec.elements.Flt[N] = graphmode.ymin;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
+	}
+	Xvec.elements.Flt[N] = next;
+	Yvec.elements.Flt[N] = graphmode.ymax;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
 	}
       }
@@ -86,21 +84,21 @@
       if (MinorTick) {
 	/* minor tick */
-	Xvec.elements[N] = next;
-	Yvec.elements[N] = graphmode.ymin;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
-	}
-	Xvec.elements[N] = next;
-	Yvec.elements[N] = graphmode.ymax;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
+	Xvec.elements.Flt[N] = next;
+	Yvec.elements.Flt[N] = graphmode.ymin;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
+	}
+	Xvec.elements.Flt[N] = next;
+	Yvec.elements.Flt[N] = graphmode.ymax;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
 	}
       }
@@ -144,21 +142,21 @@
       if (MajorTick) {
 	/* major tick */
-	Xvec.elements[N] = graphmode.xmin;
-	Yvec.elements[N] = next;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
-	}
-	Xvec.elements[N] = graphmode.xmax;
-	Yvec.elements[N] = next;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
+	Xvec.elements.Flt[N] = graphmode.xmin;
+	Yvec.elements.Flt[N] = next;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
+	}
+	Xvec.elements.Flt[N] = graphmode.xmax;
+	Yvec.elements.Flt[N] = next;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
 	}
       }
@@ -166,21 +164,21 @@
       if (MinorTick) {
 	/* minor tick */
-	Xvec.elements[N] = graphmode.xmin;
-	Yvec.elements[N] = next;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
-	}
-	Xvec.elements[N] = graphmode.xmax;
-	Yvec.elements[N] = next;
-	N++;
-	if (N == Xvec.Nelements) {
-	  Xvec.Nelements += 200;
-	  Yvec.Nelements += 200;
-	  REALLOCATE (Xvec.elements, float, Xvec.Nelements);
-	  REALLOCATE (Yvec.elements, float, Yvec.Nelements);
+	Xvec.elements.Flt[N] = graphmode.xmin;
+	Yvec.elements.Flt[N] = next;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
+	}
+	Xvec.elements.Flt[N] = graphmode.xmax;
+	Yvec.elements.Flt[N] = next;
+	N++;
+	if (N == Xvec.Nelements) {
+	  Xvec.Nelements += 200;
+	  Yvec.Nelements += 200;
+	  REALLOCATE (Xvec.elements.Flt, opihi_flt, Xvec.Nelements);
+	  REALLOCATE (Yvec.elements.Flt, opihi_flt, Yvec.Nelements);
 	}
       }
@@ -193,8 +191,8 @@
   graphmode.ptype = 100; /* connect a pair */
   graphmode.etype = 0;
-  PlotVectorPair (kapa, N, Xvec.elements, Yvec.elements, &graphmode);
-
-  free (Xvec.elements);
-  free (Yvec.elements);
+  PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
+
+  free (Xvec.elements.Flt);
+  free (Yvec.elements.Flt);
 
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/gridify.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/gridify.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/gridify.c	(revision 20936)
@@ -5,8 +5,9 @@
   int i, Nx, Ny, Xb, Yb, Normalize, N;
   float Xmin, Xmax, dX, Ymin, Ymax, dY;
-  float *buf, *val, *x, *y, *z;
+  float *buf, *val;
   int *Nval;
   Buffer *bf;
   Vector *vx, *vy, *vz;
+  opihi_flt *x, *y, *z;
 
   Normalize = TRUE;
@@ -28,4 +29,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]);
@@ -50,7 +55,7 @@
   bzero (Nval, Nx*Ny*sizeof(int));
 
-  x = vx[0].elements;
-  y = vy[0].elements;
-  z = vz[0].elements;
+  x = vx[0].elements.Flt;
+  y = vy[0].elements.Flt;
+  z = vz[0].elements.Flt;
   for (i = 0; i < vx[0].Nelements; i++, x++, y++, z++) {
     Xb = (*x - Xmin) / dX;
Index: trunk/Ohana/src/opihi/cmd.data/histogram.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/histogram.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/histogram.c	(revision 20936)
@@ -4,5 +4,6 @@
   
   int i, bin, Nbins;
-  float *V, start, end, delta;
+  opihi_int *OUT;
+  opihi_flt start, end, delta;
   Vector *xvec, *yvec;
 
@@ -30,18 +31,25 @@
   if ((xvec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
   if ((yvec = SelectVector (argv[2], ANYVECTOR, TRUE)) == NULL) return (FALSE);
-  yvec[0].Nelements = Nbins;
-    
-  REALLOCATE (yvec[0].elements, float, yvec[0].Nelements);
-  bzero (yvec[0].elements, sizeof(float)*yvec[0].Nelements);
-  if (Nbins < 1) {
-      return (TRUE);
+
+  ResetVector (yvec, OPIHI_INT, Nbins);
+  bzero (yvec[0].elements.Int, sizeof(opihi_int)*yvec[0].Nelements);
+  if (Nbins < 1) return (TRUE);
+  OUT = yvec[0].elements.Int;
+
+  if (xvec[0].type == OPIHI_FLT) {
+    opihi_flt *V = xvec[0].elements.Flt;
+    for (i = 0; i < xvec[0].Nelements; i++, V++) {
+      if (isnan(*V)) continue;
+      bin = MIN (MAX (0, (*V - start) / delta), Nbins - 1);
+      OUT[bin]++;
+    }      
+  } else {
+    opihi_int *V = xvec[0].elements.Int;
+    for (i = 0; i < xvec[0].Nelements; i++, V++) {
+      if (isnan(*V)) continue;
+      bin = MIN (MAX (0, (*V - start) / delta), Nbins - 1);
+      OUT[bin]++;
+    }      
   }
-
-  V = xvec[0].elements;
-  for (i = 0; i < xvec[0].Nelements; i++, V++) {
-    if (isnan(*V)) continue;
-    bin = MIN (MAX (0, (*V - start) / delta), Nbins - 1);
-    yvec[0].elements[bin] += 1.0;
-  }      
 
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/imcut.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/imcut.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/imcut.c	(revision 20936)
@@ -37,8 +37,6 @@
   dY = dY / L;
 
-  REALLOCATE (xvec[0].elements, float, MAX (L, 1));
-  REALLOCATE (yvec[0].elements, float, MAX (L, 1));
-  xvec[0].Nelements = L;
-  yvec[0].Nelements = L;
+  ResetVector (xvec, OPIHI_FLT, MAX (L, 1));
+  ResetVector (yvec, OPIHI_FLT, MAX (L, 1));
 
   V = (float *)buf[0].matrix.buffer;
@@ -46,6 +44,6 @@
     xi = xs + i*dX - 0.5;
     yi = ys + i*dY - 0.5;
-    xvec[0].elements[i] = i;
-    yvec[0].elements[i] = V[xi + Nx*yi];
+    xvec[0].elements.Flt[i] = i;
+    yvec[0].elements.Flt[i] = V[xi + Nx*yi];
   }
 
Index: trunk/Ohana/src/opihi/cmd.data/imhist.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/imhist.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/imhist.c	(revision 20936)
@@ -105,10 +105,8 @@
   }  
 
-  vec1[0].Nelements = Nbins + 1;
-  vec2[0].Nelements = Nbins + 1;
-  REALLOCATE (vec1[0].elements, float, vec1[0].Nelements);
-  bzero (vec1[0].elements, vec1[0].Nelements*sizeof(float));
-  REALLOCATE (vec2[0].elements, float, vec2[0].Nelements);
-  bzero (vec2[0].elements, vec2[0].Nelements*sizeof(float));
+  ResetVector (vec1, OPIHI_FLT, Nbins + 1);
+  ResetVector (vec2, OPIHI_FLT, Nbins + 1);
+  bzero (vec1[0].elements.Flt, vec1[0].Nelements*sizeof(opihi_flt));
+  bzero (vec2[0].elements.Flt, vec2[0].Nelements*sizeof(opihi_flt));
   
   for (j = sy; j < sy + ny; j++) {
@@ -116,9 +114,9 @@
     for (i = 0; i < nx; i++, V++) {
       bin = MAX (MIN (Nbins, (*V - min) / dx), 0);
-      vec2[0].elements[bin] += 1.0;
+      vec2[0].elements.Flt[bin] += 1.0;
     }
   }
   for (i = 0; i < Nbins + 1; i++, V++) {
-    vec1[0].elements[i] = i*dx + min;
+    vec1[0].elements.Flt[i] = i*dx + min;
   }
   
Index: trunk/Ohana/src/opihi/cmd.data/integrate.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/integrate.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/integrate.c	(revision 20936)
@@ -3,7 +3,8 @@
 int integrate (int argc, char **argv) {
   
-  int i, N, VERBOSE;
-  float *X, *Y;
-  double start, end, value, range;
+  int i, N, VERBOSE, isFloat;
+  opihi_flt *Yf;
+  opihi_int *Yi;
+  double start, end, value, range, dvalue;
   Vector *vecx, *vecy;
 
@@ -25,15 +26,30 @@
   end   = atof (argv[4]);
 
-  X = vecx[0].elements;
-  Y = vecy[0].elements;
+  isFloat = vecy[0].type == OPIHI_FLT;
+  Yf = vecy[0].elements.Flt;
+  Yi = vecy[0].elements.Int;
 
   value = 0;
   range = 0;
-  for (i = 0; i < vecx[0].Nelements-1; i++, X++, Y++) {
-    if ((*X >= start) && (*X <= end)) {
-      value += *Y * (X[1] - X[0]);
-      range += (X[1] - X[0]);
-    }
-  }      
+
+  if (vecx[0].type == OPIHI_FLT) {
+    opihi_flt *X = vecx[0].elements.Flt;
+    for (i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
+      if ((*X >= start) && (*X <= end)) {
+	dvalue = (isFloat) ? *Yf : *Yi;
+	value += dvalue * (X[1] - X[0]);
+	range += (X[1] - X[0]);
+      }
+    }      
+  } else {
+    opihi_int *X = vecx[0].elements.Int;
+    for (i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
+      if ((*X >= start) && (*X <= end)) {
+	dvalue = (isFloat) ? *Yf : *Yi;
+	value += dvalue * (X[1] - X[0]);
+	range += (X[1] - X[0]);
+      }
+    }      
+  }
 
   set_variable ("sum", value); 
Index: trunk/Ohana/src/opihi/cmd.data/interpolate.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/interpolate.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/interpolate.c	(revision 20936)
@@ -21,28 +21,30 @@
   if ((yout = SelectVector (argv[4],  ANYVECTOR, TRUE)) == NULL) return (FALSE);
 
-  yout[0].Nelements = xout[0].Nelements;
-  REALLOCATE (yout[0].elements, float, yout[0].Nelements);
+  REQUIRE_VECTOR_FLT (xin, FALSE); 
+  REQUIRE_VECTOR_FLT (yin, FALSE); 
+  REQUIRE_VECTOR_FLT (xout, FALSE); 
+  ResetVector (yout, OPIHI_FLT, xout[0].Nelements);
 
-  dx = xin[0].elements[1] - xin[0].elements[0];
-  dy = yin[0].elements[1] - yin[0].elements[0];
-  x0 = xin[0].elements[0];
-  y0 = yin[0].elements[0];
+  dx = xin[0].elements.Flt[1] - xin[0].elements.Flt[0];
+  dy = yin[0].elements.Flt[1] - yin[0].elements.Flt[0];
+  x0 = xin[0].elements.Flt[0];
+  y0 = yin[0].elements.Flt[0];
   
   /* in vectors are sorted, out vectors are not */
   for (j = 0; j < xin[0].Nelements - 1; j++) {
-    dx = xin[0].elements[j+1] - xin[0].elements[j];
-    dy = yin[0].elements[j+1] - yin[0].elements[j];
-    x0 = xin[0].elements[j];
-    y0 = yin[0].elements[j];
-    x1 = xin[0].elements[j+1];
+    dx = xin[0].elements.Flt[j+1] - xin[0].elements.Flt[j];
+    dy = yin[0].elements.Flt[j+1] - yin[0].elements.Flt[j];
+    x0 = xin[0].elements.Flt[j];
+    y0 = yin[0].elements.Flt[j];
+    x1 = xin[0].elements.Flt[j+1];
     for (i = 0; i < xout[0].Nelements; i++) {
-      if ((xout[0].elements[i] >= x0) && (xout[0].elements[i] < x1)) {
-	yout[0].elements[i] = (dy/dx)*(xout[0].elements[i] - x0) + y0;
+      if ((xout[0].elements.Flt[i] >= x0) && (xout[0].elements.Flt[i] < x1)) {
+	yout[0].elements.Flt[i] = (dy/dx)*(xout[0].elements.Flt[i] - x0) + y0;
       }
-      if ((j == 0) && (xout[0].elements[i] < x0)) {
-	yout[0].elements[i] = (dy/dx)*(xout[0].elements[i] - x0) + y0;
+      if ((j == 0) && (xout[0].elements.Flt[i] < x0)) {
+	yout[0].elements.Flt[i] = (dy/dx)*(xout[0].elements.Flt[i] - x0) + y0;
       }
-      if ((j == xin[0].Nelements - 2) && (xout[0].elements[i] >= x1)) {
-	yout[0].elements[i] = (dy/dx)*(xout[0].elements[i] - x0) + y0;
+      if ((j == xin[0].Nelements - 2) && (xout[0].elements.Flt[i] >= x1)) {
+	yout[0].elements.Flt[i] = (dy/dx)*(xout[0].elements.Flt[i] - x0) + y0;
       }
     }    
Index: trunk/Ohana/src/opihi/cmd.data/lookup.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/lookup.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/lookup.c	(revision 20936)
@@ -4,5 +4,5 @@
   
   int i, j;
-  float *ip, *op, *xp, *yp;
+  opihi_flt *ip, *op, *xp, *yp;
   Vector *in, *out, *xv, *yv;
 
@@ -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,14 +26,13 @@
   }
 
-  out[0].Nelements = in[0].Nelements;
-  REALLOCATE (out[0].elements, float, out[0].Nelements);
+  ResetVector (out, OPIHI_FLT, in[0].Nelements);
 
-  ip = in[0].elements;
-  op = out[0].elements;
+  ip = in[0].elements.Flt;
+  op = out[0].elements.Flt;
 
   for (i = 0; i < in[0].Nelements; i++, ip++, op++) {
     // re-write this using bisection
-    xp = xv[0].elements;
-    yp = yv[0].elements;
+    xp = xv[0].elements.Flt;
+    yp = yv[0].elements.Flt;
 
     for (j = 0; (*ip < *xp) && (j < yv[0].Nelements); j++);
Index: trunk/Ohana/src/opihi/cmd.data/medacc.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/medacc.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/medacc.c	(revision 20936)
@@ -5,5 +5,5 @@
   int i, j, Nbins, Nvalues, N, N0, N1;
   double start, end, delta, k0, k1, fn;
-  float *V, *K, *V1, *K1, *O, *tmpvec, *tmpkey;
+  opihi_flt *V, *K, *V1, *K1, *O, *tmpvec, *tmpkey;
   Vector *val, *key, *out;
 
@@ -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,14 +37,13 @@
   Nbins = 1 + (int)((end - start) / delta);
 
-  out[0].Nelements = Nbins;
-  REALLOCATE (out[0].elements, float, out[0].Nelements);
-  bzero (out[0].elements, sizeof(float)*out[0].Nelements);
+  ResetVector (out, OPIHI_FLT, Nbins);
+  bzero (out[0].elements.Flt, sizeof(opihi_flt)*out[0].Nelements);
 
   /* copy vec and key to temp vectors */
-  ALLOCATE (tmpvec, float, val[0].Nelements);
-  ALLOCATE (tmpkey, float, val[0].Nelements);
+  ALLOCATE (tmpvec, opihi_flt, val[0].Nelements);
+  ALLOCATE (tmpkey, opihi_flt, val[0].Nelements);
 
-  V = val[0].elements;
-  K = key[0].elements;
+  V = val[0].elements.Flt;
+  K = key[0].elements.Flt;
   V1 = tmpvec;
   K1 = tmpkey;
@@ -53,7 +55,7 @@
 
   /* sort vec and key by key */
-  fsortpair (tmpkey, tmpvec, Nvalues);
+  dsortpair (tmpkey, tmpvec, Nvalues);
 
-  O = out[0].elements;
+  O = out[0].elements.Flt;
   /* find the start and end key for each range */
   N0 = 0;
@@ -67,5 +69,5 @@
     N1 = j;
     N = N1 - N0;
-    fsort (&tmpvec[N0], N);
+    dsort (&tmpvec[N0], N);
     fn = O[i] = 0;
     for (j = N0 + 0.25*N; j < N0 + 0.75*N; j++) {
Index: trunk/Ohana/src/opihi/cmd.data/mget.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/mget.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/mget.c	(revision 20936)
@@ -4,5 +4,6 @@
   
   int i, Nx, Ny, Npix, xdir, Nset;
-  float *in, *out;
+  float *in;
+  opihi_flt *out;
   Buffer *buf;
   Vector *vec;
@@ -32,6 +33,6 @@
 
   if (xdir) {
-    vec[0].Nelements = Npix = Nx;
-    REALLOCATE (vec[0].elements, float, Npix);
+    Npix = Nx;
+    ResetVector (vec, OPIHI_FLT, Nx);
     if (Nset >= Ny) {
       gprint (GP_ERR, "row out of range\n");
@@ -39,12 +40,11 @@
     }
     in  = (float *) buf[0].matrix.buffer + Nx*Nset;
-    out = vec[0].elements;
+    out = vec[0].elements.Flt;
     for (i = 0; i < Npix; i++, in++, out++) {
       *out = *in;
     }
-    return (TRUE);
   } else {
-    vec[0].Nelements = Npix = Ny;
-    REALLOCATE (vec[0].elements, float, Npix);
+    Npix = Ny;
+    ResetVector (vec, OPIHI_FLT, Ny);
     if (Nset >= Nx) {
       gprint (GP_ERR, "column out of range\n");
@@ -52,10 +52,9 @@
     }
     in  = (float *) buf[0].matrix.buffer + Nset;
-    out = vec[0].elements;
+    out = vec[0].elements.Flt;
     for (i = 0; i < Npix; i++, in+=Nx, out++) {
       *out = *in;
     }
-    return (TRUE);
-  }    
+  }
+  return (TRUE);
 }
-
Index: trunk/Ohana/src/opihi/cmd.data/mset.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/mset.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/mset.c	(revision 20936)
@@ -4,5 +4,5 @@
   
   int i, Nx, Ny, Npix, xdir, Nset;
-  float *in, *out;
+  float *out;
   Buffer *buf;
   Vector *vec;
@@ -42,9 +42,18 @@
     }
     out = (float *) buf[0].matrix.buffer + Nx*Nset;
-    in = vec[0].elements;
-    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) {
@@ -57,7 +66,15 @@
     }
     out = (float *) buf[0].matrix.buffer + Nset;
-    in = vec[0].elements;
-    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: trunk/Ohana/src/opihi/cmd.data/peak.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/peak.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/peak.c	(revision 20936)
@@ -5,5 +5,4 @@
   int i, N, imax, QUIET;
   double start, end, xmax, ymax;
-  float *X, *Y;
   Vector *vecx, *vecy;
 
@@ -26,23 +25,60 @@
     end   = atof (argv[4]);
   } else {
-    start = vecx[0].elements[0];
-    end   = vecx[0].elements[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;
-  Y = vecy[0].elements;
+  imax = -1;
+  xmax = -HUGE_VAL;
+  ymax = -HUGE_VAL;
 
-  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) && (vecy[0].type == OPIHI_FLT)) {
+    opihi_flt *X = vecx[0].elements.Flt;
+    opihi_flt *Y = vecy[0].elements.Flt;
+    for (i = 0; i < vecx[0].Nelements; i++, X++, Y++) {
+      if (*X < start) continue;
+      if (*X > end) continue;
+      if (*Y < ymax) continue;
+      xmax = *X;
+      ymax = *Y;
+      imax = i;
+    }      
+  }
+  if ((vecx[0].type == OPIHI_FLT) && (vecy[0].type == OPIHI_INT)) {
+    opihi_flt *X = vecx[0].elements.Flt;
+    opihi_int *Y = vecy[0].elements.Int;
+    for (i = 0; i < vecx[0].Nelements; i++, X++, Y++) {
+      if (*X < start) continue;
+      if (*X > end) continue;
+      if (*Y < ymax) continue;
+      xmax = *X;
+      ymax = *Y;
+      imax = i;
+    }      
+  }
+  if ((vecx[0].type == OPIHI_INT) && (vecy[0].type == OPIHI_FLT)) {
+    opihi_int *X = vecx[0].elements.Int;
+    opihi_flt *Y = vecy[0].elements.Flt;
+    for (i = 0; i < vecx[0].Nelements; i++, X++, Y++) {
+      if (*X < start) continue;
+      if (*X > end) continue;
+      if (*Y < ymax) continue;
+      xmax = *X;
+      ymax = *Y;
+      imax = i;
+    }      
+  }
+  if ((vecx[0].type == OPIHI_INT) && (vecy[0].type == OPIHI_INT)) {
+    opihi_int *X = vecx[0].elements.Int;
+    opihi_int *Y = vecy[0].elements.Int;
+    for (i = 0; i < vecx[0].Nelements; i++, X++, Y++) {
+      if (*X < start) continue;
+      if (*X > end) continue;
+      if (*Y < ymax) continue;
+      xmax = *X;
+      ymax = *Y;
+      imax = i;
+    }      
+  }
 
   set_variable ("peakval", ymax);
Index: trunk/Ohana/src/opihi/cmd.data/periodogram.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/periodogram.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/periodogram.c	(revision 20936)
@@ -4,5 +4,5 @@
   
   int i, N, Npt, Np, NP, VERBOSE;
-  float *tv, *fv;
+  opihi_flt *tv, *fv;
   float minP, maxP, minT, maxT, dTime;
   float mean, var, w, tau, P, Pc, Ps, Po;
@@ -28,9 +28,12 @@
   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[0];
+  minT = maxT = time[0].elements.Flt[0];
   Npt = time[0].Nelements;
-  tv = time[0].elements;
-  fv = flux[0].elements;
+  tv = time[0].elements.Flt;
+  fv = flux[0].elements.Flt;
   mean = var = 0;
   for (i = 0; i < Npt; i++, tv++, fv++) {
@@ -40,5 +43,5 @@
   }
   mean = mean / Npt;
-  fv = flux[0].elements;
+  fv = flux[0].elements.Flt;
   for (i = 0; i < Npt; i++, fv++) {
     var += SQ(*fv - mean);
@@ -56,6 +59,6 @@
   Np = 0;
   NP = 100;
-  REALLOCATE (power[0].elements, float, NP);
-  REALLOCATE (period[0].elements, float, NP);
+  ResetVector (power,  OPIHI_FLT, NP);
+  ResetVector (period, OPIHI_FLT, NP);
 
   P = minP;
@@ -64,5 +67,5 @@
     
     /* find the period offset tau  */
-    tv = time[0].elements;
+    tv = time[0].elements.Flt;
     cs = sn = 0;
     for (i = 0; i < Npt; i++, tv++) {
@@ -73,6 +76,6 @@
       
     /* find the power at this period */
-    tv = time[0].elements;
-    fv = flux[0].elements;
+    tv = time[0].elements.Flt;
+    fv = flux[0].elements.Flt;
     cs = sn = cs2 = sn2 = 0;
     for (i = 0; i < Npt; i++, tv++, fv++) {
@@ -90,11 +93,11 @@
     Po = (Pc + Ps) / (2*var);
 
-    power[0].elements[Np] = Po;
-    period[0].elements[Np] = P;
+    power[0].elements.Flt[Np] = Po;
+    period[0].elements.Flt[Np] = P;
     Np ++;
     if (Np >= NP) {
       NP += 100;
-      REALLOCATE (power[0].elements, float, NP);
-      REALLOCATE (period[0].elements, float, NP);
+      REALLOCATE (power[0].elements.Flt, opihi_flt, NP);
+      REALLOCATE (period[0].elements.Flt, opihi_flt, NP);
     }
 
@@ -106,8 +109,6 @@
   }
 
-  power[0].Nelements = Np;
-  period[0].Nelements = Np;
-  REALLOCATE (power[0].elements, float, Np);
-  REALLOCATE (period[0].elements, float, Np);
+  ResetVector (power,  OPIHI_FLT, Np);
+  ResetVector (period, OPIHI_FLT, Np);
  
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/plot.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/plot.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/plot.c	(revision 20936)
@@ -58,13 +58,13 @@
   if (!KapaPrepPlot (kapa, Npts, &graphmode)) return (FALSE);
   
-  KapaPlotVector (kapa, Npts, xvec[0].elements, "x");
-  KapaPlotVector (kapa, Npts, yvec[0].elements, "y");
+  PlotVectorSingle (kapa, xvec, "x");
+  PlotVectorSingle (kapa, yvec, "y");
   if (graphmode.etype & 0x01) {
-    KapaPlotVector (kapa, Npts, dymvec[0].elements, "dym");
-    KapaPlotVector (kapa, Npts, dypvec[0].elements, "dyp");
+    PlotVectorSingle (kapa, dymvec, "dym");
+    PlotVectorSingle (kapa, dypvec, "dyp");
   }
   if (graphmode.etype & 0x02) {
-    KapaPlotVector (kapa, Npts, dxmvec[0].elements, "dxm");
-    KapaPlotVector (kapa, Npts, dxpvec[0].elements, "dxp");
+    PlotVectorSingle (kapa, dxmvec, "dxm");
+    PlotVectorSingle (kapa, dxpvec, "dxp");
   }
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/read_vectors.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 20936)
@@ -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, float, NELEM);
+    ResetVector (vec[i], OPIHI_FLT, NELEM);
   }
   
@@ -121,6 +123,6 @@
 	for (i = 0; (i < Nvec) && status; i++) {
 	  status = dparse (&value, col[i], c0);
-	  vec[i][0].elements[N] = value;
-	  if (!status) vec[i][0].elements[N] = 0.0/0.0;
+	  vec[i][0].elements.Flt[N] = value;
+	  if (!status) vec[i][0].elements.Flt[N] = NAN;
 	}
 	if (status) N++;
@@ -130,5 +132,5 @@
 	NELEM += 1000;
 	for (i = 0; i < Nvec; i++) {
-	  REALLOCATE (vec[i][0].elements, float, NELEM);
+	  REALLOCATE (vec[i][0].elements.Flt, opihi_flt, NELEM);
 	}
       }
@@ -137,5 +139,5 @@
   }
   for (i = 0; i < Nvec; i++) {
-    REALLOCATE (vec[i][0].elements, float, MAX (N,1));
+    REALLOCATE (vec[i][0].elements.Flt, opihi_flt, MAX (N,1));
     vec[i][0].Nelements = N;
   }
@@ -157,5 +159,5 @@
 int read_table_vectors (int argc, char **argv, char *extname) {
 
-  int i, j, k, N, Nbytes, Nextend, Ny, Binary;
+  int i, j, k, N, Nbytes, Nextend, Ny, Binary, vecType;
   char type[16], ID[80], *CCDKeyword;
   FTable table;
@@ -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, float, MAX (Ny,1));
-      vec[j][0].Nelements = Ny;
+      ResetVector (vec[j], vecType, MAX (Ny,1));
     }
 
@@ -276,5 +283,5 @@
       for (j = 0; j < Ny; j++) {
 	for (k = 0; k < Nval; k++, Pd++) {
-	  vec[k][0].elements[j] = *Pd;
+	  vec[k][0].elements.Flt[j] = *Pd;
 	}
       }
@@ -284,5 +291,5 @@
       for (j = 0; j < Ny; j++) {
 	for (k = 0; k < Nval; k++, Pf++) {
-	  vec[k][0].elements[j] = *Pf;
+	  vec[k][0].elements.Flt[j] = *Pf;
 	}
       }
@@ -292,5 +299,5 @@
       for (j = 0; j < Ny; j++) {
 	for (k = 0; k < Nval; k++, Pi++) {
-	  vec[k][0].elements[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[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[j] = *Pc;
+	  vec[k][0].elements.Int[j] = *Pc;
 	}
       }
Index: trunk/Ohana/src/opihi/cmd.data/select.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/select.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/select.c	(revision 20936)
@@ -27,10 +27,51 @@
   /* check size of in1, in2, tvec: must match */
 
-  REALLOCATE (ovec[0].elements, float, MAX (tvec[0].Nelements, 1));
-  for (i = 0; i < tvec[0].Nelements; i++) {
-    ovec[0].elements[i] = tvec[0].elements[i] ? in1[0].elements[i] : in2[0].elements[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, float, 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: trunk/Ohana/src/opihi/cmd.data/sort.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/sort.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/sort.c	(revision 20936)
@@ -1,8 +1,41 @@
 # include "data.h"
 
+void fsortindex (opihi_flt *X, int *IDX, int N) {
+
+# 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; \
+}
+# define COMPARE(A,B)(X[A] < X[B])
+
+  OHANA_SORT (N, COMPARE, SWAPFUNC);
+
+# undef SWAPFUNC
+# undef COMPARE
+
+}
+
+// XXX add an option to NOT sort, but return an index instead?
 int sort_vectors (int argc, char **argv) {
   
   int i, j, Nvec, Nval;
-  float *temp, *index, *T, *V, *I;
+  opihi_flt *ftemp;
+  opihi_int *itemp;
+  int *index, *I;
   Vector **vec;
 
@@ -35,24 +68,43 @@
   }
   
-  /* create index (use float to use sortpair) */
-  ALLOCATE (index, float, Nval);
+  /* create index */
+  ALLOCATE (index, int, Nval);
   for (i = 0; i < Nval; i++) index[i] = i;
 
   /* sort key & index */
-  fsortpair (vec[0][0].elements, 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, float, Nval);
+  ALLOCATE (ftemp, opihi_flt, Nval);
+  ALLOCATE (itemp, opihi_int, Nval);
+
   for (i = 1; i < Nvec; i++) {
-    T = temp;
-    V = vec[i][0].elements;
-    I = index;
-    for (j = 0; j < Nval; j++, T++, I++) {
-      *T = V[(int)(*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.Int = itemp;
+      itemp = V;
     }
-    /* swap .elements (== V) and temp */ 
-    vec[i][0].elements = temp;
-    temp = V;
   }
-  free (temp);
+  free (itemp);
+  free (ftemp);
   free (vec);
   free (index);
@@ -61,4 +113,2 @@
 
 }
-
-
Index: trunk/Ohana/src/opihi/cmd.data/subset.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/subset.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/subset.c	(revision 20936)
@@ -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, float, MAX (tvec[0].Nelements, 1));
-  for (j = i = 0; i < tvec[0].Nelements; i++) {
-    if (tvec[0].elements[i]) {
-      ovec[0].elements[j] = ivec[0].elements[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, float, 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: trunk/Ohana/src/opihi/cmd.data/svd.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/svd.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/svd.c	(revision 20936)
@@ -4,7 +4,8 @@
   
   int i, Nx, Ny, status;
-  float *in, *out, *A, *U, *W, *V;
+  float *in, *out, *A, *U, *V;
+  Buffer *Ma, *Mu, *Mv;
   Vector *Vw;
-  Buffer *Ma, *Mu, *Mv;
+  opihi_flt *W;
 
   if (argc != 6) goto usage;
@@ -42,12 +43,11 @@
 
   /* w is Nx */
-  Vw[0].Nelements = Nx;
-  REALLOCATE (Vw[0].elements, float, Nx);
+  ResetVector (Vw, OPIHI_FLT, Nx);
 
   /* pointers to the various arrays */
   A = (float *) Ma[0].matrix.buffer;
   U = (float *) Mu[0].matrix.buffer;
-  W = (float *) Vw[0].elements;
   V = (float *) Mv[0].matrix.buffer;
+  W = Vw[0].elements.Flt;
 
   /* copy A to U (svdcmp replaces A with U) */
Index: trunk/Ohana/src/opihi/cmd.data/test/applyfit2d.sh
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/test/applyfit2d.sh	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/test/applyfit2d.sh	(revision 20936)
@@ -32,4 +32,5 @@
 
 # Memory test
+# NOTE: requires test1 to be run first
 macro memtest1
 
@@ -48,5 +49,5 @@
  $PASS = 1
 
- if ($endmem - $startmem > 10)
+ if (($endmem - $startmem)/1000 > 1.0)
    $PASS = 0
    echo "growth: {$endmem-$startmem}"
Index: trunk/Ohana/src/opihi/cmd.data/test/fit.sh
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/test/fit.sh	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/test/fit.sh	(revision 20936)
@@ -47,10 +47,13 @@
  if ($Cn != 1)
    $PASS = 0
- end
- if (abs($C0 - 3) > 0.01)
-   $PASS = 0
- end
- if (abs($C1 - 5) > 0.01)
-   $PASS = 0
+   echo "wrong number of elements : $Cn"
+ end
+ if (abs($C0 - 3) > 0.06)
+   $PASS = 0
+   echo "wrong value for C0 : $C0"
+ end
+ if (abs($C1 - 5) > 0.06)
+   $PASS = 0
+   echo "wrong value for C1 : $C1"
  end
 end
@@ -72,8 +75,8 @@
    $PASS = 0
  end
- if (abs($C0 - 3) > 0.02)
-   $PASS = 0
- end
- if (abs($C1 - 5) > 0.02)
+ if (abs($C0 - 3) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C1 - 5) > 0.06)
    $PASS = 0
  end
@@ -102,8 +105,8 @@
    $PASS = 0
  end
- if (abs($C0 - 3) > 0.02)
-   $PASS = 0
- end
- if (abs($C1 - 5) > 0.02)
+ if (abs($C0 - 3) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C1 - 5) > 0.06)
    $PASS = 0
  end
@@ -150,11 +153,11 @@
    $PASS = 0
  end
- if (abs($C0 - 3) > 0.05)
-   $PASS = 0
- end
- if (abs($C1 - 5) > 0.05)
-   $PASS = 0
- end
- if (abs($C2 + 4) > 0.05)
+ if (abs($C0 - 3) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C1 - 5) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C2 + 4) > 0.06)
    $PASS = 0
  end
@@ -177,11 +180,11 @@
    $PASS = 0
  end
- if (abs($C0 - 3) > 0.05)
-   $PASS = 0
- end
- if (abs($C1 - 5) > 0.05)
-   $PASS = 0
- end
- if (abs($C2 + 4) > 0.05)
+ if (abs($C0 - 3) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C1 - 5) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C2 + 4) > 0.06)
    $PASS = 0
  end
@@ -212,12 +215,12 @@
    $PASS = 0
  end
- if (abs($C0 - 3) > 0.05)
-   $PASS = 0
- end
- if (abs($C1 - 5) > 0.05)
-   $PASS = 0
- end
- if (abs($C2 + 4) > 0.05)
-   $PASS = 0
- end
-end
+ if (abs($C0 - 3) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C1 - 5) > 0.06)
+   $PASS = 0
+ end
+ if (abs($C2 + 4) > 0.06)
+   $PASS = 0
+ end
+end
Index: trunk/Ohana/src/opihi/cmd.data/test/gaussj.sh
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/test/gaussj.sh	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/test/gaussj.sh	(revision 20936)
@@ -232,5 +232,7 @@
  for i 0 B[]
   for j 0 B[]
+   # echo $i $j meas[$i] inA[$i][$j] B[$j] {inA[$i][$j] * B[$j]} {meas[$i] + inA[$i][$j] * B[$j]}
    meas[$i] = meas[$i] + inA[$i][$j] * B[$j]
+   # echo "-> meas[$i]"
   end
  end
@@ -238,4 +240,5 @@
  for i 0 inB[]
   if (abs(inB[$i]-meas[$i]) > 1e-5)
+    echo inB[$i] meas[$i] {abs(inB[$i]-meas[$i])}
     $PASS = 0
   end
Index: trunk/Ohana/src/opihi/cmd.data/test/histogram.sh
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/test/histogram.sh	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/test/histogram.sh	(revision 20936)
@@ -12,5 +12,6 @@
  local i
 
- create x 0 10 0.1
+ # set data values at the i*0.1 + 0.05 values so round-off does not causs miscounts
+ create x 0.05 10.05 0.1
 
  for i 45 55
@@ -18,4 +19,5 @@
  end
 
+ # histogram bins are 0-0.1, 0.1-0.2, etc
  histogram x xhis 0 10 0.1
 
Index: trunk/Ohana/src/opihi/cmd.data/test/peak.sh
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/test/peak.sh	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/test/peak.sh	(revision 20936)
@@ -21,5 +21,5 @@
    $PASS = 0
  end
- if ($peaknum != 51)
+ if ($peaknum != 50)
    $PASS = 0
  end
@@ -43,5 +43,5 @@
    $PASS = 0
  end
- if ($peaknum != 51)
+ if ($peaknum != 50)
    $PASS = 0
  end
@@ -67,5 +67,5 @@
    $PASS = 0
  end
- if ($peaknum != 51)
+ if ($peaknum != 50)
    $PASS = 0
  end
Index: trunk/Ohana/src/opihi/cmd.data/test/vgauss.sh
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/test/vgauss.sh	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/test/vgauss.sh	(revision 20936)
@@ -20,4 +20,6 @@
 
  vgauss -q x y dy yfit
+ # lim x y; clear; box; plot -x 1 -c black x y; plot -c red x yfit
+ # cursor
 
  if (abs($C0 - 0.0) > 0.01)
@@ -51,4 +53,6 @@
 
  vgauss -q x y dy yfit
+ # lim x y; clear; box; plot -x 1 -c black x y; plot -c red x yfit
+ # cursor
 
  if (abs($C0 - 0.0) > 0.01)
@@ -71,6 +75,11 @@
  break -auto off
 
+ $C0o = 0.5
+ $C1o = 2
+ $C2o = 900
+ $C3o = 1
+
  create x -10 10 0.1
- set y = 1000 * exp(-0.5*x^2/3^2)
+ set y = $C3o + $C2o * exp(-0.5*(x - $C0o)^2/$C1o^2)
 
  gaussdev dY y[] 0.0 1.0
@@ -78,21 +87,25 @@
  set y = y + dy
 
- $C0 = 0.5
- $C1 = 2
- $C2 = 900
- $C3 = 1
+ $C0 = $C0o + 2
+ $C1 = $C1o + 2
+ $C2 = $C2o + 50
+ $C3 = $C3o + 10
 
  vgauss -q x y dy yfit
+ # lim x y; clear; box; plot -x 1 -c black x y; plot -c red x yfit
+ # cursor
 
- if (abs($C0 - 0.0) > 0.01)
+ $dS = 3.0 / sqrt(y[])
+
+ if (abs($C0 - $C0o) > $dS)
    $PASS = 0
  end
- if (abs($C1 - 3.0) > 0.01)
+ if (abs($C1 - $C1o)/$C1o > $dS)
    $PASS = 0
  end
- if (abs($C2 - 1000.0) > 1)
+ if (abs($C2 - $C2o)/$C2o > $dS)
    $PASS = 0
  end
- if (abs($C3 - 0.0) > 0.2)
+ if (abs($C3 - $C3o) > $dS)
    $PASS = 0
  end
Index: trunk/Ohana/src/opihi/cmd.data/test/vmaxwell.sh
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/test/vmaxwell.sh	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/test/vmaxwell.sh	(revision 20936)
@@ -40,30 +40,40 @@
  break -auto off
 
+ $C0o = 250
+ $C1o = 25
+ $C2o = 100
+ $C3o = 1
+ $C4o = 10
+
  create x 0 1000 1
- set y = 1000 * (x-200)^2 * exp(-0.5*(x-300)^2/30^2)
- set dy = (rnd(y) - 0.5)/0.5
+ set y = $C2o * (x-$C4o)^2 * exp(-0.5*(x-$C0o)^2/$C1o^2) + $C3o
+ gaussdev dY y[] 0.0 1.0
+ set dy = dY * sqrt(y)
  set y = y + dy
 
- lim x y; clear; box; plot -x 1 -c black x y
+ $C0 = $C0o + 20
+ $C1 = $C1o + 2
+ $C2 = $C2o + 100
+ $C3 = $C3o + 10
+ $C4 = $C4o + 20
 
- $C0 = 250
- $C1 = 25
- $C2 = 900
- $C3 = 1
- $C4 = 190
+ vmaxwell -q x y dy yfit
+ lim x y; clear; box; plot -x 1 -c black x y; plot x yfit -c red
 
- vmaxwell x y dy yfit
- plot x yfit -c red
+ $dS = 6.0 / sqrt(y[])
 
- if (abs($C0 - 0.0) > 0.01)
+ if (abs($C0 - $C0o) > $dS)
    $PASS = 0
  end
- if (abs($C1 - 3.0) > 0.01)
+ if (abs($C1 - $C1o)/$C1o > $dS)
    $PASS = 0
  end
- if (abs($C2 - 1000.0) > 0.1)
+ if (abs($C2 - $C2o)/$C2o > $dS)
    $PASS = 0
  end
- if (abs($C3 - 0.0) > 0.1)
+ if (abs($C3 - $C3o) > $dS)
+   $PASS = 0
+ end
+ if (abs($C4 - $C4o)/$C4o > $dS)
    $PASS = 0
  end
Index: trunk/Ohana/src/opihi/cmd.data/ungridify.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/ungridify.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/ungridify.c	(revision 20936)
@@ -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) {
 
@@ -6,10 +7,12 @@
   int Nx, Ny, NX, NY;
   int Xmin, Xmax, Ymin, Ymax;
-  float *v, *x, *y, *z;
   Buffer *bf;
+  float *v;
   Vector *vx, *vy, *vz;
+  opihi_flt *x, *y, *z;
 
   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);
   }
@@ -29,26 +32,28 @@
   if ((vy = SelectVector (argv[7], ANYVECTOR, TRUE)) == NULL) return (FALSE);
   if ((vz = SelectVector (argv[8], ANYVECTOR, TRUE)) == NULL) return (FALSE);
-  REALLOCATE (vx[0].elements, float, Nx*Ny);
-  REALLOCATE (vy[0].elements, float, Nx*Ny);
-  REALLOCATE (vz[0].elements, float, Nx*Ny);
 
-  x = vx[0].elements;
-  y = vy[0].elements;
-  z = vz[0].elements;
+  ResetVector (vx, OPIHI_FLT, Nx*Ny);
+  ResetVector (vy, OPIHI_FLT, Nx*Ny);
+  ResetVector (vz, OPIHI_FLT, Nx*Ny);
+
+  x = vx[0].elements.Flt;
+  y = vy[0].elements.Flt;
+  z = vz[0].elements.Flt;
   n = 0;
   v = (float *)bf[0].matrix.buffer;
   for (j = Ymin; j < Ymax; j++) {
     for (i = Xmin; i < Xmax; i++, x++, y++, z++, n++) {
-      vx[0].elements[n] = i;
-      vy[0].elements[n] = j;
+      vx[0].elements.Flt[n] = i;
+      vy[0].elements.Flt[n] = j;
       if (i < 0) continue;
       if (i >= NX) continue;
       if (j < 0) continue;
       if (j >= NY) continue;
-      vz[0].elements[n] = v[i+j*NX];
+      vz[0].elements.Flt[n] = v[i+j*NX];
     }
   }
   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: trunk/Ohana/src/opihi/cmd.data/uniq.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/uniq.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/uniq.c	(revision 20936)
@@ -4,5 +4,4 @@
   
   int Nnew, i, j, found;
-  float *v1, *v2;
   Vector *ivec, *ovec;
 
@@ -16,22 +15,38 @@
 
   /* allocate the maximum possible needed */
-  ALLOCATE (ovec[0].elements, float, ivec[0].Nelements);
+  ResetVector (ovec, ivec->type, ivec->Nelements);
 
   Nnew = 0;
-  v1 = ivec[0].elements;
-  for (i = 0; i < ivec[0].Nelements; i++, v1++) {
-    v2 = ovec[0].elements;
-    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[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, float, ovec[0].Nelements);
+  // free up extra memory
+  ResetVector (ovec, ivec->type, Nnew);
 
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/vbin.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vbin.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vbin.c	(revision 20936)
@@ -5,5 +5,5 @@
   int i, j, n, N, Nin, Nout;
   int Normalize, Ignore;
-  float *Vout, *Vin, IgnoreValue;
+  opihi_flt *Vout, IgnoreValue;
   double scale;
   Vector *in, *out;
@@ -42,22 +42,43 @@
   Nout = Nin / scale;
 
-  REALLOCATE (out[0].elements, float, Nout);
-  out[0].Nelements = Nout;
+  // re-binning creates a float vector
+  ResetVector (out, OPIHI_FLT, in[0].Nelements);
 
-  Vin  = in[0].elements;
-  Vout = out[0].elements;
-  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 /= (float) N; 
-      } else {
-	*Vout = 0;
+  Vout = out[0].elements.Flt;
+
+  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: trunk/Ohana/src/opihi/cmd.data/vclip.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vclip.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vclip.c	(revision 20936)
@@ -3,7 +3,6 @@
 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;
-  float *in;
   Vector *vec;
 
@@ -33,4 +32,5 @@
   if ((vec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
 
+  DO_CLIP = FALSE;
   if (argc == 6) {
     min = atof (argv[2]);
@@ -38,36 +38,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;
 
-  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;
-  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;
-  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: trunk/Ohana/src/opihi/cmd.data/vgauss.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vgauss.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vgauss.c	(revision 20936)
@@ -2,5 +2,5 @@
 
 /* local private functions */
-float fgaussOD (float, float *, int, float *);
+opihi_flt fgaussOD (opihi_flt, opihi_flt *, int, opihi_flt *);
 
 # define GET_VAR(V,A) \
@@ -16,6 +16,6 @@
 
   int i, N, Npts, Npar, Quiet;
-  float par[4], *v1, *v2, *dy, **covar;
-  float chisq, ochisq, dchisq;
+  opihi_flt par[4], *v1, *v2, *dy, **covar;
+  opihi_flt chisq, ochisq, dchisq;
   Vector *xvec, *yvec, *svec, *ovec;
   char *c, name[16];
@@ -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;
-  ALLOCATE (dy, float, Npts);
-  REALLOCATE (ovec[0].elements, float, Npts);
+  ResetVector (ovec, OPIHI_FLT, Npts);
+
+  ALLOCATE (dy, opihi_flt, Npts);
 
   GET_VAR (par[0], "C0");
@@ -52,5 +57,6 @@
   Npar = 4;
 
-  v1 = svec[0].elements;
+  // mrqmin takes the inverse variance (do not generate NANs)
+  v1 = svec[0].elements.Flt;
   v2 = dy;
   for (i = 0; i < Npts; i++, v1++, v2++) {
@@ -58,9 +64,9 @@
   } 
   
-  ochisq = mrqinit (xvec[0].elements, yvec[0].elements, dy, Npts, par, Npar, fgaussOD, !Quiet);
+  ochisq = mrqinit (xvec[0].elements.Flt, yvec[0].elements.Flt, dy, Npts, par, Npar, fgaussOD, !Quiet);
   dchisq = ochisq + 2*Npts;
 
   for (i = 0; (i < 20) && ((dchisq > 0.1*(Npts - Npar)) || (dchisq <= 0.0)); i++) {
-    chisq = mrqmin (xvec[0].elements, yvec[0].elements, dy, Npts, par, Npar, fgaussOD, !Quiet);
+    chisq = mrqmin (xvec[0].elements.Flt, yvec[0].elements.Flt, dy, Npts, par, Npar, fgaussOD, !Quiet);
     dchisq = ochisq - chisq;
     ochisq = chisq;
@@ -70,5 +76,5 @@
 
   for (i = 0; i < Npts; i++) {
-    ovec[0].elements[i] = fgaussOD (xvec[0].elements[i], par, Npar, dy);
+    ovec[0].elements.Flt[i] = fgaussOD (xvec[0].elements.Flt[i], par, Npar, dy);
   }
   ovec[0].Nelements = Npts;
@@ -90,7 +96,7 @@
 
 /* pars: x_o, sigma, I, back */
-float fgaussOD (float x, float *par, int Npar, float *dpar) {
+opihi_flt fgaussOD (opihi_flt x, opihi_flt *par, int Npar, opihi_flt *dpar) {
 
-  float z, r, f;
+  opihi_flt z, r, f;
 
   z = (x - par[0])/par[1];
Index: trunk/Ohana/src/opihi/cmd.data/vgrid.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vgrid.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vgrid.c	(revision 20936)
@@ -5,5 +5,6 @@
   int i, Nx, Ny, Xb, Yb;
   float Xmin, Xmax, dX, Ymin, Ymax, dY;
-  float *buf, *val, *x, *y, *z;
+  float *buf;
+  opihi_flt *val, *x, *y, *z;
   int *Nval;
   Buffer *bf;
@@ -12,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);
   }
@@ -22,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]);
@@ -39,12 +46,12 @@
   strcpy (bf[0].file, "(empty)");
 
-  ALLOCATE (val, float, Nx*Ny);
-  bzero (val, Nx*Ny*sizeof(float));
+  ALLOCATE (val, opihi_flt, Nx*Ny);
+  bzero (val, Nx*Ny*sizeof(opihi_flt));
   ALLOCATE (Nval, int, Nx*Ny);
   bzero (Nval, Nx*Ny*sizeof(int));
 
-  x = vx[0].elements;
-  y = vy[0].elements;
-  z = vz[0].elements;
+  x = vx[0].elements.Flt;
+  y = vy[0].elements.Flt;
+  z = vz[0].elements.Flt;
   for (i = 0; i < vx[0].Nelements; i++, x++, y++, z++) {
     Xb = (*x - Xmin) / dX;
Index: trunk/Ohana/src/opihi/cmd.data/vload.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vload.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vload.c	(revision 20936)
@@ -6,5 +6,5 @@
   int kapa, type;
   char *name;
-  double dx, dy, size, angle;
+  double dx, dy, angle;
   KiiOverlay *overlay;
   Vector *vecx, *vecy;
@@ -82,6 +82,8 @@
     overlay[i].type = type;
     overlay[i].text = NULL;
-    overlay[i].x = vecx[0].elements[i]+0.5;
-    overlay[i].y = vecy[0].elements[i]+0.5;
+    overlay[i].x = (vecx[0].type == OPIHI_FLT) ? vecx[0].elements.Flt[i] : vecx[0].elements.Int[i];
+    overlay[i].y = (vecy[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: trunk/Ohana/src/opihi/cmd.data/vmaxwell.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vmaxwell.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vmaxwell.c	(revision 20936)
@@ -2,5 +2,5 @@
 
 /* local private functions */
-float fmaxwellOD (float, float *, int, float *);
+opihi_flt fmaxwellOD (opihi_flt, opihi_flt *, int, opihi_flt *);
 
 # define GET_VAR(V,A) \
@@ -16,6 +16,6 @@
 
   int i, N, Npts, Npar, Quiet;
-  float par[5], *v1, *v2, *dy, **covar;
-  float chisq, ochisq, dchisq;
+  opihi_flt par[5], *v1, *v2, *dy, **covar;
+  opihi_flt chisq, ochisq, dchisq;
   Vector *xvec, *yvec, *svec, *ovec;
   char *c, name[16];
@@ -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, float, Npts);
-  REALLOCATE (ovec[0].elements, float, Npts);
+  ALLOCATE (dy, opihi_flt, Npts);
+  ResetVector (ovec, OPIHI_FLT, Npts);
 
   GET_VAR (par[0], "C0");
@@ -54,13 +58,13 @@
   /* careful of variable renomalization */
 
-  v1 = svec[0].elements;
+  v1 = svec[0].elements.Flt;
   v2 = dy;
   for (i = 0; i < Npts; i++, v1++, v2++) *v2 = 1.0 / (*v1 * *v1);
   
-  ochisq = mrqinit (xvec[0].elements, yvec[0].elements, dy, Npts, par, Npar, fmaxwellOD, !Quiet);
+  ochisq = mrqinit (xvec[0].elements.Flt, yvec[0].elements.Flt, dy, Npts, par, Npar, fmaxwellOD, !Quiet);
   dchisq = ochisq + 2*Npts;
 
-  for (i = 0; (i < 20) && ((dchisq > 0.1*(Npts - Npar)) || (dchisq <= 0.0)); i++) {
-    chisq = mrqmin (xvec[0].elements, yvec[0].elements, dy, Npts, par, Npar, fmaxwellOD, !Quiet);
+  for (i = 0; (i < 30) && ((dchisq > 0.1*(Npts - Npar)) || (dchisq <= 0.0)); i++) {
+    chisq = mrqmin (xvec[0].elements.Flt, yvec[0].elements.Flt, dy, Npts, par, Npar, fmaxwellOD, !Quiet);
     dchisq = ochisq - chisq;
     ochisq = chisq;
@@ -70,5 +74,5 @@
 
   for (i = 0; i < Npts; i++) {
-    ovec[0].elements[i] = fmaxwellOD (xvec[0].elements[i], par, Npar, dy);
+    ovec[0].elements.Flt[i] = fmaxwellOD (xvec[0].elements.Flt[i], par, Npar, dy);
   }
   ovec[0].Nelements = Npts;
@@ -90,7 +94,8 @@
 
 /* pars: x_o, -0.5/sigma^2, I, back, ref */
-float fmaxwellOD (float x, float *par, int Npar, float *dpar) {
+// f = C3 + C2*(x - C4)^2 * exp(-0.5*(x - C0)^2 / C1^2)
+opihi_flt fmaxwellOD (opihi_flt x, opihi_flt *par, int Npar, opihi_flt *dpar) {
 
-  float z, r, f;
+  opihi_flt z, r, f;
 
   z = (x - par[0])/par[1];
Index: trunk/Ohana/src/opihi/cmd.data/vpop.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vpop.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vpop.c	(revision 20936)
@@ -17,5 +17,9 @@
 
   if (Npix > 1) {
-    memmove (&vec[0].elements[0], &vec[0].elements[1], Npix*sizeof(float));
+    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: trunk/Ohana/src/opihi/cmd.data/vroll.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vroll.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vroll.c	(revision 20936)
@@ -4,5 +4,5 @@
 
   int Npix;
-  float first;
+  opihi_flt first;
   Vector *vec;
 
@@ -17,7 +17,13 @@
   if (Npix < 2) return (TRUE);
 
-  first = vec[0].elements[0];
-  memmove (&vec[0].elements[0], &vec[0].elements[1], Npix*sizeof(float));
-  vec[0].elements[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: trunk/Ohana/src/opihi/cmd.data/vsmooth.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vsmooth.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vsmooth.c	(revision 20936)
@@ -3,7 +3,8 @@
 int vsmooth (int argc, char **argv) {
   
-  int i, n, N, Nx, Ns, Ngauss;
-  float *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,10 +24,9 @@
   sigma = atof (argv[2]);
   Nx = in[0].Nelements;
-  vi = in[0].elements;
 
   /* build a 1D gaussian */
   Ns = (int) (Nsigma*sigma + 0.5);
   Ngauss = 2*Ns + 1;
-  ALLOCATE (gaussnorm, float, Ngauss);
+  ALLOCATE (gaussnorm, opihi_flt, Ngauss);
   gauss = &gaussnorm[Ns];
   for (i = -Ns; i < Ns + 1; i++) {
@@ -34,5 +34,9 @@
   }
 
-  ALLOCATE (vo, float, Nx);
+  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++) {
@@ -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,8 +52,15 @@
   }
 
-  free (in[0].elements);
   free (gaussnorm);
 
-  in[0].elements = vo;
+  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: trunk/Ohana/src/opihi/cmd.data/vstat.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vstat.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vstat.c	(revision 20936)
@@ -5,5 +5,5 @@
   int i, N;
   double max, min, sum, var, dvar, mean, stdev;
-  float *X, IgnoreValue;
+  float IgnoreValue;
   int Ignore, Quiet;
 
@@ -41,16 +41,28 @@
 
   /* calculate max, min, mean, sum, npix */
-  X = vec[0].elements;
   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;
   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: trunk/Ohana/src/opihi/cmd.data/vzload.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/vzload.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/vzload.c	(revision 20936)
@@ -58,11 +58,16 @@
 
   for (i = N = 0; i < Noverlay; i++) {
-    size = MIN (MAX_OUTPUT_SIZE, (vecz[0].elements[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[i]+0.5;
-    overlay[N].y = vecy[0].elements[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: trunk/Ohana/src/opihi/cmd.data/write_vectors.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/write_vectors.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/write_vectors.c	(revision 20936)
@@ -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[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[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[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: trunk/Ohana/src/opihi/cmd.data/zplot.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/zplot.c	(revision 20652)
+++ trunk/Ohana/src/opihi/cmd.data/zplot.c	(revision 20936)
@@ -3,6 +3,6 @@
 int zplot (int argc, char **argv) {
   
-  int i, kapa, Npts;
-  float *in, *out;
+  int i, kapa;
+  opihi_flt *out;
   double min, range;
   Graphdata graphmode;
@@ -31,11 +31,17 @@
     return (FALSE);
   }
-  Zvec.Nelements = zvec[0].Nelements;
-  ALLOCATE (Zvec.elements, float, Zvec.Nelements);
+  SetVector (&Zvec, OPIHI_FLT, zvec[0].Nelements);
+  out = Zvec.elements.Flt;
  
-  in = zvec[0].elements;
-  out = Zvec.elements;
-  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.Int;
+    for (i = 0; i < Zvec.Nelements; i++, in++, out++) {
+      *out = MIN (1.0, MAX (0.01, (*in - min) / range));
+    }
   }
 
@@ -44,8 +50,7 @@
   graphmode.size = -1; /* point size determined by Zvec */
   graphmode.etype = 0; /* no errorbars */
-  Npts = xvec[0].Nelements;
-  PlotVectorTriplet (kapa, Npts, xvec[0].elements, yvec[0].elements, Zvec.elements, &graphmode);
+  PlotVectorTriplet (kapa, xvec, yvec, &Zvec, &graphmode);
 
-  free (Zvec.elements);
+  free (Zvec.elements.Ptr);
 
   return (TRUE);
