Index: trunk/psModules/src/imcombine/pmSubtractionMatch.c
===================================================================
--- trunk/psModules/src/imcombine/pmSubtractionMatch.c	(revision 17295)
+++ trunk/psModules/src/imcombine/pmSubtractionMatch.c	(revision 17297)
@@ -101,40 +101,13 @@
                         psMaskType maskBlank, float badFrac, pmSubtractionMode mode)
 {
-    PS_ASSERT_PTR_NON_NULL(conv1, false);
-    if (mode == PM_SUBTRACTION_MODE_DUAL) {
-        PS_ASSERT_PTR_NON_NULL(conv2, false);
-    }
-    PS_ASSERT_PTR_NON_NULL(ro1, false);
-    PS_ASSERT_IMAGE_NON_NULL(ro1->image, false);
-    PS_ASSERT_IMAGE_TYPE(ro1->image, PS_TYPE_F32, false);
-    if (ro1->mask) {
-        PS_ASSERT_IMAGE_NON_NULL(ro1->mask, false);
-        PS_ASSERT_IMAGE_TYPE(ro1->mask, PS_TYPE_MASK, false);
-        PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->mask, ro1->image, false);
-    }
-    if (ro1->weight) {
-        PS_ASSERT_IMAGE_NON_NULL(ro1->weight, false);
-        PS_ASSERT_IMAGE_TYPE(ro1->weight, PS_TYPE_F32, false);
-        PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->weight, ro1->image, false);
-    }
-    if (ro2) {
-        PS_ASSERT_IMAGE_NON_NULL(ro2->image, false);
-        PS_ASSERT_IMAGE_TYPE(ro2->image, PS_TYPE_F32, false);
-        PS_ASSERT_IMAGES_SIZE_EQUAL(ro2->image, ro1->image, false);
-        if (ro2->mask) {
-            PS_ASSERT_IMAGE_NON_NULL(ro2->mask, false);
-            PS_ASSERT_IMAGE_TYPE(ro2->mask, PS_TYPE_MASK, false);
-            PS_ASSERT_IMAGES_SIZE_EQUAL(ro2->mask, ro1->image, false);
-        }
-        if (ro2->weight) {
-            PS_ASSERT_IMAGE_NON_NULL(ro2->weight, false);
-            PS_ASSERT_IMAGE_TYPE(ro2->weight, PS_TYPE_F32, false);
-            PS_ASSERT_IMAGES_SIZE_EQUAL(ro2->weight, ro1->image, false);
-        }
-    } else if (!stampsName && !sources) {
-        psError(PS_ERR_UNEXPECTED_NULL, true,
-                "A list of sources is required for convolving to a target PSF.");
-        return false;
-    }
+    PM_ASSERT_READOUT_NON_NULL(conv1, false);
+    PM_ASSERT_READOUT_NON_NULL(conv2, false);
+
+    PM_ASSERT_READOUT_NON_NULL(ro1, false);
+    PM_ASSERT_READOUT_NON_NULL(ro2, false);
+    PM_ASSERT_READOUT_IMAGE(ro1, false);
+    PM_ASSERT_READOUT_IMAGE(ro2, false);
+    PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
+
     PS_ASSERT_INT_NONNEGATIVE(footprint, false);
     // regionSize can be just about anything (except maybe negative, but it can be NAN)
@@ -182,5 +155,5 @@
     }
 
-    // Reset the output readout, just in case
+    // Reset the output readouts, just in case
     if (conv1->image) {
         psFree(conv1->image);
@@ -195,19 +168,28 @@
         conv1->weight = NULL;
     }
+    if (conv2->image) {
+        psFree(conv2->image);
+        conv2->image = NULL;
+    }
+    if (conv2->mask) {
+        psFree(conv2->mask);
+        conv2->mask = NULL;
+    }
+    if (conv2->weight) {
+        psFree(conv2->weight);
+        conv2->weight = NULL;
+    }
 
     // Where does our weight map come from?
