Index: trunk/psModules/src/objects/pmModelUtils.c
===================================================================
--- trunk/psModules/src/objects/pmModelUtils.c	(revision 29004)
+++ trunk/psModules/src/objects/pmModelUtils.c	(revision 31153)
@@ -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;
+}
