Index: /branches/eam_branch_20070921/psModules/src/objects/pmPSF.c
===================================================================
--- /branches/eam_branch_20070921/psModules/src/objects/pmPSF.c	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/src/objects/pmPSF.c	(revision 14986)
@@ -6,6 +6,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.28.2.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-09-22 02:20:11 $
+ *  @version $Revision: 1.28.2.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-09-22 13:47:28 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -67,5 +67,9 @@
     options->psfTrendNy    = 0;
 
-    options->poissonErrors = false;
+    options->poissonErrorsPhotLMM = true;
+    options->poissonErrorsPhotLin = false;
+    options->poissonErrorsParams  = true;
+
+    return options;
 }
 
@@ -115,5 +119,8 @@
     psf->nPSFstars  = 0;
     psf->nApResid   = 0;
-    psf->poissonErrors = options->poissonErrors;
+
+    psf->poissonErrorsPhotLMM = options->poissonErrorsPhotLMM;
+    psf->poissonErrorsPhotLin = options->poissonErrorsPhotLin;
+    psf->poissonErrorsParams = options->poissonErrorsParams;
 
     // the ApTrend components are (x, y).  It may be represented with a polynomial or with a
@@ -128,5 +135,5 @@
     psf->FluxScale = NULL;
 
-    if (psf->poissonErrors) {
+    if (psf->poissonErrorsPhotLMM) {
         psf->ChiTrend = psPolynomial1DAlloc (PS_POLYNOMIAL_ORD, 1);
     } else {
@@ -140,5 +147,5 @@
     psf->residuals = NULL;
 
-    Nparams = pmModelClassParameterCount (type);
+    Nparams = pmModelClassParameterCount (options->type);
     if (!Nparams) {
         psError(PS_ERR_UNKNOWN, true, "Undefined pmModelType");
@@ -156,4 +163,7 @@
     // are left as NULL.  these are selected by testing for them by the named values (
     // PM_PAR_XPOS, etc)
+
+    psf->Nx = options->image->numCols;
+    psf->Ny = options->image->numRows;
 
     // define the parameter trends
@@ -293,5 +303,4 @@
 
 // generate a psf model of the requested type, with fixed shape
-// XXX update this.
 pmPSF *pmPSFBuildSimple (char *typeName, float sxx, float syy, float sxy, ...)
 {
@@ -300,7 +309,11 @@
     va_start(ap, sxy);
 
-    pmModelType type = pmModelClassGetType (typeName);
-    psPolynomial2D *psfTrend = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 0, 0);
-    pmPSF *psf = pmPSFAlloc (type, true, psfTrend);
+    pmPSFOptions *options = pmPSFOptionsAlloc ();
+    options->type = pmModelClassGetType (typeName);
+    options->psfTrendMode = PM_TREND_POLY_ORD;
+    options->psfTrendNx = 0;
+    options->psfTrendNy = 0;
+
+    pmPSF *psf = pmPSFAlloc (options);
 
     psVector *par = psVectorAlloc (psf->params->n, PS_TYPE_F32);
@@ -311,23 +324,24 @@
     psEllipsePol pol = pmPSF_ModelToFit(par->data.F32);
 
+    pmTrend2D *trend = NULL;
+
     // set the psf shape parameters
-    psPolynomial2D *poly = NULL;
-    poly = psf->params->data[PM_PAR_E0];
-    poly->coeff[0][0] = pol.e0;
-
-    poly = psf->params->data[PM_PAR_E1];
-    poly->coeff[0][0] = pol.e1;
-
-    poly = psf->params->data[PM_PAR_E2];
-    poly->coeff[0][0] = pol.e2;
+    trend = psf->params->data[PM_PAR_E0];
+    trend->poly->coeff[0][0] = pol.e0;
+
+    trend = psf->params->data[PM_PAR_E1];
+    trend->poly->coeff[0][0] = pol.e1;
+
+    trend = psf->params->data[PM_PAR_E2];
+    trend->poly->coeff[0][0] = pol.e2;
 
     for (int i = PM_PAR_SXY + 1; i < psf->params->n; i++) {
-        poly = psf->params->data[i];
-        poly->coeff[0][0] = (psF32)va_arg(ap, psF64);
+	trend = psf->params->data[i];
+        trend->poly->coeff[0][0] = (psF32)va_arg(ap, psF64);
     }
     va_end(ap);
 
     psFree (par);
-    psFree (psfTrend);
+    psFree (options);
     return psf;
 }
Index: /branches/eam_branch_20070921/psModules/src/objects/pmPSF.h
===================================================================
--- /branches/eam_branch_20070921/psModules/src/objects/pmPSF.h	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/src/objects/pmPSF.h	(revision 14986)
@@ -6,6 +6,6 @@
  * @author EAM, IfA
  *
- * @version $Revision: 1.16.2.2 $ $Name: not supported by cvs2svn $
- * @date $Date: 2007-09-22 02:20:11 $
+ * @version $Revision: 1.16.2.3 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2007-09-22 13:47:28 $
  * Copyright 2004 Maui High Performance Computing Center, University of Hawaii
  */
@@ -47,5 +47,8 @@
     int nPSFstars;                      ///< number of stars used to measure PSF
     int nApResid;                       ///< number of stars used to measure ApResid
-    bool poissonErrors;
+    int Nx, Ny;				///< reference image dimensions
+    bool poissonErrorsPhotLMM;		///< use poission errors for non-linear model fitting
+    bool poissonErrorsPhotLin;		///< use poission errors for linear model fitting
+    bool poissonErrorsParams;		///< use poission errors for model parameter fitting
     pmGrowthCurve *growth;              ///< apMag vs Radius
     pmResiduals *residuals;             ///< normalized residual image (no spatial variation)
@@ -60,5 +63,9 @@
     int           psfTrendNx;
     int           psfTrendNy;
-    bool          poissonErrors;
+    bool 	  poissonErrorsPhotLMM;	///< use poission errors for non-linear model fitting
+    bool 	  poissonErrorsPhotLin;	///< use poission errors for linear model fitting
+    bool 	  poissonErrorsParams; ///< use poission errors for model parameter fitting
+    float         radius;
+    
 } pmPSFOptions;
 
@@ -72,9 +79,6 @@
  *
  */
-pmPSF *pmPSFAlloc(
-    pmModelType type,     // type of model for PSF
-    bool poissonErrors,
-    psPolynomial2D *psfTrendMask
-);
+pmPSF *pmPSFAlloc (pmPSFOptions *options);
+pmPSFOptions *pmPSFOptionsAlloc ();
 
 double pmPSF_SXYfromModel (psF32 *modelPar);
Index: /branches/eam_branch_20070921/psModules/src/objects/pmPSF_IO.c
===================================================================
--- /branches/eam_branch_20070921/psModules/src/objects/pmPSF_IO.c	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/src/objects/pmPSF_IO.c	(revision 14986)
@@ -6,6 +6,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.22.2.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-09-22 02:20:11 $
+ *  @version $Revision: 1.22.2.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-09-22 13:47:28 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -246,5 +246,4 @@
 
     // write the PSF model parameters in a FITS table
-    assert (psf->psfTrendMode != PM_TREND_NONE);
     { 
 	// we need to write a header for the table,
@@ -254,21 +253,38 @@
 	psMetadataAddStr (header, PS_LIST_TAIL, "PSF_NAME", 0, "PSF model name", modelName);
 
-	psMetadataAddBool (header, PS_LIST_TAIL, "POISSON",  0, "Use Poisson errors in fits?", psf->poissonErrors);
+	psMetadataAddBool (header, PS_LIST_TAIL, "ERR_LMM",  0, "Use Poisson errors in fits?", psf->poissonErrorsPhotLMM);
+	psMetadataAddBool (header, PS_LIST_TAIL, "ERR_LIN",  0, "Use Poisson errors in fits?", psf->poissonErrorsPhotLin);
+	psMetadataAddBool (header, PS_LIST_TAIL, "ERR_PAR",  0, "Use Poisson errors in fits?", psf->poissonErrorsParams);
 
 	int nPar = pmModelClassParameterCount (psf->type)    ;
 	psMetadataAdd (header, PS_LIST_TAIL, "PSF_NPAR", PS_DATA_S32, "PSF model parameter count", nPar);
+
+	psMetadataAddS32 (header, PS_LIST_TAIL, "IMAXIS1", 0, "Image X Size", psf->Nx);
+	psMetadataAddS32 (header, PS_LIST_TAIL, "IMAXIS2", 0, "Image Y Size", psf->Ny);
 
 	// save the dimensions of each parameter
 	for (int i = 0; i < nPar; i++) {
 	    char name[9];
-	    psPolynomial2D *poly = psf->params->data[i];
-	    if (poly == NULL) continue;
+	    int nX, nY;
+
+	    pmTrend2D *trend = psf->params->data[i];
+	    if (trend == NULL) continue;
+
+	    if (trend->mode == PM_TREND_MAP) {
+	      nX = trend->map->map->numCols;
+	      nY = trend->map->map->numRows;
+	    } else {
+	      nX = trend->poly->nX;
+	      nY = trend->poly->nY;
+	    }
 	    snprintf (name, 9, "PAR%02d_NX", i);
-	    psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", poly->nX);
+	    psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", nX);
 	    snprintf (name, 9, "PAR%02d_NY", i);
-	    psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", poly->nY);
-	}
-
-	char *modeName = pmTrend2DModeToString(trend->mode);
+	    psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", nY);
+	    snprintf (name, 9, "PAR%02d_MD", i);
+	    char *modeName = pmTrend2DModeToString (trend->mode);
+	    psMetadataAddStr (header, PS_LIST_TAIL, name, 0, "", modeName);
+	    psFree (modeName);
+	}
 
 	// other required information describing the PSF
@@ -277,6 +293,4 @@
 	psMetadataAddF32 (header, PS_LIST_TAIL, "CHISQ",    0, "chi-square for fit", psf->chisq);
 	psMetadataAddS32 (header, PS_LIST_TAIL, "NSTARS",   0, "number of stars used to measure PSF", psf->nPSFstars);
-	psMetadataAddStr (header, PS_LIST_TAIL, "MODE",     0, "", modeName);
-	psFree (modeName);
 
 	// XXX can we drop this now?
@@ -536,16 +550,24 @@
     if (!header) psAbort("cannot read table header");
 
+    pmPSFOptions *options = pmPSFOptionsAlloc();
+
     // load the PSF model parameters from the FITS table
     char *modelName = psMetadataLookupStr (&status, header, "PSF_NAME");
-    pmModelType type = pmModelClassGetType (modelName);
-    if (type == -1) {
+    options->type = pmModelClassGetType (modelName);
+    if (options->type == -1) {
         psError(PS_ERR_UNKNOWN, true, "invalid model name %s in psf file %s", modelName, file->filename);
         return false;
     }
 
-    bool poissonErrors = psMetadataLookupBool (&status, header, "POISSON");
+    options->poissonErrorsPhotLMM = psMetadataLookupBool (&status, header, "ERR_LMM");
+    options->poissonErrorsPhotLin = psMetadataLookupBool (&status, header, "ERR_LIN");
+    options->poissonErrorsParams  = psMetadataLookupBool (&status, header, "ERR_PAR");
+
+    // XXX this is a bit ad-hoc: determine the PSF trend mode by looking at one of the parameters
+    // this could allow the psf model to use different trend modes for different parameters, but we
+    // would need to change the alloc somewhat
 
     // we determine the PSF parameter polynomials from the MD-defined polynomials
-    pmPSF *psf = pmPSFAlloc (type, poissonErrors, NULL);
+    pmPSF *psf = pmPSFAlloc (options);
 
     // check the number of expected parameters
@@ -554,5 +576,9 @@
         psAbort("mismatch model par count");
 
-    // load the dimensions of each parameter
+    int nXimage = psMetadataLookupS32 (&status, header, "IMAXIS1");
+    int nYimage = psMetadataLookupS32 (&status, header, "IMAXIS2");
+    // XXX don't require this to exist?  0,0 if not defined?
+
+    // load the trend mode and dimensions of each parameter
     for (int i = 0; i < nPar; i++) {
         char name[9];
@@ -572,6 +598,8 @@
 	    return false;
 	}
-	// XXX allocate pmTrend2d based on the values here
-        psf->params->data[i] = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXorder, nYorder);
+	pmTrend2DMode psfTrendMode = pmTrend2DModeFromString (modeName);
+	// XXX default to POLY_ORD if not defined?
+
+	psf->params->data[i] = pmTrend2DFieldAlloc (psfTrendMode, nXimage, nYimage, nXorder, nYorder, NULL);
     }
 
