Index: /trunk/ppStats/src/ppStatsData.c
===================================================================
--- /trunk/ppStats/src/ppStatsData.c	(revision 7909)
+++ /trunk/ppStats/src/ppStatsData.c	(revision 7910)
@@ -18,7 +18,9 @@
     }
     psFree(data->headers);
+    psFree(data->concepts);
+    psFree(data->stats);
+
     psFree(data->chips);
     psFree(data->cells);
-    psFree(data->stats);
 
     return;
@@ -36,11 +38,14 @@
     data->outFile = NULL;
     data->inFPA = NULL;
+
+    data->headers = psListAlloc(NULL);
+    data->concepts = psListAlloc(NULL);
+    data->stats = psStatsAlloc(0);
+    data->doStats = false;
+
     data->sample = 0;
     data->maskVal = 0;
-    data->headers = psListAlloc(NULL);
     data->chips = psListAlloc(NULL);
     data->cells = psListAlloc(NULL);
-    data->stats = psStatsAlloc(0);
-    data->doStats = false;
 
     return data;
Index: /trunk/ppStats/src/ppStatsData.h
===================================================================
--- /trunk/ppStats/src/ppStatsData.h	(revision 7909)
+++ /trunk/ppStats/src/ppStatsData.h	(revision 7910)
@@ -12,12 +12,14 @@
     FILE *outFile;                      // Output file handle
     pmFPA *inFPA;                       // Input FPA
-    // Options
+    // Stuff to output
+    psStats *stats;                     // Statistics to calculate
+    bool doStats;                       // Do statistics?
+    psList *headers;                    // Headers to read
+    psList *concepts;                   // Concepts to read
+    // Options for input data
     float sample;                       // Fraction of cell to sample for statistics
     psMaskType maskVal;                 // Mask value for images
-    psList *headers;                    // Headers to read
     psList *chips;                      // Chips to look at
     psList *cells;                      // Cells to look at
-    psStats *stats;                     // Statistics to calculate
-    bool doStats;                       // Do statistics?
 } ppStatsData;
 
