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