Index: /branches/eam_branches/ipp-20100621/psModules/src/detrend/pmShutterCorrection.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/detrend/pmShutterCorrection.c	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/detrend/pmShutterCorrection.c	(revision 28656)
@@ -302,5 +302,5 @@
     PS_ASSERT_PTR_NON_NULL(guess, NULL);
 
-    psMinimization *minInfo = psMinimizationAlloc(15, 0.1); // Minimization information
+    psMinimization *minInfo = psMinimizationAlloc(15, 0.1, 1.0); // Minimization information
 
     psVector *params = psVectorAlloc (3, PS_TYPE_F32); // Fitting parameters
Index: /branches/eam_branches/ipp-20100621/psModules/src/imcombine/pmPSFEnvelope.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/imcombine/pmPSFEnvelope.c	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/imcombine/pmPSFEnvelope.c	(revision 28656)
@@ -416,5 +416,6 @@
     options->fitOptions                = pmSourceFitOptionsAlloc();
     options->fitOptions->nIter         = SOURCE_FIT_ITERATIONS;
-    options->fitOptions->tol           = 0.01;
+    options->fitOptions->minTol        = 0.01;
+    options->fitOptions->maxTol        = 1.00;
     options->fitOptions->poissonErrors = true;
     options->fitOptions->weight        = VARIANCE_VAL;
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/models/pmModel_SERSIC.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/models/pmModel_SERSIC.c	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/models/pmModel_SERSIC.c	(revision 28656)
@@ -243,6 +243,5 @@
 
     // the other parameters depend on the guess for PAR_7
-    if (0) {
-    } else {
+    if (!isfinite(PAR[PM_PAR_7])) {
 	PAR[PM_PAR_7]    = 0.25;
 	// PAR[PM_PAR_7]    = 0.125;
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmModel.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmModel.c	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmModel.c	(revision 28656)
@@ -81,6 +81,6 @@
 
     for (psS32 i = 0; i < tmp->params->n; i++) {
-        tmp->params->data.F32[i] = 0.0;
-        tmp->dparams->data.F32[i] = 0.0;
+        tmp->params->data.F32[i] = NAN;
+        tmp->dparams->data.F32[i] = NAN;
     }
 
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmModelFuncs.h
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmModelFuncs.h	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmModelFuncs.h	(revision 28656)
@@ -41,5 +41,6 @@
     PM_MODEL_STATUS_OFFIMAGE     = 0x04, ///< model fit drove out of range
     PM_MODEL_STATUS_BADARGS      = 0x08, ///< model fit called with invalid args
-    PM_MODEL_STATUS_LIMITS       = 0x10  ///< model parameters hit limits
+    PM_MODEL_STATUS_LIMITS       = 0x10, ///< model parameters hit limits
+    PM_MODEL_STATUS_WEAK_FIT     = 0x20, ///< model fit met loose tolerance, but not tight tolerance
 } pmModelStatus;
 
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitModel.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitModel.c	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitModel.c	(revision 28656)
@@ -44,5 +44,5 @@
 void pmSourceFitOptionsFree(pmSourceFitOptions *opt)
 {
-        return;
+    return;
 }
 
@@ -53,7 +53,9 @@
 
     opt->mode = PM_SOURCE_FIT_PSF;
-    opt->nIter = 15;
-    opt->tol = 0.1;
-    opt->weight = 1.0;
+    opt->nIter  = 15;
+    opt->minTol = 0.01;
+    opt->maxTol = 1.00;
+    opt->weight = 1.00;
+    opt->maxChisqDOF = NAN;
     opt->poissonErrors = true;
 
@@ -103,6 +105,6 @@
             // skip nan values in image
             if (!isfinite(source->variance->data.F32[i][j])) {
-	      fprintf (stderr, "impossible! %x vs %x\n", source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[i][j], maskVal);
-	      continue;
+		fprintf (stderr, "impossible! %x vs %x\n", source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[i][j], maskVal);
+		continue;
             }
 
@@ -142,5 +144,5 @@
     int nParams = 0;
     switch (options->mode) {
-    case PM_SOURCE_FIT_NORM:
+      case PM_SOURCE_FIT_NORM:
         // NORM-only model fits only source normalization (Io)
         nParams = 1;
@@ -148,5 +150,5 @@
         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
         break;
-    case PM_SOURCE_FIT_PSF:
+      case PM_SOURCE_FIT_PSF:
         // PSF model only fits x,y,Io
         nParams = 3;
@@ -156,5 +158,5 @@
         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0;
         break;
-    case PM_SOURCE_FIT_EXT:
+      case PM_SOURCE_FIT_EXT:
         // EXT model fits all params (except sky)
         nParams = params->n - 1;
@@ -162,11 +164,33 @@
         constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
         break;
-    default:
-        psAbort("invalid fitting mode");
+      case PM_SOURCE_FIT_INDEX:
+        // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params
+	psVectorInit (constraint->paramMask, 1);
+	constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0;
+        if (params->n == 7) {
+	    nParams = 1;
+	} else {
+	    nParams = 2;
+	    constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0;
+	}
+	break;
+      case PM_SOURCE_FIT_NO_INDEX:
+        // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params
+	psVectorInit (constraint->paramMask, 0);
+	constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1;
+        if (params->n == 7) {
+	    nParams = params->n - 1;
+	} else {
+	    nParams = params->n - 2;
+	    constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1;
+	}
+	break;
+      default:
+	psAbort("invalid fitting mode");
     }
     // force the floating parameters to fall within the contraint ranges
     for (int i = 0; i < params->n; i++) {
-        model->modelLimits (PS_MINIMIZE_PARAM_MIN, i, params->data.F32, NULL);
-        model->modelLimits (PS_MINIMIZE_PARAM_MAX, i, params->data.F32, NULL);
+	model->modelLimits (PS_MINIMIZE_PARAM_MIN, i, params->data.F32, NULL);
+	model->modelLimits (PS_MINIMIZE_PARAM_MAX, i, params->data.F32, NULL);
     }
 
@@ -181,5 +205,5 @@
     }
 
