Index: trunk/ppMerge/src/ppMergeMask.c
===================================================================
--- trunk/ppMerge/src/ppMergeMask.c	(revision 18365)
+++ trunk/ppMerge/src/ppMergeMask.c	(revision 18558)
@@ -18,5 +18,5 @@
                       psRandom *rng,    // Random number generator
                       psMetadata *stats // Statistics output
-                      )
+    )
 {
     assert(config);
@@ -28,5 +28,4 @@
     psStatsOptions meanStat = psMetadataLookupS32(NULL, config->arguments, "MEAN"); // Statistic for mean
     psStatsOptions stdevStat = psMetadataLookupS32(NULL, config->arguments, "STDEV"); // Statistic for stdev
-    psMaskType maskVal = psMetadataLookupU8(NULL, config->arguments, "MASKVAL"); // Value to mask
     int sample = psMetadataLookupS32(NULL, config->arguments, "SAMPLE"); // Size of sample for statistics
     bool chipStats = psMetadataLookupBool(&mdok, config->arguments, "MASK.CHIPSTATS"); // Statistics on chip?
@@ -35,9 +34,22 @@
     pmMaskIdentifyMode maskMode = psMetadataLookupS32(NULL, config->arguments, "MASK.MODE"); // Mode for identifying bad pixels
     int maskGrow = psMetadataLookupS32(NULL, config->arguments, "MASK.GROW"); // Radius to grow mask
-    psMaskType maskGrowVal = psMetadataLookupU8(NULL, config->arguments, "MASK.GROWVAL"); // Value for grown mask
 
     bool smoothSuspect = psMetadataLookupBool(&mdok, config->arguments, "MASK.SMOOTH.SUSPECT"); // Radius to grow mask
     float smoothScale = psMetadataLookupF32(&mdok, config->arguments, "MASK.SMOOTH.SCALE"); // Radius to grow mask
 
+    psMaskType markVal;
+    psMaskType maskValRaw;
+    if (!pmConfigMaskSetBits (&maskValRaw, &markVal, config)) {
+	psError (PS_ERR_UNKNOWN, true, "Unable to define the mask bit values");
+	return false;
+    }
+
+    char *maskOutName = psMetadataLookupStr (&mdok, config->arguments, "MASK.SET.VALUE");
+    psMaskType maskValOut = pmConfigMaskGet (maskOutName, config);
+    if (!maskValOut) {
+	psError (PS_ERR_UNKNOWN, true, "Undefined output mask bit value");
+	return false;
+    }
+    
     psStats *statistics = psStatsAlloc(meanStat | stdevStat); // Statistics for background
 
@@ -137,9 +149,7 @@
                 int x = pixel % numCols;
                 int y = pixel / numCols;
-                if ((mask && (mask->data.PS_TYPE_MASK_DATA[y][x] & maskVal)) ||
-                    !isfinite(image->data.F32[y][x]) ||
-                    (outMask && (outMask->data.PS_TYPE_MASK_DATA[y][x] & maskVal))) {
-                    continue;
-                }
+                if (mask && (mask->data.PS_TYPE_MASK_DATA[y][x] & maskValRaw)) continue;
+		if (outMask && (outMask->data.PS_TYPE_MASK_DATA[y][x] & maskValOut)) continue;
+		if (!isfinite(image->data.F32[y][x])) continue;
 
                 values->data.F32[valueIndex++] = image->data.F32[y][x];
@@ -155,6 +165,10 @@
                 }
 
