Index: /branches/eam_branches/20090715/psphot/src/psphotSourceSize.c
===================================================================
--- /branches/eam_branches/20090715/psphot/src/psphotSourceSize.c	(revision 25610)
+++ /branches/eam_branches/20090715/psphot/src/psphotSourceSize.c	(revision 25611)
@@ -4,4 +4,5 @@
 typedef struct {
     psImageMaskType maskVal;
+    psImageMaskType markVal;
     psImageMaskType crMask;
     float ApResid;
@@ -39,4 +40,7 @@
     assert (options.maskVal);
 
+    options.markVal = psMetadataLookupImageMask(&status, recipe, "MARK.PSPHOT"); // Mask value for bad pixels
+    assert (options.markVal);
+
     // bit to mask the cosmic-ray pixels
     options.crMask  = pmConfigMaskGet("CR", config); // Mask value for cosmic rays
@@ -81,4 +85,5 @@
     psphotVisualPlotSourceSize (recipe, sources);
     psphotVisualShowSourceSize (readout, sources);
+    psphotVisualPlotApResid (sources, options.ApResid, options.ApSysErr);
 
     return true;
@@ -89,5 +94,4 @@
     // replace the source flux
     pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);
-    source->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED;
 
     // flag this as a CR
@@ -198,4 +202,7 @@
     psVector *ApErr = psVectorAllocEmpty (100, PS_TYPE_F32);
     
+    psImageMaskType maskVal = options->maskVal | options->markVal;
+
+    // XXX  why PHOT_WEIGHT??
     pmSourcePhotometryMode photMode = PM_SOURCE_PHOT_WEIGHT;
 
@@ -204,7 +211,22 @@
 	if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue;
 
+        // replace object in image
+        if (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED) {
+            pmSourceAdd (source, PM_MODEL_OP_FULL, options->maskVal);
+        }
+
+	// clear the mask bit and set the circular mask pixels
+	psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(options->markVal));
+	psImageKeepCircle (source->maskObj, source->peak->x, source->peak->y, source->apRadius, "OR", options->markVal);
+
 	// XXX can we test if psfMag is set and calculate only if needed?
-	pmSourceMagnitudes (source, psf, photMode, options->maskVal);
+	pmSourceMagnitudes (source, psf, photMode, maskVal); // maskVal includes markVal
 	
+	// clear the mask bit 
+	psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(options->markVal));
+
+        // re-subtract the object, leave local sky
+        pmSourceSub (source, PM_MODEL_OP_FULL, options->maskVal);
+
 	float apMag = -2.5*log10(source->moments->Sum);
 	float dMag = source->psfMag - apMag;
@@ -288,4 +310,6 @@
     pmSourcePhotometryMode photMode = PM_SOURCE_PHOT_WEIGHT;
 
+    psImageMaskType maskVal = options->maskVal | options->markVal;
+
     for (psS32 i = 0 ; i < sources->n ; i++) {
 
@@ -322,6 +346,21 @@
 	psF32 Myy = source->moments->Myy;
 
+        // replace object in image
+        if (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED) {
+            pmSourceAdd (source, PM_MODEL_OP_FULL, options->maskVal);
+        }
+
+	// clear the mask bit and set the circular mask pixels
+	psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(options->markVal));
+	psImageKeepCircle (source->maskObj, source->peak->x, source->peak->y, source->apRadius, "OR", options->markVal);
+
 	// XXX can we test if psfMag is set and calculate only if needed?
-	pmSourceMagnitudes (source, psf, photMode, options->maskVal);
+	pmSourceMagnitudes (source, psf, photMode, maskVal); // maskVal includes markVal
+
+	// clear the mask bit 
+	psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(options->markVal));
+
+        // re-subtract the object, leave local sky
+        pmSourceSub (source, PM_MODEL_OP_FULL, options->maskVal);
 
 	float apMag = -2.5*log10(source->moments->Sum);
@@ -336,7 +375,4 @@
 	bool isPSF = (fabs(nSigma) < options->nSigmaApResid) && (fabs(Mxx - psfClump->X) < options->nSigmaMoments*psfClump->dX) && (fabs(Myy - psfClump->Y) < options->nSigmaMoments*psfClump->dY);
 	if (isPSF) {
-	    if (Mxx > 3.0) {
-		fprintf (stderr, "!");
-	    }
 	    Npsf ++;
 	    continue;
@@ -345,4 +381,5 @@
 	// Defects may not always match CRs from peak curvature analysis
 	// Defects may also be marked as SATSTAR -- XXX deactivate this flag?
+	// XXX this rule is not great
 	if ((Mxx < psfClump->X) || (Myy < psfClump->Y)) {
 	    source->mode |= PM_SOURCE_MODE_DEFECT;
@@ -366,5 +403,5 @@
 	}
 
-	fprintf (stderr, "miss %f,%f : %f %f -- %f\n", source->peak->xf, source->peak->yf, Mxx, Myy, nSigma);
+	psWarning ("sourse size was missed for %f,%f : %f %f -- %f\n", source->peak->xf, source->peak->yf, Mxx, Myy, nSigma);
 	Nmiss ++;
     }
