Index: trunk/psphot/src/psphotSourcePlots.c
===================================================================
--- trunk/psphot/src/psphotSourcePlots.c	(revision 12627)
+++ trunk/psphot/src/psphotSourcePlots.c	(revision 12665)
@@ -3,10 +3,13 @@
 bool psphotSourcePlots (pmReadout *readout, psArray *sources, psMetadata *recipe) {
 
-    bool status = false;
+    // bool status = false;
     psTimerStart ("psphot");
 
     // the source images are written to an image 10x the size of a PSF object
-    float OUTER = psMetadataLookupF32 (&status, recipe, "SKY_OUTER_RADIUS");
-    PS_ASSERT (status);
+    // float OUTER = psMetadataLookupF32 (&status, recipe, "SKY_OUTER_RADIUS");
+    // PS_ASSERT (status, false);
+
+    int DX = 21;
+    int DY = 21;
 
     // examine PSF sources in S/N order (brightest first)
@@ -16,9 +19,8 @@
     int dX = 0;				// starting corner of next box
     int dY = 0;				// height of row so far
-    int NX = 10*(2*OUTER+1);		// full width of output image
+    int NX = 20*DX;			// full width of output image
     int NY = 0;				// total height of output image
 
     // first, examine the PSF and SAT stars:
-    // - generate radial plots (PS plots)
     // - determine bounding boxes for summary image
     for (int i = 0; i < sources->n; i++) {
@@ -32,9 +34,12 @@
 
 	// how does this subimage get placed into the output image?
-	if (dX + source->pixels->numCols >= NX) {
+	// DX = source->pixels->numCols
+	// DY = source->pixels->numRows
+
+	if (dX + DX > NX) {
 	    // too wide for the rest of this row
 	    if (dX == 0) {
 		// alone on this row
-		NY += source->pixels->numRows;
+		NY += DY;
 		dX = 0;
 		dY = 0;
@@ -42,13 +47,12 @@
 		// start the next row
 		NY += dY;
-		dX = source->pixels->numCols;
-		dY = source->pixels->numRows;
+		dX = DX;
+		dY = DY;
 	    }
 	} else {
 	    // extend this row
-	    dX += source->pixels->numCols;
-	    dY = PS_MAX (dY, source->pixels->numRows);
+	    dX += DX;
+	    dY = PS_MAX (dY, DY);
 	}
-	psphotRadialPlot ("radial.plots.ps", source);
     }
 
@@ -59,9 +63,13 @@
     int Xo = 0;				// starting corner of next box
     int Yo = 0;				// starting corner of next box
-    int dY = 0;				// height of row so far
+    dY = 0;				// height of row so far
+
+    int nPSF = 0;
+    int nSAT = 0;
+    int kapa = 0;			// file descriptor for plotting routine
 
     // first, examine the PSF and SAT stars:
     // - generate radial plots (PS plots)
-    // - determine bounding boxes for summary image
+    // - create output image array
     for (int i = 0; i < sources->n; i++) {
 
@@ -69,15 +77,31 @@
 
 	bool keep = false;
-        keep |= (source->mode & PM_SOURCE_MODE_PSFSTAR);
-        keep |= (source->mode & PM_SOURCE_MODE_SATSTAR);
+        if (source->mode & PM_SOURCE_MODE_PSFSTAR) {
+	    nPSF ++;
+	    keep = true;
+	}
+        if (source->mode & PM_SOURCE_MODE_SATSTAR) {
+	    nSAT ++;
+	    keep = true;
+	}	    
 	if (!keep) continue;
 
 	// how does this subimage get placed into the output image?
-	if (Xo + source->pixels->numCols >= NX) {
+	// DX = source->pixels->numCols
+	// DY = source->pixels->numRows
+
+	if (Xo + DX > NX) {
 	    // too wide for the rest of this row
 	    if (Xo == 0) {
-		// alone on this row
-		PlaceImage (source, Xo, Yo);
-		Yo += source->pixels->numRows;
+		// place source alone on this row
+		psphotAddWithTest (source, true); // replace source if subtracted
+		psphotRadialPlot (&kapa, "radial.plots.ps", source);
+		psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY);
+
+		psphotSubWithTest (source, false); // remove source (force)
+		psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY);
+
+		psphotSetState (source, false); // replace source (has been subtracted)
+		Yo += DY;
 		Xo = 0;
 		dY = 0;
@@ -86,17 +110,36 @@
 		Yo += dY;
 		Xo = 0;
-		PlaceImage (source, Xo, Yo);
-		Xo = source->pixels->numCols;
-		dY = source->pixels->numRows;
+		psphotAddWithTest (source, true); // replace source if subtracted
+		psphotRadialPlot (&kapa, "radial.plots.ps", source);
+		psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY);
+
+		psphotSubWithTest (source, false); // remove source (force)
+		psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY);
+		psphotSetState (source, false); // replace source (has been subtracted)
+
+		Xo = DX;
+		dY = DY;
 	    }
 	} else {
 	    // extend this row
-	    PlaceImage (source, Xo, Yo);
-	    Xo += source->pixels->numCols;
-	    dY = PS_MAX (dY, source->pixels->numRows);
+	    psphotAddWithTest (source, true); // replace source if subtracted
+	    psphotRadialPlot (&kapa, "radial.plots.ps", source);
+	    psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY);
+
+	    psphotSubWithTest (source, false); // remove source (force)
+	    psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY);
+	    psphotSetState (source, false); // replace source (has been subtracted)
+
+	    Xo += DX;
+	    dY = PS_MAX (dY, DY);
 	}
     }
 
-    psLogMsg ("psphot", PS_LOG_INFO, "%ld sources, %d moments, %d failed: %f sec\n", sources->n, Nmoments, Nfail, psTimerMark ("psphot"));
+    psphotSaveImage (NULL, outpos, "outpos.fits");
+    psphotSaveImage (NULL, outsub, "outsub.fits");
+    psLogMsg ("psphot", PS_LOG_INFO, "plotted %d sources (%d psf, %d sat): %f sec\n", nPSF + nSAT, nPSF, nSAT, psTimerMark ("psphot"));
+
+    psFree (outpos);
+    psFree (outsub);
     return (sources);
 }
