Index: trunk/psphot/src/models/pmModel_STRAIL.c
===================================================================
--- trunk/psphot/src/models/pmModel_STRAIL.c	(revision 11702)
+++ trunk/psphot/src/models/pmModel_STRAIL.c	(revision 14655)
@@ -12,11 +12,12 @@
 *****************************************************************************/ 
  
-# define PM_MODEL_FUNC       pmModelFunc_STRAIL
-# define PM_MODEL_FLUX       pmModelFlux_STRAIL
-# define PM_MODEL_GUESS      pmModelGuess_STRAIL
-# define PM_MODEL_LIMITS     pmModelLimits_STRAIL
-# define PM_MODEL_RADIUS     pmModelRadius_STRAIL
-# define PM_MODEL_FROM_PSF   pmModelFromPSF_STRAIL
-# define PM_MODEL_FIT_STATUS pmModelFitStatus_STRAIL
+# define PM_MODEL_FUNC       	  pmModelFunc_STRAIL
+# define PM_MODEL_FLUX       	  pmModelFlux_STRAIL
+# define PM_MODEL_GUESS      	  pmModelGuess_STRAIL
+# define PM_MODEL_LIMITS     	  pmModelLimits_STRAIL
+# define PM_MODEL_RADIUS     	  pmModelRadius_STRAIL
+# define PM_MODEL_FROM_PSF   	  pmModelFromPSF_STRAIL
+# define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_STRAIL
+# define PM_MODEL_FIT_STATUS      pmModelFitStatus_STRAIL
 
 psF32 PM_MODEL_FUNC(psVector *deriv, 
@@ -474,6 +475,6 @@
  
 //fixed I think...no good way of guessing as far as I can tell 
-bool PM_MODEL_GUESS (pmModel *model, pmSource *source) { 
- 
+bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
+{ 
     pmMoments *Smoments = source->moments; 
     psF32     *params  = model->params->data.F32; 
@@ -516,6 +517,6 @@
  
 //fixed 
-bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf) { 
- 
+bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)
+{
     psF32 *out = modelPSF->params->data.F32; 
     psF32 *in  = modelFLT->params->data.F32; 
@@ -529,5 +530,5 @@
  
     for (int i = 4; i < 7; i++) { 
-      psPolynomial2D *poly = psf->params_NEW->data[i-4]; 
+      psPolynomial2D *poly = psf->params->data[i-4]; 
 	out[i] = psPolynomial2DEval (poly, out[2], out[3]); 
     } 
@@ -535,7 +536,56 @@
 } 
  
+// 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);
+}
+
 //done I think 
-bool PM_MODEL_FIT_STATUS (pmModel *model) { 
- 
+bool PM_MODEL_FIT_STATUS (pmModel *model)
+{
     psF32 dP; 
     bool  status; 
@@ -566,3 +616,4 @@
 # undef PM_MODEL_RADIUS
 # undef PM_MODEL_FROM_PSF
+# undef PM_MODEL_PARAMS_FROM_PSF
 # undef PM_MODEL_FIT_STATUS
