Index: trunk/psModules/src/camera/pmFPAfileDefine.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 12300)
+++ trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 12455)
@@ -68,7 +68,4 @@
 
     file->filerule = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "FILENAME.RULE"));
-    file->filextra = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "FILENAME.XTRA"));
-    file->extrule  = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "EXTNAME.RULE"));
-    file->extxtra  = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "EXTNAME.XTRA"));
 
     type = psMetadataLookupStr (&status, data, "FILE.TYPE");
@@ -155,7 +152,4 @@
 
     file->filerule = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "FILENAME.RULE"));
-    file->filextra = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "FILENAME.XTRA"));
-    file->extrule  = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "EXTNAME.RULE"));
-    file->extxtra  = psMemIncrRefCounter(psMetadataLookupStr (&status, data, "EXTNAME.XTRA"));
 
     const char *type = psMetadataLookupStr (&status, data, "FILE.TYPE");
@@ -338,22 +332,15 @@
     // adjust the rules to identify these files in the file->names data
     psFree (file->filerule);
-    psFree (file->filextra);
+    // XXX DROP ME: psFree (file->filesrc);
     file->filerule = psStringCopy ("@FILES");
-    file->filextra = psStringCopy ("{CHIP.NAME}.{CELL.NAME}");
-
-    // find the matching fileLevel
-    psMetadata *filemenu = psMetadataLookupPtr (&status, format, "FILE");
-    if (!filemenu) {
-        psError (PS_ERR_IO, true, "missing FILE in FORMAT");
-        return NULL;
-    }
-    char *levelName = psMetadataLookupStr (&status, filemenu, "PHU");
-    if (!levelName) {
-        psError (PS_ERR_IO, true, "missing PHU in FILE in FORMAT");
-        return NULL;
-    }
-    file->fileLevel = pmFPALevelFromName (levelName);
+    file->filesrc = psStringCopy ("{CHIP.NAME}.{CELL.NAME}");
+
+    file->fileLevel = pmFPAPHULevel(format);
     if (file->fileLevel == PM_FPA_LEVEL_NONE) {
-        psError (PS_ERR_IO, true, "unknown level");
+        psError(PS_ERR_IO, true, "Unable to determine file level for %s\n", file->name);
+        psFree(phu);
+        psFree(fpa);
+        psFree(format);
+        psFree(file);
         return NULL;
     }
@@ -411,5 +398,5 @@
 
         // associate the filename with the FPA element
-        char *name = pmFPAfileNameFromRule (file->filextra, file, view);
+        char *name = pmFPAfileNameFromRule (file->filesrc, file, view);
 
         // save the name association in the pmFPAfile structure
@@ -482,7 +469,7 @@
     // define the rule to identify these files in the file->names data
     psFree (file->filerule);
-    psFree (file->filextra);
+    psFree (file->filesrc);
     file->filerule = psStringCopy ("@FILES");
-    file->filextra = psStringCopy ("{CHIP.NAME}.{CELL.NAME}");
+    file->filesrc = psStringCopy ("{CHIP.NAME}.{CELL.NAME}");
 
     // examine the list of input files and validate their cameras
@@ -534,5 +521,5 @@
 
         // associate the filename with the FPA element
-        char *name = pmFPAfileNameFromRule (file->filextra, file, view);
+        char *name = pmFPAfileNameFromRule (file->filesrc, file, view);
 
         // save the name association in the pmFPAfile structure
@@ -602,4 +589,6 @@
     if (!fpa) {
         psError(PS_ERR_IO, false, "Failed to construct FPA from %s", (char *)infiles->data[0]);
+        psFree(phu);
+        psFree(format);
         return NULL;
     }
@@ -621,30 +610,14 @@
     // adjust the rules to identify these files in the file->names data
     psFree (file->filerule);
-    psFree (file->filextra);
+    psFree (file->filesrc);
     file->filerule = psStringCopy ("@FILES");
-    file->filextra = psStringCopy ("{CHIP.NAME}.{CELL.NAME}");
-
-    // find the matching fileLevel
-    psMetadata *filemenu = psMetadataLookupPtr (&status, format, "FILE");
-    if (!filemenu) {
-        psError (PS_ERR_IO, true, "missing FILE in FORMAT");
+    file->filesrc = psStringCopy ("{CHIP.NAME}.{CELL.NAME}");
+
+    file->fileLevel = pmFPAPHULevel(format);
+    if (file->fileLevel == PM_FPA_LEVEL_NONE) {
+        psError(PS_ERR_IO, true, "Unable to determine file level for %s\n", file->name);
         psFree(phu);
         psFree(fpa);
-        psFree(format);
-        return NULL;
-    }
-    char *levelName = psMetadataLookupStr (&status, filemenu, "PHU");
-    if (!levelName) {
-        psError (PS_ERR_IO, true, "missing PHU in FILE in FORMAT");
-        psFree(phu);
-        psFree(fpa);
-        psFree(format);
-        return NULL;
-    }
-    file->fileLevel = pmFPALevelFromName (levelName);
-    if (file->fileLevel == PM_FPA_LEVEL_NONE) {
-        psError (PS_ERR_IO, true, "unknown level");
-        psFree(phu);
-        psFree(fpa);
+        psFree(file);
         psFree(format);
         return NULL;
@@ -657,4 +630,5 @@
         psFree(phu);
         psFree(fpa);
+        psFree(file);
         psFree(format);
         return NULL;
@@ -662,13 +636,14 @@
 
     // associate the filename with the FPA element
-    char *name = pmFPAfileNameFromRule (file->filextra, file, view);
+    char *name = pmFPAfileNameFromRule (file->filesrc, file, view);
 
     // save the name association in the pmFPAfile structure
     psMetadataAddStr (file->names, PS_LIST_TAIL, name, 0, "", infiles->data[entry]);
 
-    psFree (view);
-    psFree (name);
-    psFree (phu);
-    psFree (fpa);
+    psFree(phu);
+    psFree(fpa);
+    psFree(view);
+    psFree(name);
+    psFree(format);
 
     if (found)
@@ -881,12 +856,4 @@
     }
     file->detrend = results;
-
-    // replace the existing value of filextra with the selected detID
-    psFree (file->filextra);
-    file->filextra  = psStringCopy (results->detID);
-
-    // set the fileLevel based on the detDB results
-    // XXX this is not supplied by the db.  use the config value for now.
-    // file->fileLevel = results->level;
 
     psFree (options);
