Index: trunk/psModules/src/camera/pmFPA.c
===================================================================
--- trunk/psModules/src/camera/pmFPA.c	(revision 17832)
+++ trunk/psModules/src/camera/pmFPA.c	(revision 17911)
@@ -305,5 +305,6 @@
     tmpCell->conceptsRead = PM_CONCEPT_SOURCE_NONE;
     if (!psMetadataAddStr(tmpCell->concepts, PS_LIST_HEAD, "CELL.NAME", 0, NULL, name)) {
-        psLogMsg(__func__, PS_LOG_WARN, "WARNING: Could not add CELL.NAME to metadata.\n");
+        psErrorClear();
+        psWarning("Could not add CELL.NAME to metadata.");
     }
     pmConceptsBlankCell(tmpCell);
@@ -343,5 +344,6 @@
     tmpChip->conceptsRead = PM_CONCEPT_SOURCE_NONE;
     if (!psMetadataAddStr(tmpChip->concepts, PS_LIST_HEAD, "CHIP.NAME", 0, NULL, name)) {
-        psLogMsg(__func__, PS_LOG_WARN, "WARNING: Could not add CHIP.NAME %s to concepts.\n", name);
+        psErrorClear();
+        psWarning("Could not add CHIP.NAME %s to concepts.", name);
     }
     pmConceptsBlankChip(tmpChip);
@@ -355,5 +357,5 @@
 }
 
-pmFPA *pmFPAAlloc(const psMetadata *camera)
+pmFPA *pmFPAAlloc(const psMetadata *camera, const char *cameraName)
 {
     pmFPA *tmpFPA = (pmFPA *) psAlloc(sizeof(pmFPA));
@@ -373,4 +375,10 @@
     pmConceptsBlankFPA(tmpFPA);
 
+    if (!psMetadataAddStr(tmpFPA->concepts, PS_LIST_TAIL, "FPA.CAMERA", PS_META_REPLACE,
+                          "Camera name (according to configuration)", cameraName)) {
+        psErrorClear();
+        psWarning("Could not add FPA.CAMERA %s to concepts.", cameraName);
+    }
+
     return tmpFPA;
 }
Index: trunk/psModules/src/camera/pmFPA.h
===================================================================
--- trunk/psModules/src/camera/pmFPA.h	(revision 17832)
+++ trunk/psModules/src/camera/pmFPA.h	(revision 17911)
@@ -6,6 +6,6 @@
  * @author Eugene Magnier, IfA
  *
- * @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
- * @date $Date: 2008-03-31 22:39:06 $
+ * @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2008-06-05 01:31:33 $
  * Copyright 2005-2006 Institute for Astronomy, University of Hawaii
  */
@@ -169,5 +169,7 @@
 
 /// Allocate an FPA
-pmFPA *pmFPAAlloc(const psMetadata *camera); ///< Camera configuration (to store in FPA)
+pmFPA *pmFPAAlloc(const psMetadata *camera, ///< Camera configuration (to store in FPA)
+                  const char *cameraName ///< Name of camera (for FPA.CAMERA concept)
+    );
 bool psMemCheckFPA(psPtr ptr);
 