+    // Getting the weight exactly right is not necessary --- it's just used for weighting.
     psImage *weight = NULL;             // Weight image to use
-    if (ro1->weight && ro2 && ro2->weight) {
+    if (ro1->weight && ro2->weight) {
         weight = (psImage*)psBinaryOp(NULL, ro1->weight, "+", ro2->weight);
     } else if (ro1->weight) {
         weight = psMemIncrRefCounter(ro1->weight);
-    } else if (ro2) {
-        if (ro2->weight) {
-            weight = psMemIncrRefCounter(ro2->weight);
-        } else {
-            weight = (psImage*)psBinaryOp(NULL, ro1->image, "+", ro2->image);
-        }
+    } else if (ro2->weight) {
+        weight = psMemIncrRefCounter(ro2->weight);
     } else {
-        weight = psMemIncrRefCounter(ro1->image);
+        weight = (psImage*)psBinaryOp(NULL, ro1->image, "+", ro2->image);
     }
 
@@ -218,4 +200,5 @@
     pmSubtractionStampList *stamps = NULL; // Stamps for matching PSF
     pmSubtractionKernels *kernels = NULL; // Kernel basis functions
+
     int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Image dimensions
 
@@ -272,5 +255,5 @@
             }
 
-            if (mode == PM_SUBTRACTION_MODE_UNSURE || mode == PM_SUBTRACTION_MODE_TARGET) {
+            if (mode == PM_SUBTRACTION_MODE_UNSURE) {
                 // Get backgrounds
                 psStats *bgStats = psStatsAlloc(BG_STAT); // Statistics for background
@@ -303,9 +286,4 @@
                     break;
                   case PM_SUBTRACTION_MODE_2:
-                    if (mode == PM_SUBTRACTION_MODE_TARGET) {
-                        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
-                                "Input PSF is larger than target PSF --- can't match image.");
-                        goto MATCH_ERROR;
-                    }
                     psLogMsg("psModules.imcombine", PS_LOG_INFO, "Convolving image 2 to match image 1.");
                     break;
@@ -334,17 +312,5 @@
             // Add analysis metadata
             {
-                psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,
-                                 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);
-                if (conv2) {
-                    psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,
-                                     PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);
-                }
-                psMetadataAddS32(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
-                                 PS_META_DUPLICATE_OK, "Subtraction kernels", mode);
-                if (conv2) {
-                    psMetadataAddS32(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
-                                     PS_META_DUPLICATE_OK, "Subtraction kernels", mode);
-                }
-                psRegion *subRegion;
+                psRegion *subRegion;    // Region over which subtraction was performed
                 if (region) {
                     subRegion = psMemIncrRefCounter(region);
@@ -352,8 +318,19 @@
                     subRegion = psRegionAlloc(0, numCols, 0, numRows);
                 }
-                psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,
-                                  PS_DATA_REGION | PS_META_DUPLICATE_OK,
-                                 "Region over which subtraction was performed", subRegion);
-                if (conv2) {
+
+                if (mode == PM_SUBTRACTION_MODE_1 || mode == PM_SUBTRACTION_MODE_DUAL) {
+                    psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,
+                                     PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);
+                    psMetadataAddS32(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
+                                     PS_META_DUPLICATE_OK, "Subtraction kernels", mode);
+                    psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,
+                                     PS_DATA_REGION | PS_META_DUPLICATE_OK,
+                                     "Region over which subtraction was performed", subRegion);
+                }
+                if (mode == PM_SUBTRACTION_MODE_2 || mode == PM_SUBTRACTION_MODE_DUAL) {
+                    psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,
+                                     PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);
+                    psMetadataAddS32(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,
+                                     PS_META_DUPLICATE_OK, "Subtraction kernels", mode);
                     psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,
                                      PS_DATA_REGION | PS_META_DUPLICATE_OK,
