Index: trunk/psphot/src/psphotStackParseCamera.c
===================================================================
--- trunk/psphot/src/psphotStackParseCamera.c	(revision 29548)
+++ trunk/psphot/src/psphotStackParseCamera.c	(revision 30624)
@@ -15,4 +15,6 @@
     }
 
+    int nRaw = 0;
+    int nCnv = 0;
     int nInputs = inputs->list->n;
     for (int i = 0; i < nInputs; i++) {
@@ -57,4 +59,5 @@
 		}
 	    }
+	    nRaw ++;
 	}
 
@@ -88,4 +91,5 @@
 		}
 	    }
+	    nCnv ++;
 	}
 
@@ -95,6 +99,13 @@
 	}
 
+	// XXX what if they do not match in length
+	if (nCnv && nRaw) {
+	    if (nCnv != nRaw) {
+		psError (PSPHOT_ERR_CONFIG, true, "if both RAW and CNV images are supplied, the number must match");
+		return false;
+	    }
+	}
+
 	psString sources = psMetadataLookupStr(&status, input, "SOURCES"); // Name of mask
-	// pmFPAfile *srcInputFile = rawInputFile ? rawInputFile : cnvInputFile;
 	if (sources && strlen(sources) > 0) {
 	    if (!defineFile(config, NULL, "PSPHOT.STACK.SOURCES", sources, PM_FPA_FILE_CMF)) {
@@ -107,4 +118,5 @@
 	// XXX output of these files should be optional
 	{
+	    // pmFPAfile *srcInputFile = rawInputFile ? rawInputFile : cnvInputFile;
 	    pmFPAfile *outputImage = pmFPAfileDefineOutput(config, NULL, "PSPHOT.STACK.OUTPUT.IMAGE");
 	    if (!outputImage) {
@@ -150,4 +162,7 @@
     }
     psMetadataRemoveKey(config->arguments, "FILENAMES");
+    psMetadataAddS32 (config->arguments, PS_LIST_TAIL, "PSPHOT.STACK.INPUT.RAW.NUM", PS_META_REPLACE, "number of inputs", nRaw);
+    psMetadataAddS32 (config->arguments, PS_LIST_TAIL, "PSPHOT.STACK.INPUT.CNV.NUM", PS_META_REPLACE, "number of inputs", nCnv);
+    psMetadataAddS32 (config->arguments, PS_LIST_TAIL, "PSPHOT.STACK.OUTPUT.IMAGE.NUM", PS_META_REPLACE, "number of inputs", nInputs);
     psMetadataAddS32 (config->arguments, PS_LIST_TAIL, "PSPHOT.INPUT.NUM", PS_META_REPLACE, "number of inputs", nInputs);
 