Index: trunk/psModules/src/camera/pmFPAConstruct.c
===================================================================
--- trunk/psModules/src/camera/pmFPAConstruct.c	(revision 17832)
+++ trunk/psModules/src/camera/pmFPAConstruct.c	(revision 17911)
@@ -1102,5 +1102,5 @@
 // It returns a view corresponding to the PHU
 static pmFPAview *addSource(pmFPA *fpa,       // The FPA
-                            const char *fpaname, // The desired FPA name
+                            const char *fpaObs, // The desired FPA observation name
                             const pmFPAview *phuView, // The view corresponding to the PHU, or NULL
                             const psMetadata *header, // The PHU header, or NULL
@@ -1115,16 +1115,17 @@
     bool mdok;                          // Status of MD lookup
 
-    // If FPA.NAME is already defined, new name must match it; otherwise, warn the user that something
+    // If FPA.OBS is already defined, new name must match it; otherwise, warn the user that something
     // potentially bad is happening.
-    if (fpaname && install) {
-        const char *currentName = psMetadataLookupStr(&mdok, fpa->concepts, "FPA.NAME"); // Current name
-        if (mdok && currentName && strlen(currentName) > 0 && strcmp(currentName, fpaname) != 0) {
-            psWarning("FPA.NAME for new source (%s) doesn't match FPA.NAME for current "
-                     "fpa (%s).\n", fpaname, currentName);
-        }
-        psMetadataAddStr(fpa->concepts, PS_LIST_HEAD, "FPA.NAME", PS_META_REPLACE, "Name of FPA", fpaname);
-    } else if (!psMetadataLookup(fpa->concepts, "FPA.NAME")) {
-        // Make sure there is an FPA.NAME
-        psMetadataAddStr(fpa->concepts, PS_LIST_HEAD, "FPA.NAME", 0, "Name of FPA", "UNKNOWN");
+    if (fpaObs && install) {
+        const char *currentName = psMetadataLookupStr(&mdok, fpa->concepts, "FPA.OBS"); // Current name
+        if (mdok && currentName && strlen(currentName) > 0 && strcmp(currentName, fpaObs) != 0) {
+            psWarning("FPA.OBS for new source (%s) doesn't match FPA.OBS for current fpa (%s).",
+                      fpaObs, currentName);
+        }
+        psMetadataAddStr(fpa->concepts, PS_LIST_HEAD, "FPA.OBS", PS_META_REPLACE, "Observation identifier",
+                         fpaObs);
+    } else if (!psMetadataLookup(fpa->concepts, "FPA.OBS")) {
+        // Make sure there is an FPA.OBS
+        psMetadataAddStr(fpa->concepts, PS_LIST_HEAD, "FPA.OBS", 0, "Observation identifier", "UNKNOWN");
     }
 
@@ -1308,9 +1309,9 @@
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-pmFPA *pmFPAConstruct(const psMetadata *camera)
+pmFPA *pmFPAConstruct(const psMetadata *camera, const char *cameraName)
 {
     PS_ASSERT_PTR_NON_NULL(camera, NULL);
 
-    pmFPA *fpa = pmFPAAlloc(camera);    // The FPA to fill out
+    pmFPA *fpa = pmFPAAlloc(camera, cameraName);    // The FPA to fill out
 
     bool mdok = true;                   // Status from MD lookups
@@ -1349,5 +1350,5 @@
 }
 
-bool pmFPAAddSourceFromFormat(pmFPA *fpa, const char *fpaname, const psMetadata *format)
+bool pmFPAAddSourceFromFormat(pmFPA *fpa, const char *fpaObs, const psMetadata *format)
 {
     PS_ASSERT_PTR_NON_NULL(fpa, false);
@@ -1358,5 +1359,5 @@
     pmFPAview *view = pmFPAviewAlloc(0);// View for current level
     if (phuLevel == PM_FPA_LEVEL_FPA) {
-        if (!pmFPAAddSourceFromView(fpa, fpaname, view, format)) {
+        if (!pmFPAAddSourceFromView(fpa, fpaObs, view, format)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to add PHU to FPA.");
             psFree(view);
@@ -1367,5 +1368,5 @@
         while ((chip = pmFPAviewNextChip(view, fpa, 1))) {
             if (phuLevel == PM_FPA_LEVEL_CHIP) {
-                if (!pmFPAAddSourceFromView(fpa, fpaname, view, format)) {
+                if (!pmFPAAddSourceFromView(fpa, fpaObs, view, format)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to add PHU to FPA.");
                     psFree(view);
@@ -1376,5 +1377,5 @@
                 while ((cell = pmFPAviewNextCell(view, fpa, 1))) {
                     if (phuLevel == PM_FPA_LEVEL_CELL) {
-                        if (!pmFPAAddSourceFromView(fpa, fpaname, view, format)) {
+                        if (!pmFPAAddSourceFromView(fpa, fpaObs, view, format)) {
                             psError(PS_ERR_UNKNOWN, false, "Unable to add PHU to FPA.");
                             psFree(view);
@@ -1391,5 +1392,5 @@
 }
 
-bool pmFPAAddSourceFromView(pmFPA *fpa, const char *fpaname, const pmFPAview *phuView,
+bool pmFPAAddSourceFromView(pmFPA *fpa, const char *fpaObs, const pmFPAview *phuView,
                             const psMetadata *format)
 {
@@ -1398,5 +1399,5 @@
     PS_ASSERT_PTR_NON_NULL(format, false);
 
-    pmFPAview *view = addSource(fpa, fpaname, phuView, NULL, format, true);
+    pmFPAview *view = addSource(fpa, fpaObs, phuView, NULL, format, true);
     bool status = (view != NULL);
     psFree(view);
@@ -1418,11 +1419,11 @@
 
     // Check the name of the FPA
-    psString fpaname = phuNameFromHeader("FPA.NAME", fileInfo, phu); // New name for the FPA
-    if (!fpaname || strlen(fpaname) == 0) {
-        psWarning("Unable to determine FPA.NAME: check for FPA.NAME in FILE in camera format");
-    }
-
-    pmFPAview *view = addSource(fpa, fpaname, NULL, phu, format, true); // View of PHU, to return
-    psFree(fpaname);
+    psString fpaObs = phuNameFromHeader("FPA.OBS", fileInfo, phu); // New observation name for the FPA
+    if (!fpaObs || strlen(fpaObs) == 0) {
+        psWarning("Unable to determine FPA.OBS: check for FPA.OBS in FILE in camera format");
+    }
+
+    pmFPAview *view = addSource(fpa, fpaObs, NULL, phu, format, true); // View of PHU, to return
+    psFree(fpaObs);
 
     return view;
Index: trunk/psModules/src/camera/pmFPAConstruct.h
===================================================================
--- trunk/psModules/src/camera/pmFPAConstruct.h	(revision 17832)
+++ trunk/psModules/src/camera/pmFPAConstruct.h	(revision 17911)
@@ -4,6 +4,6 @@
  * @author Paul Price, IfA
  *
- * @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
- * @date $Date: 2008-03-11 01:27:05 $
+ * @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2008-06-05 01:31:33 $
  * Copyright 2005-2006 Institute for Astronomy, University of Hawaii
  */
@@ -21,5 +21,6 @@
 /// as the corresponding values (whitespace separated).  The FPA hierarchy is created devoid of any
 /// input/output sources (i.e., HDUs).
-pmFPA *pmFPAConstruct(const psMetadata *camera ///< The camera configuration
+pmFPA *pmFPAConstruct(const psMetadata *camera, ///< The camera configuration
+                      const char *cameraName ///< Name of the camera (for FPA.CAMERA concept)
                      );
 
@@ -28,5 +29,5 @@
 /// This is suitable for generating an output FPA given the desired format.
 bool pmFPAAddSourceFromFormat(pmFPA *fpa, ///< The FPA
-                              const char *fpaname, ///< FPA.NAME for the source
+                              const char *fpaObs, ///< FPA.NAME for the source
                               const psMetadata *format ///< Format of file
     );
@@ -37,5 +38,5 @@
 /// configuration is required in order to describe how the FPA is laid out in terms of disk files.
 bool pmFPAAddSourceFromView(pmFPA *fpa,   ///< The FPA
-                            const char *fpaname, ///< FPA.NAME for the source
+                            const char *fpaObs, ///< FPA.NAME for the source
                             const pmFPAview *phuView, ///< The view, corresponding to the PHU
                             const psMetadata *format ///< Format of file
Index: trunk/psModules/src/camera/pmFPAWrite.c
===================================================================
--- trunk/psModules/src/camera/pmFPAWrite.c	(revision 17832)
+++ trunk/psModules/src/camera/pmFPAWrite.c	(revision 17911)
@@ -37,5 +37,5 @@
 
 
-// Update the FPA.NAME, CHIP.NAME and CELL.NAME in the FITS header, if required
+// Update the FPA.OBS, CHIP.NAME and CELL.NAME in the FITS header, if required
 bool pmFPAUpdateNames(pmFPA *fpa, pmChip *chip, pmCell *cell)
 {
@@ -55,8 +55,9 @@
     }
     if (fpa) {
-        const char *fpaNameHdr = psMetadataLookupStr(&mdok, fileData, "FPA.NAME");
-        if (mdok && fpaNameHdr && strlen(fpaNameHdr) > 0) {
-            const char *fpaName = psMetadataLookupStr(NULL, fpa->concepts, "FPA.NAME");
-            psMetadataAddStr(hdu->header, PS_LIST_TAIL, fpaNameHdr, PS_META_REPLACE, "FPA name", fpaName);
+        const char *fpaObsHdr = psMetadataLookupStr(&mdok, fileData, "FPA.OBS");
+        if (mdok && fpaObsHdr && strlen(fpaObsHdr) > 0) {
+            const char *fpaObs = psMetadataLookupStr(NULL, fpa->concepts, "FPA.OBS");
+            psMetadataAddStr(hdu->header, PS_LIST_TAIL, fpaObsHdr, PS_META_REPLACE,
+                             "Observation identifier", fpaObs);
         }
     }
Index: trunk/psModules/src/camera/pmFPAfile.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfile.c	(revision 17832)
+++ trunk/psModules/src/camera/pmFPAfile.c	(revision 17911)
@@ -181,8 +181,8 @@
   newName = psStringCopy(rule);
 
-  if (strstr (newName, "{FPA.NAME}") != NULL) {
-    char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.NAME");
+  if (strstr (newName, "{FPA.OBS}") != NULL) {
+    char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.OBS");
     if (name != NULL) {
-      psStringSubstitute(&newName, "fpa", "{FPA.NAME}");
+      psStringSubstitute(&newName, "fpa", "{FPA.OBS}");
     }
   }
Index: trunk/psModules/src/camera/pmFPAfileDefine.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 17832)
+++ trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 17911)
@@ -237,5 +237,5 @@
         file->fpa = psMemIncrRefCounter(fpa);
     } else {
-        file->fpa = pmFPAConstruct(file->camera);
+        file->fpa = pmFPAConstruct(file->camera, file->cameraName);
     }
 
@@ -482,5 +482,5 @@
 
     // build the template fpa, set up the basic view
-    fpa = pmFPAConstruct(config->camera);
+    fpa = pmFPAConstruct(config->camera, config->cameraName);
     if (!fpa) {
         psError(PS_ERR_IO, false, "Failed to construct FPA from %s", realName);
@@ -783,5 +783,5 @@
 
     // build the template fpa, set up the basic view
-    fpa = pmFPAConstruct (config->camera);
+    fpa = pmFPAConstruct(config->camera, config->cameraName);
     if (!fpa) {
         psError(PS_ERR_IO, false, "Failed to construct FPA from %s", (char *)infiles->data[0]);
@@ -867,5 +867,5 @@
 
     // build the template fpa, set up the basic view
-    pmFPA *fpa = pmFPAConstruct (config->camera);
+    pmFPA *fpa = pmFPAConstruct(config->camera, config->cameraName);
     if (!fpa) {
         psError(PS_ERR_IO, false, "Failed to construct FPA for %s", filename);
@@ -949,5 +949,5 @@
     if (!file) {
         // build the template fpa, set up the basic view
-        fpa = pmFPAConstruct (config->camera);
+        fpa = pmFPAConstruct(config->camera, config->cameraName);
         if (!fpa) {
             psError(PS_ERR_IO, false, "Failed to construct FPA for %s", filename);
@@ -1090,5 +1090,5 @@
     PS_ASSERT_STRING_NON_EMPTY(filename, NULL);
 
-    pmFPA *fpa = pmFPAConstruct(src->camera);
+    pmFPA *fpa = pmFPAConstruct(src->camera, psMetadataLookupStr(NULL, src->concepts, "FPA.CAMERA"));
     // XXX should this use DefineOutputForFormat?
     pmFPAfile *file = pmFPAfileDefineOutput (config, fpa, filename);
@@ -1139,5 +1139,5 @@
         return NULL;
     }
-    file->fpa = pmFPAConstruct(file->camera);
+    file->fpa = pmFPAConstruct(file->camera, file->cameraName);
 
     return file;
Index: trunk/psModules/src/camera/pmFPAfileFitsIO.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileFitsIO.c	(revision 17832)
+++ trunk/psModules/src/camera/pmFPAfileFitsIO.c	(revision 17911)
@@ -67,13 +67,13 @@
     }
 
-    pmFPA *nameSource = file->src; // Source of FPA.NAME
+    pmFPA *nameSource = file->src; // Source of FPA.OBS
     if (!nameSource) {
         nameSource = file->fpa;
     }
     bool mdok;                  // Status of MD lookup
-    const char *fpaname = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.NAME"); // Name of FPA
-
-    pmFPA *copy = pmFPAConstruct(file->camera);  // FPA to return
-    if (!pmFPAAddSourceFromView(copy, fpaname, phuView, file->format)) {
+    const char *fpaObs = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.OBS"); // Observation id
+
+    pmFPA *copy = pmFPAConstruct(file->camera, file->cameraName);  // FPA to return
+    if (!pmFPAAddSourceFromView(copy, fpaObs, phuView, file->format)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to insert HDU into FPA for writing.\n");
         psFree(copy);
Index: trunk/psModules/src/camera/pmFPAfileIO.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileIO.c	(revision 17832)
+++ trunk/psModules/src/camera/pmFPAfileIO.c	(revision 17911)
@@ -263,13 +263,14 @@
             }
 
-            pmFPA *nameSource = file->src; // Source of FPA.NAME
+            pmFPA *nameSource = file->src; // Source of FPA.OBS
             if (!nameSource) {
                 nameSource = file->fpa;
             }
             bool mdok;                  // Status of MD lookup
-            const char *fpaname = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.NAME"); // Name of FPA
-
-            pmFPAAddSourceFromView(file->fpa, fpaname, view, format);
-            psTrace ("psModules.camera", 5, "created fpa data elements for %s (%s) (%d:%d:%d)\n", file->name, file->name, view->chip, view->cell, view->readout);
+            const char *fpaObs = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.OBS"); // Obs. id
+
+            pmFPAAddSourceFromView(file->fpa, fpaObs, view, format);
+            psTrace ("psModules.camera", 5, "created fpa data elements for %s (%s) (%d:%d:%d)\n",
+                     file->name, file->name, view->chip, view->cell, view->readout);
             break;
     }
@@ -349,5 +350,5 @@
     // (existing) fpa
     if (file->type == PM_FPA_FILE_CMF) {
-	if (!pmFPAviewCheckDataStatusForSources (view, file)) {
+        if (!pmFPAviewCheckDataStatusForSources (view, file)) {
         psTrace("psModules.camera", 6, "skip write for %s, no data for this entry", file->name);
         return true;
@@ -778,36 +779,36 @@
         file->fits->options = psMemIncrRefCounter(file->options);
 
-	// in most cases, we have already open and read the phu and determined the format.
-	// in some cases, (eg DetDB images), we have only just determined the filename.
-	// we need to check the file format before we can work with the file
-	if (!file->format) {
-	  psMetadata *phu = psFitsReadHeader (NULL, file->fits);
-	  if (!phu) {
-	    psError(PS_ERR_IO, false, "Failed to read file header %s\n", file->filename);
-	    return false;
-	  }
-
-	  // determine the current format from the header
-	  // determine camera if not specified already
-	  file->format = pmConfigCameraFormatFromHeader (config, phu, true);
-	  if (!file->format) {
-	    psError(PS_ERR_IO, false, "Failed to read CCD format from %s\n", file->filename);
-	    psFree(phu);
-	    return false;
-	  }
-	  psFree(phu);
-	}
-
-	// if needed, set the optional EXTWORD field based on the camera value
-	psMetadata *fileMenu = psMetadataLookupMetadata (NULL, file->format, "FILE");
-	if (!fileMenu) {
-	  psError (PS_ERR_IO, true, "FILE METADATA missing from camera format %s\n",
-		   config->formatName);
-	  return false;
-	}
-	char *extword = psMetadataLookupStr (&status, fileMenu, "EXTWORD");
-	if (status) {
-	  psFitsSetExtnameWord (file->fits, extword);
-	}
+        // in most cases, we have already open and read the phu and determined the format.
+        // in some cases, (eg DetDB images), we have only just determined the filename.
+        // we need to check the file format before we can work with the file
+        if (!file->format) {
+          psMetadata *phu = psFitsReadHeader (NULL, file->fits);
+          if (!phu) {
+            psError(PS_ERR_IO, false, "Failed to read file header %s\n", file->filename);
+            return false;
+          }
+
+          // determine the current format from the header
+          // determine camera if not specified already
+          file->format = pmConfigCameraFormatFromHeader (config, phu, true);
+          if (!file->format) {
+            psError(PS_ERR_IO, false, "Failed to read CCD format from %s\n", file->filename);
+            psFree(phu);
+            return false;
+          }
+          psFree(phu);
+        }
+
+        // if needed, set the optional EXTWORD field based on the camera value
+        psMetadata *fileMenu = psMetadataLookupMetadata (NULL, file->format, "FILE");
+        if (!fileMenu) {
+          psError (PS_ERR_IO, true, "FILE METADATA missing from camera format %s\n",
+                   config->formatName);
+          return false;
+        }
+        char *extword = psMetadataLookupStr (&status, fileMenu, "EXTWORD");
+        if (status) {
+          psFitsSetExtnameWord (file->fits, extword);
+        }
 
         // XXX these are probably only needed for WRITE files
