Index: trunk/psphot/src/psphot.c
===================================================================
--- trunk/psphot/src/psphot.c	(revision 31452)
+++ trunk/psphot/src/psphot.c	(revision 31673)
@@ -4,4 +4,5 @@
 int main (int argc, char **argv) {
 
+    psMemInit();
     psTimerStart ("complete");
     pmErrorRegister();                  // register psModule's error codes/messages
Index: trunk/psphot/src/psphotChoosePSF.c
===================================================================
--- trunk/psphot/src/psphotChoosePSF.c	(revision 31452)
+++ trunk/psphot/src/psphotChoosePSF.c	(revision 31673)
@@ -373,4 +373,6 @@
     }
 
+
+
     char *modelName = pmModelClassGetName (psf->type);
     psLogMsg ("psphot.pspsf", PS_LOG_INFO, "select psf model: %f sec\n", psTimerMark ("psphot.choose.psf"));
@@ -503,4 +505,5 @@
       }
       psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "PSF_EXT1", PS_META_REPLACE, "PSF extra param 1", stats->sampleMean);
+      psLogMsg ("psphot", PS_LOG_DETAIL, "PSF extra parameter 1: %f +/- %f", stats->sampleMean, stats->sampleStdev);
     }
 
@@ -511,8 +514,11 @@
       }
       psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "PSF_EXT2", PS_META_REPLACE, "PSF extra param 2", stats->sampleMean);
-    }
-
-    psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "ANGLE",    PS_META_REPLACE, "PSF angle",           axes.theta);
+      psLogMsg ("psphot", PS_LOG_DETAIL, "PSF extra parameter 2: %f +/- %f", stats->sampleMean, stats->sampleStdev);
+    }
+
+    // psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "ANGLE",    PS_META_REPLACE, "PSF angle",           axes.theta);
     psMetadataAddS32 (readout->analysis, PS_LIST_TAIL, "NPSFSTAR", PS_META_REPLACE, "Number of stars used to make PSF", psf->nPSFstars);
+
+    // psLogMsg ("psphot", PS_LOG_DETAIL, "PSF angle: %f, nstars: %d", axes.theta, psf->nPSFstars);
 
     char *psfModelName = pmModelClassGetName(psf->type);
Index: trunk/psphot/src/psphotExtendedSourceFits.c
===================================================================
--- trunk/psphot/src/psphotExtendedSourceFits.c	(revision 31452)
+++ trunk/psphot/src/psphotExtendedSourceFits.c	(revision 31673)
@@ -268,4 +268,5 @@
     float radius;
     psScalar *scalar = NULL;
+    pmMoments psfMoments;
 
     // arguments: readout, sources, models, region, psfSize, maskVal, markVal
@@ -333,7 +334,9 @@
 	// this uses the footprint to judge both radius and aperture?
 	// XXX save the psf-based moments for output
+	psfMoments = *source->moments;
 	if (!pmSourceMoments (source, radius, 0.0, 0.0, 0.0, maskVal)) {
+	    // subtract the best fit from the object, leave local sky
 	    fprintf (stderr, "skipping (2) %f, %f\n", source->peak->xf, source->peak->yf);
-	    // subtract the best fit from the object, leave local sky
+	    *source->moments = psfMoments;
 	    pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);
 	    // XXX raise an error flag of some kind
@@ -348,4 +351,5 @@
 	    if (!modelFluxStart) {
 		fprintf (stderr, "skipping (3) %f, %f\n", source->peak->xf, source->peak->yf);
+		*source->moments = psfMoments;
 		pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);
 		// XXX raise an error of some kind?
@@ -467,4 +471,5 @@
           source->modelFlux = modelFluxStart;
 
+	  *source->moments = psfMoments;
           pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);
 
@@ -492,4 +497,7 @@
         source->modelFlux = psMemIncrRefCounter (modelFluxes->data[minModel]);
 
+	// replace the original moments
+	*source->moments = psfMoments;
+
         // subtract the best fit from the object, leave local sky
         pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);
