Index: trunk/psModules/src/camera/pmFPAfileDefine.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 9950)
+++ trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 10421)
@@ -277,7 +277,23 @@
     }
 
+    psString realName = pmConfigConvertFilename (infiles->data[0], config);
+    if (!realName) {
+        psError(PS_ERR_IO, false, "Failed to convert file name %s\n", (char *) infiles->data[0]);
+        return NULL;
+    }
+
     // load the header of the first image
-    fits = psFitsOpen (infiles->data[0], "r");
+    fits = psFitsOpen (realName, "r");
+    if (!fits) {
+        psError(PS_ERR_IO, false, "Failed to open file %s\n", realName);
+        psFree (realName);
+        return NULL;
+    }
     phu = psFitsReadHeader (NULL, fits);
+    if (!phu) {
+        psError(PS_ERR_IO, false, "Failed to read file header %s\n", realName);
+        psFree (realName);
+        return NULL;
+    }
     psFitsClose (fits);
 
@@ -286,6 +302,7 @@
     format = pmConfigCameraFormatFromHeader (config, phu);
     if (!format) {
-        psError(PS_ERR_IO, false, "Failed to read CCD format from %s\n", (char *)infiles->data[0]);
+        psError(PS_ERR_IO, false, "Failed to read CCD format from %s\n", realName);
         psFree(phu);
+        psFree (realName);
         return NULL;
     }
@@ -294,7 +311,9 @@
     fpa = pmFPAConstruct (config->camera);
     if (!fpa) {
-        psError(PS_ERR_IO, false, "Failed to construct FPA from %s", (char *)infiles->data[0]);
-        return NULL;
-    }
+        psError(PS_ERR_IO, false, "Failed to construct FPA from %s", realName);
+        psFree (realName);
+        return NULL;
+    }
+    psFree (realName);
 
     // load the given filerule (from config->camera) and bind it to the fpa
@@ -337,7 +356,28 @@
     for (int i = 0; i < infiles->n; i++) {
         if (i > 0) {
-            fits = psFitsOpen (infiles->data[i], "r");
+            psString realName = pmConfigConvertFilename (infiles->data[i], config);
+            if (!realName) {
+                psError(PS_ERR_IO, false, "Failed to convert file name %s", (char *) infiles->data[i]);
+                return NULL;
+            }
+            fits = psFitsOpen (realName, "r");
+            if (!fits) {
+                psError(PS_ERR_IO, false, "Failed to open file %s\n", realName);
+                psFree (realName);
+                return NULL;
+            }
             phu = psFitsReadHeader (NULL, fits);
-            pmConfigValidateCameraFormat (format, phu);
+            if (!phu) {
+                psError(PS_ERR_IO, false, "Failed to read file header %s", realName);
+                psFree (realName);
+                psFitsClose (fits);
+                return NULL;
+            }
+            if (!pmConfigValidateCameraFormat (format, phu)) {
+                psError(PS_ERR_IO, false, "file %s is not from the required camera", realName);
+                psFree (realName);
+                psFitsClose (fits);
+                return NULL;
+            }
             psFitsClose (fits);
         }
@@ -545,7 +585,7 @@
 
     // Prepend the global path to the file rule
-    if (config->workdir) {
-        psStringPrepend(&file->filerule, "%s/", config->workdir);
-    }
+    psString tmpName = pmConfigConvertFilename (file->filerule, config);
+    psFree (file->filerule);
+    file->filerule = tmpName;
 
     if (found) {
