Index: /trunk/psLib/src/dataManip/psStats.c
===================================================================
--- /trunk/psLib/src/dataManip/psStats.c	(revision 659)
+++ /trunk/psLib/src/dataManip/psStats.c	(revision 660)
@@ -174,11 +174,15 @@
     int i = 0;
     float mean = 0.0;
+    int count = 0;
 
     if (maskVector != NULL) {
         for (i=0;i<myVector->n;i++) {
             if (!(maskVal & maskVector->vec.i[i])) {
-                mean+= maskVector->vec.i[i];
-            }
-        }
+                mean+= myVector->vec.f[i];
+                count++;
+            }
+        }
+        mean/= (float) count;
+        return(mean);
     } else {
         for (i=0;i<myVector->n;i++) {
@@ -348,72 +352,94 @@
     }
 
-    switch (stats->options) {
-    case PS_STAT_SAMPLE_MEAN:
-        newStruct->sampleMean = p_psArraySampleMean(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_MEDIAN:
+    if (stats->options & PS_STAT_SAMPLE_MEAN) {
+        newStruct->sampleMean = p_psArraySampleMean(myVector,
+                                maskVector,
+                                maskVal);
+    }
+
+    if (stats->options & PS_STAT_MAX) {
+        newStruct->max = p_psArrayMax(myVector, maskVector, maskVal);
+    }
+
+    if (stats->options & PS_STAT_MIN) {
+        newStruct->min = p_psArrayMin(myVector, maskVector, maskVal);
+    }
+
+    if (stats->options & PS_STAT_NVALUES) {
+        newStruct->nValues = p_psArrayNValues(myVector, maskVector, maskVal);
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_MEDIAN) {
         newStruct->sampleMedian = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_STDEV:
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_STDEV) {
         newStruct->sampleStdev = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_UQ:
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_UQ) {
         newStruct->sampleUQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_LQ:
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_LQ) {
         newStruct->sampleLQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEAN:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEAN) {
         newStruct->robustMean = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEAN_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEAN_NVALUES) {
         newStruct->robustMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEDIAN:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEDIAN) {
         newStruct->robustMedian = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEDIAN_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEDIAN_NVALUES) {
         newStruct->robustMedianNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MODE:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MODE) {
         newStruct->robustMode = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MODE_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MODE_NVALUES) {
         newStruct->robustModeNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_STDEV:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_STDEV) {
         newStruct->robustStdev = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_UQ:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_UQ) {
         newStruct->robustUQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_LQ:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_LQ) {
         newStruct->robustLQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_MEAN:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_MEAN) {
         newStruct->clippedMean = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_MEAN_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_MEAN_NVALUES) {
         newStruct->clippedMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_MEAN_NSIGMA:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_MEAN_NSIGMA) {
         newStruct->clipSigma = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_STDEV:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_STDEV) {
         newStruct->clippedStdev = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_MAX:
-        newStruct->max = p_psArrayMax(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_MIN:
-        newStruct->min = p_psArrayMin(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_NVALUES:
-        newStruct->nValues = p_psArrayNValues(myVector, maskVector, maskVal);
-        break;
-    default:
-        psError(__func__, "Unknown options 0x%x.\n", stats->options);
-        break;
-    }
+    }
+
+
+    //    OLD CODE: Should we check for an unknown option?
+    //    default:
+    //        psError(__func__, "Unknown options 0x%x.\n", stats->options);
 
     return(newStruct);
Index: /trunk/psLib/src/math/psStats.c
===================================================================
--- /trunk/psLib/src/math/psStats.c	(revision 659)
+++ /trunk/psLib/src/math/psStats.c	(revision 660)
@@ -174,11 +174,15 @@
     int i = 0;
     float mean = 0.0;
+    int count = 0;
 
     if (maskVector != NULL) {
         for (i=0;i<myVector->n;i++) {
             if (!(maskVal & maskVector->vec.i[i])) {
-                mean+= maskVector->vec.i[i];
-            }
-        }
+                mean+= myVector->vec.f[i];
+                count++;
+            }
+        }
+        mean/= (float) count;
+        return(mean);
     } else {
         for (i=0;i<myVector->n;i++) {
@@ -348,72 +352,94 @@
     }
 
-    switch (stats->options) {
-    case PS_STAT_SAMPLE_MEAN:
-        newStruct->sampleMean = p_psArraySampleMean(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_MEDIAN:
+    if (stats->options & PS_STAT_SAMPLE_MEAN) {
+        newStruct->sampleMean = p_psArraySampleMean(myVector,
+                                maskVector,
+                                maskVal);
+    }
+
+    if (stats->options & PS_STAT_MAX) {
+        newStruct->max = p_psArrayMax(myVector, maskVector, maskVal);
+    }
+
+    if (stats->options & PS_STAT_MIN) {
+        newStruct->min = p_psArrayMin(myVector, maskVector, maskVal);
+    }
+
+    if (stats->options & PS_STAT_NVALUES) {
+        newStruct->nValues = p_psArrayNValues(myVector, maskVector, maskVal);
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_MEDIAN) {
         newStruct->sampleMedian = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_STDEV:
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_STDEV) {
         newStruct->sampleStdev = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_UQ:
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_UQ) {
         newStruct->sampleUQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_SAMPLE_LQ:
+    }
+
+    if (stats->options & PS_STAT_SAMPLE_LQ) {
         newStruct->sampleLQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEAN:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEAN) {
         newStruct->robustMean = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEAN_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEAN_NVALUES) {
         newStruct->robustMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEDIAN:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEDIAN) {
         newStruct->robustMedian = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MEDIAN_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MEDIAN_NVALUES) {
         newStruct->robustMedianNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MODE:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MODE) {
         newStruct->robustMode = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_MODE_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_MODE_NVALUES) {
         newStruct->robustModeNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_STDEV:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_STDEV) {
         newStruct->robustStdev = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_UQ:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_UQ) {
         newStruct->robustUQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_ROBUST_LQ:
+    }
+
+    if (stats->options & PS_STAT_ROBUST_LQ) {
         newStruct->robustLQ = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_MEAN:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_MEAN) {
         newStruct->clippedMean = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_MEAN_NVALUES:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_MEAN_NVALUES) {
         newStruct->clippedMeanNvalues = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_MEAN_NSIGMA:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_MEAN_NSIGMA) {
         newStruct->clipSigma = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_CLIPPED_STDEV:
+    }
+
+    if (stats->options & PS_STAT_CLIPPED_STDEV) {
         newStruct->clippedStdev = p_psArrayXXX(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_MAX:
-        newStruct->max = p_psArrayMax(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_MIN:
-        newStruct->min = p_psArrayMin(myVector, maskVector, maskVal);
-        break;
-    case PS_STAT_NVALUES:
-        newStruct->nValues = p_psArrayNValues(myVector, maskVector, maskVal);
-        break;
-    default:
-        psError(__func__, "Unknown options 0x%x.\n", stats->options);
-        break;
-    }
+    }
+
+
+    //    OLD CODE: Should we check for an unknown option?
+    //    default:
+    //        psError(__func__, "Unknown options 0x%x.\n", stats->options);
 
     return(newStruct);
Index: /trunk/psLib/test/dataManip/tst_psStats00.c
===================================================================
--- /trunk/psLib/test/dataManip/tst_psStats00.c	(revision 659)
+++ /trunk/psLib/test/dataManip/tst_psStats00.c	(revision 660)
@@ -1,4 +1,5 @@
 /*****************************************************************************
-    This code tests whether a hash table be allocated successfully.
+    This routine must ensure that PS_STAT_SAMPLE_MEAN is correctly computed
+    by the procedure psArrayStats().
  *****************************************************************************/
 #include <stdio.h>
@@ -14,7 +15,11 @@
     int i               = 0;
     psType dummyFloatType;
+    psType dummyIntType;
     psVector *myVector  = NULL;
+    psVector *maskVector= NULL;
     float mean          = 0.0;
-    float realMean      = 0.0;
+    float realMean1     = 0.0;
+    float realMean2     = 0.0;
+    int count           = 0;
 
     printPositiveTestHeader(stdout,
@@ -25,23 +30,43 @@
     dummyFloatType.type = PS_TYPE_FLOAT;
     dummyFloatType.dimen = PS_DIMEN_VECTOR;
+    dummyIntType.type = PS_TYPE_INT;
+    dummyIntType.dimen = PS_DIMEN_VECTOR;
     myVector = psVectorAlloc(dummyFloatType, N);
     myVector->n = N;
+    maskVector = psVectorAlloc(dummyIntType, N);
+    maskVector->n = N;
 
     mean = 0.0;
-    realMean = 0.0;
+    realMean2 = 0.0;
     for (i=0;i<N;i++) {
         myVector->vec.f[i] = (float) i;
-        realMean+= myVector->vec.f[i];
+        if (i < (N/2)) {
+            maskVector->vec.i[i] = 0;
+            realMean2+= myVector->vec.f[i];
+            count++;
+        } else {
+            printf("Masking element %d\n", i);
+            maskVector->vec.i[i] = 1;
+        }
+        realMean1+= myVector->vec.f[i];
     }
-    realMean /= (float) N;
+    realMean1 /= (float) N;
+    realMean2 /= (float) count;
 
     myStats2 = psArrayStats(myVector, NULL, 0, myStats);
     mean = myStats2->sampleMean;
 
-    if (mean == realMean) {
+    printf("Called psArrayStats() on a vector with no elements masked.\n");
+    printf("The expected mean was %f; the calculated mean was %f\n", realMean1, mean);
+    if (mean == realMean1) {
         testStatus = true;
     } else {
         testStatus = false;
     }
+
+    myStats2 = psArrayStats(myVector, maskVector, 1, myStats);
+    mean = myStats2->sampleMean;
+    printf("Called psArrayStats() on a vector with last N/2 elements masked.\n");
+    printf("The expected mean was %f; the calculated mean was %f\n", realMean2, mean);
 
     printFooter(stdout,
