Index: trunk/ppStats/src/ppStatsLoop.c
===================================================================
--- trunk/ppStats/src/ppStatsLoop.c	(revision 7903)
+++ 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);
