Index: trunk/ppStats/src/ppStatsReadout.c
===================================================================
--- trunk/ppStats/src/ppStatsReadout.c	(revision 19355)
+++ trunk/ppStats/src/ppStatsReadout.c	(revision 21183)
@@ -63,8 +63,7 @@
         int sampleSpace = 1.0 / data->sample; // Space between samples
         psVector *sampleValues = psVectorAlloc(numSamples, PS_TYPE_F32); // Vector of samples
-        psVector *sampleMask = psVectorAlloc(numSamples, PS_TYPE_MASK);  // Corresponding mask
-        if (!mask) {
-            psVectorInit(sampleMask, 0);
-        }
+        psVector *sampleMask = psVectorAlloc(numSamples, PS_TYPE_VECTOR_MASK);  // Corresponding mask
+	psVectorInit(sampleMask, 0);
+
         for (int i = 0; i < numSamples; i++) {
             int j = i * sampleSpace;
@@ -72,17 +71,25 @@
             int x = j % image->numCols;
             sampleValues->data.F32[i] = image->data.F32[y][x];
-            if ((!mask || !(mask->data.PS_TYPE_MASK_DATA[y][x] & data->maskVal)) &&
-                !isfinite(sampleValues->data.F32[i])) {
-                if (!warnNonFinite) {
-                    psWarning("Unmasked non-finite value detected at %d,%d; suppressing further warnings",
-                              x, y);
-                    warnNonFinite = true;
-                }
-                sampleMask->data.PS_TYPE_MASK_DATA[i] = data->maskVal;
-            } else if (mask) {
-                sampleMask->data.PS_TYPE_MASK_DATA[i] = mask->data.PS_TYPE_MASK_DATA[y][x];
-            }
-        }
-        if (!psVectorStats(data->stats, sampleValues, NULL, sampleMask, data->maskVal)) {
+
+	    // ignore the sampleMask if there is no input mask
+	    if (!mask) continue;
+
+	    // if this pixel is masked, set the sample mask
+            if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & data->maskVal) {
+		sampleMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = 1;
+		continue;
+	    }
+
+	    // mask any unmasked NAN/INF values
+            if (!isfinite(sampleValues->data.F32[i])) {
+		// warn for the first unmasked NAN/INF value
+		if (!warnNonFinite) {
+		    psWarning("Unmasked non-finite value detected at %d,%d; suppressing further warnings", x, y);
+		    warnNonFinite = true;
+		}
+                sampleMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = 1;
+            } 
+        }
+        if (!psVectorStats(data->stats, sampleValues, NULL, sampleMask, 1)) {
             psWarning("Unable to perform statistics on readout %s.\n", readoutName);
             psErrorClear();
@@ -179,5 +186,5 @@
                 for (int j = 0; j < readout->mask->numRows; j++) {
                     for (int i = 0; i < readout->mask->numCols; i++) {
-                        if (readout->mask->data.PS_TYPE_MASK_DATA[j][i] & data->maskVal) {
+                        if (readout->mask->data.PS_TYPE_IMAGE_MASK_DATA[j][i] & data->maskVal) {
                             numBad++;
                         }
