Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_DEV.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_DEV.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_DEV.c	(revision 31034)
@@ -217,44 +217,29 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-    pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
-    psF32     *PAR  = model->params->data.F32;
-
-    psEllipseMoments emoments;
-    emoments.x2 = moments->Mxx;
-    emoments.xy = moments->Mxy;
-    emoments.y2 = moments->Myy;
-
-    // force the axis ratio to be < 20.0
-    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
-
-    if (!isfinite(axes.major)) return false;
-    if (!isfinite(axes.minor)) return false;
-    if (!isfinite(axes.theta)) return false;
-
-    psEllipseShape shape = psEllipseAxesToShape (axes);
-
-    if (!isfinite(shape.sx))  return false;
-    if (!isfinite(shape.sy))  return false;
-    if (!isfinite(shape.sxy)) return false;
-
-    // the other parameters depend on the guess for PAR_7
+    psF32 *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
+    PAR[PM_PAR_SKY]  = 0.0;
+
+    // set the shape parameters
+    if (!pmModelSetShape(&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], source->moments)) {
+      return false;
+    }
+
+    // the normalization is modified by the slope
     float index = 0.5 / ALPHA;
     float bn = 1.9992*index - 0.3271;
-    // float fR = 1.0 / (sqrt(2.0) * pow (bn, index));
     float Io = exp(0.5*bn);
 
-    float Sxx = PS_MAX(0.5, shape.sx);
-    float Syy = PS_MAX(0.5, shape.sy);
-
-    PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux / Io;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
-    // PAR[PM_PAR_SXX]  = Sxx * fR;
-    // PAR[PM_PAR_SYY]  = Syy * fR;
-    PAR[PM_PAR_SXX]  = Sxx;
-    PAR[PM_PAR_SYY]  = Syy;
-    PAR[PM_PAR_SXY]  = shape.sxy;
+    // set the model normalization
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+    PAR[PM_PAR_I0] /= Io;
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
 
     return(true);
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_EXP.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_EXP.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_EXP.c	(revision 31034)
@@ -210,33 +210,24 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-    pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
-    psF32     *PAR  = model->params->data.F32;
-
-    psEllipseMoments emoments;
-    emoments.x2 = moments->Mxx;
-    emoments.xy = moments->Mxy;
-    emoments.y2 = moments->Myy;
-
-    // force the axis ratio to be < 20.0
-    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
-
-    if (!isfinite(axes.major)) return false;
-    if (!isfinite(axes.minor)) return false;
-    if (!isfinite(axes.theta)) return false;
-
-    psEllipseShape shape = psEllipseAxesToShape (axes);
-
-    if (!isfinite(shape.sx))  return false;
-    if (!isfinite(shape.sy))  return false;
-    if (!isfinite(shape.sxy)) return false;
-
+    psF32 *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
     PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
-    PAR[PM_PAR_SXX]  = PS_MAX(0.5, M_SQRT2*shape.sx);
-    PAR[PM_PAR_SYY]  = PS_MAX(0.5, M_SQRT2*shape.sy);
-    PAR[PM_PAR_SXY]  = shape.sxy;
+
+    // set the shape parameters
+    if (!pmModelSetShape(&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], source->moments)) {
+      return false;
+    }
+
+    // set the model normalization
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
+
     return(true);
 }
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_GAUSS.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_GAUSS.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_GAUSS.c	(revision 31034)
@@ -193,24 +193,24 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-    pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
-    psF32     *PAR  = model->params->data.F32;
-
-    psEllipseMoments emoments;
-    emoments.x2 = moments->Mxx;
-    emoments.y2 = moments->Myy;
-    emoments.xy = moments->Mxy;
-
-    // force the axis ratio to be < 20.0
-    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
-    psEllipseShape shape = psEllipseAxesToShape (axes);
-
+    psF32 *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
     PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
-    PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx);
-    PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy);
-    PAR[PM_PAR_SXY] = shape.sxy;
+
+    // set the shape parameters
+    if (!pmModelSetShape(&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], source->moments)) {
+      return false;
+    }
+
+    // set the model normalization
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
+
     return(true);
 }
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_PGAUSS.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_PGAUSS.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_PGAUSS.c	(revision 31034)
@@ -194,23 +194,24 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-    pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
-    psF32     *PAR     = model->params->data.F32;
-
-    psEllipseMoments emoments;
-    emoments.x2 = moments->Mxx;
-    emoments.xy = moments->Mxy;
-    emoments.y2 = moments->Myy;
-
-    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
-    psEllipseShape shape = psEllipseAxesToShape (axes);
-
+    psF32 *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
     PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
