Index: trunk/psModules/src/imcombine/pmSubtractionParams.c
===================================================================
--- trunk/psModules/src/imcombine/pmSubtractionParams.c	(revision 14738)
+++ trunk/psModules/src/imcombine/pmSubtractionParams.c	(revision 14801)
@@ -171,6 +171,7 @@
 
 pmSubtractionKernels *pmSubtractionKernelsOptimumISIS(pmSubtractionKernelsType type, int size, int inner,
-                                                     int spatialOrder, psVector *fwhms, int maxOrder,
-                                                     const psArray *stamps, int footprint, float tolerance)
+                                                      int spatialOrder, psVector *fwhms, int maxOrder,
+                                                      const pmSubtractionStampList *stamps, int footprint,
+                                                      float tolerance)
 {
     if (type != PM_SUBTRACTION_KERNEL_ISIS && type != PM_SUBTRACTION_KERNEL_GUNK) {
@@ -184,5 +185,5 @@
     PS_ASSERT_VECTOR_TYPE(fwhms, PS_TYPE_F32, NULL);
     PS_ASSERT_INT_NONNEGATIVE(maxOrder, NULL);
-    PS_ASSERT_ARRAY_NON_NULL(stamps, NULL);
+    PM_ASSERT_SUBTRACTION_STAMP_LIST_NON_NULL(stamps, NULL);
     PS_ASSERT_INT_NONNEGATIVE(footprint, NULL);
     PS_ASSERT_FLOAT_LARGER_THAN(tolerance, 0.0, NULL);
@@ -208,9 +209,12 @@
 
     // Need to save the stamp inputs --- we're changing the values!
-    int numStamps = stamps->n;          // Number of stamps
+    int numStamps = stamps->num;        // Number of stamps
     psArray *inputs = psArrayAlloc(numStamps); // Deep copies of the inputs
+    psVector *badStamps = psVectorAlloc(numStamps, PS_TYPE_U8); // Mark the bad stamps
+    psVectorInit(badStamps, 0);
     for (int i = 0; i < numStamps; i++) {
-        pmSubtractionStamp *stamp = stamps->data[i]; // Stamp of interest
-        if (stamp->status == PM_SUBTRACTION_STAMP_REJECTED || stamp->status == PM_SUBTRACTION_STAMP_NONE) {
+        pmSubtractionStamp *stamp = stamps->stamps->data[i]; // Stamp of interest
+        if (stamp->status != PM_SUBTRACTION_STAMP_CALCULATE && stamp->status != PM_SUBTRACTION_STAMP_USED) {
+            badStamps->data.U8[i] = 0xff;
             continue;
         }
@@ -230,6 +234,6 @@
     int numPixels = 0;                  // Number of pixels contributing to chi^2
     for (int i = 0; i < numStamps; i++) {
-        pmSubtractionStamp *stamp = stamps->data[i]; // Stamp of interest
-        if (stamp->status == PM_SUBTRACTION_STAMP_REJECTED || stamp->status == PM_SUBTRACTION_STAMP_NONE) {
+        pmSubtractionStamp *stamp = stamps->stamps->data[i]; // Stamp of interest
+        if (badStamps->data.U8[i]) {
             continue;
         }
@@ -238,4 +242,5 @@
             psFree(inputs);
             psFree(kernels);
+            psFree(badStamps);
             return NULL;
         }
@@ -255,4 +260,5 @@
             psFree(inputs);
             psFree(kernels);
+            psFree(badStamps);
             return NULL;
         }
@@ -287,9 +293,8 @@
 
             for (int j = 0; j < numStamps; j++) {
-                pmSubtractionStamp *stamp = stamps->data[j]; // Stamp of interest
-                if (stamp->status == PM_SUBTRACTION_STAMP_REJECTED ||
-                    stamp->status == PM_SUBTRACTION_STAMP_NONE) {
+                if (badStamps->data.U8[j]) {
                     continue;
                 }
+                pmSubtractionStamp *stamp = stamps->stamps->data[j]; // Stamp of interest
                 accumulateCross(&sumI, &sumII, &sumIC, stamp, inputs->data[j], i, footprint);
             }
@@ -301,9 +306,8 @@
             double chi2 = 0.0;          // Chi^2
             for (int j = 0; j < numStamps; j++) {
-                pmSubtractionStamp *stamp = stamps->data[j]; // Stamp of interest
-                if (stamp->status == PM_SUBTRACTION_STAMP_REJECTED ||
-                    stamp->status == PM_SUBTRACTION_STAMP_NONE) {
+                if (badStamps->data.U8[j]) {
                     continue;
                 }
+                pmSubtractionStamp *stamp = stamps->stamps->data[j]; // Stamp of interest
                 chi2 += accumulateChi2(inputs->data[j], stamp, i, coeff, bg, footprint);
             }
@@ -329,4 +333,5 @@
             psFree(ranking);
             psFree(kernels);
+            psFree(badStamps);
             return NULL;
         }
@@ -336,9 +341,8 @@
         // Remove its contribution, and don't include it in the future.
         for (int j = 0; j < numStamps; j++) {
-            pmSubtractionStamp *stamp = stamps->data[j]; // Stamp of interest
-            if (stamp->status == PM_SUBTRACTION_STAMP_REJECTED ||
-                stamp->status == PM_SUBTRACTION_STAMP_NONE) {
+            if (badStamps->data.U8[j]) {
                 continue;
             }
+            pmSubtractionStamp *stamp = stamps->stamps->data[j]; // Stamp of interest
             subtractConvolution(inputs->data[j], stamp, bestIndex, bestCoeff, bestBG, footprint);
         }
@@ -365,4 +369,5 @@
         psFree(ranking);
         psFree(kernels);
+        psFree(badStamps);
         return NULL;
     }
@@ -376,4 +381,7 @@
     psArray *convNew = psArrayAlloc(numStamps);
     for (int i = 0; i < numStamps; i++) {
+        if (badStamps->data.U8[i]) {
+            continue;
+        }
         convNew->data[i] = psArrayAlloc(newSize);
     }
@@ -388,6 +396,9 @@
 
             for (int j = 0; j < numStamps; j++) {
+                if (badStamps->data.U8[j]) {
+                    continue;
+                }
+                pmSubtractionStamp *stamp = stamps->stamps->data[j]; // Stamp of interest
                 psArray *convolutions = convNew->data[j]; // Convolutions for this stamp
-                pmSubtractionStamp *stamp = stamps->data[j]; // Stamp of interest
                 convolutions->data[rank] = psMemIncrRefCounter(stamp->convolutions->data[i]);
             }
@@ -405,9 +416,13 @@
 
     for (int i = 0; i < numStamps; i++) {
-        pmSubtractionStamp *stamp = stamps->data[i]; // Stamp of interest
+        if (badStamps->data.U8[i]) {
+            continue;
+        }
+        pmSubtractionStamp *stamp = stamps->stamps->data[i]; // Stamp of interest
         psFree(stamp->convolutions);
         stamp->convolutions = convNew->data[i];
     }
 
+    psFree(badStamps);
     psFree(ranking);
 