-    psMinimization *myMin = psMinimizationAlloc (options->nIter, options->tol);
+    psMinimization *myMin = psMinimizationAlloc (options->nIter, options->minTol, options->maxTol);
 
     psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32);
@@ -202,4 +226,5 @@
     model->flags |= PM_MODEL_STATUS_FITTED;
     if (!fitStatus) model->flags |= PM_MODEL_STATUS_NONCONVERGE;
+    if (myMin->lastDelta > myMin->minTol) model->flags |= PM_MODEL_STATUS_WEAK_FIT;
 
     // get the Gauss-Newton distance for fixed model parameters
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitModel.h
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitModel.h	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitModel.h	(revision 28656)
@@ -19,5 +19,7 @@
     PM_SOURCE_FIT_EXT,
     PM_SOURCE_FIT_PSF_AND_SKY,
-    PM_SOURCE_FIT_EXT_AND_SKY
+    PM_SOURCE_FIT_EXT_AND_SKY,
+    PM_SOURCE_FIT_INDEX,
+    PM_SOURCE_FIT_NO_INDEX,
 } pmSourceFitMode;
 
@@ -25,5 +27,7 @@
     pmSourceFitMode mode;		///< optionally fit all or a subset of parameters
     float nIter;			///< max number of allowed iterations
-    float tol;				///< convergence criterion
+    float minTol;			///< convergence criterion
+    float maxTol;			///< convergence criterion
+    float maxChisqDOF;			///< convergence criterion
     float weight;			///< use this weight for constant-weight fits
     bool poissonErrors;			///< use poisson errors for fits?
Index: /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitSet.c
===================================================================
--- /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitSet.c	(revision 28655)
+++ /branches/eam_branches/ipp-20100621/psModules/src/objects/pmSourceFitSet.c	(revision 28656)
@@ -541,5 +541,5 @@
     }
 
-    psMinimization *myMin = psMinimizationAlloc (options->nIter, options->tol);
+    psMinimization *myMin = psMinimizationAlloc (options->nIter, options->minTol, options->maxTol);
 
     psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32);
