Index: trunk/dbconfig/cam.md
===================================================================
--- trunk/dbconfig/cam.md	(revision 28088)
+++ trunk/dbconfig/cam.md	(revision 28089)
@@ -15,9 +15,14 @@
     magicked    S64         0
     software_ver    STR         16
-    maskfrac_npix F32       0.0
-    maskfrac_static F32	    0.0
-    maskfrac_dynamic F32    0.0
-    maskfrac_magic  F32     0.0
-    maskfrac_advisory F32   0.0
+    maskfrac_ref_npix S32       0
+    maskfrac_ref_static F32	    0.0
+    maskfrac_ref_dynamic F32    0.0
+    maskfrac_ref_magic  F32     0.0
+    maskfrac_ref_advisory F32   0.0
+    maskfrac_max_npix S32       0
+    maskfrac_max_static F32	    0.0
+    maskfrac_max_dynamic F32    0.0
+    maskfrac_max_magic  F32     0.0
+    maskfrac_max_advisory F32   0.0
     note        STR         255
 END
@@ -98,9 +103,14 @@
     fault          S16      0       # Key NOT NULL
     software_ver    STR         16
-    maskfrac_npix S32       0
-    maskfrac_static F32	    0.0
-    maskfrac_dynamic F32    0.0
-    maskfrac_magic  F32     0.0
-    maskfrac_advisory F32   0.0
+    maskfrac_ref_npix S32       0
+    maskfrac_ref_static F32	    0.0
+    maskfrac_ref_dynamic F32    0.0
+    maskfrac_ref_magic  F32     0.0
+    maskfrac_ref_advisory F32   0.0
+    maskfrac_max_npix S32       0
+    maskfrac_max_static F32	    0.0
+    maskfrac_max_dynamic F32    0.0
+    maskfrac_max_magic  F32     0.0
+    maskfrac_max_advisory F32   0.0
     quality        S16      0
 END
Index: trunk/dbconfig/changes.txt
===================================================================
--- trunk/dbconfig/changes.txt	(revision 28088)
+++ trunk/dbconfig/changes.txt	(revision 28089)
@@ -1684,2 +1684,26 @@
 ALTER TABLE warpRun CHANGE maskfrac_npix maskfrac_npix FLOAT; 
 ALTER TABLE diffRun CHANGE maskfrac_npix maskfrac_npix FLOAT;
+
+ALTER TABLE camRun CHANGE maskfrac_npix maskfrac_ref_npix FLOAT;
+ALTER TABLE camRun CHANGE maskfrac_static maskfrac_ref_static FLOAT;
+ALTER TABLE camRun CHANGE maskfrac_dynamic maskfrac_ref_dynamic FLOAT;
+ALTER TABLE camRun CHANGE maskfrac_magic maskfrac_ref_magic FLOAT;
+ALTER TABLE camRun CHANGE maskfrac_advisory maskfrac_ref_advisory FLOAT;
+
+ALTER TABLE camProcessedExp CHANGE maskfrac_npix maskfrac_ref_npix INT;
+ALTER TABLE camProcessedExp CHANGE maskfrac_static maskfrac_ref_static FLOAT;
+ALTER TABLE camProcessedExp CHANGE maskfrac_dynamic maskfrac_ref_dynamic FLOAT;
+ALTER TABLE camProcessedExp CHANGE maskfrac_magic maskfrac_ref_magic FLOAT;
+ALTER TABLE camProcessedExp CHANGE maskfrac_advisory maskfrac_ref_advisory FLOAT;
+
+ALTER TABLE camRun ADD COLUMN maskfrac_max_npix FLOAT after maskfrac_ref_advisory;
+ALTER TABLE camRun ADD COLUMN maskfrac_max_static FLOAT after maskfrac_max_npix;
+ALTER TABLE camRun ADD COLUMN maskfrac_max_dynamic FLOAT after maskfrac_max_static;
+ALTER TABLE camRun ADD COLUMN maskfrac_max_magic FLOAT after maskfrac_max_dynamic;
+ALTER TABLE camRun ADD COLUMN maskfrac_max_advisory FLOAT after maskfrac_max_magic;
+
+ALTER TABLE camProcessedExp ADD COLUMN maskfrac_max_npix INT after maskfrac_ref_advisory;
+ALTER TABLE camProcessedExp ADD COLUMN maskfrac_max_static FLOAT after maskfrac_max_npix;
+ALTER TABLE camProcessedExp ADD COLUMN maskfrac_max_dynamic FLOAT after maskfrac_max_static;
+ALTER TABLE camProcessedExp ADD COLUMN maskfrac_max_magic FLOAT after maskfrac_max_dynamic;
+ALTER TABLE camProcessedExp ADD COLUMN maskfrac_max_advisory FLOAT after maskfrac_max_magic;
Index: trunk/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- trunk/ippTools/share/pxadmin_create_tables.sql	(revision 28088)
+++ trunk/ippTools/share/pxadmin_create_tables.sql	(revision 28089)
@@ -400,9 +400,14 @@
     magicked BIGINT,
     software_ver VARCHAR(16),
