Index: /branches/eam_branches/ipp-20100823/ppSub/src/ppSubMatchPSFs.c
===================================================================
--- /branches/eam_branches/ipp-20100823/ppSub/src/ppSubMatchPSFs.c	(revision 29322)
+++ /branches/eam_branches/ipp-20100823/ppSub/src/ppSubMatchPSFs.c	(revision 29323)
@@ -184,4 +184,15 @@
 }
 
+pmSubtractionMode subModeFromString (char *string) {
+
+    if (!strcasecmp(string, "AUTO")) return PM_SUBTRACTION_MODE_UNSURE;
+    if (!strcasecmp(string, "DUAL")) return PM_SUBTRACTION_MODE_DUAL;
+    if (!strcasecmp(string, "SINGLE1")) return PM_SUBTRACTION_MODE_1;
+    if (!strcasecmp(string, "SINGLE2")) return PM_SUBTRACTION_MODE_2;
+    if (!strcasecmp(string, "1")) return PM_SUBTRACTION_MODE_1;
+    if (!strcasecmp(string, "2")) return PM_SUBTRACTION_MODE_2;
+
+    return PM_SUBTRACTION_MODE_UNSURE;
+}
 
 bool ppSubMatchPSFs(ppSubData *data)
@@ -317,4 +328,16 @@
     psImageMaskType maskBad = pmConfigMaskGet("BLANK", config); // Bits to mask for bad pixels
 
+    // we have three things to control the convolution choice:
+
+    // 1) in the recipe, the keyword DUAL can be TRUE or FALSE.  if TRUE, DUAL is used. If not
+    // DUAL, then we are doing SINGLE convolution (but see CONVOLVE.TARGET below).
+
+    // 2) if the -convolve option is given on the command line, the specified input (1 or 2) is
+    // the one convolved.  Allowed values are 1 or 2.
+
+    // 3) if the -convolve option is NOT given, then the value of the recipe keyword
+    // CONVOLVE.TARGET is used.  this may have the value DUAL, AUTO, SINGLE1, SINGLE2, 1, 2.
+    // thus, DUAL convolution can be turned on with either DUAL = T or CONVOLVE.TARGET = DUAL
+
     bool dual = psMetadataLookupBool(&mdok, recipe, "DUAL"); // Dual convolution?
     pmSubtractionMode subMode;          // Subtraction mode
@@ -322,19 +345,21 @@
         subMode = PM_SUBTRACTION_MODE_DUAL;
     } else {
-        int convolve = psMetadataLookupS32(NULL, config->arguments, "-convolve"); // Image number to convolve
-        switch (convolve) {
-          case 0:
-            subMode = PM_SUBTRACTION_MODE_UNSURE;
-            break;
-          case 1:
-            subMode = PM_SUBTRACTION_MODE_1;
-            break;
-          case 2:
-            subMode = PM_SUBTRACTION_MODE_2;
-            break;
-          default:
-            psError(PPSUB_ERR_ARGUMENTS, false, "Invalid value for -convolve");
-            return false;
-        }
+	char *convolveName = psMetadataLookupStr(&mdok, recipe, "CONVOLVE.TARGET"); // recipe value for target
+        int convolve = psMetadataLookupS32(&mdok, config->arguments, "-convolve"); // override with command-line option
+	switch (convolve) {
+	  case 0:
+	    // convolve is 0 if it is not supplied on the command line
+	    subMode = subModeFromString(convolveName);
+	    break;
+	  case 1:
+	    subMode = PM_SUBTRACTION_MODE_1;
+	    break;
+	  case 2:
+	    subMode = PM_SUBTRACTION_MODE_2;
+	    break;
+	  default:
+	    psError(PPSUB_ERR_ARGUMENTS, false, "Invalid value for -convolve");
+	    return false;
+	}
     }
 
