Index: branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionMatch.c
===================================================================
--- branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionMatch.c	(revision 26332)
+++ branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionMatch.c	(revision 26339)
@@ -28,4 +28,10 @@
 static bool useFFT = true;              // Do convolutions using FFT
 
+# define SEPARATE 0
+# if (SEPARATE)
+# define SUBMODE PM_SUBTRACTION_EQUATION_NORM
+# else
+# define SUBMODE PM_SUBTRACTION_EQUATION_ALL
+# endif
 
 //#define TESTING
@@ -562,6 +568,5 @@
 		// XXX step 1: calculate normalization
                 psTrace("psModules.imcombine", 3, "Calculating equation for normalization...\n");
-                // if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_NORM)) {
-                if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_ALL)) {
+                if (!pmSubtractionCalculateEquation(stamps, kernels, SUBMODE)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
                     goto MATCH_ERROR;
@@ -569,6 +574,5 @@
 
                 psTrace("psModules.imcombine", 3, "Solving equation for normalization...\n");
-                // if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_NORM)) {
-                if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_ALL)) {
+                if (!pmSubtractionSolveEquation(kernels, stamps, SUBMODE)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
                     goto MATCH_ERROR;
@@ -576,5 +580,8 @@
                 memCheck("  solve equation");
 
-# if (0)
+# if (SEPARATE)
+		// set USED -> CALCULATE
+		pmSubtractionStampsResetStatus (stamps);
+
 		// XXX step 2: calculate kernel parameters
                 psTrace("psModules.imcombine", 3, "Calculating equation for kernels...\n");
@@ -592,5 +599,4 @@
                 memCheck("  solve equation");
 # endif
-
                 psVector *deviations = pmSubtractionCalculateDeviations(stamps, kernels); // Stamp deviations
                 if (!deviations) {
@@ -615,13 +621,37 @@
 	    // if we hit the max number of iterations and we have rejected stamps, re-solve
             if (numRejected > 0) {
-		// calculate kernel parameters
+		// XXX step 1: calculate normalization
+                psTrace("psModules.imcombine", 3, "Calculating equation for normalization...\n");
+                if (!pmSubtractionCalculateEquation(stamps, kernels, SUBMODE)) {
+                    psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
+                    goto MATCH_ERROR;
+                }
+
+		// solve normalization
                 psTrace("psModules.imcombine", 3, "Solving equation for kernels...\n");
-                // if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_KERNELS)) {
-                if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_ALL)) {
+                if (!pmSubtractionSolveEquation(kernels, stamps, SUBMODE)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
                     goto MATCH_ERROR;
                 }
+
+# if (SEPARATE)
+		// set USED -> CALCULATE
+		pmSubtractionStampsResetStatus (stamps);
+
+		// XXX step 2: calculate kernel parameters
+                psTrace("psModules.imcombine", 3, "Calculating equation for normalization...\n");
+                if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_KERNELS)) {
+                    psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
+                    goto MATCH_ERROR;
+                }
+
+		// solve kernel parameters
+                psTrace("psModules.imcombine", 3, "Solving equation for kernels...\n");
+                if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_KERNELS)) {
+                    psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
+                    goto MATCH_ERROR;
+                }
                 memCheck("  solve equation");
-
+# endif
                 psVector *deviations = pmSubtractionCalculateDeviations(stamps, kernels); // Stamp deviations
                 if (!deviations) {
@@ -929,6 +959,5 @@
 
     psTrace("psModules.imcombine", 3, "Calculating %s normalization equation...\n", description);
-    // if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_NORM)) {
-    if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_ALL)) {
+    if (!pmSubtractionCalculateEquation(stamps, kernels, SUBMODE)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
         return false;
@@ -936,11 +965,13 @@
 
     psTrace("psModules.imcombine", 3, "Solving %s normalization equation...\n", description);
-    // if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_NORM)) {
-    if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_ALL)) {
+    if (!pmSubtractionSolveEquation(kernels, stamps, SUBMODE)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
         return false;
     }
 
-# if (0)
+# if (SEPARATE)
+    // set USED -> CALCULATE
+    pmSubtractionStampsResetStatus (stamps);
+
     psTrace("psModules.imcombine", 3, "Calculating %s kernel coeffs equation...\n", description);
     if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_KERNELS)) {
@@ -954,5 +985,5 @@
         return false;
     }
-# endif
+# endif 
 
     psTrace("psModules.imcombine", 3, "Calculate %s deviations...\n", description);
@@ -974,6 +1005,11 @@
     if (numRejected > 0) {
         // Allow re-fit with reduced stamps set
+	psTrace("psModules.imcombine", 3, "Calculating %s normalization equation...\n", description);
+	if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_ALL)) {
+	    psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
+	    return false;
+	}
+
         psTrace("psModules.imcombine", 3, "Resolving %s equation...\n", description);
-        // if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_KERNELS)) {
         if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_ALL)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
@@ -981,4 +1017,22 @@
         }
         psTrace("psModules.imcombine", 3, "Recalculate %s deviations...\n", description);
+
+# if (SEPARATE)
+	// set USED -> CALCULATE
+	pmSubtractionStampsResetStatus (stamps);
+	
+	psTrace("psModules.imcombine", 3, "Calculating %s normalization equation...\n", description);
+	if (!pmSubtractionCalculateEquation(stamps, kernels, PM_SUBTRACTION_EQUATION_KERNELS)) {
+	    psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
+	    return false;
+	}
+
+        psTrace("psModules.imcombine", 3, "Resolving %s equation...\n", description);
+        if (!pmSubtractionSolveEquation(kernels, stamps, PM_SUBTRACTION_EQUATION_KERNELS)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation.");
+            return false;
+        }
+        psTrace("psModules.imcombine", 3, "Recalculate %s deviations...\n", description);
+# endif
 
         psVector *deviations = pmSubtractionCalculateDeviations(stamps, kernels); // Stamp deviations