-    maskfrac_npix FLOAT,
-    maskfrac_static FLOAT,
-    maskfrac_dynamic FLOAT,
-    maskfrac_magic FLOAT,
-    maskfrac_advisory FLOAT,
+    maskfrac_ref_npix FLOAT,
+    maskfrac_ref_static FLOAT,
+    maskfrac_ref_dynamic FLOAT,
+    maskfrac_ref_magic FLOAT,
+    maskfrac_ref_advisory FLOAT,
+    maskfrac_max_npix FLOAT,
+    maskfrac_max_static FLOAT,
+    maskfrac_max_dynamic FLOAT,
+    maskfrac_max_magic FLOAT,
+    maskfrac_max_advisory FLOAT,
     note VARCHAR(255),
     PRIMARY KEY(cam_id),
@@ -483,9 +488,14 @@
     fault SMALLINT NOT NULL,
     software_ver VARCHAR(16),
-    maskfrac_npix INT,
-    maskfrac_static FLOAT,
-    maskfrac_dynamic FLOAT,
-    maskfrac_magic FLOAT,
-    maskfrac_advisory FLOAT,
+    maskfrac_ref_npix INT,
+    maskfrac_ref_static FLOAT,
+    maskfrac_ref_dynamic FLOAT,
+    maskfrac_ref_magic FLOAT,
+    maskfrac_ref_advisory FLOAT,
+    maskfrac_max_npix INT,
+    maskfrac_max_static FLOAT,
+    maskfrac_max_dynamic FLOAT,
+    maskfrac_max_magic FLOAT,
+    maskfrac_max_advisory FLOAT,
     PRIMARY KEY(cam_id),
     KEY(fault),
Index: trunk/ippTools/src/camtool.c
===================================================================
--- trunk/ippTools/src/camtool.c	(revision 28088)
+++ trunk/ippTools/src/camtool.c	(revision 28089)
@@ -490,12 +490,18 @@
     PXOPT_LOOKUP_STR(ver_streaks, config->args, "-ver_streaks", false, false);
 
-    PXOPT_LOOKUP_S32(maskfrac_npix, config->args, "-maskfrac_npix", false, false);
-    PXOPT_LOOKUP_F32(maskfrac_static, config->args, "-maskfrac_static", false, false);
-    PXOPT_LOOKUP_F32(maskfrac_dynamic, config->args, "-maskfrac_dynamic", false, false);
-    PXOPT_LOOKUP_F32(maskfrac_magic, config->args, "-maskfrac_magic", false, false);
-    PXOPT_LOOKUP_F32(maskfrac_advisory, config->args, "-maskfrac_advisory", false, false);
-
-    psTrace("czw.test",1,"Received versions: pslib %s psmodules %s psphot %s psastro %s ppstats %s ppImage %s streaks %s\n",
-	    ver_pslib,ver_psmodules,ver_psphot,ver_psastro,ver_ppstats,ver_ppimage,ver_streaks);
+    PXOPT_LOOKUP_S32(maskfrac_ref_npix, config->args, "-maskfrac_ref_npix", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_ref_static, config->args, "-maskfrac_ref_static", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_ref_dynamic, config->args, "-maskfrac_ref_dynamic", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_ref_magic, config->args, "-maskfrac_ref_magic", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_ref_advisory, config->args, "-maskfrac_ref_advisory", false, false);
+
+    PXOPT_LOOKUP_S32(maskfrac_max_npix, config->args, "-maskfrac_max_npix", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_max_static, config->args, "-maskfrac_max_static", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_max_dynamic, config->args, "-maskfrac_max_dynamic", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_max_magic, config->args, "-maskfrac_max_magic", false, false);
+    PXOPT_LOOKUP_F32(maskfrac_max_advisory, config->args, "-maskfrac_max_advisory", false, false);
+
+/*     psTrace("czw.test",1,"Received versions: pslib %s psmodules %s psphot %s psastro %s ppstats %s ppImage %s streaks %s\n", */
+/* 	    ver_pslib,ver_psmodules,ver_psphot,ver_psastro,ver_ppstats,ver_ppimage,ver_streaks); */
     psString software_ver = NULL;
     if ((ver_pslib)&&(ver_psmodules)) {
@@ -632,9 +638,14 @@
         fault,
 	software_ver,
-	maskfrac_npix,
-	maskfrac_static,
-	maskfrac_dynamic,
-	maskfrac_magic,
-	maskfrac_advisory,
+	maskfrac_ref_npix,
+	maskfrac_ref_static,
+	maskfrac_ref_dynamic,
+	maskfrac_ref_magic,
+	maskfrac_ref_advisory,
+	maskfrac_max_npix,
+	maskfrac_max_static,
+	maskfrac_max_dynamic,
+	maskfrac_max_magic,
+	maskfrac_max_advisory,
 	quality
         );
