Index: /trunk/psModules/src/pslib/Makefile.am
===================================================================
--- /trunk/psModules/src/pslib/Makefile.am	(revision 7003)
+++ /trunk/psModules/src/pslib/Makefile.am	(revision 7004)
@@ -14,4 +14,5 @@
     psPolynomialUtils.c \
     psRegionIsBad.c \
+    psVectorSmooth.c \
     psSparse.c
 
@@ -28,3 +29,4 @@
     psPolynomialUtils.h \
     psRegionIsBad.h \
+    psVectorSmooth.h \
     psSparse.h
Index: /trunk/psModules/src/pslib/psVectorSmooth.c
===================================================================
--- /trunk/psModules/src/pslib/psVectorSmooth.c	(revision 7004)
+++ /trunk/psModules/src/pslib/psVectorSmooth.c	(revision 7004)
@@ -0,0 +1,90 @@
+# include "pslib.h"
+# include "psEllipse.h"
+
+bool psVectorSmooth (psVector *vector,
+                     double  sigma,
+                     double  Nsigma)
+{
+    PS_ASSERT_VECTOR_NON_NULL(vector, NULL);
+
+    int Nbin, Npixel, Nrange;
+    double factor, g, s, sum;
+    psVector *temp;
+
+    // relevant terms
+    Nrange = sigma*Nsigma + 0.5;
+    Npixel = 2*Nrange + 1;
+    factor = -0.5/(sigma*sigma);
+
+    Nbin = vector->n;
+
+    #define VECTORSMOOTH_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        /* generate normalized gaussian */ \
+        psVector *gaussnorm = psVectorAlloc (Npixel, PS_TYPE_##TYPE); \
+        sum = 0.0; \
+        for (int i = -Nrange; i < Nrange + 1; i++) { \
+            gaussnorm->data.TYPE[i+Nrange] = exp (factor*i*i); \
+            sum += gaussnorm->data.TYPE[i+Nrange]; \
+        } \
+        for (int i = -Nrange; i < Nrange + 1; i++) { \
+            gaussnorm->data.TYPE[i+Nrange] /= sum; \
+        } \
+        ps##TYPE *gauss = &gaussnorm->data.TYPE[Nrange]; \
+        \
+        /* smooth vector */ \
+        temp = psVectorAlloc (Nbin, PS_TYPE_##TYPE); \
+        ps##TYPE *vi = vector->data.TYPE; \
+        ps##TYPE *vo = temp->data.TYPE; \
+        /* smooth first Nrange pixels, with renorm */ \
+        /* XXX need to check that this does not run over end for narrow vectors */ \
+        for (int i = 0; i < Nrange; i++, vi++, vo++) { \
+            ps##TYPE *vr = vi - i; \
+            ps##TYPE *vg = gauss - i; \
+            g = s = 0; \
+            for (int n = -i; n < Nrange + 1; n++, vr++, vg++) { \
+                s += *vg * *vr; \
+                g += *vg; \
+            } \
+            *vo = s / g; \
+        } \
+        /* smooth middle pixels */ \
+        for (int i = Nrange; i < Nbin - Nrange; i++, vi++, vo++) { \
+            ps##TYPE *vr = vi - Nrange; \
+            ps##TYPE *vg = gauss - Nrange; \
+            s = 0; \
+            for (int n = -Nrange; n < Nrange + 1; n++, vr++, vg++) { \
+                s += *vg * *vr; \
+            } \
+            *vo = s; \
+        } \
+        /* smooth last Nrange pixels, with renorm */ \
+        /* XXX does this miss the last column? */ \
+        for (int i = Nbin - Nrange; i < Nbin; i++, vi++, vo++) { \
+            ps##TYPE *vr = vi - Nrange; \
+            ps##TYPE *vg = gauss - Nrange; \
+            g = s = 0; \
+            for (int n = -Nrange; n < Nbin - i - 1; n++, vr++, vg++) { \
+                s += *vg * *vr; \
+                g += *vg; \
+            } \
+            *vo = s / g; \
+        } \
+        memcpy (vector->data.TYPE, temp->data.TYPE, Nbin*sizeof(ps##TYPE)); \
+        psFree (temp); \
+        psFree (gaussnorm); \
+        break; \
+    }
+
+    switch (vector->type.type) {
+        VECTORSMOOTH_CASE(F32);
+        VECTORSMOOTH_CASE(F64);
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,vector->type.type);
+            psLogMsg("psVectorSmooth", 2, "unsupported type");
+            return false;
+        }
+    }
+    return true;
+}
Index: /trunk/psModules/src/pslib/psVectorSmooth.h
===================================================================
--- /trunk/psModules/src/pslib/psVectorSmooth.h	(revision 7004)
+++ /trunk/psModules/src/pslib/psVectorSmooth.h	(revision 7004)
@@ -0,0 +1,14 @@
+/** @file  psVectorSmooth.h
+ *
+ * smooth the input vector
+ *  
+ */
+
+# ifndef PS_VECTOR_SMOOTH_H
+# define PS_VECTOR_SMOOTH_H
+
+bool psVectorSmooth (psVector *vector,
+                     double  sigma,
+                     double  Nsigma);
+
+# endif
Index: /trunk/psModules/src/psmodules.h
===================================================================
--- /trunk/psModules/src/psmodules.h	(revision 7003)
+++ /trunk/psModules/src/psmodules.h	(revision 7004)
@@ -13,4 +13,5 @@
 #include <psSparse.h>
 #include <psEllipse.h>
+#include <psVectorSmooth.h>
 #include <psAdditionals.h>
 #include <psRegionIsBad.h>
@@ -38,6 +39,6 @@
 #include <pmFPA_JPEG.h>
 #include <pmReadout.h>
+#include <pmAstrometryObjects.h>
 #include <pmChipMosaic.h>
-// #include <pmFPAAstrometry.h>
 
 // the following headers are from psModule:detrend
