Index: trunk/psphot/src/psphotFullFit.c
===================================================================
--- trunk/psphot/src/psphotFullFit.c	(revision 5773)
+++ trunk/psphot/src/psphotFullFit.c	(revision 5802)
@@ -1,7 +1,13 @@
 # include "psphot.h"
+
+# define CLEAR_TRACE \
+  if (TEST_SRC_ON) { \
+    psTraceSetLevel (".pmObjects.pmSourceFitModel", 0); \
+    psTraceSetLevel ("psMinimizeLMChi2", 0); \
+    TEST_SRC_ON = false; } \
 
 bool psphotFullFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky) 
 { 
-    bool  skip, status;
+    bool  status;
     float x, y;
     int   Nfit = 0;
@@ -26,4 +32,10 @@
     psphotInitRadiusFLT (config, sky, modelTypeFLT);
 
+    float TEST_SRC_X = psMetadataLookupF32 (&status, config, "TEST_SRC_X");
+    float TEST_SRC_Y = psMetadataLookupF32 (&status, config, "TEST_SRC_Y");
+    bool TEST_SRC_ON = false;
+    bool TEST_SRC    = status;
+    fprintf (stderr, "test src: %f %f\n", TEST_SRC_X, TEST_SRC_Y);
+
     for (int i = 0; i < sources->n; i++) {
 
@@ -37,5 +49,5 @@
 
 	// save the PSF model from the Ensemble fit
-	pmModel *save  = pmModelCopy (source->modelPSF);
+	pmModel *LIN  = pmModelCopy (source->modelPSF);
 
 	// attempt to fit the PSF model
@@ -49,4 +61,10 @@
 	x = modelPSF->params->data.F32[2];
 	y = modelPSF->params->data.F32[3];
+
+	if (TEST_SRC && (fabs(TEST_SRC_X - x) < 5) && (fabs(TEST_SRC_Y - y) < 5)) {
+	    psTraceSetLevel (".pmObjects.pmSourceFitModel", 6);
+	    psTraceSetLevel ("psMinimizeLMChi2", 6);
+	    TEST_SRC_ON = true;
+	}
 
 	// fit PSF model (set/unset the pixel mask)
@@ -63,20 +81,13 @@
 	    pmSourceSubModel (source->pixels, source->mask, source->modelPSF, false, false);
 	    source->mode |= PM_SOURCE_SUBTRACTED;
-	    psFree (save);
+	    psFree (LIN);
 	    Nsub ++;
+	    CLEAR_TRACE;
 	    continue;
 	} 
 
 	// skip the source if we don't think it is extended
-	skip  = (source->type != PM_SOURCE_GALAXY);
-	skip |= (source->moments->SN < GAL_MIN_SN);
-	if (skip) {
-	    source->modelPSF = save;
-	    pmSourceSubModel (source->pixels, source->mask, source->modelPSF, false, false);
-	    source->mode |= PM_SOURCE_SUBTRACTED;
-	    psFree (modelPSF);
-	    Nsub ++;
-	    continue;
-	}
+	if (source->type != PM_SOURCE_GALAXY) goto subLINEAR;
+	if (source->moments->SN < GAL_MIN_SN) goto subLINEAR;
 
 	// add the double-PSF fit mode
@@ -84,8 +95,5 @@
 	
 	// recalculate the source moments using the larger galaxy moments radius
-	if (!pmSourceMoments (source, GAL_MOMENTS_RAD)) {
-	    source->mode |= PM_SOURCE_FAIL;  // better choice?
-	    continue;
-	}
+	if (!pmSourceMoments (source, GAL_MOMENTS_RAD)) goto subLINEAR;
 
 	// use the source moments, etc to guess basic model parameters
@@ -111,16 +119,19 @@
 	    pmSourceSubModel (source->pixels, source->mask, source->modelFLT, false, false);
 	    source->mode |= PM_SOURCE_SUBTRACTED;
-	    psFree (save);
+	    psFree (LIN);
 	    Nsub ++;
+	    CLEAR_TRACE;
 	    continue;
 	}
 
 	// subtract PSF for object, leave local sky
-	// XXX : we should keep the non-linear PSF fit if object was marked extended but
-	//       PSF fit is OK otherwise.
+    subLINEAR:
 	psFree (source->modelPSF);
-	source->modelPSF = save;
+	source->modelPSF = LIN;
 	pmSourceSubModel (source->pixels, source->mask, source->modelPSF, false, false);
 	source->mode |= PM_SOURCE_SUBTRACTED;
+	source->mode |= PM_SOURCE_LINEAR;
+	Nsub ++;
+	CLEAR_TRACE;
     }
 