-    PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx);
-    PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy);
-    PAR[PM_PAR_SXY] = shape.sxy;
+
+    // set the shape parameters
+    if (!pmModelSetShape(&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], source->moments)) {
+      return false;
+    }
+
+    // set the model normalization
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
+
     return(true);
 }
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_PS1_V1.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_PS1_V1.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_PS1_V1.c	(revision 31034)
@@ -213,33 +213,25 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-    pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
-    psF32     *PAR  = model->params->data.F32;
-
-    psEllipseMoments emoments;
-    emoments.x2 = moments->Mxx;
-    emoments.xy = moments->Mxy;
-    emoments.y2 = moments->Myy;
-
-    // force the axis ratio to be < 20.0
-    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
-
-    if (!isfinite(axes.major)) return false;
-    if (!isfinite(axes.minor)) return false;
-    if (!isfinite(axes.theta)) return false;
-
-    psEllipseShape shape = psEllipseAxesToShape (axes);
-
-    if (!isfinite(shape.sx))  return false;
-    if (!isfinite(shape.sy))  return false;
-    if (!isfinite(shape.sxy)) return false;
-
+    psF32 *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
     PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
-    PAR[PM_PAR_SXX]  = PS_MAX(0.5, M_SQRT2*shape.sx);
-    PAR[PM_PAR_SYY]  = PS_MAX(0.5, M_SQRT2*shape.sy);
-    PAR[PM_PAR_SXY]  = shape.sxy;
+
+    // set the shape parameters
+    if (!pmModelSetShape(&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], source->moments)) {
+      return false;
+    }
+
+    // set the model normalization
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
+
+    // extra parameter
     PAR[PM_PAR_7]    = 0.5;
 
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_QGAUSS.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_QGAUSS.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_QGAUSS.c	(revision 31034)
@@ -214,33 +214,25 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-    pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
-    psF32     *PAR  = model->params->data.F32;
-
-    psEllipseMoments emoments;
-    emoments.x2 = moments->Mxx;
-    emoments.xy = moments->Mxy;
-    emoments.y2 = moments->Myy;
-
-    // force the axis ratio to be < 20.0
-    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
-
-    if (!isfinite(axes.major)) return false;
-    if (!isfinite(axes.minor)) return false;
-    if (!isfinite(axes.theta)) return false;
-
-    psEllipseShape shape = psEllipseAxesToShape (axes);
-
-    if (!isfinite(shape.sx))  return false;
-    if (!isfinite(shape.sy))  return false;
-    if (!isfinite(shape.sxy)) return false;
-
+    psF32 *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
     PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
-    PAR[PM_PAR_SXX]  = PS_MAX(0.5, M_SQRT2*shape.sx);
-    PAR[PM_PAR_SYY]  = PS_MAX(0.5, M_SQRT2*shape.sy);
-    PAR[PM_PAR_SXY]  = shape.sxy;
+
+    // set the shape parameters
+    if (!pmModelSetShape(&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], source->moments)) {
+      return false;
+    }
+
+    // set the model normalization
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
+
+    // extra parameter
     PAR[PM_PAR_7]    = 1.0;
 
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_RGAUSS.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_RGAUSS.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_RGAUSS.c	(revision 31034)
@@ -203,33 +203,25 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-    pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
-    psF32     *PAR  = model->params->data.F32;
-
-    psEllipseMoments emoments;
-    emoments.x2 = moments->Mxx;
-    emoments.xy = moments->Mxy;
-    emoments.y2 = moments->Myy;
-
-    // force the axis ratio to be < 20.0
-    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
-
-    if (!isfinite(axes.major)) return false;
-    if (!isfinite(axes.minor)) return false;
-    if (!isfinite(axes.theta)) return false;
-
-    psEllipseShape shape = psEllipseAxesToShape (axes);
-
-    if (!isfinite(shape.sx))  return false;
-    if (!isfinite(shape.sy))  return false;
-    if (!isfinite(shape.sxy)) return false;
-
+    psF32 *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
     PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
