Index: trunk/psModules/src/detrend/pmDark.c
===================================================================
--- trunk/psModules/src/detrend/pmDark.c	(revision 16824)
+++ trunk/psModules/src/detrend/pmDark.c	(revision 16841)
@@ -25,4 +25,6 @@
 static bool ordinateLookup(float *value, // Value of ordinate, to return
                            const char *name, // Name of ordinate (concept name)
+                           bool scale,  // Scale the value?
+                           float min, float max, // Minimum and maximum values for scaling
                            const pmReadout *ro // Readout of interest
                            )
@@ -60,4 +62,11 @@
         psWarning("Non-finite value (%f) of concept %s in readout", *value, name);
         return false;
+    }
+    if (scale) {
+        if (*value < min || *value > max) {
+            psWarning("Value of concept %s (%f) outside range (%f:%f)", name, *value, min, max);
+            return false;
+        }
+        *value = 2.0 * (*value - min) / (max - min) - 1.0;
     }
 
@@ -130,12 +139,9 @@
 
             float value = NAN;          // Value of ordinate
-            if (!ordinateLookup(&value, ord->name, ro)) {
+            if (!ordinateLookup(&value, ord->name, ord->scale, ord->min, ord->max, ro)) {
                 roMask->data.U8[j] = 0xff;
                 val->data.F32[i] = NAN;
                 numBadInputs++;
                 continue;
-            }
-            if (ord->scale) {
-                value = 2.0 * (value - ord->min) / (ord->max - ord->min) - 1.0;
             }
             val->data.F32[i] = value;
@@ -280,5 +286,4 @@
         return false;
     }
-    PS_ASSERT_ARRAYS_SIZE_EQUAL(dark->readouts, ordinates, false);
 
     int numOrdinates = ordinates->n;    // Number of ordinates
@@ -287,5 +292,5 @@
         pmDarkOrdinate *ord = ordinates->data[i]; // Ordinate of interest
         float value = NAN;              // Value for ordinate
-        if (!ordinateLookup(&value, ord->name, readout)) {
+        if (!ordinateLookup(&value, ord->name, ord->scale, ord->min, ord->max, readout)) {
             psError(PS_ERR_UNKNOWN, true, "Unable to find value for %s", ord->name);
             psFree(values);
@@ -317,5 +322,5 @@
             }
             float value = psPolynomialMDEval(poly, values); // Value of dark current
-            readout->image->data.F32[y][x] = value;
+            readout->image->data.F32[y][x] -= value;
             if (readout->mask && !isfinite(value)) {
                 readout->mask->data.PS_TYPE_MASK_DATA[y][x] = bad;
