Index: /branches/eam_02_branch/psphot/src/psphotAddNoise.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotAddNoise.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotAddNoise.c	(revision 12957)
@@ -63,9 +63,6 @@
 	PAR[PM_PAR_SXY] = newshape.sxy;
 
-	if (add) {
-	    pmModelAdd (source->weight, source->mask, model, PM_MODEL_ADD_FULL);
-	} else {
-	    pmModelSub (source->weight, source->mask, model, PM_MODEL_ADD_FULL);
-	}
+	// XXX if we use pmSourceOp, the size (and possibly Io) will not be respected
+	pmSourceOp (source, PM_MODEL_OP_FULL, add);
 	
 	// restore original values
Index: /branches/eam_02_branch/psphot/src/psphotBlendFit.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotBlendFit.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotBlendFit.c	(revision 12957)
@@ -43,7 +43,9 @@
 
 	// limit selection to some SN limit
+	// XXX this should use peak?
 	if (source->moments == NULL) continue;
 	if (source->moments->SN < FIT_SN_LIM) continue;
 
+	// XXX this should use peak?
 	if (source->moments->x < AnalysisRegion.x0) continue;
 	if (source->moments->y < AnalysisRegion.y0) continue;
@@ -65,12 +67,10 @@
 	// replace object in image
 	if (source->mode & PM_SOURCE_MODE_SUBTRACTED) {
-	  // XXX we will need to remove the existing source->modelFlux if we do 
-	  // a non-linear fit
-	  // pmSourceSub (!NORM, -)
-	    pmModelAdd (source->pixels, source->mask, source->modelPSF, PM_MODEL_ADD_FULL);
+	    pmSourceAdd (source, PM_MODEL_OP_FULL);
 	}
 	Nfit ++;
 
 	// try fitting PSFs, then try extended sources
+	// these functions subtract the resulting fitted source (XXX and update the modelFlux?)
 	if (psphotFitBlend (readout, source, psf)) { 
 	    psTrace ("psphot", 5, "source at %7.1f, %7.1f is psf", source->moments->x, source->moments->y);
@@ -87,6 +87,6 @@
 	Nfail ++;
 
-	// re-subtract PSF for object, leave local sky
-	pmModelSub (source->pixels, source->mask, source->modelPSF, PM_MODEL_ADD_FULL);
+	// re-subtract the object, leave local sky
+	pmSourceSub (source, PM_MODEL_OP_FULL);
 	source->mode |= PM_SOURCE_MODE_SUBTRACTED;
 	source->mode |= PM_SOURCE_MODE_TEMPSUB;
Index: /branches/eam_02_branch/psphot/src/psphotChoosePSF.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotChoosePSF.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotChoosePSF.c	(revision 12957)
@@ -240,5 +240,5 @@
 	    // set the mask and subtract the PSF model
 	    psImageKeepCircle (source->mask, x, y, RADIUS, "OR", PM_MASK_MARK);
-	    pmModelSub (source->pixels, source->mask, source->modelPSF, PM_MODEL_ADD_FULL);
+	    pmModelSub (source->pixels, source->mask, source->modelPSF, PM_MODEL_OP_FULL);
 	    psImageKeepCircle (source->mask, x, y, RADIUS, "AND", PS_NOT_U8(PM_MASK_MARK));
 	}
Index: /branches/eam_02_branch/psphot/src/psphotEnsemblePSF.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotEnsemblePSF.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotEnsemblePSF.c	(revision 12957)
@@ -91,7 +91,10 @@
 
         // fill in the model pixel values
+	// XXX this function should just work with the (normalized) modelFlux pixels
+	// XXX we should not have to create a complete copy
+	// XXX review the use of the object mask: can we use a copied mask?
         psImageInit (fitSource->pixels, 0.0);
         psImageKeepCircle (fitSource->mask, x, y, model->radiusFit, "OR", PM_MASK_MARK);
