Index: trunk/ppStats/src/ppStatsLoop.c
===================================================================
--- trunk/ppStats/src/ppStatsLoop.c	(revision 8195)
+++ trunk/ppStats/src/ppStatsLoop.c	(revision 8337)
@@ -5,4 +5,5 @@
 
 #include "ppStats.h"
+#include "ppStatsLoop.h"
 
 
@@ -47,9 +48,19 @@
 
 
-void ppStatsLoop(ppStatsData *data,     // The data
-                 const pmConfig *config // Configuration
+psMetadata *ppStatsLoop(psMetadata *fpaResults, // Metadata to hold the FPA results
+                        ppStatsData *data, // The data
+                        const pmConfig *config // Configuration
     )
 {
-    psMetadata *fpaResults = psMetadataAlloc(); // Metadata to hold the FPA results
+    PS_ASSERT_PTR_NON_NULL(data, NULL);
+    pmFPA *fpa = data->fpa;             // FPA to analyse
+    psFits *fits = data->fits;          // FITS file handle
+    PS_ASSERT_PTR_NON_NULL(fpa, NULL);
+
+    if (!fpaResults) {
+        fpaResults = psMetadataAlloc();
+    }
+
+    bool mdok;                          // Status of MD lookup
 
     // Iterators for the headers and concepts
@@ -58,12 +69,15 @@
 
     // Iterate through the FPA
-    pmFPA *fpa = data->inFPA;           // The FPA of interest
     if (psListLength(data->headers) > 0 && fpa->hdu) {
-        pmFPAReadHeader(fpa, data->inFile);
+        if (fits) {
+            pmFPAReadHeader(fpa, fits);
+        }
         pmHDU *hdu = fpa->hdu;          // HDU for headers
         getMetadata(fpaResults, hdu->header, headersIter);
     }
     if (psListLength(data->concepts) > 0) {
-        pmFPAReadHeader(fpa, data->inFile);
+        if (fits) {
+            pmFPAReadHeader(fpa, fits);
+        }
         pmConceptsReadFPA(fpa, PM_CONCEPT_SOURCE_ALL, false, config->database);
         getMetadata(fpaResults, fpa->concepts, conceptsIter);
@@ -82,8 +96,11 @@
         }
 
-        psMetadata *chipResults = psMetadataAlloc(); // Metadata to hold the chip-level results
+        psMetadata *chipResults = psMetadataLookupMD(&mdok, fpaResults, chipName); // Chip-level results
+        if (!mdok || !chipResults) {
+            chipResults = psMetadataAlloc();
+        }
 
         if (psListLength(data->headers) > 0 && chip->hdu) {
-            if (!pmChipReadHeader(chip, data->inFile)) {
+            if (fits && !pmChipReadHeader(chip, fits)) {
                 continue;
             }
@@ -92,5 +109,5 @@
         }
         if (psListLength(data->concepts) > 0) {
-            if (!pmChipReadHeader(chip, data->inFile)) {
+            if (fits && !pmChipReadHeader(chip, fits)) {
                 continue;
             }
@@ -112,8 +129,11 @@
             }
 
-            psMetadata *cellResults = psMetadataAlloc(); // Metadata to hold the cell-level results
+            psMetadata *cellResults = psMetadataLookupMD(&mdok, chipResults, cellName); // Cell-level results
+            if (!mdok || !cellResults) {
+                cellResults = psMetadataAlloc();
+            }
 
             if (psListLength(data->headers) > 0 && cell->hdu) {
-                if (!pmCellReadHeader(cell, data->inFile)) {
+                if (fits && !pmCellReadHeader(cell, fits)) {
                     continue;
                 }
@@ -122,5 +142,5 @@
             }
             if (psListLength(data->concepts) > 0) {
-                if (!pmCellReadHeader(cell, data->inFile)) {
+                if (fits && !pmCellReadHeader(cell, fits)) {
                     continue;
                 }
@@ -143,5 +163,5 @@
             }
 
-            if (!pmCellRead(cell, data->inFile, config->database)) {
+            if (fits && !pmCellRead(cell, fits, config->database)) {
                 psLogMsg(__func__, PS_LOG_WARN, "Unable to read chip %s cell %s\n", chipName, cellName);
                 pmCellFreeData(cell);
@@ -229,35 +249,31 @@
 
             // Add the cell results to the chip
-            psMetadataAdd(chipResults, PS_LIST_TAIL, cellName, PS_DATA_METADATA,
-                          "Results for cell", cellResults);
-
-            psFree(cellResults);
-            pmCellFreeData(cell);
-        }
-        pmChipFreeData(chip);
-        if (psListLength(chipResults->list) > 0) {
+            if (psListLength(cellResults->list) > 0 && !psMetadataLookup(chipResults, cellName)) {
+                psMetadataAdd(chipResults, PS_LIST_TAIL, cellName, PS_DATA_METADATA,
+                              "Results for cell", cellResults);
+                psFree(cellResults);
+            }
+
+            if (fits) {
+                pmCellFreeData(cell);
+            }
+        }
+        if (fits) {
+            pmChipFreeData(chip);
+        }
+
+        if (psListLength(chipResults->list) > 0 && !psMetadataLookup(fpaResults, chipName)) {
             psMetadataAdd(fpaResults, PS_LIST_TAIL, chipName, PS_DATA_METADATA,
                           "Results for chip", chipResults);
-        }
-        psFree(chipResults);
-    }
-    pmFPAFreeData(fpa);
+            psFree(chipResults);
+        }
+    }
+    if (fits) {
+        pmFPAFreeData(fpa);
+    }
+
     psFree(headersIter);
     psFree(conceptsIter);
 
-    if (psListLength(fpaResults->list) == 0) {
-        psError(PS_ERR_UNKNOWN, true, "No output.\n");
-        return;
-    }
-
-    psString output = psMetadataConfigFormat(fpaResults);
-    psFree(fpaResults);
-    if (!output) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to generate configuration file with result.\n");
-        return;
-    }
-    fprintf(data->outFile, "%s", output);
-    psFree(output);
-
-    return;
+    return fpaResults;
 }
