Index: /branches/eam_branches/ipp-20230313/psModules/src/objects/pmPSF.h
===================================================================
--- /branches/eam_branches/ipp-20230313/psModules/src/objects/pmPSF.h	(revision 42709)
+++ /branches/eam_branches/ipp-20230313/psModules/src/objects/pmPSF.h	(revision 42710)
@@ -79,4 +79,5 @@
     bool          poissonErrorsParams; ///< use poission errors for model parameter fitting
 
+    bool          fitPSFstarCoords; // Allow the PSF star positions to fit in the full fit? (pmPSFtryFitEXT)
     bool          chiFluxTrend;         // Fit a trend in Chi2 as a function of flux?
     pmSourceFitOptions *fitOptions;
Index: /branches/eam_branches/ipp-20230313/psModules/src/objects/pmPSFtryFitEXT.c
===================================================================
--- /branches/eam_branches/ipp-20230313/psModules/src/objects/pmPSFtryFitEXT.c	(revision 42709)
+++ /branches/eam_branches/ipp-20230313/psModules/src/objects/pmPSFtryFitEXT.c	(revision 42710)
@@ -73,6 +73,9 @@
 
     // in this segment, we are fitting the full PSF model class (shape unconstrained)
-    options->fitOptions->mode = PM_SOURCE_FIT_EXT;
-
+    if (options->fitPSFstarCoords) {
+      options->fitOptions->mode = PM_SOURCE_FIT_FULL;
+    } else {
+      options->fitOptions->mode = PM_SOURCE_FIT_EXT;
+    }
     // maskVal is used to test for rejected pixels, and must include markVal
     maskVal |= markVal;
Index: /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSource.c
===================================================================
--- /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSource.c	(revision 42709)
+++ /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSource.c	(revision 42710)
@@ -407,5 +407,5 @@
 *****************************************************************************/
 
-pmPSFClump pmSourcePSFClump(psImage **savedImage, psRegion *region, psArray *sources, float PSF_SN_LIM, float PSF_CLUMP_GRID_SCALE, psF32 SX_MAX, psF32 SY_MAX, psF32 SX_MIN, psF32 SY_MIN, psF32 AR_MAX)
+pmPSFClump pmSourcePSFClump(psImage **savedImage, psRegion *region, psArray *sources, float PSF_SN_LIM, float PSF_CLUMP_GRID_SCALE, psF32 SX_MAX, psF32 SY_MAX, psF32 SX_MIN, psF32 SY_MIN, psF32 AR_MAX, bool useClippedMean)
 {
     psTrace("psModules.objects", 10, "---- begin ----\n");
@@ -601,20 +601,26 @@
         }
 
-        // measures stats of Sx, Sy
-        stats = psStatsAlloc (PS_STAT_CLIPPED_MEAN | PS_STAT_CLIPPED_STDEV);
-
-        if (!psVectorStats (stats, tmpSx, NULL, NULL, 0)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to measure Sx stats");
-            return (emptyClump);
-        }
-        psfClump.X  = stats->clippedMean;
-        psfClump.dX = hypot(stats->clippedStdev, PSF_CLUMP_GRID_SCALE);
-
-        if (!psVectorStats (stats, tmpSy, NULL, NULL, 0)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to measure Sy stats");
-            return (emptyClump);
-        }
-        psfClump.Y  = stats->clippedMean;
-        psfClump.dY = hypot(stats->clippedStdev, PSF_CLUMP_GRID_SCALE);
+	// measures stats of Sx, Sy
+	if (useClippedMean) {
+	  stats = psStatsAlloc (PS_STAT_CLIPPED_MEAN | PS_STAT_CLIPPED_STDEV);
+	} else {
+	  stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV);
+	}
+
+	if (!psVectorStats (stats, tmpSx, NULL, NULL, 0)) {
+	  psError(PS_ERR_UNKNOWN, false, "failed to measure Sx stats");
+	  return (emptyClump);
+	}
+	psfClump.X  = psStatsGetValue (stats, psStatsMeanOption (stats->options)); 
+	psfClump.dX = psStatsGetValue (stats, psStatsStdevOption (stats->options));
+	psfClump.dX = hypot(psfClump.dX, PSF_CLUMP_GRID_SCALE);
+
+	if (!psVectorStats (stats, tmpSy, NULL, NULL, 0)) {
+	  psError(PS_ERR_UNKNOWN, false, "failed to measure Sy stats");
+	  return (emptyClump);
+	}
+	psfClump.Y  = psStatsGetValue (stats, psStatsMeanOption (stats->options)); 
+	psfClump.dY = psStatsGetValue (stats, psStatsStdevOption (stats->options));
+	psfClump.dY = hypot(psfClump.dX, PSF_CLUMP_GRID_SCALE);		     
 
         psTrace ("psModules.objects", 2, "clump  X,  Y: %f, %f\n", psfClump.X, psfClump.Y);
