Index: /trunk/psModules/src/astrom/pmFPAHeader.c
===================================================================
--- /trunk/psModules/src/astrom/pmFPAHeader.c	(revision 6929)
+++ /trunk/psModules/src/astrom/pmFPAHeader.c	(revision 6929)
@@ -0,0 +1,99 @@
+#include <stdio.h>
+#include <assert.h>
+#include "pslib.h"
+#include "pmFPA.h"
+#include "pmHDU.h"
+#include "pmConcepts.h"
+#include "pmFPAHeader.h"
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// File-static (private) functions
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Read concepts for all cells in a chip
+static bool chipConcepts(pmChip *chip   // The chip for which to read the concepts
+                        )
+{
+    bool status = true;                 // Status of concept reading
+    status |= pmConceptsReadChip(chip, PM_CONCEPT_SOURCE_HEADER, false, NULL);
+    psArray *cells = chip->cells;       // The cells
+    for (int i = 0; i < cells->n; i++) {
+        pmCell *cell = cells->data[i];  // The cell of interest
+        if (!cell) {
+            continue;
+        }
+        status |= pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_HEADER, false, NULL);
+    }
+
+    return status;
+}
+
+// Read concepts for all chips in an FPA
+static bool fpaConcepts(pmFPA *fpa   // The FPA for which to read the concepts
+                       )
+{
+    bool status = true;                 // Status of concept reading
+    status |= pmConceptsReadFPA(fpa, PM_CONCEPT_SOURCE_HEADER, NULL);
+    psArray *chips = fpa->chips;        // The chips
+    for (int i = 0; i < chips->n; i++) {
+        pmChip *chip = chips->data[i];  // The chip of interest
+        if (!chip) {
+            continue;
+        }
+        status |= chipConcepts(chip);
+    }
+
+    return status;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Public functions
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool pmCellReadHeader(pmCell *cell,     // Cell for which to read header
+                      psFits *fits      // FITS file handle
+                     )
+{
+    if (!cell->hdu) {
+        return pmChipReadHeader(cell->parent, fits);
+    }
+    if (!pmHDUReadHeader(cell->hdu, fits)) {
+        psError(PS_ERR_IO, false, "Unable to read header for cell.\n");
+        return false;
+    }
+
+    return pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_HEADER, false, NULL);
+}
+
+
+bool pmChipReadHeader(pmChip *chip,     // Chip for which to read header
+                      psFits *fits      // FITS file handle
+                     )
+{
+    if (!chip->hdu) {
+        return pmFPAReadHeader(chip->parent, fits);
+    }
+    if (!pmHDUReadHeader(chip->hdu, fits)) {
+        psError(PS_ERR_IO, false, "Unable to read header for cell.\n");
+        return false;
+    }
+
+    return chipConcepts(chip);
+}
+
+
+bool pmFPAReadHeader(pmFPA *fpa,        // FPA for which to read header
+                     psFits *fits       // FITS file handle
+                    )
+{
+    if (!fpa->hdu) {
+        return false;
+    }
+    if (!pmHDUReadHeader(fpa->hdu, fits)) {
+        psError(PS_ERR_IO, false, "Unable to read header for cell.\n");
+        return false;
+    }
+
+    return fpaConcepts(fpa);
+}
Index: /trunk/psModules/src/astrom/pmFPAHeader.h
===================================================================
--- /trunk/psModules/src/astrom/pmFPAHeader.h	(revision 6929)
+++ /trunk/psModules/src/astrom/pmFPAHeader.h	(revision 6929)
@@ -0,0 +1,14 @@
+#ifndef PM_FPA_HEADER_H
+#define PM_FPA_HEADER_H
+
+bool pmCellReadHeader(pmCell *cell,     // Cell for which to read header
+                      psFits *fits      // FITS file handle
+                     );
+bool pmChipReadHeader(pmChip *chip,     // Chip for which to read header
+                      psFits *fits      // FITS file handle
+                     );
+bool pmFPAReadHeader(pmFPA *fpa,        // FPA for which to read header
+                     psFits *fits       // FITS file handle
+                    );
+
+#endif
