Index: /trunk/archive/scripts/src/gpc1_raw.config
===================================================================
--- /trunk/archive/scripts/src/gpc1_raw.config	(revision 4394)
+++ /trunk/archive/scripts/src/gpc1_raw.config	(revision 4395)
@@ -3,7 +3,9 @@
 # How to identify this type
 RULE	METADATA
-	TELESCOP	STR	PS1
-	DETECTOR	STR	GPC1
+#	TELESCOP	STR	PS1
+#	DETECTOR	STR	GPC1
 	EXTEND		BOOL	T
+	NEXTEND		S32	64
+	NAMPS		S32	64
 END
 
Index: /trunk/archive/scripts/src/ipprc.config
===================================================================
--- /trunk/archive/scripts/src/ipprc.config	(revision 4394)
+++ /trunk/archive/scripts/src/ipprc.config	(revision 4395)
@@ -12,5 +12,6 @@
 	MEGACAM_SPLICE	STR	megacam_splice.config
 	GPC1_RAW	STR	gpc1_raw.config
-	PS1_COMCAM	STR	ps1_comcam.config
+	LRIS_BLUE	STR	lris_blue.config
+	LRIS_RED	STR	lris_red.config
 END
 
Index: /trunk/archive/scripts/src/lris_blue.config
===================================================================
--- /trunk/archive/scripts/src/lris_blue.config	(revision 4394)
+++ /trunk/archive/scripts/src/lris_blue.config	(revision 4395)
@@ -26,5 +26,5 @@
 	AMPPSIZE	STR	[1:1024,1:4096]
 	NAXIS1		S32	4620
-	NAXIS2		STR	4096
+	NAXIS2		S32	4096
 END
 
Index: /trunk/archive/scripts/src/lris_red.config
===================================================================
--- /trunk/archive/scripts/src/lris_red.config	(revision 4394)
+++ /trunk/archive/scripts/src/lris_red.config	(revision 4395)
@@ -18,5 +18,5 @@
 RULE	METADATA
 	TELESCOP	STR	Keck I
-	DETECTOR	STR	LRIS
+	INSTRUME	STR	LRIS
 	AMPLIST		STR	2,1,0,0
 	WINDOW		STR	0,0,0,2048,2048
Index: /trunk/archive/scripts/src/megacam_raw.config
===================================================================
--- /trunk/archive/scripts/src/megacam_raw.config	(revision 4394)
+++ /trunk/archive/scripts/src/megacam_raw.config	(revision 4395)
@@ -158,5 +158,5 @@
 		ccd28	S32	1
 		ccd29	S32	1
-		ccd20	S32	1
+		ccd30	S32	1
 		ccd31	S32	1
 		ccd32	S32	1
Index: /trunk/archive/scripts/src/megacam_splice.config
===================================================================
--- /trunk/archive/scripts/src/megacam_splice.config	(revision 4394)
+++ /trunk/archive/scripts/src/megacam_splice.config	(revision 4395)
@@ -1,9 +1,10 @@
-# The processed MecaCam data is stored in single files for each chip
+# The spliced MecaCam data is stored in single extensions for each chip
 
 # How to recognise this type
 RULE	METADATA
-	TELESCOP	STR	CFHT
+	TELESCOP	STR	CFHT 3.6m
 	DETECTOR	STR	MegaCam
-	EXTEND		BOOL	F
+	EXTEND		BOOL	T
+	NEXTEND		S32	36
 END
 
Index: /trunk/archive/scripts/src/pmCameraFromHeader.c
===================================================================
--- /trunk/archive/scripts/src/pmCameraFromHeader.c	(revision 4394)
+++ /trunk/archive/scripts/src/pmCameraFromHeader.c	(revision 4395)
@@ -5,7 +5,7 @@
 
 // Work out what camera we have, based on the FITS header and a set of rules specified in the IPP
-// configuration
-char *pmCameraFromHeader(const psMetadata *header, // The FITS header
-			 const psMetadata *ipprc // The IPP configuration
+// configuration; return the camera configuration
+psMetadata *pmCameraFromHeader(const psMetadata *header, // The FITS header
+			       const psMetadata *ipprc // The IPP configuration
     )
 {
@@ -17,5 +17,6 @@
     }
 
-    char *winner = NULL;		// The instrument whose rule first matches the supplied header
+    psMetadata *winner = NULL;		// The instrument configuration whose rule first matches the supplied
+					// header
 
     // Iterate over the instruments
@@ -31,5 +32,10 @@
 	} else if (instrumentItem->type == PS_META_STR) {
 	    psTrace(__func__, 5, "Reading instrument configuration for %s...\n", instrumentItem->name);
-	    instrument = psMetadataConfigParse(NULL, NULL, instrumentItem->data.V, true);
+	    int badLines = 0;		// Number of bad lines in reading instrument configuration
+	    instrument = psMetadataConfigParse(NULL, &badLines, instrumentItem->data.V, true);
+	    if (badLines > 0) {
+		psLogMsg(__func__, PS_LOG_WARN, "%d bad lines encountered while reading camera"
+			 "configuration %s\n", badLines, instrumentItem->name);
+	    }
 	}
 
