Index: /trunk/archive/modules/src/pmAstrom.c
===================================================================
--- /trunk/archive/modules/src/pmAstrom.c	(revision 5493)
+++ /trunk/archive/modules/src/pmAstrom.c	(revision 5494)
@@ -32,5 +32,5 @@
 */
 
-pmAstromGridMatchStat pmAstromGridMatch (psArray *st1, psArray *st2, pmAstromOpt *opt) {
+psArray *pmAstromGridMatch (psArray *raw, psArray *ref, psMetadata *options) {
 
     pmAstromGridMatchStat minStat, newStat
@@ -59,31 +59,4 @@
     }
     return (minStat);
-}
-
-// rotate the focal-plane coordinates about the center coordinate
-// angle specified in radians
-psArray *pmAstromRotateObj (psArray *old, double angle, double pCenter, double qCenter) {
-
-    pmAstromObj *ob;
-
-    psArray *new = psArrayAlloc (old->n);
-
-    cs = cos(angle);
-    sn = sin(angle);
-    
-    for (int i = 0; i < old->n; i++) {
-
-	oldObj = (pmAstromObj *)old->data[i];
-	newObj = pmAstromObjCopy (oldObj);
-
-	P = oldObj->P - pCenter;
-	Q = oldObj->Q - qCenter;
-	
-	newObj->P = P*cs + Q*sn;
-	newObj->Q = Q*cs - P*sn;
-	
-	new->data[i] = newObj;
-    }
-    return (new);
 }
 
@@ -250,2 +223,74 @@
     psPolynomial2D *yt = psVectorFitPolynomial2D (NULL, stats, NULL, 0, Y, NULL, x, y)
     psPolynomial2D *yt = psVectorClipFitPolynomial2D (NULL, stats, NULL, 0, Y, NULL, x, y)
+
+      }
+
+}
+
+
+// rotate the focal-plane coordinates about the center coordinate
+// angle specified in radians
+psArray *pmAstromRotateObj (psArray *old, psPlane *center, double angle) {
+
+    pmAstromObj *newObj;
+
+    psArray *new = psArrayAlloc (old->n);
+
+    cs = cos(angle);
+    sn = sin(angle);
+    xCenter = center.x;
+    yCenter = center.y;
+    
+    for (int i = 0; i < old->n; i++) {
+
+	oldObj = (pmAstromObj *)old->data[i];
+	newObj = pmAstromObjCopy (oldObj);
+
+	P = oldObj->FP.x - xCenter;
+	Q = oldObj->FP.y - yCenter;
+	
+	newObj->FP.x = P*cs + Q*sn;
+	newObj->FP.y = Q*cs - P*sn;
+	
+	new->data[i] = newObj;
+    }
+    return (new);
+}
+
+pmAstromObj *pmAstromObjCopy (pmAstromObj *old) {
+
+  pmAstromObj *obj = pmAstromObjAlloc ();
+
+  obj[0] = old[0];
+
+  return (obj);
+}
+
+static void pmAstromObjFree (pmAstromObj *obj) {
+
+  if (obj == NULL) return;
+  return;
+}
+
+pmAstromObj *pmAstromObjAlloc (void) {
+
+  pmAstromObj *obj = psAlloc (sizeof(pmAstromObj));
+  psMemSetDeallocator(line, (psFreeFunc) pmAstromObjFree);
+
+  obj->pix.x = 0;
+  obj->pix.y = 0;
+
+  obj->FP.x = 0;
+  obj->FP.y = 0;
+
+  obj->TP.x = 0;
+  obj->TP.y = 0;
+
+  obj->sky.x = 0;
+  obj->sky.y = 0;
+
+  obj->mag = 0;
+
+  return (obj);
+}
+
Index: /trunk/archive/modules/src/pmFringe.c
===================================================================
--- /trunk/archive/modules/src/pmFringe.c	(revision 5494)
+++ /trunk/archive/modules/src/pmFringe.c	(revision 5494)
@@ -0,0 +1,53 @@
+# include "pslib.h"
+
+typedef struct {
+    double xMin;
+    double yMin;
+    double xMax;
+    double yMax;
+    double delta;
+    double midValue;
+} pmFringePoint;
+
+stats *pmFringeStats (psImage *image, psArray *fringePoints, psMetadata *config) {
+
+    psRegion region;
+
+    double RADIUS = psMetadataLookupR32 (&status, myHeader, "FRINGE_SQUARE_RADIUS");
+
+    psStats *stats = psStatsAlloc (PS_STATS_ROBUST_MEDIAN | PS_STATS_ROBUST_STDEV);
+
+    // clip out the stars?
+
+    psVector *delta = psVectorAlloc (fringePoints->n, PS_DATA_F32);
+
+    for (i = 0; i < fringePoints->n; i++) {
+
+	pmFringePoint *point = fringePoints->data[i];
+	
+	region = psRegionForSquare (point->xMin, point->yMin, RADIUS);
+	region = psRegionForImage (image, region);
+	subimage = psImageSubset (image, region);
+	stats = psImageStats (stats, subimage, NULL, 0);
+	psImageFree (subimage);
+
+	min = stats->robustMedian;
+
+	region = psRegionForSquare (point->xMax, point->yMax, RADIUS);
+	region = psRegionForImage (image, region);
+	subimage = psImageSubset (image, region);
+	stats = psImageStats (stats, subimage, NULL, 0);
+	psImageFree (subimage);
+
+	max = stats->robustMedian;
+
+	// check for NaN, ignore 
+	point->delta = max - min;
+	point->midValue = 0.5*(min + max);
+
+	delta->data.F32[i] = point->delta;
+    }
+
+    stats = psVectorStats (stats, delta, NULL, NULL, 0);
+    return (value);
+}
