Index: trunk/psphot/src/psphotSourceFits.c
===================================================================
--- trunk/psphot/src/psphotSourceFits.c	(revision 12792)
+++ trunk/psphot/src/psphotSourceFits.c	(revision 13035)
@@ -67,5 +67,5 @@
 	// these should never be invalid values
 	// XXX drop these tests eventually
-        if (isnan(model->params->data.F32[PM_PAR_I0])) psAbort("nan in blend fit");
+        if (isnan(model->params->data.F32[PM_PAR_I0]))   psAbort("nan in blend fit");
         if (isnan(model->params->data.F32[PM_PAR_XPOS])) psAbort("nan in blend fit");
         if (isnan(model->params->data.F32[PM_PAR_YPOS])) psAbort("nan in blend fit");
@@ -83,7 +83,5 @@
 
     // fit PSF model (set/unset the pixel mask)
-    psImageKeepCircle (source->mask, x, y, PSF->radiusFit, "OR", PM_MASK_MARK);
     pmSourceFitSet (source, modelSet, PM_SOURCE_FIT_PSF);
-    psImageKeepCircle (source->mask, x, y, PSF->radiusFit, "AND", PS_NOT_U8(PM_MASK_MARK));
 
     // correct model chisq for flux trend
@@ -110,5 +108,8 @@
         blend->modelPSF = psMemIncrRefCounter (model);
         psTrace ("psphot", 5, "fitted blend as PSF\n");
-        pmModelSub (source->pixels, source->mask, model, false, false);
+
+	// build cached model and subtract
+	pmSourceCacheModel (blend);
+	pmSourceSub (blend, PM_MODEL_OP_FULL);
         blend->mode |=  PM_SOURCE_MODE_SUBTRACTED;
         blend->mode &= ~PM_SOURCE_MODE_TEMPSUB;
@@ -127,8 +128,12 @@
     psFree (sourceSet);
 
-    psTrace ("psphot", 5, "fitted primary as PSF\n");
-    pmModelSub (source->pixels, source->mask, PSF, false, false);
+    // save the new, successful model
     psFree (source->modelPSF);
     source->modelPSF = PSF;
+    psTrace ("psphot", 5, "fitted primary as PSF\n");
+
+    // build cached model and subtract
+    pmSourceCacheModel (source);
+    pmSourceSub (source, PM_MODEL_OP_FULL);
     source->mode |=  PM_SOURCE_MODE_SUBTRACTED;
     source->mode &= ~PM_SOURCE_MODE_TEMPSUB;
@@ -138,5 +143,4 @@
 bool psphotFitPSF (pmReadout *readout, pmSource *source, pmPSF *psf) {
 
-    float x, y;
     double chiTrend;
 
@@ -150,11 +154,6 @@
     psphotCheckRadiusPSF (readout, source, PSF);
 
-    x = PSF->params->data.F32[PM_PAR_XPOS];
-    y = PSF->params->data.F32[PM_PAR_YPOS];
-
     // fit PSF model (set/unset the pixel mask)
-    psImageKeepCircle (source->mask, x, y, PSF->radiusFit, "OR", PM_MASK_MARK);
     pmSourceFitModel (source, PSF, PM_SOURCE_FIT_PSF);
-    psImageKeepCircle (source->mask, x, y, PSF->radiusFit, "AND", PS_NOT_U8(PM_MASK_MARK));
 
     // correct model chisq for flux trend
@@ -168,11 +167,12 @@
     }
 
-    psTrace ("psphot", 5, "fitted as PSF\n");
-    pmModelSub (source->pixels, source->mask, PSF, false, false);
-
     // free old model, save new model
     psFree (source->modelPSF);
     source->modelPSF = PSF;
-
+    psTrace ("psphot", 5, "fitted as PSF\n");
+
+    // build cached model and subtract
+    pmSourceCacheModel (source);
+    pmSourceSub (source, PM_MODEL_OP_FULL);
     source->mode |=  PM_SOURCE_MODE_SUBTRACTED;
     source->mode &= ~PM_SOURCE_MODE_TEMPSUB;
@@ -264,9 +264,13 @@
     // sub EXT
     psFree (DBL);
-    pmModelSub (source->pixels, source->mask, EXT, false, false);
-    psTrace ("psphot", 5, "blob as EXT: %f %f\n", EXT->params->data.F32[PM_PAR_XPOS], EXT->params->data.F32[PM_PAR_YPOS]);
 
     // save new model
     source->modelEXT = EXT;