-    PAR[PM_PAR_SXX]  = PS_MAX(0.5, shape.sx);
-    PAR[PM_PAR_SYY]  = PS_MAX(0.5, shape.sy);
-    PAR[PM_PAR_SXY]  = shape.sxy;
+
+    // set the shape parameters
+    if (!pmModelSetShape(&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], source->moments)) {
+      return false;
+    }
+
+    // set the model normalization
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
+
+    // extra parameter
     PAR[PM_PAR_7]    = 1.5;
 
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_SERSIC.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_SERSIC.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/models/pmModel_SERSIC.c	(revision 31034)
@@ -222,6 +222,8 @@
 {
     pmMoments *moments = source->moments;
-    pmPeak    *peak    = source->peak;
     psF32     *PAR  = model->params->data.F32;
+
+    // sky is set to 0.0
+    PAR[PM_PAR_SKY]  = 0.0;
 
     // the other parameters depend on the guess for PAR_7
@@ -236,4 +238,5 @@
     float Zero  = 1.16 - 0.615 * PAR[PM_PAR_7];
 
+    // Sersic shape is a bit special
     psEllipseMoments emoments;
     emoments.x2 = moments->Mxx;
@@ -273,11 +276,18 @@
     float Syy = PS_MAX(0.5, shape.sy);
 
-    PAR[PM_PAR_SKY]  = 0.0;
-    PAR[PM_PAR_I0]   = peak->rawFlux / Io;
-    PAR[PM_PAR_XPOS] = peak->xf;
-    PAR[PM_PAR_YPOS] = peak->yf;
     PAR[PM_PAR_SXX]  = Sxx;
     PAR[PM_PAR_SYY]  = Syy;
     PAR[PM_PAR_SXY]  = shape.sxy;
+
+    // set the model normalization (adjust for Sersic best guess)
+    if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) {
+      return false;
+    }
+    PAR[PM_PAR_I0] /= Io;
+
+    // set the model position
+    if (!pmModelSetPosition(&PAR[PM_PAR_XPOS], &PAR[PM_PAR_YPOS], source)) {
+      return false;
+    }
 
     return(true);
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/pmModelUtils.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/pmModelUtils.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/pmModelUtils.c	(revision 31034)
@@ -107,2 +107,56 @@
     return true;
 }
+
+bool pmModelSetShape (float *Sxx, float *Sxy, float *Syy, pmMoments *moments) {
+
+    psEllipseMoments emoments;
+    emoments.x2 = moments->Mxx;
+    emoments.xy = moments->Mxy;
+    emoments.y2 = moments->Myy;
+
+    // force the axis ratio to be < 20.0
+    psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0);
+
+    if (!isfinite(axes.major)) return false;
+    if (!isfinite(axes.minor)) return false;
+    if (!isfinite(axes.theta)) return false;
+
+    psEllipseShape shape = psEllipseAxesToShape (axes);
+
+    if (!isfinite(shape.sx))  return false;
+    if (!isfinite(shape.sy))  return false;
+    if (!isfinite(shape.sxy)) return false;
+
+    // set the shape parameters
+    *Sxx  = PS_MAX(0.5, M_SQRT2*shape.sx);
+    *Syy  = PS_MAX(0.5, M_SQRT2*shape.sy);
+    *Sxy  = shape.sxy;
+
+    return true;
+}
+
+bool pmModelSetNorm (float *Io, pmSource *source) {
+
+    *Io = source->peak->rawFlux;
+    if (!isfinite(*Io) && !source->moments) return false;
+
+    *Io = source->moments->Peak;
+    if (!isfinite(*Io)) return false;
+
+    return true;
+}
+
+bool pmModelSetPosition (float *Xo, float *Yo, pmSource *source) {
+
+    bool useMoments = pmSourcePositionUseMoments(source);
+    
+    if (useMoments) {
+	*Xo = source->moments->Mx;
+	*Yo = source->moments->My;
+    } else {
+	*Xo = source->peak->xf;
+	*Yo = source->peak->yf;
+    }
+
+    return true;
+}
Index: /branches/eam_branches/ipp-20110213/psModules/src/objects/pmModelUtils.h
===================================================================
--- /branches/eam_branches/ipp-20110213/psModules/src/objects/pmModelUtils.h	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psModules/src/objects/pmModelUtils.h	(revision 31034)
@@ -42,5 +42,7 @@
     );
 
-
+bool pmModelSetPosition (float *Xo, float *Yo, pmSource *source);
+bool pmModelSetNorm (float *Io, pmSource *source);
+bool pmModelSetShape (float *Sxx, float *Sxy, float *Syy, pmMoments *moments);
 
 /// @}
Index: /branches/eam_branches/ipp-20110213/psphot/src/psphotGuessModels.c
===================================================================
--- /branches/eam_branches/ipp-20110213/psphot/src/psphotGuessModels.c	(revision 31033)
+++ /branches/eam_branches/ipp-20110213/psphot/src/psphotGuessModels.c	(revision 31034)
@@ -177,4 +177,7 @@
         // the guess central intensity comes from the peak:
         float Io = source->peak->rawFlux;
+        if (!isfinite(Io) && source->moments) {
+	  Io = source->moments->Peak;
+	}
 
         // We have two options to get a guess for the object position: the position from the
