Index: trunk/psModules/src/detrend/pmFringeStats.c
===================================================================
--- trunk/psModules/src/detrend/pmFringeStats.c	(revision 24095)
+++ trunk/psModules/src/detrend/pmFringeStats.c	(revision 24836)
@@ -464,4 +464,8 @@
     for (long i = 0; i < fringes->n; i++) {
         pmFringeStats *fringe = fringes->data[i]; // The fringe of interest
+	if (!fringe) {
+	    psWarning ("skipping empty fringe stats for entry %ld -- video cell?\n", i);
+	    continue;
+	}
         pmFringeRegions *regions = fringe->regions; // The fringe regions
         if (numPoints == 0) {
@@ -496,4 +500,8 @@
     for (long i = 0; i < fringes->n; i++) {
         pmFringeStats *fringe = fringes->data[i]; // The fringe of interest
+	if (!fringe) {
+	    psWarning ("skipping empty fringe stats for entry %ld -- video cell?\n", i);
+	    continue;
+	}
         pmFringeRegions *regions = fringe->regions; // The fringe regions
         // Copy the data over
@@ -520,7 +528,7 @@
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-bool pmFringesFormat(pmCell *cell, psMetadata *header, const psArray *fringes)
-{
-    PS_ASSERT_PTR_NON_NULL(cell, false);
+psArray *pmFringesFormatTable(psMetadata *header, const psArray *fringes)
+{
+    PS_ASSERT_PTR_NON_NULL(header, false);
     PS_ASSERT_ARRAY_NON_NULL(fringes, false);
 
@@ -531,5 +539,5 @@
         if (stats->regions != regions) {
             psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Regions for fringe statistics are not identical.\n");
-            return false;
+            return NULL;
         }
     }
@@ -557,20 +565,8 @@
     // Vectors: x, y, mask, f, df
 
-    psMetadata *scalars = psMemIncrRefCounter(header); // Metadata to hold the scalars; will be the header
-    if (!scalars) {
-        scalars = psMetadataAlloc();
-    }
-    psMetadataAddS32(scalars, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width",
-                     regions->dX);
-    psMetadataAddS32(scalars, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height",
-                     regions->dY);
-    psMetadataAddS32(scalars, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x",
-                     regions->nX);
-    psMetadataAddS32(scalars, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y",
-                     regions->nY);
-    psMetadataAdd(cell->analysis, PS_LIST_TAIL, "FRINGE.HEADER", PS_DATA_METADATA,
-                  "Header for fringe data", scalars);
-    psFree(scalars);
-
+    psMetadataAddS32(header, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width", regions->dX);
+    psMetadataAddS32(header, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height", regions->dY);
+    psMetadataAddS32(header, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x", regions->nX);
+    psMetadataAddS32(header, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y", regions->nY);
 
     psArray *table = psArrayAlloc(numRows); // The table
@@ -605,27 +601,13 @@
     }
 
-    psMetadataAdd(cell->analysis, PS_LIST_TAIL, "FRINGE", PS_DATA_ARRAY, "Fringe data", table);
-
-    return true;
-}
-
-
-psArray *pmFringesParse(pmCell *cell)
-{
-    PS_ASSERT_PTR_NON_NULL(cell, NULL);
+    return table;
+}
+
+psArray *pmFringesParseTable(psArray *table, psMetadata *header)
+{
+    PS_ASSERT_PTR_NON_NULL(table, NULL);
+    PS_ASSERT_PTR_NON_NULL(header, NULL);
 
     bool mdok;                          // Status of MD lookup
-    psMetadata *header = psMetadataLookupMetadata(&mdok, cell->analysis, "FRINGE.HEADER"); // Header
-    if (!mdok || !header) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to find header for fringe data.\n");
-        return NULL;
-    }
-
-    psArray *table = psMetadataLookupPtr(NULL, cell->analysis, "FRINGE"); // FITS table
-    if (!table) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to find table for fringe data.\n");
-        return NULL;
-    }
-
 
     // Read the scalars from the header
@@ -722,4 +704,55 @@
 }
 
+bool pmFringesFormat(pmCell *cell, psMetadata *inHeader, const psArray *fringes)
+{
+    PS_ASSERT_PTR_NON_NULL(cell, false);
+    PS_ASSERT_ARRAY_NON_NULL(fringes, false);
+
+    psMetadata *header = psMemIncrRefCounter(inHeader); // Metadata to hold the scalars; will be the header
+    if (!inHeader) {
+	inHeader = psMetadataAlloc();
+    }
+
+    psArray *table = pmFringesFormatTable(header, fringes);
+    if (!table) {
+	psError (PS_ERR_UNKNOWN, false, "unable to generate table from fringes");
+	psFree(header);
+	return NULL;
+    }
+
+    psMetadataAdd(cell->analysis, PS_LIST_TAIL, "FRINGE.HEADER", PS_DATA_METADATA, "Header for fringe data", header);
+    psFree(header);
+
+    psMetadataAdd(cell->analysis, PS_LIST_TAIL, "FRINGE.TABLE", PS_DATA_ARRAY, "Fringe data", table);
+    psFree(table);
+
+    return true;
+}
+
+psArray *pmFringesParse(pmCell *cell)
+{
+    PS_ASSERT_PTR_NON_NULL(cell, NULL);
+
+    bool mdok;                          // Status of MD lookup
+    psMetadata *header = psMetadataLookupMetadata(&mdok, cell->analysis, "FRINGE.HEADER"); // Header
+    if (!mdok || !header) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to find header for fringe data.\n");
+        return NULL;
+    }
+
+    psArray *table = psMetadataLookupPtr(NULL, cell->analysis, "FRINGE.TABLE"); // FITS table
+    if (!table) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to find table for fringe data.\n");
+        return NULL;
+    }
+
+    psArray *fringes = pmFringesParseTable(table, header);
+    if (!fringes) {
+	psError(PS_ERR_UNKNOWN, false, "Unable to add parse the fringe table data");
+	return NULL;
+    }
+
+    return fringes;
+}
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
