Index: trunk/ppStats/src/ppStatsLoop.c
===================================================================
--- trunk/ppStats/src/ppStatsLoop.c	(revision 7910)
+++ trunk/ppStats/src/ppStatsLoop.c	(revision 7924)
@@ -1,3 +1,4 @@
 #include <stdio.h>
+#include <string.h>
 #include <pslib.h>
 #include <psmodules.h>
@@ -22,4 +23,27 @@
 }
 
+static bool doThis(psList *toDoList,    // List of things to do
+                   const char *this     // The name of "this"
+    )
+{
+    if (psListLength(toDoList) == 0) {
+        // No list --- do everything
+        return true;
+    }
+
+    psListIterator *iterator = psListIteratorAlloc(toDoList, PS_LIST_HEAD, false); // Iterator
+    psString test;                      // Test string, from iteration
+    while ((test = psListGetAndIncrement(iterator))) {
+        if (strcmp(this, test) == 0) {
+            // It's in the list --- do it
+            psFree(iterator);
+            return true;
+        }
+    }
+    psFree(iterator);
+    // Couldn't find it --- don't do it
+    return false;
+}
+
 
 void ppStatsLoop(ppStatsData *data,     // The data
@@ -51,4 +75,10 @@
         }
         const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip
+
+        // Check to see if this is a chip of interest
+        if (!doThis(data->chips, chipName)) {
+            continue;
+        }
+
         psMetadata *chipResults = psMetadataAlloc(); // Metadata to hold the chip-level results
 
@@ -69,4 +99,10 @@
             }
             const char *cellName = psMetadataLookupStr(NULL, cell->concepts, "CELL.NAME"); // Name of cell
+
+            // Check to see if this is a cell of interest
+            if (!doThis(data->cells, cellName)) {
+                continue;
+            }
+
             psMetadata *cellResults = psMetadataAlloc(); // Metadata to hold the cell-level results
 
@@ -84,4 +120,9 @@
             if (!data->doStats) {
                 // Nothing further to do --- don't want to waste our time reading the data
+                continue;
+            }
+
+            pmHDU *hdu = pmHDUFromCell(cell); // HDU for cell
+            if (!hdu || hdu->blankPHU) {
                 continue;
             }
@@ -192,4 +233,9 @@
     psFree(conceptsIter);
 
+    if (psListLength(fpaResults->list) == 0) {
+        psError(PS_ERR_UNKNOWN, true, "No output.\n");
+        return;
+    }
+
     psString output = psMetadataConfigFormat(fpaResults);
     psFree(fpaResults);