+
+    // build cached model and subtract
+    pmSourceCacheModel (source);
+    pmSourceSub (source, PM_MODEL_OP_FULL);
+    psTrace ("psphot", 5, "blob as EXT: %f %f\n", EXT->params->data.F32[PM_PAR_XPOS], EXT->params->data.F32[PM_PAR_YPOS]);
+
     source->mode |=  PM_SOURCE_MODE_SUBTRACTED;
     source->mode &= ~PM_SOURCE_MODE_TEMPSUB;
@@ -276,7 +280,4 @@
     // sub DLB
     psFree (EXT);
-    pmModelSub (source->pixels, source->mask, (pmModel *) DBL->data[0], false, false);
-    pmModelSub (source->pixels, source->mask, (pmModel *) DBL->data[1], false, false);
-    psTrace ("psphot", 5, "blob as DBL: %f %f\n", ONE->params->data.F32[PM_PAR_XPOS], ONE->params->data.F32[PM_PAR_YPOS]);
 
     // drop old model, save new second model...
@@ -288,13 +289,15 @@
 
     // copy most data from the primary source (modelEXT, blends stay NULL)
-    pmSource *newSrc = pmSourceAlloc ();
-    newSrc->peak     = psMemIncrRefCounter (source->peak);
-    newSrc->pixels   = psMemIncrRefCounter (source->pixels);
-    newSrc->weight   = psMemIncrRefCounter (source->weight);
-    newSrc->mask     = psMemIncrRefCounter (source->mask);
-    newSrc->moments  = psMemIncrRefCounter (source->moments);
+    // XXX use pmSourceCopy?
+    pmSource *newSrc = pmSourceCopy (source);
     newSrc->modelPSF = psMemIncrRefCounter (DBL->data[1]);
-    newSrc->type     = source->type;
-    newSrc->mode     = source->mode;
+
+    // build cached models and subtract
+    pmSourceCacheModel (source);
+    pmSourceSub (source, PM_MODEL_OP_FULL);
+    pmSourceCacheModel (newSrc);
+    pmSourceSub (newSrc, PM_MODEL_OP_FULL);
+    psTrace ("psphot", 5, "blob as DBL: %f %f\n", ONE->params->data.F32[PM_PAR_XPOS], ONE->params->data.F32[PM_PAR_YPOS]);
+
     psArrayAdd (sources, 100, newSrc);
     psFree (newSrc);
@@ -306,5 +309,5 @@
 psArray *psphotFitDBL (pmReadout *readout, pmSource *source) {
 
-    float x, y, dx, dy;
+    float dx, dy;
     pmModel *DBL;
     pmModel *PSF;
@@ -344,18 +347,10 @@
     modelSet->data[1] = DBL;
 
-    x = source->moments->x;
-    y = source->moments->y;
-
     // fit PSF model (set/unset the pixel mask)
-    psImageKeepCircle (source->mask, x, y, PSF->radiusFit, "OR", PM_MASK_MARK);
     pmSourceFitSet (source, modelSet, PM_SOURCE_FIT_PSF);
-    psImageKeepCircle (source->mask, x, y, PSF->radiusFit, "AND", PS_NOT_U8(PM_MASK_MARK));
-
     return (modelSet);
 }
 
 pmModel *psphotFitEXT (pmReadout *readout, pmSource *source) {
-
-    float x, y;
 
     NfitEXT ++;
@@ -369,7 +364,4 @@
     psphotCheckRadiusEXT (readout, source, EXT);
 
-    x = EXT->params->data.F32[PM_PAR_XPOS];
-    y = EXT->params->data.F32[PM_PAR_YPOS];
-
     if ((source->moments->Sx < 1e-3) || (source->moments->Sx < 1e-3)) {
         psTrace ("psphot", 5, "problem source: moments: %f %f\n", source->moments->Sx, source->moments->Sy);
@@ -377,8 +369,5 @@
 
     // fit EXT (not PSF) model (set/unset the pixel mask)
-    psImageKeepCircle (source->mask, x, y, EXT->radiusFit, "OR", PM_MASK_MARK);
     pmSourceFitModel (source, EXT, PM_SOURCE_FIT_EXT);
-    psImageKeepCircle (source->mask, x, y, EXT->radiusFit, "AND", PS_NOT_U8(PM_MASK_MARK));
-
     return (EXT);
 }
