Index: /branches/eam_branches/ipp-20110213/psphot/src/Makefile.am
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/Makefile.am	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/Makefile.am	(revision 30936)
@@ -69,7 +69,6 @@
         psphotForced.c             \
 	psphotForcedArguments.c	   \
-	psphotForcedImageLoop.c	   \
-	psphotForcedReadout.c	   \
 	psphotParseCamera.c        \
+	psphotImageLoop.c	   \
 	psphotMosaicChip.c	   \
 	psphotCleanup.c
@@ -79,7 +78,6 @@
         psphotMakePSF.c            \
 	psphotMakePSFArguments.c   \
-	psphotMakePSFImageLoop.c   \
-	psphotMakePSFReadout.c	   \
 	psphotParseCamera.c        \
+	psphotImageLoop.c   \
 	psphotMosaicChip.c	   \
 	psphotCleanup.c
@@ -128,4 +126,6 @@
 	psphotReadoutForcedKnownSources.c    \
 	psphotReadoutMinimal.c	       \
+	psphotForcedReadout.c	       \
+	psphotMakePSFReadout.c	       \
 	psphotModelBackground.c	       \
 	psphotMaskBackground.c	       \
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphot.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphot.c	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphot.c	(revision 30936)
@@ -1,3 +1,4 @@
 # include "psphotStandAlone.h"