Index: trunk/psphot/src/psphotKronMasked.c
===================================================================
--- trunk/psphot/src/psphotKronMasked.c	(revision 31452)
+++ trunk/psphot/src/psphotKronMasked.c	(revision 31673)
@@ -1,5 +1,5 @@
 # include "psphotInternal.h"
 
-bool psphotKronMag (pmSource *source, float radius, psImageMaskType maskVal);
+bool psphotKronMag (pmSource *source, float radius, float minKronRadius, psImageMaskType maskVal);
 
 bool psphotKronMasked (pmConfig *config, const pmFPAview *view, const char *filerule)
@@ -65,4 +65,9 @@
     if (!status) {
         RADIUS = psMetadataLookupF32 (&status, recipe, "PSF_MOMENTS_RADIUS");
+    }
+
+    float MIN_KRON_RADIUS = psMetadataLookupF32 (&status, readout->analysis, "MOMENTS_MIN_KRON");
+    if (!status) {
+        MIN_KRON_RADIUS = 0.25*RADIUS;
     }
 
@@ -96,5 +101,5 @@
         }
 
-	psphotKronMag (source, RADIUS, maskVal);
+	psphotKronMag (source, RADIUS, MIN_KRON_RADIUS, maskVal);
 
         // re-subtract the object, leave local sky
@@ -138,5 +143,5 @@
 }
 
-bool psphotKronMag (pmSource *source, float radius, psImageMaskType maskVal) {
+bool psphotKronMag (pmSource *source, float radius, float minKronRadius, psImageMaskType maskVal) {
 
     PS_ASSERT_PTR_NON_NULL(source, false);
@@ -219,5 +224,8 @@
 
     // Saturate the 1st radial moment
-    float Mrf = MIN(radius, MAX(0.25*radius, RF/RS));
+    float Mrf = MAX(minKronRadius, RF/RS);
+    if (sqrt(source->peak->detValue) < 10.0) {
+	Mrf = MIN (radius, Mrf);
+    }
 
     // Calculate the Kron magnitude (make this block optional?)
@@ -263,6 +271,9 @@
 	}
     }
+
+    source->moments->Mrh = Mrf;
+
     // XXX for a test, save the old values here:
-    source->moments->KronCore    = source->moments->KronFlux;
+    source->moments->KronFouter    = source->moments->KronFlux;
     source->moments->KronCoreErr = source->moments->KronFluxErr;
 
Index: trunk/psphot/src/psphotMagnitudes.c
===================================================================
--- trunk/psphot/src/psphotMagnitudes.c	(revision 31452)
+++ trunk/psphot/src/psphotMagnitudes.c	(revision 31673)
@@ -212,7 +212,5 @@
         if (status && isfinite(source->apFlux)) {
 	    Nap ++;
-	} else {
-	    fprintf (stderr, "failed to measure mag for source @ %f,%f\n", source->peak->xf, source->peak->yf);
-	}
+	} 
 
         // clear the mask bit
Index: trunk/psphot/src/psphotRoughClass.c
===================================================================
--- trunk/psphot/src/psphotRoughClass.c	(revision 31452)
+++ trunk/psphot/src/psphotRoughClass.c	(revision 31673)
@@ -180,6 +180,20 @@
             psAssert (status, "missing MOMENTS_SY_MAX");
         }
