Index: branches/eam_branches/20091201/ppViz/src/ppVizPattern/ppVizPatternCamera.c
===================================================================
--- branches/eam_branches/20091201/ppViz/src/ppVizPattern/ppVizPatternCamera.c	(revision 26842)
+++ branches/eam_branches/20091201/ppViz/src/ppVizPattern/ppVizPatternCamera.c	(revision 26847)
@@ -42,8 +42,16 @@
     pmFPAfile *output = pmFPAfileDefineOutput(data->config, input->fpa, "PPVIZPATTERN.OUTPUT");
     if (!output) {
-        psError(psErrorCodeLast(), false, "Unable to define output.");
+        psError(psErrorCodeLast(), false, "Unable to define file PPVIZPATTERN.OUTPUT");
         return false;
     }
     output->save = true;
+
+    pmFPAfile *outChip = pmFPAfileDefineChipMosaic(data->config, input->fpa, "PPVIZPATTERN.CHIP");
+    if (!outChip) {
+        psError(psErrorCodeLast(), false, "Unable to define file PPVIZPATTERN.CHIP");
+        return false;
+    }
+    outChip->save = true;
+
 
 #if 0
Index: branches/eam_branches/20091201/ppViz/src/ppVizPattern/ppVizPatternLoop.c
===================================================================
--- branches/eam_branches/20091201/ppViz/src/ppVizPattern/ppVizPatternLoop.c	(revision 26842)
+++ branches/eam_branches/20091201/ppViz/src/ppVizPattern/ppVizPatternLoop.c	(revision 26847)
@@ -15,5 +15,6 @@
 {
     pmConfig *config = data->config;                                        // Configuration data
-    pmFPAfile *input = pmFPAfileSelectSingle(config->files, "PPVIZPATTERN.INPUT", 0); // File with PSF
+    pmFPAfile *input = pmFPAfileSelectSingle(config->files, "PPVIZPATTERN.INPUT", 0); // Input file
+    pmFPAfile *output = pmFPAfileSelectSingle(config->files, "PPVIZPATTERN.CHIP", 0); // Output file
 
     pmFPAview *view = pmFPAviewAlloc(0); // Pointer into FPA hierarchy
@@ -48,5 +49,7 @@
                     return false;
                 }
-                if (!readout->data_exists) {
+                // Need to generate an image even if there's nothing in this readout, so chip-mosaicked image
+                // is filled in.
+                if (!readout->data_exists && !cell->data_exists && !chip->data_exists) {
                     continue;
                 }
@@ -100,4 +103,9 @@
                     return false;
                 }
+
+                // Blow away bias sections to prevent warnings
+                psMetadataItem *biassec = psMetadataLookup(cell->concepts, "CELL.BIASSEC"); // Bias section
+                psFree(biassec->data.list);
+                biassec->data.list = psListAlloc(NULL);
             }
             // Cell
@@ -107,4 +115,15 @@
             }
         }
+
+        pmChip *outChip = pmFPAfileThisChip(config->files, view, "PPVIZPATTERN.CHIP");
+        if (!outChip->hdu && !outChip->parent->hdu) {
+            const char *name = psMetadataLookupStr(NULL, chip->parent->concepts, "FPA.OBS"); // Name of FPA
+            pmFPAAddSourceFromView(outChip->parent, name, view, output->format);
+        }
+        if (!pmChipMosaic(outChip, chip, true, MASK_BAD)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to mosaic chip.");
+            return false;
+        }
+
         // Chip
         if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) {