+# define FORCED_PHOTOMETRY 0
 
 int main (int argc, char **argv) {
@@ -20,5 +21,5 @@
 
     // call psphot for each readout
-    if (!psphotImageLoop (config)) {
+    if (!psphotImageLoop (config, PSPHOT_SINGLE)) {
         psErrorStackPrint(stderr, "Error in the psphot image loop\n");
         exit (psphotGetExitStatus());
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphot.h
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphot.h	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphot.h	(revision 30936)
@@ -14,4 +14,10 @@
 
 # define READOUT_OR_INTERNAL(VIEW,FILE)((FILE)->mode == PM_FPA_MODE_INTERNAL) ? (FILE)->readout : pmFPAviewThisReadout((VIEW), (FILE)->fpa)
+
+typedef enum {
+    PSPHOT_SINGLE,
+    PSPHOT_FORCED,
+    PSPHOT_MAKE_PSF,
+} psphotImageLoopMode;
 
 // top-level psphot functions
@@ -23,4 +29,6 @@
 bool            psphotVersionHeaderFull(psMetadata *header);
 void            psphotVersionPrint(void);
+
+bool            psphotImageLoop (pmConfig *config, psphotImageLoopMode mode);
 
 bool            psphotModelTest (pmConfig *config, const pmFPAview *view, psMetadata *recipe);
@@ -311,9 +319,7 @@
 
 pmConfig *psphotForcedArguments(int argc, char **argv);
-bool psphotForcedImageLoop (pmConfig *config);
 bool psphotForcedReadout(pmConfig *config, const pmFPAview *view, const char *filerule);
 
 pmConfig *psphotMakePSFArguments(int argc, char **argv);
-bool psphotMakePSFImageLoop (pmConfig *config);
 bool psphotMakePSFReadout(pmConfig *config, const pmFPAview *view, const char *filerule);
 
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphotForced.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphotForced.c	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphotForced.c	(revision 30936)
@@ -1,3 +1,4 @@
 # include "psphotStandAlone.h"
+# define FORCED_PHOTOMETRY 1
 
 int main (int argc, char **argv) {
@@ -20,5 +21,5 @@
 
     // call psphot for each readout
-    if (!psphotForcedImageLoop (config)) {
+    if (!psphotImageLoop (config, PSPHOT_FORCED)) {
         psErrorStackPrint(stderr, "Error in the psphot image loop\n");
         exit (psphotGetExitStatus());
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphotForcedImageLoop.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphotForcedImageLoop.c	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphotForcedImageLoop.c	(revision 30936)
@@ -1,9 +1,9 @@
 # include "psphotStandAlone.h"
 
-# define ESCAPE(MESSAGE) { \
-  psError(PSPHOT_ERR_DATA, false, MESSAGE); \
-  psFree (view); \
-  return false; \
-}
+# define ESCAPE(MESSAGE) {				\
+	psError(PSPHOT_ERR_DATA, false, MESSAGE);	\
+	psFree (view);					\
+	return false;					\
+    }
 
 bool psphotForcedImageLoop (pmConfig *config) {
@@ -31,4 +31,10 @@
     if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE ("failed input for fpa in psphot.");
 
+    // select the appropriate recipe information
+    psMetadata *recipe  = psMetadataLookupPtr (&status, config->recipes, PSPHOT_RECIPE);
+    psAssert (recipe, "missing recipe?");
+
+    psImageMaskType maskTest = psMetadataLookupImageMask(&status, recipe, "MASK.PSPHOT");
+
     // for psphot, we force data to be read at the chip level
     while ((chip = pmFPAviewNextChip (view, load->fpa, 1)) != NULL) {
@@ -45,4 +51,21 @@
         // mosaic the cells of a chip into a single contiguous (trimmed) chip
         if (!psphotMosaicChip(config, view, "PSPHOT.INPUT", "PSPHOT.LOAD")) ESCAPE ("Unable to mosaic chip.");
+
+        // Read WCS if easy.
+        // XXX Since we're mosaicking cells, we ignore the case where the WCS is defined for a cell.
+        {
+            pmChip *inChip = pmFPAviewThisChip(view, input->fpa); // Mosaicked chip
+            pmHDU *hduLow = pmHDUGetLowest(input->fpa, inChip, NULL);
+            if (hduLow && !pmAstromReadWCS(input->fpa, inChip, hduLow->header, 1.0)) {
+                psWarning("Unable to read WCS astrometry from header.");
+                psErrorClear();
+                pmHDU *hduHigh = pmHDUGetHighest(input->fpa, inChip, NULL);
+                if (hduHigh && hduHigh != hduLow &&
+                    !pmAstromReadWCS(input->fpa, chip, hduHigh->header, 1.0)) {
+                    psWarning("Unable to read WCS astrometry from primary header.");
+                    psErrorClear();
+                }
+            }
+        }
 
         // try to load other supporting data (PSF, SRC, etc).
@@ -76,5 +99,5 @@
 		if (readout->mask) {
 		    psImageMaskType maskSat = pmConfigMaskGet("SAT", config); // Mask value for saturated pixels
-		    if (!pmReadoutMaskNonfinite(readout, maskSat)) {
+                    if (!pmReadoutMaskInvalid(readout, maskTest, maskSat)) {
 			psError(psErrorCodeLast(), false, "Unable to mask non-finite pixels.");
 			psFree(view);
@@ -91,4 +114,5 @@
             }
 
+            // drop all versions of the internal files
             status = true;
             status &= pmFPAfileDropInternal (config->files, "PSPHOT.BACKMDL");
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphotImageLoop.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphotImageLoop.c	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphotImageLoop.c	(revision 30936)
@@ -1,11 +1,11 @@
 # include "psphotStandAlone.h"
 
-# define ESCAPE(MESSAGE) { \
-  psError(PSPHOT_ERR_DATA, false, MESSAGE); \
-  psFree (view); \
-  return false; \
-}
+# define ESCAPE(MESSAGE) {				\
+	psError(PSPHOT_ERR_DATA, false, MESSAGE);	\
+	psFree (view);					\
+	return false;					\
+    }
 
-bool psphotImageLoop (pmConfig *config) {
+bool psphotImageLoop (pmConfig *config, psphotImageLoopMode mode) {
 
     bool status;
@@ -90,10 +90,8 @@
 
                 // Update the header
-                {
-                    pmHDU *hdu = pmHDUGetHighest(input->fpa, chip, cell);
-                    if (hdu && hdu != lastHDU) {
-                        psphotVersionHeaderFull(hdu->header);
-                        lastHDU = hdu;
-                    }
+		pmHDU *hdu = pmHDUGetHighest(input->fpa, chip, cell);
+		if (hdu && hdu != lastHDU) {
+		    psphotVersionHeaderFull(hdu->header);
+		    lastHDU = hdu;
                 }
 
@@ -109,9 +107,27 @@
 
                 // run the actual photometry analysis on this chip/cell/readout
-                if (!psphotReadout (config, view, "PSPHOT.INPUT")) {
-                    psError(psErrorCodeLast(), false, "failure in psphotReadout for chip %d, cell %d, readout %d\n", view->chip, view->cell, view->readout);
-                    psFree (view);
-                    return false;
-                }
+		switch (mode) {
+		  case PSPHOT_SINGLE:
+		    if (!psphotReadout (config, view, "PSPHOT.INPUT")) {
+			psError(psErrorCodeLast(), false, "failure in psphotReadout for chip %d, cell %d, readout %d\n", view->chip, view->cell, view->readout);
+			psFree (view);
+			return false;
+		    }
+		    break;
+		  case PSPHOT_FORCED:
+		    if (!psphotForcedReadout (config, view, "PSPHOT.INPUT")) {
+			psError(psErrorCodeLast(), false, "failure in psphotReadout for chip %d, cell %d, readout %d\n", view->chip, view->cell, view->readout);
+			psFree (view);
+			return false;
+		    }
+		    break;
+		  case PSPHOT_MAKE_PSF:
+		    if (!psphotMakePSFReadout (config, view, "PSPHOT.INPUT")) {
+			psError(psErrorCodeLast(), false, "failure in psphotReadout for chip %d, cell %d, readout %d\n", view->chip, view->cell, view->readout);
+			psFree (view);
+			return false;
+		    }
+		    break;
+		}
             }
 
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphotMakePSF.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphotMakePSF.c	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphotMakePSF.c	(revision 30936)
@@ -20,5 +20,5 @@
 
     // call psphot for each readout
-    if (!psphotMakePSFImageLoop (config)) {
+    if (!psphotImageLoop (config, PSPHOT_MAKE_PSF)) {
         psErrorStackPrint(stderr, "Error in the psphot image loop\n");
         exit (psphotGetExitStatus());
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphotStandAlone.h
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphotStandAlone.h	(revision 30935)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphotStandAlone.h	(revision 30936)
@@ -14,5 +14,4 @@
 pmConfig       *psphotArguments (int argc, char **argv);
 bool            psphotParseCamera (pmConfig *config);
-bool            psphotImageLoop (pmConfig *config);
 bool            psphotMosaicChip(pmConfig *config, const pmFPAview *view, char *outFile, char *inFile);
 void            psphotCleanup (pmConfig *config);
