Index: trunk/psphot/src/models/pmModel_TEST1.c
===================================================================
--- trunk/psphot/src/models/pmModel_TEST1.c	(revision 11702)
+++ trunk/psphot/src/models/pmModel_TEST1.c	(revision 14655)
@@ -16,19 +16,17 @@
  *****************************************************************************/
 
-# define PM_MODEL_FUNC       pmModelFunc_TEST1
-# define PM_MODEL_FLUX       pmModelFlux_TEST1
-# define PM_MODEL_GUESS      pmModelGuess_TEST1
-# define PM_MODEL_LIMITS     pmModelLimits_TEST1
-# define PM_MODEL_RADIUS     pmModelRadius_TEST1
-# define PM_MODEL_FROM_PSF   pmModelFromPSF_TEST1
-# define PM_MODEL_FIT_STATUS pmModelFitStatus_TEST1
-
-// XXX consider changing to form PAR[SXY]*(1/PAR[SXX]^2 + 1/PAR[SYY]^2)*X*Y
-// this would provide natural limits on PAR[SXY] of -0.25 : +0.25
+# define PM_MODEL_FUNC       	  pmModelFunc_TEST1
+# define PM_MODEL_FLUX       	  pmModelFlux_TEST1
+# define PM_MODEL_GUESS      	  pmModelGuess_TEST1
+# define PM_MODEL_LIMITS     	  pmModelLimits_TEST1
+# define PM_MODEL_RADIUS     	  pmModelRadius_TEST1
+# define PM_MODEL_FROM_PSF   	  pmModelFromPSF_TEST1
+# define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_TEST1
+# define PM_MODEL_FIT_STATUS      pmModelFitStatus_TEST1
 
 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y)
 psF32 PM_MODEL_FUNC(psVector *deriv,
-                         const psVector *params,
-                         const psVector *pixcoord)
+		    const psVector *params,
+		    const psVector *pixcoord)
 {
     psF32 *PAR = params->data.F32;
@@ -127,5 +125,4 @@
 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
 {
-
     pmMoments *moments = source->moments;
     psF32     *PAR  = model->params->data.F32;
@@ -160,5 +157,5 @@
     norm = 0.0;
 
-    # define DZ 0.25
+# define DZ 0.25
 
     float f0 = 1.0;
@@ -209,17 +206,16 @@
 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)
 {
-
     psF32 *out = modelPSF->params->data.F32;
     psF32 *in  = modelFLT->params->data.F32;
 
     // we require these two parameters to exist
-    assert (psf->params_NEW->n > PM_PAR_YPOS);
-    assert (psf->params_NEW->n > PM_PAR_XPOS);
-
-    for (int i = 0; i < psf->params_NEW->n; i++) {
-	if (psf->params_NEW->data[i] == NULL) {
+    assert (psf->params->n > PM_PAR_YPOS);
+    assert (psf->params->n > PM_PAR_XPOS);
+
+    for (int i = 0; i < psf->params->n; i++) {
+	if (psf->params->data[i] == NULL) {
 	    out[i] = in[i];
 	} else {	    
-	    psPolynomial2D *poly = psf->params_NEW->data[i];
+	    psPolynomial2D *poly = psf->params->data[i];
 	    out[i] = psPolynomial2DEval(poly, in[PM_PAR_XPOS], in[PM_PAR_YPOS]);
 	}
@@ -229,4 +225,53 @@
     out[PM_PAR_SXY] = pmPSF_SXYtoModel (out);
 
+    return(true);
+}
+
+// construct the PSF model from the FLT model and the psf
+// XXX is this sufficiently general do be a global function, not a pmModelClass function?
+bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, pmPSF *psf, float Xo, float Yo, float Io)
+{
+    psF32 *PAR = model->params->data.F32;
+
+    // we require these two parameters to exist
+    assert (psf->params->n > PM_PAR_YPOS);
+    assert (psf->params->n > PM_PAR_XPOS);
+
+    PAR[PM_PAR_SKY]  = 0.0;
+    PAR[PM_PAR_I0]   = Io;
+    PAR[PM_PAR_XPOS] = Xo;
+    PAR[PM_PAR_YPOS] = Yo;
+    
+    // supply the model-fitted parameters, or copy from the input
+    for (int i = 0; i < psf->params->n; i++) {
+	if (i == PM_PAR_SKY) continue;
+	psPolynomial2D *poly = psf->params->data[i];
+	assert (poly);
+	PAR[i] = psPolynomial2DEval(poly, Xo, Yo);
+    }
+
+    // the 2D PSF model fits polarization terms (E0,E1,E2)
+    // convert to shape terms (SXX,SYY,SXY)
+    // XXX user-defined value for limit?
+    if (!pmPSF_FitToModel (PAR, 0.1)) {
+	psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);
+	return false;
+    }
+
+    // apply the model limits here: this truncates excessive extrapolation
+    // XXX do we need to do this still?  should we put in asserts to test?
+    for (int i = 0; i < psf->params->n; i++) {
+        // apply the limits to all components or just the psf-model parameters?
+        if (psf->params->data[i] == NULL)
+            continue;
+
+	bool status = true;
+        status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL);
+        status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL);
+	if (!status) {
+	    psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);
+	    model->flags |= PM_MODEL_STATUS_LIMITS;
+	}
+    }
     return(true);
 }
@@ -237,5 +282,4 @@
 bool PM_MODEL_FIT_STATUS (pmModel *model)
 {
-
     psF32 dP;
     bool  status;
@@ -265,3 +309,4 @@
 # undef PM_MODEL_RADIUS
 # undef PM_MODEL_FROM_PSF
+# undef PM_MODEL_PARAMS_FROM_PSF
 # undef PM_MODEL_FIT_STATUS
