Index: trunk/ppStats/src/ppStatsLoop.c
===================================================================
--- trunk/ppStats/src/ppStatsLoop.c	(revision 8337)
+++ trunk/ppStats/src/ppStatsLoop.c	(revision 8338)
@@ -47,4 +47,18 @@
 }
 
+static void addToHierarchy(psMetadata *source, // Source to add
+                           psMetadata *target, // Target to which to add
+                           const char *name, // Name of source
+                           const char *comment // Comment for source
+    )
+{
+    if (psListLength(source->list) > 0 && !psMetadataLookup(target, name)) {
+        psMetadataAdd(target, PS_LIST_TAIL, name, PS_DATA_METADATA,
+                      comment, source);
+    }
+    psFree(source);                     // Drop reference
+    return;
+}
+
 
 psMetadata *ppStatsLoop(psMetadata *fpaResults, // Metadata to hold the FPA results
@@ -96,5 +110,6 @@
         }
 
-        psMetadata *chipResults = psMetadataLookupMD(&mdok, fpaResults, chipName); // Chip-level results
+        // Chip-level results
+        psMetadata *chipResults = psMemIncrRefCounter(psMetadataLookupMD(&mdok, fpaResults, chipName));
         if (!mdok || !chipResults) {
             chipResults = psMetadataAlloc();
@@ -129,5 +144,6 @@
             }
 
-            psMetadata *cellResults = psMetadataLookupMD(&mdok, chipResults, cellName); // Cell-level results
+            // Cell-level results
+            psMetadata *cellResults = psMemIncrRefCounter(psMetadataLookupMD(&mdok, chipResults, cellName));
             if (!mdok || !cellResults) {
                 cellResults = psMetadataAlloc();
@@ -136,4 +152,5 @@
             if (psListLength(data->headers) > 0 && cell->hdu) {
                 if (fits && !pmCellReadHeader(cell, fits)) {
+                    addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                     continue;
                 }
@@ -143,4 +160,5 @@
             if (psListLength(data->concepts) > 0) {
                 if (fits && !pmCellReadHeader(cell, fits)) {
+                    addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                     continue;
                 }
@@ -155,4 +173,5 @@
                                   "Results for cell", cellResults);
                 }
+                addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                 continue;
             }
@@ -160,4 +179,5 @@
             pmHDU *hdu = pmHDUFromCell(cell); // HDU for cell
             if (!hdu || hdu->blankPHU) {
+                addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                 continue;
             }
@@ -166,4 +186,5 @@
                 psLogMsg(__func__, PS_LOG_WARN, "Unable to read chip %s cell %s\n", chipName, cellName);
                 pmCellFreeData(cell);
+                addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                 continue;
             }
@@ -171,5 +192,8 @@
             psArray *readouts = cell->readouts; // Array of component readouts
             if (readouts->n == 0) {
-                pmCellFreeData(cell);
+                if (fits) {
+                    pmCellFreeData(cell);
+                }
+                addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                 continue;
             }
@@ -182,5 +206,8 @@
                 psLogMsg(__func__, PS_LOG_WARN, "No image associated with readout in chip %s cell %s --- "
                          "ignored.\n", chipName, cellName);
-                pmCellFreeData(cell);
+                if (fits) {
+                    pmCellFreeData(cell);
+                }
+                addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                 continue;
             }
@@ -191,5 +218,8 @@
                     psLogMsg(__func__, PS_LOG_WARN, "Unable to perform statistics on chip %s cell %s --- "
                              "ignored.\n", chipName, cellName);
-                    pmCellFreeData(cell);
+                    if (fits) {
+                        pmCellFreeData(cell);
+                    }
+                    addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                     continue;
                 }
@@ -221,5 +251,8 @@
                     psFree(sampleValues);
                     psFree(sampleMask);
-                    pmCellFreeData(cell);
+                    if (fits) {
+                        pmCellFreeData(cell);
+                    }
+                    addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
                     continue;
                 }
@@ -249,28 +282,19 @@
 
             // Add the cell results to the chip
-            if (psListLength(cellResults->list) > 0 && !psMetadataLookup(chipResults, cellName)) {
-                psMetadataAdd(chipResults, PS_LIST_TAIL, cellName, PS_DATA_METADATA,
-                              "Results for cell", cellResults);
-                psFree(cellResults);
-            }
-
+            addToHierarchy(cellResults, chipResults, cellName, "Results for cell");
             if (fits) {
                 pmCellFreeData(cell);
             }
         }
+
+        addToHierarchy(chipResults, fpaResults, chipName, "Results for chip");
         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);
-        }
     }
     if (fits) {
         pmFPAFreeData(fpa);
     }
-
     psFree(headersIter);
     psFree(conceptsIter);
