Index: trunk/psModules/src/detrend/pmFringeStats.c
===================================================================
--- trunk/psModules/src/detrend/pmFringeStats.c	(revision 9822)
+++ trunk/psModules/src/detrend/pmFringeStats.c	(revision 9856)
@@ -250,5 +250,5 @@
     (void)psMemSetDeallocator(stats, (psFreeFunc)fringeStatsFree);
 
-    int numRegions = regions->x->n;     // Number of regions
+    int numRegions = regions->nRequested; // Number of regions
     stats->regions = psMemIncrRefCounter(regions);
     stats->f = psVectorAlloc(numRegions, PS_TYPE_F32);
@@ -475,5 +475,5 @@
             return NULL;
         }
-        unsigned int num = regions->nRequested;  // Number of fringe points
+        int num = regions->nRequested;  // Number of fringe points
         if (regions->x->n != num || regions->y->n != num || regions->mask->n != num ||
                 fringe->f->n != num || fringe->df->n != num) {
@@ -487,4 +487,7 @@
 
     pmFringeRegions *newRegions = pmFringeRegionsAlloc(numPoints, dX, dY, nX, nY); // The new list of regions
+    newRegions->x = psVectorAlloc(numPoints, PS_TYPE_F32);
+    newRegions->y = psVectorAlloc(numPoints, PS_TYPE_F32);
+    newRegions->mask = psVectorAlloc(numPoints, PS_TYPE_U8);
     pmFringeStats *newStats = pmFringeStatsAlloc(newRegions); // The new list of statistics
 
@@ -499,4 +502,10 @@
         memcpy(&newStats->f->data.F32[offset], fringe->f->data.F32, fringe->f->n * sizeof(psF32));
         memcpy(&newStats->df->data.F32[offset], fringe->f->data.F32, fringe->df->n * sizeof(psF32));
+        if (x0 && y0) {
+            for (long j = offset; j < offset + regions->x->n; j++) {
+                newRegions->x->data.F32[j] += x0->data.S32[i];
+                newRegions->y->data.F32[j] += y0->data.S32[i];
+            }
+        }
         offset += regions->nRequested;
     }
@@ -652,16 +661,33 @@
 
     #define READ_FRINGES_VECTOR_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \
-    VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \
-    if (!mdok) { \
-        psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
-        goto READ_FRINGES_DONE; \
-    }
-
-    #define READ_FRINGES_ARRAY_ROW(ARRAY, NAME, DESCRIPTION) \
-    ARRAY->data[i] = psMetadataLookupPtr(&mdok, row, NAME); \
-    if (!ARRAY->data[i] || !mdok) { \
-        psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
-        goto READ_FRINGES_DONE; \
-    }
+    { \
+        VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \
+        if (!mdok) { \
+            psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
+            goto READ_FRINGES_DONE; \
+        } \
+    }
+
+    // Some values may be either a vector or a value --- need to check
+    #define READ_FRINGES_ARRAY_ROW(ARRAY, TYPE, NAME, DESCRIPTION) \
+    { \
+        psMetadataItem *item = psMetadataLookup(row, NAME); \
+        if (!item) { \
+            psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
+            goto READ_FRINGES_DONE; \
+        } \
+        if (item->type == PS_DATA_VECTOR) { \
+            ARRAY->data[i] = psMemIncrRefCounter(item->data.V); \
+        } else if (item->type == PS_TYPE_##TYPE) { \
+            psVector *vector = psVectorAlloc(1, PS_TYPE_##TYPE); \
+            vector->data.TYPE[0] = item->data.TYPE; \
+            ARRAY->data[i] = vector; \
+        } else { \
+            psError(PS_ERR_IO, true, "Found " #DESCRIPTION ", but it's of an unsupported type (%x).\n", \
+                    item->type); \
+            goto READ_FRINGES_DONE; \
+        } \
+    }
+
 
     // Translate the table into vectors
@@ -671,6 +697,6 @@
         READ_FRINGES_VECTOR_ROW(y, F32, "y", "y position");
         READ_FRINGES_VECTOR_ROW(mask, U8, "mask", "mask");
-        READ_FRINGES_ARRAY_ROW(f, "f", "fringe measurement");
-        READ_FRINGES_ARRAY_ROW(df, "df", "fringe error");
+        READ_FRINGES_ARRAY_ROW(f, F32, "f", "fringe measurement");
+        READ_FRINGES_ARRAY_ROW(df, F32, "df", "fringe error");
     }
 
@@ -695,7 +721,4 @@
     psFree(table);
     psFree(regions);
-    psFree(x);
-    psFree(y);
-    psFree(mask);
     psFree(f);
     psFree(df);
@@ -813,4 +836,7 @@
         scale->coeffErr->data.F32[i] = sqrt(A->data.F64[i][i]);
     }
+
+    psFree(A);
+    psFree(B);
 
     return true;