@@ -584,7 +612,4 @@
     // XXX can we drop this now?
     psf->skyBias   = psMetadataLookupF32 (&status, header, "SKY_BIAS");
-
-    char *modeName = psMetadataLookupStr (&status, header, "MODE");
-    trend->mode = pmTrend2DModeToString(modeName);
 
     // read the raw table data
@@ -608,6 +633,5 @@
 	    psImageMap *map = trend->map;
 	    map->map->data.F32[yPow][xPow]    = psMetadataLookupF32 (&status, row, "VALUE");
-	    map->error->data.F32[yPow][xPow]    = psMetadataLookupF32 (&status, row, "ERROR");
-	    // poly->mask[xPow][yPow]     = psMetadataLookupU8  (&status, row, "MASK");
+	    map->error->data.F32[yPow][xPow]  = psMetadataLookupF32 (&status, row, "ERROR");
 	} else {
 	    psPolynomial2D *poly = trend->poly;
@@ -666,93 +690,3 @@
 
 // create a psMetadata representation (human-readable) of a psf model
-// XXX drop this function?
-psMetadata *pmPSFtoMetadata (psMetadata *metadata, pmPSF *psf)
-{
-
-    if (metadata == NULL) {
-        metadata = psMetadataAlloc ();
-    }
-
-    char *modelName = pmModelClassGetName (psf->type);
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_MODEL_NAME", PS_DATA_STRING, "PSF model name", modelName);
-
-    int nPar = pmModelClassParameterCount (psf->type)    ;
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_MODEL_NPAR", PS_DATA_S32, "PSF model parameter count", nPar);
-
-    for (int i = 0; i < nPar; i++) {
-        psPolynomial2D *poly = psf->params->data[i];
-        if (poly == NULL)
-            continue;
-        psPolynomial2DtoMetadata (metadata, poly, "PSF_PAR%02d", i);
-    }
-
-    // XXX fix this
-    psWarning ("APTREND is currently missing");
-    // psPolynomial4DtoMetadata (metadata, psf->ApTrend, "APTREND");
-
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_AP_RESID", PS_DATA_F32, "aperture residual", psf->ApResid);
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_dAP_RESID", PS_DATA_F32, "aperture residual scatter", psf->dApResid);
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_SKY_BIAS", PS_DATA_F32, "sky bias level", psf->skyBias);
-
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "chi-square for fit", psf->chisq);
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_NSTARS", PS_DATA_S32, "number of stars used to measure PSF", psf->nPSFstars);
-    psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_POISSON_ERRORS", PS_DATA_BOOL, "Poisson errors for fits", psf->poissonErrors);
-
-    return metadata;
-}
-
-// parse a psMetadata representation (human-readable) of a psf model
-// XXX drop this function?
-pmPSF *pmPSFfromMetadata (psMetadata *metadata)
-{
-
-    bool status;
-    char keyword[80];
-
-    char *modelName = psMetadataLookupPtr (&status, metadata, "PSF_MODEL_NAME");
-    pmModelType type = pmModelClassGetType (modelName);
-
-    bool poissonErrors = psMetadataLookupPtr (&status, metadata, "PSF_POISSON_ERRORS");
-    if (!status)
-        poissonErrors = true;
-
-    // we determine the PSF parameter polynomials from the MD-defined polynomials
-    pmPSF *psf = pmPSFAlloc (type, poissonErrors, NULL);
-
-    int nPar = psMetadataLookupS32 (&status, metadata, "PSF_MODEL_NPAR");
-    if (nPar != pmModelClassParameterCount (psf->type))
-        psAbort("mismatch model par count");
-
-    // un-fitted terms, not in the Metadata, are left NULL
-    // XXX add a double-check of the expected number?
-    for (int i = 0; i < nPar; i++) {
-        sprintf (keyword, "PSF_PAR%02d", i);
-        psMetadata *folder = psMetadataLookupPtr (&status, metadata, keyword);
-        if (!status)
-            continue;
-        psPolynomial2D *poly = psPolynomial2DfromMetadata (folder);
-        psFree (psf->params->data[i]);
-        psf->params->data[i] = poly;
-    }
-
-    // load the APTREND data
-    // XXX fix this to work with pmTrend2D
-    psWarning ("APTREND is not being read");
-    # if (0)
-    sprintf (keyword, "APTREND");
-    psMetadata *folder = psMetadataLookupPtr (&status, metadata, keyword);
-    psPolynomial4D *poly = psPolynomial4DfromMetadata (folder);
-    psFree (psf->ApTrend);
-    psf->ApTrend = poly;
-    # endif
-
-    psf->ApResid = psMetadataLookupF32 (&status, metadata, "PSF_AP_RESID");
-    psf->dApResid = psMetadataLookupF32 (&status, metadata, "PSF_dAP_RESID");
-    psf->skyBias = psMetadataLookupF32 (&status, metadata, "PSF_SKY_BIAS");
-
-    psf->chisq = psMetadataLookupF32 (&status, metadata, "PSF_CHISQ");
-    psf->nPSFstars = psMetadataLookupS32 (&status, metadata, "PSF_NSTARS");
-
-    psFree (metadata);
-    return (psf);
-}
+// XXX pmPSF to/from Metadata functions were defined for 1.22 and earlier, but were dropped
Index: /branches/eam_branch_20070921/psModules/src/objects/pmPSF_IO.h
===================================================================
--- /branches/eam_branch_20070921/psModules/src/objects/pmPSF_IO.h	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/src/objects/pmPSF_IO.h	(revision 14986)
@@ -6,6 +6,6 @@
  * @author EAM, IfA
  *
