Index: trunk/psModules/src/detrend/pmDark.c
===================================================================
--- trunk/psModules/src/detrend/pmDark.c	(revision 19299)
+++ trunk/psModules/src/detrend/pmDark.c	(revision 19432)
@@ -222,20 +222,28 @@
 
     // these calls allocate and save the requested images on the output analysis metadata
-    psImage *counts = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_COUNT, numCols, numRows, PS_TYPE_U16, 0);
+    psImage *counts = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_COUNT,
+                                                numCols, numRows, PS_TYPE_U16, 0);
     if (!counts) {
         return false;
     }
-    psImage *sigma = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_SIGMA, numCols, numRows, PS_TYPE_F32, NAN);
+    psImage *sigma = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_SIGMA,
+                                               numCols, numRows, PS_TYPE_F32, NAN);
     if (!sigma) {
         return false;
     }
 
-    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_ORDINATES, PS_DATA_ARRAY | PS_META_REPLACE, "Dark ordinates", ordinates);
-    psMetadataAddStr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_NORM, PS_META_REPLACE, "Dark normalisation", normConcept);
-
-    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.VALUES",  PS_DATA_ARRAY  | PS_META_REPLACE, "Dark values", values);
-    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.RO.MASK", PS_DATA_VECTOR | PS_META_REPLACE, "Dark Readout Mask", roMask);
-    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.NORM",    PS_DATA_VECTOR | PS_META_REPLACE, "Dark norm", norm);
-    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.ORDERS",  PS_DATA_VECTOR | PS_META_REPLACE, "Dark orders", orders);
+    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_ORDINATES,
+                     PS_DATA_ARRAY | PS_META_REPLACE, "Dark ordinates", ordinates);
+    psMetadataAddStr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_NORM, PS_META_REPLACE,
+                     "Dark normalisation", normConcept);
+
+    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.VALUES",  PS_DATA_ARRAY  | PS_META_REPLACE,
+                     "Dark values", values);
+    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.RO.MASK", PS_DATA_VECTOR | PS_META_REPLACE,
+                     "Dark Readout Mask", roMask);
+    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.NORM",    PS_DATA_VECTOR | PS_META_REPLACE,
+                     "Dark norm", norm);
+    psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.ORDERS",  PS_DATA_VECTOR | PS_META_REPLACE,
+                     "Dark orders", orders);
 
     for (int i = 0; i < numTerms; i++) {
@@ -272,7 +280,10 @@
 
     // retrieve the required parameter vectors
-    psArray *values  = psMetadataLookupPtr(&mdok, output->analysis, "DARK.VALUES");  psAssert (values, "values not supplied");
-    psVector *roMask = psMetadataLookupPtr(&mdok, output->analysis, "DARK.RO.MASK"); psAssert (roMask, "roMask not supplied");
-    psVector *orders = psMetadataLookupPtr(&mdok, output->analysis, "DARK.ORDERS");  psAssert (orders, "orders not supplied");
+    psArray *values  = psMetadataLookupPtr(&mdok, output->analysis, "DARK.VALUES");
+    psAssert(values, "values not supplied");
+    psVector *roMask = psMetadataLookupPtr(&mdok, output->analysis, "DARK.RO.MASK");
+    psAssert(roMask, "roMask not supplied");
+    psVector *orders = psMetadataLookupPtr(&mdok, output->analysis, "DARK.ORDERS");
+    psAssert(orders, "orders not supplied");
 
     psPolynomialMD *poly = psPolynomialMDAlloc(orders); // Polynomial for fitting
@@ -307,10 +318,10 @@
         int yOut = i - outReadout->row0; // y position on output readout
 
-# ifdef SHOW_BUSY
+#ifdef SHOW_BUSY
         if (psTraceGetLevel("psModules.detrend") > 9) {
             printf("Processing row %d\r", i);
             fflush(stdout);
         }
-# endif
+#endif
 
         for (int j = minInputCols; j < maxInputCols; j++) {
@@ -337,18 +348,4 @@
             }
 
-            // XXX test
-            if (0 && (i == 377) && (j == 80)) {
-                FILE *f = fopen ("test.dat", "w");
-                for (int r = 0; r < inputs->n; r++) {
-                    fprintf (f, "%d %d  %d  ", i, j, mask->data.U8[r]);
-                    psVector *value = values->data[r];
-                    for (int tmpj = 0; tmpj < value->n; tmpj++) {
-                        fprintf (f, "%f ", value->data.F32[tmpj]);
-                    }
-                    fprintf (f, "%f\n", pixels->data.F32[r]);
-                }
-                fclose (f);
-            }
-
             if (!psPolynomialMDClipFit(poly, pixels, NULL, mask, maskVal, values, iter, rej)) {
                 psErrorClear();         // Nothing we can do about it
@@ -367,5 +364,4 @@
     psFree(mask);
 
-    fprintf (stderr, "done with combine %x : %f sec\n", (unsigned int) id, psTimerMark (name));
     return true;
 }
@@ -375,24 +371,26 @@
     PS_ASSERT_THREAD_JOB_NON_NULL(job, false);
 
-    pmReadout *readout   = job->args->data[0];
-    pmCell *dark         = job->args->data[1];
-    psPolynomialMD *poly = job->args->data[2];
-    psVector *values     = job->args->data[3];
-
-    psMaskType bad = PS_SCALAR_VALUE(job->args->data[4],U8);
-    bool doNorm    = PS_SCALAR_VALUE(job->args->data[5],U8);
-    float norm     = PS_SCALAR_VALUE(job->args->data[6],F32);
-    int rowStart   = PS_SCALAR_VALUE(job->args->data[7],S32);
-    int rowStop    = PS_SCALAR_VALUE(job->args->data[8],S32);
-    bool status = pmDarkApplyScan (readout, dark, poly, values, bad, doNorm, norm, rowStart, rowStop);
-    return status;
-}
-
-bool pmDarkApplyScan (pmReadout *readout, const pmCell *dark, psPolynomialMD *poly, psVector *values, psMaskType bad, bool doNorm, float norm, int rowStart, int rowStop) {
-
+    pmReadout *readout     = job->args->data[0]; // Readout to correct
+    pmCell *dark           = job->args->data[1]; // Dark to apply
+    const psVector *orders = job->args->data[2]; // Polynomial orders for each ordinate
+    const psVector *values = job->args->data[3]; // Values for each ordinate
+
+    psMaskType bad = PS_SCALAR_VALUE(job->args->data[4], U8); // Mask value to give bad pixels
+    bool doNorm    = PS_SCALAR_VALUE(job->args->data[5], U8); // Normalise values?
+    float norm     = PS_SCALAR_VALUE(job->args->data[6], F32); // Value by which to normalise
+    int rowStart   = PS_SCALAR_VALUE(job->args->data[7], S32); // Starting row for scan
+    int rowStop    = PS_SCALAR_VALUE(job->args->data[8], S32); // Stopping row for scan
+
+    return pmDarkApplyScan(readout, dark, orders, values, bad, doNorm, norm, rowStart, rowStop);
+}
+
+bool pmDarkApplyScan(pmReadout *readout, const pmCell *dark, const psVector *orders, const psVector *values,
+                     psMaskType bad, bool doNorm, float norm, int rowStart, int rowStop)
+{
     int numCols = readout->image->numCols;
     int numTerms = dark->readouts->n;   // Number of polynomial terms
 
-    // thread here by scan
+    psPolynomialMD *poly = psPolynomialMDAlloc(orders); // Polynomial to apply
+
     for (int y = rowStart; y < rowStop; y++) {
         for (int x = 0; x < numCols; x++) {
@@ -411,4 +409,6 @@
         }
     }
+    psFree(poly);
+
     return true;
 }
