Index: trunk/pswarp/src/Makefile.am
===================================================================
--- trunk/pswarp/src/Makefile.am	(revision 28010)
+++ trunk/pswarp/src/Makefile.am	(revision 28043)
@@ -34,4 +34,5 @@
 	pswarpErrorCodes.c		\
 	pswarpMapGrid.c			\
+	pswarpMaskStats.c               \
 	pswarpMatchRange.c		\
 	pswarpParseCamera.c		\
Index: trunk/pswarp/src/pswarp.h
===================================================================
--- trunk/pswarp/src/pswarp.h	(revision 28010)
+++ trunk/pswarp/src/pswarp.h	(revision 28043)
@@ -109,4 +109,9 @@
     );
 
+bool pswarpMaskStats(const pmReadout *readout,
+		     psMetadata *stats,
+		     const pmConfig *config);
+
+
 /**
  * define threads for this program
Index: trunk/pswarp/src/pswarpLoop.c
===================================================================
--- trunk/pswarp/src/pswarpLoop.c	(revision 28010)
+++ trunk/pswarp/src/pswarpLoop.c	(revision 28043)
@@ -266,5 +266,13 @@
         goto DONE;
     }
-
+    bool doStats = psMetadataLookupBool(&mdok,recipe,"MASK.STATS");
+    if (doStats) {
+      if (!pswarpMaskStats(output, stats, config)) {
+	psError(psErrorCodeLast(), false, "Unable to calculate mask stats.");
+	psFree(cells);
+	psFree(view);
+	goto DONE;
+      }
+    }
     // Set covariance matrix for output
     {
@@ -332,5 +340,5 @@
 
     pswarpVersionHeader(hdu->header);
-
+    
     if (!pmAstromWriteWCS(hdu->header, outFPA, outChip, WCS_NONLIN_TOL)) {
         psError(psErrorCodeLast(), false, "Unable to generate WCS header.");
@@ -347,4 +355,5 @@
     pswarpFileActivation(config, detectorFiles, false);
     pswarpFileActivation(config, independentFiles, false);
+
 
     // We need a new PSF model for the warped frame.  It would be good to generate this analytically, but
@@ -421,4 +430,5 @@
         }
     }
+    
 
     // Add MD5 information for readout
Index: trunk/pswarp/src/pswarpMaskStats.c
===================================================================
--- trunk/pswarp/src/pswarpMaskStats.c	(revision 28043)
+++ trunk/pswarp/src/pswarpMaskStats.c	(revision 28043)
@@ -0,0 +1,45 @@
+#include "pswarp.h"
+#include <ppStats.h>
+
+bool pswarpMaskStats(const pmReadout *readout, psMetadata *stats, const pmConfig *config) {
+  PS_ASSERT_PTR_NON_NULL(readout, false);
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  bool status;
+  psMetadata *recipe = psMetadataLookupMetadata(&status, config->recipes, PSWARP_RECIPE);
+  psU16 staticMaskVal = psMetadataLookupU32(&status, recipe, "MASKSTAT.STATIC");
+  psU16 magicMaskVal = psMetadataLookupU32(&status, recipe, "MASKSTAT.MAGIC");
+  psU16 dynamicMaskVal = psMetadataLookupU32(&status, recipe, "MASKSTAT.DYNAMIC");
+  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;
+
+  if (!readout || !readout->data_exists) {
+    // Nothing to process
+    return(true);
+  }
+  psWarning("pswarpMaskStats: %d %d %d %d\n",staticMaskVal,magicMaskVal,dynamicMaskVal,advisoryMaskVal);
+  psImage *mask = readout->mask;  // Mask of interest;
+  if (!pmSingleImageMaskStats(mask,&Npix_valid,&Npix_static,&Npix_magic,
+			      &Npix_dynamic,&Npix_advisory,
+			      staticMaskVal,magicMaskVal,
+			      dynamicMaskVal,advisoryMaskVal)) {
+    psError(PS_ERR_UNKNOWN, false, "Unable to calculate masks for readout.");
+    return(false);
+  }
+  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);
+  return(true);
+}
Index: trunk/pswarp/src/pswarpVersion.c
===================================================================
--- trunk/pswarp/src/pswarpVersion.c	(revision 28010)
+++ trunk/pswarp/src/pswarpVersion.c	(revision 28043)
@@ -85,4 +85,6 @@
     psString source  = pswarpSource();  // Software source
 
+    psMetadataAddStr(header, PS_LIST_TAIL, "WARP_V", PS_META_REPLACE, NULL, PSWARP_VERSION);
+    
     psStringPrepend(&version, "pswarp version: ");
     psStringPrepend(&source, "pswarp source: ");