@@ -749,6 +755,12 @@
             }
 
+            psF32 radius = hypot ((sigX-clump.X)/clump.dX, (sigY-clump.Y)/clump.dY);
+
+	    // XXX this is crude cut to avoid using extended sources in the PSF model
+	    // psphot will update this analysis based on the PSF - Kron mags
             // likely unsaturated extended source (too large to be stellar)
-            if (sigX > clump.X + 3*clump.dX || sigY > clump.Y + 3*clump.dY) {
+            // XXX old test: if (sigX > clump.X + 3*clump.dX || sigY > clump.Y + 3*clump.dY) {
+
+            if (radius > 2.0) {
                 source->type = PM_SOURCE_TYPE_EXTENDED;
                 Next ++;
@@ -768,5 +780,4 @@
 
             // PSF star (within 1.5 sigma of clump center, S/N > limit)
-            psF32 radius = hypot ((sigX-clump.X)/clump.dX, (sigY-clump.Y)/clump.dY);
             if ((source->moments->SN > PSF_SN_LIM) && (radius < PSF_CLUMP_NSIGMA)) {
                 source->type = PM_SOURCE_TYPE_STAR;
Index: /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSource.h
===================================================================
--- /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSource.h	(revision 42709)
+++ /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSource.h	(revision 42710)
@@ -245,5 +245,6 @@
     psF32 SX_MIN, 
     psF32 SY_MIN, 
-    psF32 AR_MAX
+    psF32 AR_MAX,
+    bool useClippedMean                 ///< use clipped mean & stdev to define clump, else robust
 );
 
Index: /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSourceFitModel.c
===================================================================
--- /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSourceFitModel.c	(revision 42709)
+++ /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSourceFitModel.c	(revision 42710)
@@ -189,4 +189,10 @@
         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_XPOS] = 0;
         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0;
+        break;
+      case PM_SOURCE_FIT_FULL:
+        // PSFstar Full model fits all shape params and Xo, Yo, Io (not sky)
+        nParams = params->n - 1;
+        psVectorInit (constraint->paramMask, 0);
+        constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
         break;
       case PM_SOURCE_FIT_EXT:
@@ -270,5 +276,5 @@
     model->nPar = nParams;
 
-    psTrace ("psModules.objects", 4, "niter: %d, chisq: %f", myMin->iter, myMin->value);
+    psTrace ("psModules.objects", 4, "niter: %d, chisq: %f, status: %d", myMin->iter, myMin->value, fitStatus);
 
     // save the resulting chisq, nDOF, nIter
Index: /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSourceFitModel.h
===================================================================
--- /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSourceFitModel.h	(revision 42709)
+++ /branches/eam_branches/ipp-20230313/psModules/src/objects/pmSourceFitModel.h	(revision 42710)
@@ -18,4 +18,5 @@
     PM_SOURCE_FIT_PSF,
     PM_SOURCE_FIT_EXT,
+    PM_SOURCE_FIT_FULL,
     PM_SOURCE_FIT_PSF_AND_SKY,
     PM_SOURCE_FIT_EXT_AND_SKY,