-                if (!pmMaskFlagSuspectPixels(outRO, readout, psStatsGetValue(statistics, meanStat),
-                                             psStatsGetValue(statistics, stdevStat), maskSuspect, maskVal)) {
+		float mean = psStatsGetValue(statistics, meanStat);
+		float stdev = psStatsGetValue(statistics, stdevStat);
+
+		// this function increments the count for each suspect pixel in each input plane
+		// maskValRaw is used to test for valid input pixels
+                if (!pmMaskFlagSuspectPixels(outRO, readout, mean, stdev, maskSuspect, maskValRaw)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to find suspect values in file %d", i);
                     psFree(inView);
@@ -189,8 +203,6 @@
 
                 pmHDU *hdu = pmHDUFromCell(inCell); // HDU for cell
-                if (!hdu || hdu->blankPHU) {
-                    // No data here
-                    continue;
-                }
+                if (!hdu || hdu->blankPHU) continue;
+
                 pmReadout *readout = inCell->readouts->data[0]; // Readout of interest
 
@@ -198,6 +210,8 @@
                 pmReadout *outRO = pmFPAfileThisReadout(config->files, inView, "PPMERGE.OUTPUT.MASK");
 
-                if (!pmMaskFlagSuspectPixels(outRO, readout, psStatsGetValue(statistics, meanStat),
-                                             psStatsGetValue(statistics, stdevStat), maskSuspect, maskVal)) {
+		float mean = psStatsGetValue(statistics, meanStat);
+		float stdev = psStatsGetValue(statistics, stdevStat);
+
+		if (!pmMaskFlagSuspectPixels(outRO, readout, mean, stdev, maskSuspect, maskValRaw)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to find suspect values in file %d", i);
                     goto MERGE_MASK_ERROR;
@@ -229,12 +243,9 @@
     while ((outCell = pmFPAviewNextCell(outView, outFPA, 1))) {
 
-	// skipp inactive cells
+	// skip inactive cells
 	if (!outCell->process) continue;
 
         pmHDU *hdu = pmHDUFromCell(outCell); // HDU for cell
-        if (!hdu || hdu->blankPHU) {
-            // No data here
-            continue;
-        }
+        if (!hdu || hdu->blankPHU) continue;
 
         psTrace("ppMerge", 1, "Getting bad pixels for chip %d cell %d", outView->chip, outView->cell);
@@ -250,5 +261,6 @@
 	}
 
-        if (!pmMaskIdentifyBadPixels(outRO, maskVal, maskBad, maskMode)) {
+	// set the bad pixels to the value 'maskVal'
+        if (!pmMaskIdentifyBadPixels(outRO, maskValOut, maskBad, maskMode)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to mask bad pixels");
             goto MERGE_MASK_ERROR;
@@ -274,6 +286,6 @@
         }
 
-        if (maskGrowVal > 0) {
-            psImage *grown = psImageGrowMask(NULL, outRO->mask, maskVal, maskGrow, maskGrowVal); // Grown mask
+        if (maskGrow > 0) {
+            psImage *grown = psImageGrowMask(NULL, outRO->mask, maskValOut, maskGrow, maskValOut); // Grown mask
             psFree(outRO->mask);
             outRO->mask = grown;
@@ -307,6 +319,5 @@
             outRO->image = psImageAlloc(outRO->mask->numCols, outRO->mask->numRows, PS_TYPE_F32);
             psImageInit(outRO->image, 1.0);
-            if (!ppStatsFPA(stats, outRO->parent->parent->parent, outView,
-                            maskVal | pmConfigMask("BLANK", config), config)) {
+            if (!ppStatsFPA(stats, outRO->parent->parent->parent, outView, maskValOut, config)) {
                 psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to generate stats for image.");
                 psFree(outRO);
@@ -337,8 +348,4 @@
 }
 
-
-
-
-
 bool ppMergeMask(pmConfig *config)
 {
@@ -381,4 +388,7 @@
         goto PPMERGE_MASK_ERROR;
     }
+
+    // XXX this function should use pmConfigMaskReadHeader () to get the named values defined
+    // for the input masks.
 
     psString outName = ppMergeOutputFile(config); // Name of output file
@@ -414,4 +424,7 @@
 		psListAdd(inChips, PS_LIST_TAIL, chip);
 	    }
+
+	    // XXX I need to call pmConfigMaskWriteHeader for the PHU somewhere, after it is created!
+
 	    if (!pmConceptsAverageChips(outChip, inChips, true)) {
 		psError(PS_ERR_UNKNOWN, false, "Unable to average Chip concepts.");