- * @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
- * @date $Date: 2007-08-24 00:11:02 $
+ * @version $Revision: 1.9.4.1 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2007-09-22 13:47:28 $
  * Copyright 2004 Maui High Performance Computing Center, University of Hawaii
  */
@@ -33,7 +33,4 @@
 bool pmPSFmodelCheckDataStatusForChip (const pmChip *chip);
 
-psMetadata *pmPSFtoMetadata (psMetadata *metadata, pmPSF *psf);
-pmPSF *pmPSFfromMetadata (psMetadata *metadata);
-
 /// @}
 # endif
Index: /branches/eam_branch_20070921/psModules/src/objects/pmPSFtry.c
===================================================================
--- /branches/eam_branch_20070921/psModules/src/objects/pmPSFtry.c	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/src/objects/pmPSFtry.c	(revision 14986)
@@ -5,6 +5,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.45.2.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-09-22 02:20:11 $
+ *  @version $Revision: 1.45.2.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-09-22 13:47:28 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -139,6 +139,5 @@
 
     // stage 2: construct a psf (pmPSF) from this collection of model fits
-    // XXX take 'applyWeights' from the psf options?
-    if (!pmPSFFromPSFtry (psfTry, options->applyWeights)) {
+    if (!pmPSFFromPSFtry (psfTry)) {
         psError(PS_ERR_UNKNOWN, false, "failed to construct a psf model from collection of sources");
         psFree(psfTry);
@@ -339,5 +338,5 @@
 /*****************************************************************************
 pmPSFFromPSFtry (psfTry): build a PSF model from a collection of
-source->modelEXT entires.  The PSF ignores the first 4 (independent) model
+source->modelEXT entries.  The PSF ignores the first 4 (independent) model
 parameters and constructs a polynomial fit to the remaining as a function of
 image coordinate.
@@ -345,5 +344,5 @@
 Note: some of the array entries may be NULL (failed fits); ignore them.
  *****************************************************************************/
-bool pmPSFFromPSFtry (pmPSFtry *psfTry, bool applyWeight)
+bool pmPSFFromPSFtry (pmPSFtry *psfTry)
 {
     pmPSF *psf = psfTry->psf;
@@ -355,5 +354,5 @@
 
     psVector *dz = NULL;
-    if (applyWeight) {
+    if (psf->poissonErrorsParams) {
         dz = psVectorAlloc (psfTry->sources->n, PS_TYPE_F32);
     }
@@ -420,5 +419,5 @@
     if (psTraceGetLevel("psModules.objects") >= 4) {
         FILE *f = fopen ("pol.dat", "w");
-	fprintf (f, "x y  :  e0obs e1obs e2obs  : e0fit e1fit e2fit : mask\n",
+	fprintf (f, "# x y  :  e0obs e1obs e2obs  : e0fit e1fit e2fit : mask\n");
         for (int i = 0; i < e0->n; i++) {
             fprintf (f, "%f %f  :  %f %f %f  : %f %f %f  : %d\n",
@@ -462,8 +461,7 @@
         // fit the collection of measured parameters to the PSF 2D model
         // the mask is carried from previous steps and updated with this operation
-        // the weight is either the flux error or NULL, depending on 'applyWeights'
+        // the weight is either the flux error or NULL, depending on 'psf->poissonErrorParams'
         if (!pmTrend2DFit (psf->params->data[i], psfTry->mask, 0xff, x, y, e0, NULL)) {
             psError(PS_ERR_UNKNOWN, false, "failed to build psf model for parameter %d", i);
-            psFree(stats);
             psFree(x);
             psFree(y);
@@ -502,5 +500,4 @@
     }
 
-    psFree (stats);
     psFree (x);
     psFree (y);
Index: /branches/eam_branch_20070921/psModules/src/objects/pmPSFtry.h
===================================================================
--- /branches/eam_branch_20070921/psModules/src/objects/pmPSFtry.h	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/src/objects/pmPSFtry.h	(revision 14986)
@@ -6,6 +6,6 @@
  * @author EAM, IfA
  *
- * @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
- * @date $Date: 2007-08-15 20:21:18 $
+ * @version $Revision: 1.14.6.1 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2007-09-22 13:47:28 $
  * Copyright 2004 Maui High Performance Computing Center, University of Hawaii
  */
@@ -78,5 +78,5 @@
  *
  */
-pmPSFtry *pmPSFtryAlloc (psArray *sources, char *modelName, bool poissonErrors, psPolynomial2D *psfTrendMask);
+pmPSFtry *pmPSFtryAlloc (psArray *sources, pmPSFOptions *options);
 
 /** pmPSFtryModel()
@@ -87,5 +87,5 @@
  *
  */
-pmPSFtry *pmPSFtryModel (psArray *sources, char *modelName, float RADIUS, bool poissonErrors, psPolynomial2D *psfTrendMask, bool applyWeights, psMaskType maskVal, psMaskType mark);
+pmPSFtry *pmPSFtryModel (psArray *sources, char *modelName, pmPSFOptions *options, psMaskType maskVal, psMaskType mark);
 
 /** pmPSFtryMetric()
@@ -123,5 +123,5 @@
  *
  */
-bool pmPSFFromPSFtry (pmPSFtry *psfTry, bool applyWeights);
+bool pmPSFFromPSFtry (pmPSFtry *psfTry);
 
 /// @}
Index: /branches/eam_branch_20070921/psModules/src/objects/pmTrend2D.c
===================================================================
--- /branches/eam_branch_20070921/psModules/src/objects/pmTrend2D.c	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/src/objects/pmTrend2D.c	(revision 14986)
@@ -3,6 +3,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.2.2.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-09-22 02:20:11 $
+ *  @version $Revision: 1.2.2.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-09-22 13:47:28 $
  *
  *  Copyright 2004 Institute for Astronomy, University of Hawaii
@@ -14,4 +14,5 @@
 #endif
 
+# include <strings.h>
 # include <pslib.h>
 # include "pmTrend2D.h"
@@ -85,5 +86,9 @@
  	for (int nx = 0; nx < trend->poly->nX + 1; nx++) {
 	    for (int ny = 0; ny < trend->poly->nY + 1; ny++) {
-		trend->poly->mask[nx][ny] = XXX;
+		if (nx + ny >= PS_MAX (trend->poly->nX, trend->poly->nY) + 1) {
+		    trend->poly->mask[nx][ny] = 1;
+		} else {
+		    trend->poly->mask[nx][ny] = 0;
+		}
 	    }
 	}
@@ -181,17 +186,19 @@
 
 psString pmTrend2DModeToString (pmTrend2DMode mode) {
+    
+    psString name;
 
     switch (mode) {
       case PM_TREND_NONE:
-	psString name = psStringCopy ("NONE");
-	break;
-      case PM_TREND_POLY_ORD:
-	psString name = psStringCopy ("POLY_ORD");
-	break;
-      case PM_TREND_POLY_CHEB:
-	psString name = psStringCopy ("POLY_CHEB");
-	break;
-      case PM_TREND_MAP:
-	psString name = psStringCopy ("MAP");
+	name = psStringCopy ("NONE");
+	break;
+      case PM_TREND_POLY_ORD:
+	name = psStringCopy ("POLY_ORD");
+	break;
+      case PM_TREND_POLY_CHEB:
+	name = psStringCopy ("POLY_CHEB");
+	break;
+      case PM_TREND_MAP:
+	name = psStringCopy ("MAP");
 	break;
       default:
Index: /branches/eam_branch_20070921/psModules/test/camera/Makefile.am
===================================================================
--- /branches/eam_branch_20070921/psModules/test/camera/Makefile.am	(revision 14985)
+++ /branches/eam_branch_20070921/psModules/test/camera/Makefile.am	(revision 14986)
@@ -11,6 +11,5 @@
 	$(PSMODULES_LIBS)
 
-TEST_PROGS = \
-	tap_pmFPAReadWrite
+TEST_PROGS =
 
 if BUILD_TESTS
Index: /branches/eam_branch_20070921/psphot/doc/psfmodel.txt
===================================================================
--- /branches/eam_branch_20070921/psphot/doc/psfmodel.txt	(revision 14985)
+++ /branches/eam_branch_20070921/psphot/doc/psfmodel.txt	(revision 14986)
@@ -1,2 +1,11 @@
+
+2007.09.21
+
+  there are three places where we can choose to use errors in the fits or not:
+
+  * non-linear fitting of the models to the pixel flux distribution (poissonErrorsPhotLMM)
+  * linear fitting of the models to the pixel flux distribution (poissonErrorsPhotLin)
+  * fitting of the 2D variations in the psf parameters (poissonErrorsParams)
+  * fitting of the 2D variations in the aperture residuals
 
 2007.09.20
Index: /branches/eam_branch_20070921/psphot/src/psphotChoosePSF.c
===================================================================
--- /branches/eam_branch_20070921/psphot/src/psphotChoosePSF.c	(revision 14985)
+++ /branches/eam_branch_20070921/psphot/src/psphotChoosePSF.c	(revision 14986)
@@ -27,5 +27,9 @@
 
     // use poissonian errors or local-sky errors
-    options->poissonErrorsPhotom = psMetadataLookupBool (&status, recipe, "POISSON.ERRORS.PHOTOM");
+    options->poissonErrorsPhotLMM = psMetadataLookupBool (&status, recipe, "POISSON.ERRORS.PHOT.LMM");
+    assert (status);
+
+    // use poissonian errors or local-sky errors
+    options->poissonErrorsPhotLin = psMetadataLookupBool (&status, recipe, "POISSON.ERRORS.PHOT.LIN");
     assert (status);
 
@@ -52,5 +56,5 @@
     options->image = psMemIncrRefCounter (readout->image);
 
-    pmSourceFitModelInit (15, 0.01, PS_SQR(SKY_SIG), options->poissonErrorsPhotom);
+    pmSourceFitModelInit (15, 0.01, PS_SQR(SKY_SIG), options->poissonErrorsPhotLMM);
 
     psArray *stars = psArrayAllocEmpty (sources->n);
@@ -235,7 +239,7 @@
             // use pmModelSub because modelFlux has not been generated
             assert (source->maskObj);
-            psImageKeepCircle (source->maskObj, x, y, RADIUS, "OR", PM_MASK_MARK);
+            psImageKeepCircle (source->maskObj, x, y, options->radius, "OR", PM_MASK_MARK);
             pmModelSub (source->pixels, source->maskObj, source->modelPSF, PM_MODEL_OP_FULL, maskVal);
-            psImageKeepCircle (source->maskObj, x, y, RADIUS, "AND", PS_NOT_U8(PM_MASK_MARK));
+            psImageKeepCircle (source->maskObj, x, y, options->radius, "AND", PS_NOT_U8(PM_MASK_MARK));
         }
 