@@ -674,7 +685,10 @@
     }
     // Set chipRun.maskfrac* to the appropriate values.
-    if (maskfrac_npix) {
-      if (!pxSetRunMaskfrac(config, "camRun", "cam_id",cam_id, (float) maskfrac_npix, maskfrac_static,
-			    maskfrac_dynamic, maskfrac_magic, maskfrac_advisory)) {
+    if (maskfrac_ref_npix) {
+      if (!pxCamSetRunMaskfrac(config, "camRun", "cam_id",cam_id,
+			       (float) maskfrac_ref_npix, maskfrac_ref_static,
+			       maskfrac_ref_dynamic, maskfrac_ref_magic, maskfrac_ref_advisory,
+			       (float) maskfrac_max_npix, maskfrac_max_static,
+			       maskfrac_max_dynamic, maskfrac_max_magic, maskfrac_max_advisory)) {
 	if (!psDBRollback(config->dbh)) {
 	  psError(PS_ERR_UNKNOWN, false, "database error");
Index: trunk/ippTools/src/camtoolConfig.c
===================================================================
--- trunk/ippTools/src/camtoolConfig.c	(revision 28088)
+++ trunk/ippTools/src/camtoolConfig.c	(revision 28089)
@@ -182,9 +182,15 @@
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-ver_streaks", 0, "define streaksremove version", NULL);
 
-    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_npix", 0, "define number of pixels used for maskstats", 0);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_static", 0, "define static mask fraction", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_dynamic", 0, "define dynamic mask fraction", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_magic", 0, "define magic mask fraction", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_advisory", 0, "define advisory mask fraction", NAN);
+    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_ref_npix", 0, "define number of pixels used for maskstats", 0);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_ref_static", 0, "define static mask fraction", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_ref_dynamic", 0, "define dynamic mask fraction", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_ref_magic", 0, "define magic mask fraction", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_ref_advisory", 0, "define advisory mask fraction", NAN);
+
+    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_max_npix", 0, "define number of pixels used for maskstats", 0);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_max_static", 0, "define static mask fraction", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_max_dynamic", 0, "define dynamic mask fraction", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_max_magic", 0, "define magic mask fraction", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-maskfrac_max_advisory", 0, "define advisory mask fraction", NAN);
 
 
Index: trunk/ippTools/src/pxtools.c
===================================================================
--- trunk/ippTools/src/pxtools.c	(revision 28088)
+++ trunk/ippTools/src/pxtools.c	(revision 28089)
@@ -150,4 +150,5 @@
   return(true);
 }
+
 bool pxSetRunMaskfrac(pxConfig *config, const psString tableName, const psString stage_id_name, const psS64 stage_id,
 		      psS64 maskfrac_npix, psF32 maskfrac_static, psF32 maskfrac_dynamic,
@@ -156,4 +157,25 @@
   if (!p_psDBRunQueryF(config->dbh,query,tableName,(float) maskfrac_npix,maskfrac_static,
 		       maskfrac_dynamic, maskfrac_magic,maskfrac_advisory,stage_id_name,stage_id)) {
+    psError(PS_ERR_UNKNOWN, false,
+	    "failed to set maskfrac stats for %s %" PRId64,stage_id_name,stage_id);
+    return(false);
+  }
+  
+
+
+  return(true);
+}
+
+bool pxCamSetRunMaskfrac(pxConfig *config, const psString tableName, const psString stage_id_name, const psS64 stage_id,
+			 psS64 maskfrac_ref_npix, psF32 maskfrac_ref_static, psF32 maskfrac_ref_dynamic,
+			 psF32 maskfrac_ref_magic, psF32 maskfrac_ref_advisory,
+			 psS64 maskfrac_max_npix, psF32 maskfrac_max_static, psF32 maskfrac_max_dynamic,
+			 psF32 maskfrac_max_magic, psF32 maskfrac_max_advisory) {
+  char *query = "UPDATE %s SET maskfrac_ref_npix = %f, maskfrac_ref_static = %f, maskfrac_ref_dynamic = %f, maskfrac_ref_magic = %f, maskfrac_ref_advisory = %f, maskfrac_max_npix = %f, maskfrac_max_static = %f, maskfrac_max_dynamic = %f, maskfrac_max_magic = %f, maskfrac_max_advisory = %f WHERE %s = %" PRId64;
+  if (!p_psDBRunQueryF(config->dbh,query,tableName,(float) maskfrac_ref_npix,maskfrac_ref_static,
+		       maskfrac_ref_dynamic, maskfrac_ref_magic,maskfrac_ref_advisory,
+		       (float) maskfrac_max_npix,maskfrac_max_static,
+		       maskfrac_max_dynamic, maskfrac_max_magic,maskfrac_max_advisory,
+		       stage_id_name,stage_id)) {
     psError(PS_ERR_UNKNOWN, false,
 	    "failed to set maskfrac stats for %s %" PRId64,stage_id_name,stage_id);
Index: trunk/ippTools/src/pxtools.h
===================================================================
--- trunk/ippTools/src/pxtools.h	(revision 28088)
+++ trunk/ippTools/src/pxtools.h	(revision 28089)
@@ -62,4 +62,9 @@
 		      psS64 maskfrac_npix, psF32 maskfrac_static, psF32 maskfrac_dynamic,
 		      psF32 maskfrac_magic, psF32 maskfrac_advisory);
+bool pxCamSetRunMaskfrac(pxConfig *config, const psString tableName, const psString stage_id_name, const psS64 stage_id,
+			 psS64 maskfrac_ref_npix, psF32 maskfrac_ref_static, psF32 maskfrac_ref_dynamic,
+			 psF32 maskfrac_ref_magic, psF32 maskfrac_ref_advisory,
+			 psS64 maskfrac_max_npix, psF32 maskfrac_max_static, psF32 maskfrac_max_dynamic,
+			 psF32 maskfrac_max_magic, psF32 maskfrac_max_advisory);
 
 bool pxSetStateCleaned(const psString tableName, const psString columnName, psArray *rows);
Index: trunk/ippconfig/gpc1/camera.config
===================================================================
--- trunk/ippconfig/gpc1/camera.config	(revision 28088)
+++ trunk/ippconfig/gpc1/camera.config	(revision 28089)
@@ -153,4 +153,9 @@
 BURNTOOL.STATE.GOOD.UPDATE S16  13  # for upddate processing accept earlier version
 
-FOV                     F32     20930   # Field of view of unvignetted region in FPA pixels.
+FOV_REF                     F32     20930   # Field of view of unvignetted region in FPA pixels.
+FOV_MAX			    F32	    22720
+#NPIX_REF		    S32	    1357799527
+#NPIX_MAX		    S32	    1482790357
+NPIX_REF 		    S32	    1333206539
+NPIX_MAX		    S32	    1455690816
 NPIX_INTERCHIP          S32     103794483
Index: trunk/ippconfig/recipes/ppStats.config
===================================================================
--- trunk/ippconfig/recipes/ppStats.config	(revision 28088)
+++ trunk/ippconfig/recipes/ppStats.config	(revision 28089)
@@ -130,9 +130,15 @@
   ANALYSIS      STR     PSASTRO.HEADER
 
-  ANALYSIS 	STR	MASKFRAC_STATIC
-  ANALYSIS 	STR	MASKFRAC_MAGIC
-  ANALYSIS	STR	MASKFRAC_ADVISORY
-  ANALYSIS	STR	MASKFRAC_DYNAMIC
-  ANALYSIS	STR	MASKFRAC_NPIX
+  ANALYSIS 	STR	MASKFRAC_REF_STATIC
+  ANALYSIS 	STR	MASKFRAC_REF_MAGIC
+  ANALYSIS	STR	MASKFRAC_REF_ADVISORY
+  ANALYSIS	STR	MASKFRAC_REF_DYNAMIC
+  ANALYSIS	STR	MASKFRAC_REF_NPIX
+
+  ANALYSIS 	STR	MASKFRAC_MAX_STATIC
+  ANALYSIS 	STR	MASKFRAC_MAX_MAGIC
+  ANALYSIS	STR	MASKFRAC_MAX_ADVISORY
+  ANALYSIS	STR	MASKFRAC_MAX_DYNAMIC
+  ANALYSIS	STR	MASKFRAC_MAX_NPIX
 END
 
Index: trunk/ippconfig/recipes/ppStatsFromMetadata.config
===================================================================
--- trunk/ippconfig/recipes/ppStatsFromMetadata.config	(revision 28088)
+++ trunk/ippconfig/recipes/ppStatsFromMetadata.config	(revision 28089)
@@ -282,9 +282,15 @@
 
   # Mask stats values
-  ENTRY VAL MASKFRAC_NPIX	  S32  CONSTANT		-maskfrac_npix
-  ENTRY VAL MASKFRAC_STATIC	  F32  CONSTANT		-maskfrac_static
-  ENTRY VAL MASKFRAC_DYNAMIC	  F32  CONSTANT		-maskfrac_dynamic
-  ENTRY VAL MASKFRAC_MAGIC	  F32  CONSTANT		-maskfrac_magic
-  ENTRY VAL MASKFRAC_ADVISORY	  F32  CONSTANT		-maskfrac_advisory
+  ENTRY VAL MASKFRAC_REF_NPIX	  S32  CONSTANT		-maskfrac_ref_npix
+  ENTRY VAL MASKFRAC_REF_STATIC	  F32  CONSTANT		-maskfrac_ref_static
+  ENTRY VAL MASKFRAC_REF_DYNAMIC  F32  CONSTANT		-maskfrac_ref_dynamic
+  ENTRY VAL MASKFRAC_REF_MAGIC	  F32  CONSTANT		-maskfrac_ref_magic
+  ENTRY VAL MASKFRAC_REF_ADVISORY F32  CONSTANT		-maskfrac_ref_advisory
+
+  ENTRY VAL MASKFRAC_MAX_NPIX	  S32  CONSTANT		-maskfrac_max_npix
+  ENTRY VAL MASKFRAC_MAX_STATIC	  F32  CONSTANT		-maskfrac_max_static
+  ENTRY VAL MASKFRAC_MAX_DYNAMIC  F32  CONSTANT		-maskfrac_max_dynamic
+  ENTRY VAL MASKFRAC_MAX_MAGIC	  F32  CONSTANT		-maskfrac_max_magic
+  ENTRY VAL MASKFRAC_MAX_ADVISORY F32  CONSTANT		-maskfrac_max_advisory
 END
 
Index: trunk/psastro/src/psastroMaskUpdates.c
===================================================================
--- trunk/psastro/src/psastroMaskUpdates.c	(revision 28088)
+++ trunk/psastro/src/psastroMaskUpdates.c	(revision 28089)
@@ -30,5 +30,11 @@
 int colEnd(psU16 corner_list,int i,int x_0,int y_0,int R,int max) {
   if ((corner_list == 0x04)||(corner_list == 0x05)) {
-    return((int) fabs(x_0 - sqrt(pow(R,2) - pow(y_0 - i,2))));
+    int v = (int) fabs(x_0 - sqrt(pow(R,2) - pow(y_0 - i,2)));
+    if (v > max) {
+      return(max);
+    }
+    else {
+      return(v);
+    }
   }
   else {
@@ -54,5 +60,11 @@
 	   (corner_list == 0x03)||(corner_list == 0x0b)||
 	   (corner_list == 0x07)) {
-    return((int) fabs(y_0 - sqrt(pow(R,2) - pow(x_0 - j,2))));
+    int v = (int) fabs(y_0 - sqrt(pow(R,2) - pow(x_0 - j,2)));
+    if (v > max) {
+      return(max);
+    }
+    else {
+      return(v);
+    }
   }
   else {
@@ -62,5 +74,7 @@
 }
 
-/**
+/* #define MASK_DEBUG 1 */
+
+/*
  * create a mask or mask regions based on the collection of reference stars that * are in the vicinity of each chip
  */
@@ -112,7 +126,6 @@
         return false;
     }
-
     psLogMsg ("psastro", PS_LOG_INFO, "generating a bright-star mask");
-
+    
     bool REFSTAR_MASK_BLEED                = psMetadataLookupBool (&status, recipe, "REFSTAR_MASK_BLEED");
 
@@ -137,9 +150,15 @@
     psU16 advisoryMaskVal = psMetadataLookupU32(&status, recipe, "MASKSTAT.ADVISORY");
 
-    psS32 Npix_valid = 0;
-    psS32 Npix_static = 0;
-    psS32 Npix_magic = 0;
-    psS32 Npix_dynamic = 0;
-    psS32 Npix_advisory = 0;
+    psS32 Npix_ref_valid = 0;
+    psS32 Npix_ref_static = 0;
+    psS32 Npix_ref_magic = 0;
+    psS32 Npix_ref_dynamic = 0;
+    psS32 Npix_ref_advisory = 0;
+
+    psS32 Npix_max_valid = 0;
+    psS32 Npix_max_static = 0;
+    psS32 Npix_max_magic = 0;
+    psS32 Npix_max_dynamic = 0;
+    psS32 Npix_max_advisory = 0;
     
     psU16 corner_list = 0x00;
@@ -177,10 +196,8 @@
 
     // Get camera specific mask stat options
-    psF32 FOV = psMetadataLookupF32(&status, fpaMask->camera, "FOV"); // Almost certainly doesn't exist. Placeholder for now.
-    psS32 CONSTANT_BLANK = psMetadataLookupS32(&status, fpaMask->camera, "NPIX_INTERCHIP"); // Need to add this as well.
-    
-    Npix_valid += CONSTANT_BLANK;
-    Npix_static += CONSTANT_BLANK;
-
+    psF32 FOV_REF = psMetadataLookupF32(&status, fpaMask->camera, "FOV_REF");
+    psF32 FOV_MAX = psMetadataLookupF32(&status, fpaMask->camera, "FOV_MAX");
+    psS32 NPIX_REF = psMetadataLookupS32(&status, fpaMask->camera, "NPIX_REF");
+    psS32 NPIX_MAX = psMetadataLookupS32(&status, fpaMask->camera, "NPIX_MAX");
     
     // select the reference mask fpa :: we use this to determine cell boundaries
@@ -209,5 +226,8 @@
     // open/load files as needed
     if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE;
-
+#ifdef MASK_DEBUG
+    psImage *masktest = psImageAlloc(10500,10500,PS_TYPE_U16);
+    psImageMaskType **maskIData = masktest->data.PS_TYPE_IMAGE_MASK_DATA;
+#endif
     // this loop selects the matched stars for all chips
     while ((chip = pmFPAviewNextChip (view, fpa, 1)) != NULL) {
@@ -435,15 +455,10 @@
 	  while ((cell = pmFPAviewNextCell(view, fpa, 1)) != NULL) {
 	    if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE;
-	    psWarning("In CELL: FOV: %f CONSTANT: %d Mask bits: %d %d %d %d\n",
-		      FOV,CONSTANT_BLANK,staticMaskVal,magicMaskVal,dynamicMaskVal,advisoryMaskVal);
-	    
 	    if (!cell->process || !cell->file_exists) {continue; }
 	    while ((readout = pmFPAviewNextReadout(view, fpa, 1)) != NULL) {
 	      pmReadout *readoutMask = pmFPAviewThisReadout (view, outMask->fpa);
 	      if (!pmFPAfileIOChecks (config, viewMask, PM_FPA_BEFORE)) ESCAPE;
-	      psWarning("In READOUT: FOV: %f CONSTANT: %d Mask bits: %d %d %d %d\n",
-			FOV,CONSTANT_BLANK,staticMaskVal,magicMaskVal,dynamicMaskVal,advisoryMaskVal);
-	      
 	      if (!readoutMask->data_exists) {continue; }
+
 	      psPlane coordFPA;
 	      psPlane coordCell;
@@ -453,84 +468,119 @@
 	      psImageMaskType **maskData = mask->data.PS_TYPE_IMAGE_MASK_DATA;
 	      // Dance coordinates around
-	      // Calculate which corners fall within the field of view.
+	      // Calculate which corners fall within the field of view.  If this chip is fully contained, we can
+	      // do a simple scan instead of checking it falls within the FOV.
 	      // 0x04   0x08
 	      // 0x01   0x02
+	      corner_list = 0;
 	      
-	      coordFPA.x = 0.0;
-	      coordFPA.y = 0.0;
-	      psPlaneTransformApply(&coordCell,chip->fromFPA,&coordFPA);
-	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV,2)) {
+	      coordCell.x = 0.0;
+	      coordCell.y = 0.0;
+	      psPlaneTransformApply(&coordFPA,chip->toFPA,&coordCell);
+	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV_REF,2)) {
 		corner_list = corner_list | 0x01;
 	      }
-	      
-	      coordCell.x = mask->numCols - 1;
-	      psPlaneTransformApply(&coordCell,chip->fromFPA,&coordFPA);
-	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV,2)) {
+	      coordCell.x = (1.0 * mask->numCols - 1.0);
+	      psPlaneTransformApply(&coordFPA,chip->toFPA,&coordCell);
+	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV_REF,2)) {
 		corner_list = corner_list | 0x02;
 	      }
-	      
-	      coordCell.y = mask->numRows - 1;
-	      psPlaneTransformApply(&coordCell,chip->fromFPA,&coordFPA);
-	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV,2)) {
+	      coordCell.y = 1.0 * (mask->numRows - 1);
+	      psPlaneTransformApply(&coordFPA,chip->toFPA,&coordCell);
+	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV_REF,2)) {
 		corner_list = corner_list | 0x08;
 	      }
