Index: /trunk/psModules/src/camera/pmFPAfileIO.c
===================================================================
--- /trunk/psModules/src/camera/pmFPAfileIO.c	(revision 7709)
+++ /trunk/psModules/src/camera/pmFPAfileIO.c	(revision 7710)
@@ -112,52 +112,70 @@
         // this is never true for the output images, which are constructed later
 
-        if (file->mode != PM_FPA_MODE_READ) {
-            break;
-        }
-
-        pmChip *chip;
-        pmCell *cell;
-        bool addSource = false;
-        switch (file->fileLevel) {
-        case PM_FPA_LEVEL_FPA:
-            addSource = !file->fpa->hdu;
-            break;
-        case PM_FPA_LEVEL_CHIP:
-            chip = pmFPAviewThisChip(view, file->fpa);
-            if (!chip) {
-                psError (PS_ERR_IO, true, "inconsistent file/fpa: fileLevel is CHIP, view is FPA");
-                return false;
-            }
-            addSource = !chip->hdu;
-            break;
-        case PM_FPA_LEVEL_CELL:
-            cell = pmFPAviewThisCell(view, file->fpa);
-            if (!cell) {
-                psError (PS_ERR_IO, true, "inconsistent file/fpa: fileLevel is CELL, view is FPA");
-                return false;
-            }
-            addSource = !cell->hdu;
-            break;
-        default:
-            psAbort ("pmFPAfileIO", "fileLevel not correctly set");
-            break;
-        }
-
-        if (addSource) {
-            psMetadata *phu = psFitsReadHeader (NULL, file->fits);
-            if (!file->format) {
-                file->format = pmConfigCameraFormatFromHeader (config, phu);
+        if (file->mode == PM_FPA_MODE_READ) {
+            pmChip *chip;
+            pmCell *cell;
+            bool addSource = false;
+            switch (file->fileLevel) {
+            case PM_FPA_LEVEL_FPA:
+                addSource = !file->fpa->hdu;
+                break;
+            case PM_FPA_LEVEL_CHIP:
+                chip = pmFPAviewThisChip(view, file->fpa);
+                if (!chip) {
+                    psError (PS_ERR_IO, true, "inconsistent file/fpa: fileLevel is CHIP, view is FPA");
+                    return false;
+                }
+                addSource = !chip->hdu;
+                break;
+            case PM_FPA_LEVEL_CELL:
+                cell = pmFPAviewThisCell(view, file->fpa);
+                if (!cell) {
+                    psError (PS_ERR_IO, true, "inconsistent file/fpa: fileLevel is CELL, view is FPA");
+                    return false;
+                }
+                addSource = !cell->hdu;
+                break;
+            default:
+                psAbort ("pmFPAfileIO", "fileLevel not correctly set");
+                break;
+            }
+
+            if (addSource) {
+                psMetadata *phu = psFitsReadHeader (NULL, file->fits);
                 if (!file->format) {
-                    psError(PS_ERR_IO, false, "Failed to read CCD format from %s\n", file->filename);
-                    psFree(phu);
-                    return NULL;
+                    file->format = pmConfigCameraFormatFromHeader (config, phu);
+                    if (!file->format) {
+                        psError(PS_ERR_IO, false, "Failed to read CCD format from %s\n", file->filename);
+                        psFree(phu);
+                        return NULL;
+                    }
+                } else {
+                    pmConfigValidateCameraFormat (file->format, phu);
                 }
-            } else {
-                pmConfigValidateCameraFormat (file->format, phu);
-            }
-            pmFPAview *thisView = pmFPAAddSourceFromHeader (file->fpa, phu, file->format);
-            psFree (thisView);
-            psFree (phu);
-            // XXX we can check the output view to be sure it corresponds to our current view
+                pmFPAview *thisView = pmFPAAddSourceFromHeader (file->fpa, phu, file->format);
+                psFree (thisView);
+                psFree (phu);
+                // XXX we can check the output view to be sure it corresponds to our current view
+            }
+        }
+        if (file->mode == PM_FPA_MODE_WRITE) {
+            pmChip *chip;
+            pmCell *cell;
+            switch (file->fileLevel) {
+            case PM_FPA_LEVEL_FPA:
+                pmFPAWrite (file->fpa, file->fits, NULL, false, false);
+                break;
+            case PM_FPA_LEVEL_CHIP:
+                chip = pmFPAviewThisChip(view, file->fpa);
+                pmChipWrite (chip, file->fits, NULL, false, false);
+                break;
+            case PM_FPA_LEVEL_CELL:
+                cell = pmFPAviewThisCell(view, file->fpa);
+                pmCellWrite (cell, file->fits, NULL, false, false);
+                break;
+            default:
+                psAbort ("pmFPAfileIO", "fileLevel not correctly set");
+                break;
+            }
         }
         break;
@@ -410,7 +428,7 @@
     case PM_FPA_FILE_IMAGE:
 
-        /* create a PHU for thie file, if it does not exist */
-        pmFPAfileCopyStructureView (file->fpa, file->src, file->format, file->xBin, file->yBin, view);
-        // psTrace ("pmFPAfile", 5, "created fpa data elements for %s (fpa: %p)\n", file->name, file->fpa);
+        // create FPA structure component based on view
+        pmFPAAddSourceFromView (file->fpa, view, file->format);
+        psTrace ("pmFPAfile", 5, "created fpa data elements for %s (fpa: %p)\n", file->name, file->fpa);
         break;
 