@@ -478,7 +478,4 @@
     }
 
-    psPolynomialMD *poly = psPolynomialMDAlloc(orders); // Polynomial to apply
-    psFree(orders);
-
     // thread here by scan
 
@@ -491,46 +488,44 @@
 
     for (int rowStart = 0; rowStart < readout->image->numRows; rowStart += scanRows) {
-      int rowStop = PS_MIN (rowStart + scanRows, readout->image->numRows);
-
-      if (threaded) {
-          // allocate a job, construct the arguments for this job
-          psThreadJob *job = psThreadJobAlloc ("PSMODULES_DETREND_DARK");
-          psArrayAdd (job->args, 1, readout);
-          psArrayAdd (job->args, 1, dark);
-          psArrayAdd (job->args, 1, poly);
-          psArrayAdd (job->args, 1, values);
-          PS_ARRAY_ADD_SCALAR (job->args, bad, PS_TYPE_MASK);
-          PS_ARRAY_ADD_SCALAR (job->args, doNorm, PS_TYPE_U8);
-          PS_ARRAY_ADD_SCALAR (job->args, norm, PS_TYPE_F32);
-          PS_ARRAY_ADD_SCALAR (job->args, rowStart, PS_TYPE_S32);
-          PS_ARRAY_ADD_SCALAR (job->args, rowStop, PS_TYPE_S32);
-
-          // ppImageDetrendReadout(config, options, view)
-          if (!psThreadJobAddPending (job)) {
-              psFree(job);
-              return false;
-          }
-          psFree(job);
-      } else {
-          pmDarkApplyScan (readout, dark, poly, values, bad, doNorm, norm, rowStart, rowStop);
-      }
+        int rowStop = PS_MIN(rowStart + scanRows, readout->image->numRows);
+
+        if (threaded) {
+            psThreadJob *job = psThreadJobAlloc("PSMODULES_DETREND_DARK");
+            psArrayAdd(job->args, 1, readout);
+            psArrayAdd(job->args, 1, dark);
+            psArrayAdd(job->args, 1, orders);
+            psArrayAdd(job->args, 1, values);
+            PS_ARRAY_ADD_SCALAR(job->args, bad, PS_TYPE_MASK);
+            PS_ARRAY_ADD_SCALAR(job->args, doNorm, PS_TYPE_U8);
+            PS_ARRAY_ADD_SCALAR(job->args, norm, PS_TYPE_F32);
+            PS_ARRAY_ADD_SCALAR(job->args, rowStart, PS_TYPE_S32);
+            PS_ARRAY_ADD_SCALAR(job->args, rowStop, PS_TYPE_S32);
+
+            if (!psThreadJobAddPending (job)) {
+                psFree(job);
+                psFree(orders);
+                psFree(values);
+                return false;
+            }
+            psFree(job);
+        } else if (!pmDarkApplyScan(readout, dark, orders, values, bad, doNorm, norm, rowStart, rowStop)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to apply dark.");
+            psFree(orders);
+            psFree(values);
+            return false;
+        }
     }
 
     if (threaded) {
         // wait here for the threaded jobs to finish
-        if (!psThreadPoolWait(false)) {
-            psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image.");
+        if (!psThreadPoolWait(true)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to apply dark.");
+            psFree(orders);
+            psFree(values);
             return false;
         }
-        fprintf (stderr, "success for threaded jobs\n");
-
-        // free the done jobs
-        psThreadJob *job = NULL;
-        while ((job = psThreadJobGetDone()) != NULL) {
-            psFree (job);
-        }
-    }
-
-    psFree(poly);
+    }
+
+    psFree(orders);
     psFree(values);
 