-        pmModelAdd (fitSource->pixels, fitSource->mask, model, PM_MODEL_ADD_FULL);
+        pmModelAdd (fitSource->pixels, fitSource->mask, model, PM_MODEL_OP_FULL);
 
         // save source in list
@@ -218,5 +221,5 @@
 
         // subtract object
-        pmModelSub (Ri->pixels, Ri->mask, model, PM_MODEL_ADD_FULL);
+        pmModelSub (Ri->pixels, Ri->mask, model, PM_MODEL_OP_FULL);
         Ri->mode |= PM_SOURCE_MODE_SUBTRACTED;
         if (!final) Ri->mode |= PM_SOURCE_MODE_TEMPSUB;
Index: /branches/eam_02_branch/psphot/src/psphotFitSet.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotFitSet.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotFitSet.c	(revision 12957)
@@ -24,4 +24,5 @@
     }
 
+    // XXX pmSourceFitSet must cache the modelFlux?
     pmSourceFitSet (source, modelSet, mode);
 
@@ -32,5 +33,5 @@
     for (int i = 0; i < modelSet->n; i++) {
         pmModel *model = modelSet->data[i];
-        pmModelSub (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+        pmModelSub (source->pixels, source->mask, model, PM_MODEL_OP_FULL);
 
         fprintf (stderr, "output parameters (obj %d):\n", i);
Index: /branches/eam_02_branch/psphot/src/psphotGrowthCurve.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotGrowthCurve.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotGrowthCurve.c	(revision 12957)
@@ -54,5 +54,5 @@
 
         psImageKeepCircle (mask, xc, yc, radius, "OR", PM_MASK_MARK);
-        pmModelAdd (image, mask, model, PM_MODEL_ADD_FULL);
+        pmModelAdd (image, mask, model, PM_MODEL_OP_FULL);
         pmSourcePhotometryAper (&apMag, model, image, mask);
         psImageKeepCircle (mask, xc, yc, radius, "AND", PS_NOT_U8(PM_MASK_MARK));
Index: /branches/eam_02_branch/psphot/src/psphotMakeResiduals.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotMakeResiduals.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotMakeResiduals.c	(revision 12957)
@@ -79,5 +79,5 @@
         psImage *weight = psImageCopy (NULL, source->weight, PS_TYPE_F32);
         psImage *mask   = psImageCopy (NULL, source->mask,   PS_TYPE_U8);
-        pmModelSub (image, mask, model, PM_MODEL_ADD_FULL);
+        pmModelSub (image, mask, model, PM_MODEL_OP_FULL);
 	
 	// re-normalize image and weight
Index: /branches/eam_02_branch/psphot/src/psphotModelTest.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotModelTest.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotModelTest.c	(revision 12957)
@@ -177,5 +177,5 @@
 
     // subtract object, leave local sky
-    pmModelSub (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+    pmModelSub (source->pixels, source->mask, model, PM_MODEL_OP_FULL);
 
     fprintf (stderr, "output parameters: \n");
Index: /branches/eam_02_branch/psphot/src/psphotOutput.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotOutput.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotOutput.c	(revision 12957)
@@ -182,5 +182,5 @@
     modelEXT->params->data.F32[3] = y;
     pmModel *modelPSF = pmModelFromPSF (modelEXT, psf);
-    pmModelAdd (sample, NULL, modelPSF, PM_MODEL_ADD_FULL);
+    pmModelAdd (sample, NULL, modelPSF, PM_MODEL_OP_FULL);
     psFree (modelPSF);
     return (sample);
Index: /branches/eam_02_branch/psphot/src/psphotReplaceUnfit.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotReplaceUnfit.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotReplaceUnfit.c	(revision 12957)
@@ -1,4 +1,5 @@
 # include "psphotInternal.h"
 
+// replace the flux for sources which failed
 bool psphotReplaceUnfit (psArray *sources) { 
 
@@ -15,12 +16,5 @@
 
     replace:
-	if (source->modelPSF == NULL) continue;
-
-	psTrace ("psphot", 3, "replacing object at %f,%f\n", 
-		 source->modelPSF->params->data.F32[PM_PAR_XPOS], source->modelPSF->params->data.F32[PM_PAR_YPOS]);
-
-	// why am i assuming below that this is a PSF?
-	// pmSourceAdd (!NORM, +)
-	pmModelAdd (source->pixels, source->mask, source->modelPSF, PM_MODEL_ADD_FULL);
+	pmSourceAdd (source, PM_MODEL_OP_FULL);
 	source->mode &= ~PM_SOURCE_MODE_SUBTRACTED;
 	source->mode &= ~PM_SOURCE_MODE_TEMPSUB;
@@ -42,14 +36,5 @@
       if (!(source->mode & PM_SOURCE_MODE_SUBTRACTED)) continue;
 
-      // select appropriate model
-      pmModel *model = pmSourceGetModel (NULL, source);
-      if (model == NULL) continue;  // model must be defined
-	
-      psTrace ("psphot", 3, "replacing object at %f,%f\n", 
-	       model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]);
-
-      // pmSourceAdd (source, !NORM, "+");
-      // XXX remove model selection and ps
-      pmModelAdd (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+      pmSourceAdd (source, PM_MODEL_OP_FULL);
       source->mode &= ~PM_SOURCE_MODE_SUBTRACTED;
     }
@@ -58,5 +43,5 @@
 }
 
-// add or sub source replace or if the source has 
+// add source, if the source has been subtracted (or if we ignore the state)
 bool psphotAddWithTest (pmSource *source, bool useState) { 
 
@@ -64,20 +49,13 @@
     bool state = !(source->mode & PM_SOURCE_MODE_SUBTRACTED);
     if (state && useState) return true;
-
-    // select appropriate model
-    pmModel *model = pmSourceGetModel (NULL, source);
-    if (model == NULL) return false;  // model must be defined
-    
-    psTrace ("psphot", 3, "replacing object at %f,%f\n", 
-	     model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]);
     
     // replace the model if 1) state says it is missing or 2) useState is false (just do it)
     if (!state || !useState) {
-	pmModelAdd (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+	pmSourceAdd (source, PM_MODEL_OP_FULL);
     }
     return true;
 }
 
-// add or sub source replace or if the source has 
+// sub source, if the source has been added (or if we ignore the state)
 bool psphotSubWithTest (pmSource *source, bool useState) { 
 
@@ -86,15 +64,7 @@
     if (state && useState) return true;
 
-    // select appropriate model
-    pmModel *model = pmSourceGetModel (NULL, source);
-    if (model == NULL) return false;  // model must be defined
-    
-    psTrace ("psphot", 3, "replacing object at %f,%f\n", 
-	     model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]);
-    
     // replace the model if 1) state says it is missing or 2) useState is false (just do it)
     if (!state || !useState) {
-      // pmSourceSub (!NORM, -)
-	pmModelSub (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+	pmSourceSub (source, PM_MODEL_OP_FULL);
     }
     return true;
@@ -107,19 +77,10 @@
     bool newState = !(source->mode & PM_SOURCE_MODE_SUBTRACTED);
     if (curState == newState) return true;
-
-    // select appropriate model
-    pmModel *model = pmSourceGetModel (NULL, source);
-    if (model == NULL) return false;  // model must be defined
-    
-    psTrace ("psphot", 3, "replacing object at %f,%f\n", 
-	     model->params->data.F32[PM_PAR_XPOS], model->params->data.F32[PM_PAR_YPOS]);
     
     if (curState && !newState) {
-      // pmSourceSub (!NORM, -)
-	pmModelSub (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+	pmSourceSub (source, PM_MODEL_OP_FULL);
     }
     if (newState && !curState) {
-      // pmSourceAdd (!NORM, +)
-	pmModelAdd (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+	pmSourceAdd (source, PM_MODEL_OP_FULL);
     }
     return true;
Index: /branches/eam_02_branch/psphot/src/psphotSourceFits.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotSourceFits.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotSourceFits.c	(revision 12957)
@@ -110,5 +110,5 @@
         blend->modelPSF = psMemIncrRefCounter (model);
         psTrace ("psphot", 5, "fitted blend as PSF\n");
-        pmModelSub (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+        pmModelSub (source->pixels, source->mask, model, PM_MODEL_OP_FULL);
         blend->mode |=  PM_SOURCE_MODE_SUBTRACTED;
         blend->mode &= ~PM_SOURCE_MODE_TEMPSUB;
@@ -128,5 +128,5 @@
 
     psTrace ("psphot", 5, "fitted primary as PSF\n");
-    pmModelSub (source->pixels, source->mask, PSF, PM_MODEL_ADD_FULL);
+    pmModelSub (source->pixels, source->mask, PSF, PM_MODEL_OP_FULL);
     psFree (source->modelPSF);
     source->modelPSF = PSF;
@@ -169,5 +169,5 @@
 
     psTrace ("psphot", 5, "fitted as PSF\n");
-    pmModelSub (source->pixels, source->mask, PSF, PM_MODEL_ADD_FULL);
+    pmModelSub (source->pixels, source->mask, PSF, PM_MODEL_OP_FULL);
 
     // free old model, save new model
@@ -264,5 +264,5 @@
     // sub EXT
     psFree (DBL);
-    pmModelSub (source->pixels, source->mask, EXT, PM_MODEL_ADD_FULL);
+    pmModelSub (source->pixels, source->mask, EXT, 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]);
 
@@ -276,6 +276,6 @@
     // sub DLB
     psFree (EXT);
-    pmModelSub (source->pixels, source->mask, (pmModel *) DBL->data[0], PM_MODEL_ADD_FULL);
-    pmModelSub (source->pixels, source->mask, (pmModel *) DBL->data[1], PM_MODEL_ADD_FULL);
+    pmModelSub (source->pixels, source->mask, (pmModel *) DBL->data[0], PM_MODEL_OP_FULL);
+    pmModelSub (source->pixels, source->mask, (pmModel *) DBL->data[1], 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]);
 
Index: /branches/eam_02_branch/psphot/src/psphotTestPSF.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotTestPSF.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotTestPSF.c	(revision 12957)
@@ -124,5 +124,5 @@
 
 	// subtract model flux
-	pmModelSub (source->pixels, source->mask, model, PM_MODEL_ADD_FULL);
+	pmModelSub (source->pixels, source->mask, model, PM_MODEL_OP_FULL);
     }
     fclose (f);
Index: /branches/eam_02_branch/psphot/src/psphotWeightBias.c
===================================================================
--- /branches/eam_02_branch/psphot/src/psphotWeightBias.c	(revision 12956)
+++ /branches/eam_02_branch/psphot/src/psphotWeightBias.c	(revision 12957)
@@ -5,4 +5,5 @@
 // only allow the normalization to vary
 // XXX eventually, we should be able to do this with linear fitting...
+// XXX UNUSED
 bool psphotWeightBias (pmReadout *readout, psArray *sources, psMetadata *recipe, pmPSF *psf) {
 
@@ -59,5 +60,5 @@
 
         // replace object in image
-        pmModelAdd (source->pixels, source->mask, source->modelPSF, PM_MODEL_ADD_FULL);
+        pmModelAdd (source->pixels, source->mask, source->modelPSF, PM_MODEL_OP_FULL);
 
         // make a temporary model (we don't keep the result of this analysis)
@@ -76,5 +77,5 @@
 
         // re-subtract PSF for object, leave local sky
-        pmModelSub (source->pixels, source->mask, source->modelPSF, PM_MODEL_ADD_FULL);
+        pmModelSub (source->pixels, source->mask, source->modelPSF, PM_MODEL_OP_FULL);
 
         PARp = source->modelPSF->params->data.F32;