@@ -58,7 +64,13 @@
 			switch (ruleItem->type) {
 			  case PS_META_STR:
-			    match = (strcmp(ruleItem->data.V, headerItem->data.V) == 0) ? true : false;
+			    psTrace(__func__, 8, "Matching %s: '%s' vs '%s'\n", ruleItem->name,
+				    ruleItem->data.V, headerItem->data.V);
+			    match = (strncmp(ruleItem->data.V, headerItem->data.V,
+					     strlen(ruleItem->data.V)) == 0) ? true : false;
 			    break;
 			  case PS_TYPE_S32:
+			  case PS_TYPE_BOOL:
+			    psTrace(__func__, 8, "Matching %s: %d vs %d\n", ruleItem->name,
+				    ruleItem->data.S32, headerItem->data.S32);
 			    if (ruleItem->data.S32 != headerItem->data.S32) {
 				match = false;
@@ -66,4 +78,6 @@
 			    break;
 			  case PS_TYPE_F32:
+			    psTrace(__func__, 8, "Matching %s: %f vs %f\n", ruleItem->name,
+				    ruleItem->data.F32, headerItem->data.F32);
 			    if (ruleItem->data.F32 != headerItem->data.F32) {
 				match = false;
@@ -71,4 +85,6 @@
 			    break;
 			  case PS_TYPE_F64:
+			    psTrace(__func__, 8, "Matching %s: %g vs %g\n", ruleItem->name,
+				    ruleItem->data.F64, headerItem->data.F64);
 			    if (ruleItem->data.F64 != headerItem->data.F64) {
 				match = false;
@@ -85,5 +101,7 @@
 		    if (! winner) {
 			// This is the first match
-			winner = instrumentItem->name;
+			winner = instrument;
+			psLogMsg(__func__, PS_LOG_INFO, "FITS header matches instrument %s\n",
+				 instrumentItem->name);
 		    } else {
 			// We have a duplicate match
@@ -100,4 +118,8 @@
     psFree(iterator);
 
+    if (! winner) {
+	psError(PS_ERR_IO, true, "Unable to find an instrument that matches input FITS header!\n");
+    }
+
     return winner;
 }
Index: /trunk/archive/scripts/src/pmCameraFromHeader.h
===================================================================
--- /trunk/archive/scripts/src/pmCameraFromHeader.h	(revision 4394)
+++ /trunk/archive/scripts/src/pmCameraFromHeader.h	(revision 4395)
@@ -3,7 +3,7 @@
 
 // Work out what camera we have, based on the FITS header and a set of rules specified in the IPP
-// configuration
-char *pmCameraFromHeader(const psMetadata *header, // The FITS header
-			 const psMetadata *ipprc // The IPP configuration
+// configuration; return the camera configuration
+psMetadata *pmCameraFromHeader(const psMetadata *header, // The FITS header
+			       const psMetadata *ipprc // The IPP configuration
     );
 
Index: /trunk/archive/scripts/src/test_pmFPARead.c
===================================================================
--- /trunk/archive/scripts/src/test_pmFPARead.c	(revision 4394)
+++ /trunk/archive/scripts/src/test_pmFPARead.c	(revision 4395)
@@ -25,25 +25,32 @@
 #endif
 
-    (void)psTraceSetLevel(".", 10);
+    (void)psTraceSetLevel(".", 0);
     (void)psTraceSetLevel("readMultipleRegions", 0);
     (void)psTraceSetLevel("portions", 0);
     (void)psTraceSetLevel("pmFPARead", 10);
     (void)psTraceSetLevel("pmFPAfromHeader", 10);
+    (void)psTraceSetLevel("pmCameraFromHeader", 10);
+
+
 
     if (argc != 3) {
-	printf("Usage: %s CONFIG IMAGE\n", argv[0]);
+	printf("Usage: %s IPP_CONFIG IMAGE\n", argv[0]);
 	exit(EXIT_FAILURE);
     }
-    const char *cameraName = argv[1];
+    const char *ipprcName = argv[1];
     const char *imageName = argv[2];
 
     int badLines = 0;			// Number of bad lines in camera configuration
-    psMetadata *camera = psMetadataConfigParse(NULL, &badLines, cameraName, true); // Read camera config file
+    psMetadata *ipprc = psMetadataConfigParse(NULL, &badLines, ipprcName, true); // Read IPP config file
     if (badLines > 0) {
-	psLogMsg(__func__, PS_LOG_WARN, "%d bad lines encountered while reading camera configuration %s\n",
-		 badLines, cameraName);
+	psLogMsg(__func__, PS_LOG_WARN, "%d bad lines encountered while reading IPP configuration %s\n",
+		 badLines, ipprcName);
     }
 
     psFits *fits = psFitsAlloc(imageName);
+    psMetadata *header = psFitsReadHeader(NULL, fits);
+
+    psMetadata *camera = pmCameraFromHeader(header, ipprc);
+
     papFPA *fpa = pmFPARead(fits, camera, NULL);
     (void)pmFPAPrint(fpa);
@@ -55,6 +62,4 @@
     printf("Test: %d %d\n", psCellGetValueS32(fpa, "ccd15", "left", "CELL.YPARITY"),
 	   psCellGetValueS32(fpa, "ccd15", "right", "CELL.YPARITY"));
-
-//    (void)pmFPAPrint(fpa);
 
     // Tidy up
