Index: trunk/psModules/src/objects/pmSourceIO.c
===================================================================
--- trunk/psModules/src/objects/pmSourceIO.c	(revision 15151)
+++ trunk/psModules/src/objects/pmSourceIO.c	(revision 15157)
@@ -3,6 +3,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.49 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-10-01 21:37:21 $
+ *  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-10-02 01:10:48 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -41,4 +41,7 @@
 #include "pmSourceIO.h"
 
+#define BLANK_HEADERS "BLANK.HEADERS"   // Name of metadata in camera configuration containing header names
+                                        // for putting values into a blank PHU
+
 // translations between psphot object types and dophot object types
 int pmSourceGetDophotType (pmSource *source)
@@ -336,5 +339,5 @@
                     // this hdu->header acts as the PHU: set EXTEND to be true
                     psMetadataAddBool (hdu->header, PS_LIST_TAIL, "EXTEND", PS_META_REPLACE, "this file has extensions", true);
-		    file->wrote_phu = true;
+                    file->wrote_phu = true;
                 }
 
@@ -435,20 +438,71 @@
     psMetadata *outhead = psMetadataAlloc();
     if (phu) {
-	psMetadataCopy (outhead, phu->header);
+        psMetadataCopy (outhead, phu->header);
     } else {
-	pmConfigConformHeader (outhead, file->format);
-
-	// XXX need to finish this:
-	// psMetadata *blankHeaders = psMetadataLookupMetadata(NULL, file->camera, "BLANK.HEADERS"); // File information
-	// psMetadataItem *item = NULL;
-	// while (item = psMetadatagetAndIncrement (blankHeaders)) {
-	    
-
-	psMetadata *fileData = psMetadataLookupMetadata(NULL, file->format, "FILE"); // File information
-	const char *fpaNameHdr = psMetadataLookupStr(NULL, fileData, "FPA.NAME");
-	if (fpaNameHdr && strlen(fpaNameHdr) > 0) {
-	    const char *fpaName = psMetadataLookupStr(NULL, file->fpa->concepts, "FPA.NAME");
-	    psMetadataAddStr(outhead, PS_LIST_TAIL, fpaNameHdr, PS_META_REPLACE, "FPA name", fpaName);
-	}
+        pmConfigConformHeader (outhead, file->format);
+
+        // We need to get some FPA-level concepts in there
+        // This is a hack, not very pretty.  But then, so is writing the FPA in this manner without
+        // using the pmFPAMosaic functions....
+
+        psMetadata *headers = psMetadataLookupMetadata(NULL, file->fpa->camera,
+                                                       BLANK_HEADERS); // Header names
+        if (!headers) {
+            psError(PS_ERR_UNEXPECTED_NULL, false,
+                    "Unable to find %s metadata within camera configuration", BLANK_HEADERS);
+            psFree(outhead);
+            return false;
+        }
+
+        {
+            const char *mjdName = psMetadataLookupStr(NULL, headers, "FPA.TIME"); // Header name
+            if (!mjdName || strlen(mjdName) == 0) {
+                psError(PS_ERR_UNEXPECTED_NULL, false,
+                        "Unable to find FPA.TIME in %s within camera configuration.", BLANK_HEADERS);
+                psFree(outhead);
+                return false;
+            }
+            psTime *time = psMetadataLookupTime(NULL, file->fpa->concepts,
+                                                "FPA.TIME"); // Time of observation
+            double mjd = psTimeToMJD(time); // The MJD of observation
+            psMetadataAddF64(outhead, PS_LIST_TAIL, mjdName, PS_META_REPLACE,
+                             "Time of observation", mjd);
+        }
+
+        {
+            const char *expName = psMetadataLookupStr(NULL, headers, "FPA.EXPOSURE"); // Header name
+            if (!expName || strlen(expName) == 0) {
+                psError(PS_ERR_UNEXPECTED_NULL, false,
+                        "Unable to find FPA.EXPOSURE in %s within camera configuration.",
+                        BLANK_HEADERS);
+                psFree(outhead);
+                return false;
+            }
+            float exptime = psMetadataLookupF32(NULL, file->fpa->concepts,
+                                                "FPA.EXPOSURE"); // Exposure time
+            psMetadataAddF32(outhead, PS_LIST_TAIL, expName, PS_META_REPLACE,
+                             "Exposure time (sec)", exptime);
+        }
+
+        {
+            const char *amName = psMetadataLookupStr(NULL, headers, "FPA.AIRMASS"); // Header name
+            if (!amName || strlen(amName) == 0) {
+                psError(PS_ERR_UNEXPECTED_NULL, false,
+                        "Unable to find FPA.AIRMASS in %s within camera configuration.",
+                        BLANK_HEADERS);
+                psFree(outhead);
+                return false;
+            }
+            float airmass = psMetadataLookupF32(NULL, file->fpa->concepts, "FPA.AIRMASS"); // Airmass
+            psMetadataAddF32(outhead, PS_LIST_TAIL, amName, PS_META_REPLACE,
+                             "Observation airmass", airmass);
+        }
+
+        psMetadata *fileData = psMetadataLookupMetadata(NULL, file->format, "FILE"); // File information
+        const char *fpaNameHdr = psMetadataLookupStr(NULL, fileData, "FPA.NAME");
+        if (fpaNameHdr && strlen(fpaNameHdr) > 0) {
+            const char *fpaName = psMetadataLookupStr(NULL, file->fpa->concepts, "FPA.NAME");
+            psMetadataAddStr(outhead, PS_LIST_TAIL, fpaNameHdr, PS_META_REPLACE, "FPA name", fpaName);
+        }
     }
 
@@ -456,5 +510,5 @@
     psMetadata *updates = psMetadataLookupPtr (&status, file->fpa->analysis, "PSASTRO.HEADER");
     if (updates) {
-	psMetadataCopy (outhead, updates);
+        psMetadataCopy (outhead, updates);
     }
 
