Index: trunk/ppImage/src/ppImageParseCamera.c
===================================================================
--- trunk/ppImage/src/ppImageParseCamera.c	(revision 13844)
+++ trunk/ppImage/src/ppImageParseCamera.c	(revision 13901)
@@ -24,6 +24,6 @@
     pmFPAfile *inputMask = pmFPAfileBindFromArgs(&status, input, config, "PPIMAGE.INPUT.MASK", "INPUT.MASK");
     if (!status) {
-	psError (PS_ERR_UNKNOWN, false, "failed to load find definition");
-	return NULL;
+        psError (PS_ERR_UNKNOWN, false, "failed to load find definition");
+        return NULL;
     }
     if (inputMask && inputMask->type != PM_FPA_FILE_MASK) {
@@ -34,6 +34,6 @@
     pmFPAfile *inputWeight = pmFPAfileBindFromArgs(&status, input, config, "PPIMAGE.INPUT.WEIGHT", "INPUT.WEIGHT");
     if (!status) {
-	psError (PS_ERR_UNKNOWN, false, "failed to load find definition");
-	return NULL;
+        psError (PS_ERR_UNKNOWN, false, "failed to load find definition");
+        return NULL;
     }
     if (inputWeight && inputWeight->type != PM_FPA_FILE_WEIGHT) {
@@ -52,38 +52,38 @@
     // not all input or output images are used in a given recipe
     if (options->doBias) {
-	if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.BIAS", "BIAS", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_BIAS)) {
-	    psError (PS_ERR_IO, false, "Can't find a bias image source");
-	    psFree (options);
-	    return NULL;
-	}
+        if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.BIAS", "BIAS", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_BIAS)) {
+            psError (PS_ERR_IO, false, "Can't find a bias image source");
+            psFree (options);
+            return NULL;
+        }
     }
     if (options->doDark) {
-	if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.DARK", "DARK", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_DARK)) {
-	    psError (PS_ERR_IO, false, "Can't find a dark image source");
-	    psFree (options);
-	    return NULL;
-	}
+        if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.DARK", "DARK", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_DARK)) {
+            psError (PS_ERR_IO, false, "Can't find a dark image source");
+            psFree (options);
+            return NULL;
+        }
     }
     if (options->doMask) {
-	if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.MASK", "MASK", PM_FPA_FILE_MASK, PM_DETREND_TYPE_MASK)) {
-	    psError (PS_ERR_IO, false, "Can't find a mask image source");
-	    psFree (options);
-	    return NULL;
-	}
+        if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.MASK", "MASK", PM_FPA_FILE_MASK, PM_DETREND_TYPE_MASK)) {
+            psError (PS_ERR_IO, false, "Can't find a mask image source");
+            psFree (options);
+            return NULL;
+        }
     }
     if (options->doShutter) {
-	if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.SHUTTER", "SHUTTER", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_SHUTTER)) {
-	    psError (PS_ERR_IO, false, "Can't find a flat image source");
-	    psFree (options);
-	    return NULL;
-	}
+        if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.SHUTTER", "SHUTTER", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_SHUTTER)) {
+            psError (PS_ERR_IO, false, "Can't find a flat image source");
+            psFree (options);
+            return NULL;
+        }
     }
 
     if (options->doFlat) {
-	if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.FLAT", "FLAT", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_FLAT)) {
-	    psError (PS_ERR_IO, false, "Can't find a shutter image source");
-	    psFree (options);
-	    return NULL;
-	}
+        if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.FLAT", "FLAT", PM_FPA_FILE_IMAGE, PM_DETREND_TYPE_FLAT)) {
+            psError (PS_ERR_IO, false, "Can't find a shutter image source");
+            psFree (options);
+            return NULL;
+        }
     }
 
@@ -136,8 +136,8 @@
 skip_fringe:
     if (options->doFringe) {
-	if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.FRINGE", "FRINGE", PM_FPA_FILE_FRINGE, PM_DETREND_TYPE_FRINGE)) {
-	    psError (PS_ERR_IO, false, "Can't find a fringe image source");
-	    return NULL;
-	}
+        if (!ppImageDefineFile (config, input->fpa, "PPIMAGE.FRINGE", "FRINGE", PM_FPA_FILE_FRINGE, PM_DETREND_TYPE_FRINGE)) {
+            psError (PS_ERR_IO, false, "Can't find a fringe image source");
+            return NULL;
+        }
     }
 
@@ -178,15 +178,38 @@
 
     // XXX should these be bound explicitly to the output->fpa rather than the input->fpa?
