Index: trunk/psLib/src/math/psStats.c
===================================================================
--- trunk/psLib/src/math/psStats.c	(revision 28998)
+++ trunk/psLib/src/math/psStats.c	(revision 30075)
@@ -827,5 +827,5 @@
         // values; nearly bi-modal distribution).  if so, keep only points within 5? 10?
         // bins of that excess bin:
-        int nMaxBin = 0;
+        int nMaxBin = histogram->nums->data.F32[0];
         int iMaxBin = 0;
         for (long i = 1; i < histogram->nums->n; i++) {
@@ -843,6 +843,6 @@
                 if (mask->data.PS_TYPE_VECTOR_MASK_DATA[i] & maskVal) continue;
                 bool invalid = false;
-                invalid |= (myVector->data.F32[i] <= minKeep);
-                invalid |= (myVector->data.F32[i] >= maxKeep);
+                invalid |= (myVector->data.F32[i] < minKeep);
+                invalid |= (myVector->data.F32[i] > maxKeep);
                 invalid |= (!isfinite(myVector->data.F32[i]));
                 if (!invalid) continue;
@@ -852,5 +852,6 @@
 
             if (nInvalid) {
-              psTrace(TRACE, 6, "data is concentrated in a single bin, masking %d extreme outliers and retrying\n", nInvalid);
+              psTrace(TRACE, 6, "data is concentrated in a single bin (%d = %f - %f), masking %d extreme outliers and retrying\n", 
+		      iMaxBin, histogram->bounds->data.F32[iMaxBin], histogram->bounds->data.F32[iMaxBin+1], nInvalid);
               psFree(histogram);
               psFree(cumulative);
@@ -1108,6 +1109,16 @@
     // If the mean is NAN, then generate a warning and set the stdev to NAN.
     if (isnan(stats->robustMedian)) {
-        stats->fittedStdev = NAN;
-        stats->fittedStdev = NAN;
+	stats->fittedMean = NAN;
+	stats->fittedStdev = NAN;
+	stats->results |= PS_STAT_FITTED_MEAN;
+	stats->results |= PS_STAT_FITTED_STDEV;
+        return true;
+    }
+
+    if (stats->robustStdev <= FLT_EPSILON) {
+	stats->fittedMean = stats->robustMedian;
+	stats->fittedStdev = stats->robustStdev;
+	stats->results |= PS_STAT_FITTED_MEAN;
+	stats->results |= PS_STAT_FITTED_STDEV;
         return true;
     }
@@ -1289,7 +1300,16 @@
     // If the mean is NAN, then generate a warning and set the stdev to NAN.
     if (isnan(stats->robustMedian)) {
-        stats->fittedStdev = NAN;
-        stats->fittedStdev = NAN;
-        psTrace(TRACE, 4, "---- %s() end ----\n", __func__);
+	stats->fittedMean = NAN;
+	stats->fittedStdev = NAN;
+	stats->results |= PS_STAT_FITTED_MEAN_V2;
+	stats->results |= PS_STAT_FITTED_STDEV_V2;
+        return true;
+    }
+
+    if (stats->robustStdev <= FLT_EPSILON) {
+	stats->fittedMean = stats->robustMedian;
+	stats->fittedStdev = stats->robustStdev;
+	stats->results |= PS_STAT_FITTED_MEAN_V2;
+	stats->results |= PS_STAT_FITTED_STDEV_V2;
         return true;
     }
@@ -1486,7 +1506,16 @@
     // If the mean is NAN, then generate a warning and set the stdev to NAN.
     if (isnan(stats->robustMedian)) {
-        stats->fittedStdev = NAN;
-        stats->fittedStdev = NAN;
-        psTrace(TRACE, 4, "---- %s() end ----\n", __func__);
+	stats->fittedMean = NAN;
+	stats->fittedStdev = NAN;
+	stats->results |= PS_STAT_FITTED_MEAN_V3;
+	stats->results |= PS_STAT_FITTED_STDEV_V3;
+        return true;
+    }
+
+    if (stats->robustStdev <= FLT_EPSILON) {
+	stats->fittedMean = stats->robustMedian;
+	stats->fittedStdev = stats->robustStdev;
+	stats->results |= PS_STAT_FITTED_MEAN_V3;
+	stats->results |= PS_STAT_FITTED_STDEV_V3;
         return true;
     }
@@ -1782,5 +1811,19 @@
 
     // If the mean is NAN, then generate a warning and set the stdev to NAN.
-    if (isnan(stats->robustMedian)) goto escape;
+    if (isnan(stats->robustMedian)) {
+	stats->fittedMean = NAN;
+	stats->fittedStdev = NAN;
+	stats->results |= PS_STAT_FITTED_MEAN_V4;
+	stats->results |= PS_STAT_FITTED_STDEV_V4;
+        return true;
+    }
+
+    if (stats->robustStdev <= FLT_EPSILON) {
+	stats->fittedMean = stats->robustMedian;
+	stats->fittedStdev = stats->robustStdev;
+	stats->results |= PS_STAT_FITTED_MEAN_V4;
+	stats->results |= PS_STAT_FITTED_STDEV_V4;
+        return true;
+    }
 
     float guessStdev = stats->robustStdev;  // pass the guess sigma