Index: /trunk/ppStats/src/ppStatsLoop.c
===================================================================
--- /trunk/ppStats/src/ppStatsLoop.c	(revision 7909)
+++ /trunk/ppStats/src/ppStatsLoop.c	(revision 7910)
@@ -6,13 +6,16 @@
 
 
-static void getHeaders(psMetadata *target, // Target for headers
-                       psMetadata *source, // Source header
-                       psListIterator *keywordsIter // Iterator for header keywords
+static void getMetadata(psMetadata *target, // Target for metadata
+                        psMetadata *source, // Source for metadata
+                        psListIterator *iterator // Iterator for keywords
     )
 {
-    psListIteratorSet(keywordsIter, PS_LIST_HEAD);
-    psString keyword;                    // Header from iteration
-    while ((keyword = psListGetAndIncrement(keywordsIter))) {
-        psMetadataAddItem(target, psMetadataLookup(source, keyword), PS_LIST_TAIL, 0);
+    psListIteratorSet(iterator, PS_LIST_HEAD);
+    psString name;                      // Name from iteration
+    while ((name = psListGetAndIncrement(iterator))) {
+        psMetadataItem *item = psMetadataLookup(source, name); // Item of interest, or NULL
+        if (item) {
+            psMetadataAddItem(target, item, PS_LIST_TAIL, 0);
+        }
     }
     return;
@@ -26,6 +29,7 @@
     psMetadata *fpaResults = psMetadataAlloc(); // Metadata to hold the FPA results
 
-    psListIterator *headersIter = psListIteratorAlloc(data->headers, PS_LIST_HEAD, false); // Headers iterator
-
+    // Iterators for the headers and concepts
+    psListIterator *headersIter = psListIteratorAlloc(data->headers, PS_LIST_HEAD, false); // Headers
+    psListIterator *conceptsIter = psListIteratorAlloc(data->concepts, PS_LIST_HEAD, false); // Concepts
 
     // Iterate through the FPA
@@ -33,5 +37,9 @@
     if (psListLength(data->headers) > 0 && fpa->hdu && pmFPAReadHeader(fpa, data->inFile)) {
         pmHDU *hdu = fpa->hdu;          // HDU for headers
-        getHeaders(fpaResults, hdu->header, headersIter);
+        getMetadata(fpaResults, hdu->header, headersIter);
+    }
+    if (psListLength(data->concepts) > 0 &&
+        pmConceptsReadFPA(fpa, PM_CONCEPT_SOURCE_ALL, false, config->database)) {
+        getMetadata(fpaResults, fpa->concepts, conceptsIter);
     }
 
@@ -47,5 +55,9 @@
         if (psListLength(data->headers) > 0 && chip->hdu && pmChipReadHeader(chip, data->inFile)) {
             pmHDU *hdu = chip->hdu;     // HDU for headers
-            getHeaders(chipResults, hdu->header, headersIter);
+            getMetadata(chipResults, hdu->header, headersIter);
+        }
+        if (psListLength(data->concepts) > 0 &&
+            pmConceptsReadChip(chip, PM_CONCEPT_SOURCE_ALL, false, false, config->database)) {
+            getMetadata(chipResults, chip->concepts, conceptsIter);
         }
 
@@ -61,7 +73,11 @@
             if (psListLength(data->headers) > 0 && cell->hdu && pmCellReadHeader(cell, data->inFile)) {
                 pmHDU *hdu = cell->hdu;     // HDU for headers
-                getHeaders(cellResults, hdu->header, headersIter);
+                getMetadata(cellResults, hdu->header, headersIter);
                 psMetadataAdd(chipResults, PS_LIST_TAIL, cellName, PS_DATA_METADATA,
                               "Results for cell", cellResults);
+            }
+            if (psListLength(data->concepts) > 0 &&
+                pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_ALL, false, config->database)) {
+                getMetadata(cellResults, cell->concepts, conceptsIter);
             }
 
@@ -174,4 +190,5 @@
     pmFPAFreeData(fpa);
     psFree(headersIter);
+    psFree(conceptsIter);
 
     psString output = psMetadataConfigFormat(fpaResults);
Index: /trunk/ppStats/src/ppStatsSetup.c
===================================================================
--- /trunk/ppStats/src/ppStatsSetup.c	(revision 7909)
+++ /trunk/ppStats/src/ppStatsSetup.c	(revision 7910)
@@ -30,4 +30,5 @@
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-cell", PS_META_DUPLICATE_OK, "Cell to inspect", NULL);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-header", PS_META_DUPLICATE_OK, "Header to look up", NULL);
+    psMetadataAddStr(arguments, PS_LIST_TAIL, "-concept", PS_META_DUPLICATE_OK, "Concept to look up", NULL);
     psMetadataAddBool(arguments, PS_LIST_TAIL, "-mean", 0, "Calculate sample mean", false);
     psMetadataAddBool(arguments, PS_LIST_TAIL, "-stdev", 0, "Calculate sample standard deviation", false);
@@ -77,4 +78,5 @@
     GET_LIST_FROM_ARGUMENTS("Cell", "-cell", data->cells);
     GET_LIST_FROM_ARGUMENTS("Header", "-header", data->headers);
+    GET_LIST_FROM_ARGUMENTS("Concept", "-concept", data->concepts);
 
     // Set the statistics options
@@ -102,31 +104,33 @@
 
     // Open the input file, determine the camera
-    data->inFile = psFitsOpen(data->inName, "r");
-    if (!data->inFile) {
-        psError(PS_ERR_IO, false, "Unable to open input file %s\n", data->inName);
-        goto die;
-    }
-    psMetadata *header = psFitsReadHeader(NULL, data->inFile); // The FITS (primary) header
-    psMetadata *format = pmConfigCameraFormatFromHeader(config, header);
-    if (!format) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to determine camera format for %s\n", data->inName);
-        psFree(header);
-        goto die;
-    }
-    data->inFPA = pmFPAConstruct(config->camera);
-    if (!data->inFPA) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to construct FPA for %s\n", data->inName);
+    {
+        data->inFile = psFitsOpen(data->inName, "r");
+        if (!data->inFile) {
+            psError(PS_ERR_IO, false, "Unable to open input file %s\n", data->inName);
+            goto die;
+        }
+        psMetadata *header = psFitsReadHeader(NULL, data->inFile); // The FITS (primary) header
+        psMetadata *format = pmConfigCameraFormatFromHeader(config, header);
+        if (!format) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to determine camera format for %s\n", data->inName);
+            psFree(header);
+            goto die;
+        }
+        data->inFPA = pmFPAConstruct(config->camera);
+        if (!data->inFPA) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to construct FPA for %s\n", data->inName);
+            psFree(header);
+            psFree(format);
+            goto die;
+        }
+        pmFPAview *view = pmFPAAddSourceFromHeader(data->inFPA, header, format);
         psFree(header);
         psFree(format);
-        goto die;
-    }
-    pmFPAview *view = pmFPAAddSourceFromHeader(data->inFPA, header, format);
-    psFree(header);
-    psFree(format);
-    if (!view) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to add input file %s to FPA.\n", data->inName);
-        goto die;
-    }
-    psFree(view);
+        if (!view) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to add input file %s to FPA.\n", data->inName);
+            goto die;
+        }
+        psFree(view);
+    }
 
     // Open the output file
@@ -174,6 +178,7 @@
 
     GET_LIST_FROM_RECIPE("CHIPS", data->chips);
-    GET_LIST_FROM_RECIPE("CELLS", data->chips);
-    GET_LIST_FROM_RECIPE("HEADER", data->chips);
+    GET_LIST_FROM_RECIPE("CELLS", data->cells);
+    GET_LIST_FROM_RECIPE("HEADER", data->headers);
+    GET_LIST_FROM_RECIPE("CONCEPT", data->concepts);
 
     // Parse the statistics options