-    pmFPAfile *byChip = pmFPAfileDefineChipMosaic(config, input->fpa, "PPIMAGE.OUTPUT.CHIP");
-    if (!byChip) {
-        psError(PS_ERR_IO, false, _("Unable to generate new file from PPIMAGE.OUTPUT.CHIP"));
-        psFree(options);
-        return NULL;
-    }
-    if (byChip->type != PM_FPA_FILE_IMAGE) {
-        psError(PS_ERR_IO, true, "PPIMAGE.OUTPUT.CHIP is not of type IMAGE");
-        psFree(options);
-        return NULL;
-    }
+    pmFPAfile *chipImage = pmFPAfileDefineChipMosaic(config, input->fpa, "PPIMAGE.CHIP");
+    if (!chipImage) {
+        psError(PS_ERR_IO, false, _("Unable to generate new file from PPIMAGE.CHIP"));
+        psFree(options);
+        return NULL;
+    }
+    if (chipImage->type != PM_FPA_FILE_IMAGE) {
+        psError(PS_ERR_IO, true, "PPIMAGE.CHIP is not of type IMAGE");
+        psFree(options);
+        return NULL;
+    }
+    pmFPAfile *chipMask = pmFPAfileDefineOutput(config, chipImage->fpa, "PPIMAGE.CHIP.MASK");
+    if (!chipMask) {
+        psError(PS_ERR_IO, false, _("Unable to generate output file from PPIMAGE.CHIP.MASK"));
+        psFree(options);
+        return NULL;
+    }
+    if (chipMask->type != PM_FPA_FILE_MASK) {
+        psError(PS_ERR_IO, true, "PPIMAGE.CHIP.MASK is not of type MASK");
+        psFree(options);
+        return NULL;
+    }
+    pmFPAfile *chipWeight = pmFPAfileDefineOutput(config, chipImage->fpa, "PPIMAGE.CHIP.WEIGHT");
+    if (!chipWeight) {
+        psError(PS_ERR_IO, false, _("Unable to generate output file from PPIMAGE.CHIP.WEIGHT"));
+        psFree(options);
+        return NULL;
+    }
+    if (chipWeight->type != PM_FPA_FILE_WEIGHT) {
+        psError(PS_ERR_IO, true, "PPIMAGE.CHIP.WEIGHT is not of type WEIGHT");
+        psFree(options);
+        return NULL;
+    }
+
     pmFPAfile *byFPA1 = pmFPAfileDefineFPAMosaic(config, input->fpa, "PPIMAGE.OUTPUT.FPA1");
     if (!byFPA1) {
@@ -215,5 +238,5 @@
     // we create a copy of the mosaicked image for psphot so we can write out a clean image
     if (options->doPhotom) {
-        pmFPAfile *psphotInput = pmFPAfileDefineFromFPA (config, byChip->fpa, 1, 1, "PSPHOT.INPUT");
+        pmFPAfile *psphotInput = pmFPAfileDefineFromFPA (config, chipImage->fpa, 1, 1, "PSPHOT.INPUT");
         PS_ASSERT (psphotInput, false);
 
@@ -251,10 +274,10 @@
 
     // save any of these files?
-    output->save = options->BaseFITS;
-    byChip->save = options->ChipFITS;
+    output->save = outMask->save = outWeight->save = options->BaseFITS;
+    chipImage->save = chipMask->save = chipWeight->save = options->ChipFITS;
     byFPA1->save = options->FPA1FITS;
     byFPA2->save = options->FPA2FITS;
 
-    // output is used as a carrier: input to byChip -> require the data to remain at the CHIP level
+    // output is used as a carrier: input to chipImage -> require the data to remain at the CHIP level
     output->freeLevel = PS_MIN (output->freeLevel, PM_FPA_LEVEL_CHIP);
     output->dataLevel = output->freeLevel;
@@ -267,9 +290,15 @@
     outWeight->dataLevel = output->dataLevel;
 
+    // Ditto for the chip-mosaicked version
+    chipMask->freeLevel   = chipImage->freeLevel;
+    chipWeight->freeLevel = chipImage->freeLevel;
+    chipMask->dataLevel   = chipImage->dataLevel;
+    chipWeight->dataLevel = chipImage->dataLevel;
+
     // the input data is the same as the output data : force the free levels to match
     input->freeLevel = PS_MIN (output->freeLevel, input->freeLevel);
 
     // define the binned target files (which may just be carriers for some camera configurations)
-    pmFPAfile *bin1 = pmFPAfileDefineFromFPA (config, byChip->fpa, options->xBin1, options->yBin1, "PPIMAGE.BIN1");
+    pmFPAfile *bin1 = pmFPAfileDefineFromFPA (config, chipImage->fpa, options->xBin1, options->yBin1, "PPIMAGE.BIN1");
     if (!bin1) {
         psError(PS_ERR_IO, false, _("Unable to generate new file from PPIMAGE.BIN1"));
@@ -283,5 +312,5 @@
     }
 
-    pmFPAfile *bin2 = pmFPAfileDefineFromFPA (config, byChip->fpa, options->xBin2, options->yBin2, "PPIMAGE.BIN2");
+    pmFPAfile *bin2 = pmFPAfileDefineFromFPA (config, chipImage->fpa, options->xBin2, options->yBin2, "PPIMAGE.BIN2");
     if (!bin2) {
         psError(PS_ERR_IO, false, _("Unable to generate new file from PPIMAGE.BIN2"));
@@ -354,4 +383,6 @@
         outMask->save = false;
         outWeight->save = false;
+        chipMask->save = false;
+        chipWeight->save = false;
     }
 