-	      
-	      coordCell.x = 0;
-	      psPlaneTransformApply(&coordCell,chip->fromFPA,&coordFPA);
-	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV,2)) {
+	      coordCell.x = 0.0;
+	      psPlaneTransformApply(&coordFPA,chip->toFPA,&coordCell);
+	      if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV_REF,2)) {
 		corner_list = corner_list | 0x04;
 	      }
-	      
-	      int x_0 = coordFPA.x;
-	      int y_0 = coordFPA.y;
-	      
-	      
+
 	      // Scan over the valid regions of the image and count masked pixels
-	      if ((corner_list == 0x04)||(corner_list == 0x08)||
-		  (corner_list == 0x05)||(corner_list == 0x0a)) {
-		for (int i = 0; i < mask->numRows - 1; i++) {
-		  for (int j = colStart(corner_list,i,x_0,y_0,FOV,mask->numCols - 1);
-		       j < colEnd(corner_list,i,x_0,y_0,FOV,mask->numCols - 1); j++) {
-		    Npix_valid++;
-		    if (maskData[i][j] & staticMaskVal) {
-		      Npix_static++;
-		      continue;
-		    }
-		    if (maskData[i][j] & dynamicMaskVal) {
-		      Npix_dynamic++;
-		      continue;
-		    }
-		    if (maskData[i][j] & magicMaskVal) {
-		      Npix_magic++;
-		      continue;
-		    }
-		    if (maskData[i][j] & advisoryMaskVal) {
-		      Npix_advisory++;
-		      continue;
-		    }
+	      for (int i = 0; i < mask->numRows - 1; i++) {
+		for (int j = 0; j < mask->numCols - 1; j++) {
+		  coordCell.x = j;
+		  coordCell.y = i;
+		  coordFPA.x = 0.0;
+		  coordFPA.y = 0.0;
+		  int region = 0;
+
+		  if (corner_list == 0x0f) {
+		    Npix_ref_valid++;
+		    Npix_max_valid++;
+		    region = 1;
+/* #ifdef MASK_DEBUG */
+/* 		    psPlaneTransformApply(&coordFPA,chip->toFPA,&coordCell); */
+/* 		    maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] = */
+/* 		      maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] + 0x01; */
+/* #endif */
 		  }
-		}
-	      }
-	      else {
-		for (int j = 0; j < mask->numCols - 1; j++) {
-		  for (int i = rowStart(corner_list,j,x_0,y_0,FOV,mask->numRows - 1);
-		       i < rowEnd(corner_list,j,x_0,y_0,FOV,mask->numRows - 1); i++) {
-		    Npix_valid++;
-		    if (maskData[i][j] & staticMaskVal) {
-		      Npix_static++;
-		      continue;
-		    }
-		    if (maskData[i][j] & dynamicMaskVal) {
-		      Npix_dynamic++;
-		      continue;
-		    }
-		    if (maskData[i][j] & magicMaskVal) {
-		      Npix_magic++;
-		      continue;
-		    }
-		    if (maskData[i][j] & advisoryMaskVal) {
-		      Npix_advisory++;
-		      continue;
-		    }
+		  if (!region) {
+		    psPlaneTransformApply(&coordFPA,chip->toFPA,&coordCell);
+		    if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV_REF,2)) {
+		      Npix_ref_valid++;
+		      Npix_max_valid++;
+		      region = 1;
+/* #ifdef MASK_DEBUG */
+/* 		      maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] = */
+/* 			maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] +  0x01; */
+/* #endif */
+		    }
+		    else if (pow(coordFPA.x,2) + pow(coordFPA.y,2) <= pow(FOV_MAX,2)) {
+		      Npix_max_valid++;
+		      region = 2;
+/* #ifdef MASK_DEBUG  */
+/* 		      maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] = */
+/* 			maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] + 0x01; */
+/* #endif */
+		    }
+		  }
+		  if (!region) {
+		    continue;
+		  }
+		  
+		  if (maskData[i][j] & staticMaskVal) {
+#ifdef MASK_DEBUG
+		    psPlaneTransformApply(&coordFPA,chip->toFPA,&coordCell);
+		    maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] =
+		      maskIData[(int) (coordFPA.y/4 + 5250)][(int) (coordFPA.x/4 + 5250)] + 1;
+#endif
+		    if (region == 1) {
+		      Npix_ref_static++;
+		      Npix_max_static++;
+		    }
+		    if (region == 2) {
+		      Npix_max_static++;
+		    }
+		    continue;
+		  }
+		  if (maskData[i][j] & dynamicMaskVal) {
+		    if (region == 1) {
+		      Npix_ref_dynamic++;
+		      Npix_max_dynamic++;
+		    }
+		    if (region == 2) {
+		      Npix_max_dynamic++;
+		    }
+		    continue;
+		  }
+		  if (maskData[i][j] & magicMaskVal) {
+		    if (region == 1) {
+		      Npix_ref_magic++;
+		      Npix_max_magic++;
+		    }
+		    if (region == 2) {
+		      Npix_max_magic++;
+		    }
+		    continue;
+		  }
+		  if (maskData[i][j] & advisoryMaskVal) {
+		    if (region == 1) {
+		      Npix_ref_advisory++;
+		      Npix_max_advisory++;
+		    }
+		    if (region == 2) {
+		      Npix_max_advisory++;
+		    }
+		    continue;
 		  }
 		}
@@ -555,4 +605,11 @@
     if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) ESCAPE;
 
+#ifdef MASK_DEBUG
+    psFits *maskFits = psFitsOpen("/data/ipp007.0/watersc1/mask.test.fits","w");
+    psFitsWriteImage(maskFits,NULL,masktest,1,"mask");
+
+    psFree(maskFits);
+    psFree(masktest);
+#endif
     if (COUNT_GHOSTS) {
         // save nGhosts to update header.
@@ -566,14 +623,27 @@
     }
 
-    psMetadataAddS32(stats,PS_LIST_TAIL, "MASKFRAC_NPIX", 0,
-		     "Number of valid pixels", Npix_valid);
-    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_STATIC", 0,
-		     "Fraction of pixels statically masked", (float) Npix_static / Npix_valid);
-    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_DYNAMIC", 0,
-		     "Fraction of pixels dynamically masked", (float) Npix_dynamic / Npix_valid);
-    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_MAGIC", 0,
-		     "Fraction of pixels magically masked", (float) Npix_magic / Npix_valid);
-    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_ADVISORY", 0,
-		     "Fraction of pixels masked as an advisory", (float) Npix_advisory / Npix_valid);
+    Npix_ref_static += (NPIX_REF - Npix_ref_valid);
+    Npix_max_static += (NPIX_MAX - Npix_max_valid);
+    psMetadataAddS32(stats,PS_LIST_TAIL, "MASKFRAC_REF_NPIX", 0,
+		     "Number of valid pixels", Npix_ref_valid);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_REF_STATIC", 0,
+		     "Fraction of pixels statically masked", (float) Npix_ref_static / NPIX_REF);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_REF_DYNAMIC", 0,
+		     "Fraction of pixels dynamically masked", (float) Npix_ref_dynamic / NPIX_REF);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_REF_MAGIC", 0,
+		     "Fraction of pixels magically masked", (float) Npix_ref_magic / NPIX_REF);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_REF_ADVISORY", 0,
+		     "Fraction of pixels masked as an advisory", (float) Npix_ref_advisory / NPIX_REF);
+
+    psMetadataAddS32(stats,PS_LIST_TAIL, "MASKFRAC_MAX_NPIX", 0,
+		     "Number of valid pixels", Npix_max_valid);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_MAX_STATIC", 0,
+		     "Fraction of pixels statically masked", (float) Npix_max_static / NPIX_MAX);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_MAX_DYNAMIC", 0,
+		     "Fraction of pixels dynamically masked", (float) Npix_max_dynamic / NPIX_MAX);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_MAX_MAGIC", 0,
+		     "Fraction of pixels magically masked", (float) Npix_max_magic / NPIX_MAX);
+    psMetadataAddF32(stats,PS_LIST_TAIL, "MASKFRAC_MAX_ADVISORY", 0,
+		     "Fraction of pixels masked as an advisory", (float) Npix_max_advisory / NPIX_MAX);
     
     // deactivate all files