-
-        psfClump = pmSourcePSFClump (NULL, region, sources, PSF_SN_LIM, PSF_CLUMP_GRID_SCALE, MOMENTS_SX_MAX, MOMENTS_SY_MAX, MOMENTS_AR_MAX);
+        float MOMENTS_SX_MIN = psMetadataLookupF32(&status, analysis, "MOMENTS_SX_MIN");
+        if (!status) {
+            MOMENTS_SX_MIN = psMetadataLookupF32(&status, recipe, "MOMENTS_SX_MIN");
+            if (!status) {
+		MOMENTS_SX_MIN = 0.5;
+	    }
+        }
+        float MOMENTS_SY_MIN = psMetadataLookupF32(&status, analysis, "MOMENTS_SY_MIN");
+        if (!status) {
+            MOMENTS_SY_MIN = psMetadataLookupF32(&status, recipe, "MOMENTS_SY_MIN");
+            if (!status) {
+		MOMENTS_SY_MIN = 0.5;
+	    }
+        }
+
+        psfClump = pmSourcePSFClump (NULL, region, sources, PSF_SN_LIM, PSF_CLUMP_GRID_SCALE, MOMENTS_SX_MAX, MOMENTS_SY_MAX, MOMENTS_SX_MIN, MOMENTS_SY_MIN, MOMENTS_AR_MAX);
 
         psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X",  PS_META_REPLACE, "psf clump center", psfClump.X);
Index: trunk/psphot/src/psphotSkyReplace.c
===================================================================
--- trunk/psphot/src/psphotSkyReplace.c	(revision 31452)
+++ trunk/psphot/src/psphotSkyReplace.c	(revision 31673)
@@ -41,5 +41,5 @@
     // select the corresponding images
     psF32 **image = readout->image->data.F32;
-    psImageMaskType  **mask  = readout->mask->data.PS_TYPE_IMAGE_MASK_DATA;
+    // psImageMaskType  **mask  = readout->mask->data.PS_TYPE_IMAGE_MASK_DATA;
     psF32 **back  = background->image->data.F32;
 
@@ -47,5 +47,5 @@
     for (int j = 0; j < readout->image->numRows; j++) {
         for (int i = 0; i < readout->image->numCols; i++) {
-            if (!mask[j][i]) {
+            if (isfinite(image[j][i]) && isfinite(back[j][i])) {
                 image[j][i] += back[j][i];
             }
Index: trunk/psphot/src/psphotSourceStats.c
===================================================================
--- trunk/psphot/src/psphotSourceStats.c	(revision 31452)
+++ trunk/psphot/src/psphotSourceStats.c	(revision 31673)
@@ -505,4 +505,13 @@
     psF32 MOMENTS_AR_MAX = psMetadataLookupF32(&status, recipe, "MOMENTS_AR_MAX"); psAssert (status, "missing MOMENTS_AR_MAX");
 
+    float MOMENTS_SX_MIN = psMetadataLookupF32(&status, recipe, "MOMENTS_SX_MIN");
+    if (!status) {
+	MOMENTS_SX_MIN = 0.5;
+    }
+    float MOMENTS_SY_MIN = psMetadataLookupF32(&status, recipe, "MOMENTS_SY_MIN");
+    if (!status) {
+	MOMENTS_SY_MIN = 0.5;
+    }
+
     // when we set the window, we are not attempting to measure spatial variations; we can use a somewhat higher S/N limit
     // since we are using all sources (true?)
@@ -544,5 +553,5 @@
 
         // determine the PSF parameters from the source moment values
-        pmPSFClump psfClump = pmSourcePSFClump (NULL, NULL, sources, PSF_SN_LIM, PSF_CLUMP_GRID_SCALE, MOMENTS_SX_MAX, MOMENTS_SY_MAX, MOMENTS_AR_MAX);
+        pmPSFClump psfClump = pmSourcePSFClump (NULL, NULL, sources, PSF_SN_LIM, PSF_CLUMP_GRID_SCALE, MOMENTS_SX_MAX, MOMENTS_SY_MAX, MOMENTS_SX_MIN, MOMENTS_SY_MIN, MOMENTS_AR_MAX);
         psLogMsg ("psphot", 3, "radius %.1f, nStars: %d of %d in clump, nSigma: %5.2f, X,  Y: %f, %f (%f, %f)\n", sigma[i], psfClump.nStars, psfClump.nTotal, psfClump.nSigma, psfClump.X, psfClump.Y, sqrt(psfClump.X) / sigma[i], sqrt(psfClump.Y) / sigma[i]);
 
