Index: branches/tap_branches/psphot/src/psphotVisual.c
===================================================================
--- branches/tap_branches/psphot/src/psphotVisual.c	(revision 25900)
+++ branches/tap_branches/psphot/src/psphotVisual.c	(revision 27838)
@@ -60,4 +60,18 @@
 }
 
+bool psphotVisualEraseOverlays (int channel, char *overlay) {
+
+    int myKapa = psphotKapaChannel (channel);
+    if (!(strcasecmp (overlay, "all"))) {
+      KiiEraseOverlay (myKapa, "red");
+      KiiEraseOverlay (myKapa, "green");
+      KiiEraseOverlay (myKapa, "blue");
+      KiiEraseOverlay (myKapa, "yellow");
+      return true;
+    }
+    KiiEraseOverlay (myKapa, overlay);
+    return true;
+}
+
 bool psphotVisualShowMask (int kapaFD, psImage *inImage, const char *name, int channel) {
 
@@ -106,5 +120,5 @@
 }
 
-bool psphotVisualScaleImage (int kapaFD, psImage *inImage, const char *name, int channel) {
+bool psphotVisualScaleImage (int kapaFD, psImage *inImage, psImage *inMask, const char *name, int channel) {
 
     KiiImage image;
@@ -116,5 +130,5 @@
     psStats *stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV);
     psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS);
-    if (!psImageBackground(stats, NULL, inImage, NULL, 0, rng)) {
+    if (!psImageBackground(stats, NULL, inImage, inMask, 0xffff, rng)) {
         fprintf (stderr, "failed to get background values\n");
         return false;
@@ -171,7 +185,7 @@
     if (kapa == -1) return false;
 
-    // psphotVisualShowMask (kapa, readout->mask, "mask", 2);
-    psphotVisualScaleImage (kapa, readout->variance, "variance", 1);
-    psphotVisualScaleImage (kapa, readout->image, "image", 0);
+    psphotVisualShowMask (kapa, readout->mask, "mask", 2);
+    psphotVisualScaleImage (kapa, readout->variance, readout->mask, "variance", 1);
+    psphotVisualScaleImage (kapa, readout->image, readout->mask, "image", 0);
 
     pmVisualAskUser(NULL);
@@ -197,6 +211,6 @@
     }
 
-    psphotVisualScaleImage (kapa, backgnd->image, "backgnd", 2);
-    psphotVisualScaleImage (kapa, readout->image, "backsub", 0);
+    psphotVisualScaleImage (kapa, backgnd->image, readout->mask, "backgnd", 2);
+    psphotVisualScaleImage (kapa, readout->image, readout->mask, "backsub", 0);
 
     pmVisualAskUser(NULL);
@@ -204,5 +218,5 @@
 }
 
-bool psphotVisualShowSignificance (psImage *image) {
+bool psphotVisualShowSignificance (psImage *image, float min, float max) {
 
     if (!pmVisualIsVisual()) return true;
@@ -211,5 +225,5 @@
     if (kapa == -1) return false;
 
-    psphotVisualRangeImage (kapa, image, "signif", 2, -1.0, 25.0*25.0);
+    psphotVisualRangeImage (kapa, image, "signif", 2, min, max);
 
     pmVisualAskUser(NULL);
@@ -247,36 +261,5 @@
         overlay[Noverlay].text = NULL;
         Noverlay ++;
-
-# if (0)
-        overlay[Noverlay].type = KII_OVERLAY_BOX;
-        overlay[Noverlay].x = peak->x;
-        overlay[Noverlay].y = peak->y;
-        overlay[Noverlay].dx = 1.0;
-        overlay[Noverlay].dy = 1.0;
-        overlay[Noverlay].angle = 0.0;
-        overlay[Noverlay].text = NULL;
-        Noverlay ++;
-
-        overlay[Noverlay].type = KII_OVERLAY_CIRCLE;
-        overlay[Noverlay].x = peak->xf;
-        overlay[Noverlay].y = peak->yf;
-        overlay[Noverlay].dx = 2.0;
-        overlay[Noverlay].dy = 2.0;
-        overlay[Noverlay].angle = 0.0;
-        overlay[Noverlay].text = NULL;
-        Noverlay ++;
-# endif
-    }
-
-# if (1)
-    overlay[Noverlay].type = KII_OVERLAY_BOX;
-    overlay[Noverlay].x = 10.0;
-    overlay[Noverlay].y = 10.0;
-    overlay[Noverlay].dx = 1.0;
-    overlay[Noverlay].dy = 1.0;
-    overlay[Noverlay].angle = 0.0;
-    overlay[Noverlay].text = NULL;
-    Noverlay ++;
-# endif
+    }
 
     KiiLoadOverlay (kapa, overlay, Noverlay, "red");
@@ -463,4 +446,6 @@
     KapaSetFont (myKapa, "courier", 14);
 
+    section.bg = KapaColorByName ("none"); // XXX probably should be 'none'
+
     float SN_LIM = psMetadataLookupF32(&status, recipe, "PSF_SN_LIM");
 
@@ -494,4 +479,8 @@
     Xmin = PS_MAX(Xmin, -0.1);
     Ymin = PS_MAX(Ymin, -0.1);
+
+    // XXX test: hardwire plot limits
+    // Xmin = -0.1; Ymin = -0.1;
+    // Xmax = 20.1; Ymax = 20.1;
 
     // storage vectors for data to be plotted
@@ -551,5 +540,10 @@
     KapaSetLimits (myKapa, &graphdata);
 
+    graphdata.padXm = NAN;
+    graphdata.padYm = NAN;
+    graphdata.padXp = 0.5;
+    graphdata.padYp = 0.5;
     KapaBox (myKapa, &graphdata);
+
     KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM);
     KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM);
@@ -560,4 +554,5 @@
     graphdata.style = 2;
     KapaPrepPlot (myKapa, nF, &graphdata);
+
     KapaPlotVector (myKapa, nF, xFaint->data.F32, "x");
     KapaPlotVector (myKapa, nF, yFaint->data.F32, "y");
@@ -575,5 +570,5 @@
     section.dy = 0.25;
     section.x  = 0.00;
-    section.y  = 0.80;
+    section.y  = 0.75;
     section.name = psStringCopy ("MagMyy");
     KapaSetSection (myKapa, &section);
@@ -587,4 +582,8 @@
     KapaSetLimits (myKapa, &graphdata);
 
+    graphdata.padXm = 0.5;
+    graphdata.padYm = NAN;
+    graphdata.padXp = NAN;
+    graphdata.padYp = 0.5;
     strcpy (graphdata.labels, "0210");
     KapaBox (myKapa, &graphdata);
@@ -611,5 +610,5 @@
     section.dx = 0.25;
     section.dy = 0.75;
-    section.x  = 0.80;
+    section.x  = 0.75;
     section.y  = 0.00;
     section.name = psStringCopy ("MagMxx");
@@ -624,4 +623,8 @@
     KapaSetLimits (myKapa, &graphdata);
 
+    graphdata.padXm = NAN;
+    graphdata.padYm = 0.5;
+    graphdata.padXp = 0.5;
+    graphdata.padYp = NAN;
     strcpy (graphdata.labels, "2001");
     KapaBox (myKapa, &graphdata);
@@ -654,5 +657,5 @@
 
         int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS");
-        float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, analysis, "PSF_CLUMP_NSIGMA");
+        float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA");
 
         graphdata.color = KapaColorByName ("blue");
@@ -1107,9 +1110,21 @@
     }
 
-    psphotVisualScaleImage (myKapa, outsat, "satstar", 2);
+    psphotVisualScaleImage (myKapa, outsat, NULL, "satstar", 2);
 
     pmVisualAskUser(NULL);
     psFree (outsat);
     return true;
+}
+
+static void plotline (int myKapa, Graphdata *graphdata, float x0, float y0, float x1, float y1) 
+{
+    float x[2], y[2];
+    x[0] = x0;
+    x[1] = x1;
+    y[0] = y0;
+    y[1] = y1;
+    KapaPrepPlot   (myKapa, 2, graphdata);
+    KapaPlotVector (myKapa, 2, x, "x");
+    KapaPlotVector (myKapa, 2, y, "y");
 }
 
@@ -1151,4 +1166,64 @@
     }
 
+    // generate model profiles (major and minor axis):
+    // create a model with theta = 0.0 so major and minor axes are equiv to x and y:
+    psEllipseShape rawShape, rotShape;
+
+    rawShape.sx  = source->modelPSF->params->data.F32[PM_PAR_SXX] / M_SQRT2;
+    rawShape.sy  = source->modelPSF->params->data.F32[PM_PAR_SYY] / M_SQRT2;
+    rawShape.sxy = source->modelPSF->params->data.F32[PM_PAR_SXY];
+
+    psEllipseAxes axes = psEllipseShapeToAxes (rawShape, 20.0);
+
+    axes.theta = 0.0;
+
+    rotShape = psEllipseAxesToShape (axes);
+
+    psVector *params = psVectorAlloc(source->modelPSF->params->n, PS_TYPE_F32);
+    for (int i = 0; i < source->modelPSF->params->n; i++) {
+	params->data.F32[i] = source->modelPSF->params->data.F32[i];
+    }
+    params->data.F32[PM_PAR_SXX] = rotShape.sx * M_SQRT2;
+    params->data.F32[PM_PAR_SYY] = rotShape.sy * M_SQRT2;
+    params->data.F32[PM_PAR_SXY] = rotShape.sxy;
+    params->data.F32[PM_PAR_XPOS] = 0.0;
+    params->data.F32[PM_PAR_YPOS] = 0.0;
+
+    psVector *rmod = psVectorAlloc(300, PS_TYPE_F32);
+    psVector *fmaj = psVectorAlloc(300, PS_TYPE_F32);
+    psVector *fmin = psVectorAlloc(300, PS_TYPE_F32);
+
+    psVector *coord = psVectorAlloc(2, PS_TYPE_F32);
+
+    float r = 0.0;
+    for (int i = 0; i < rmod->n; i++) {
+	r = i*0.1;
+	rmod->data.F32[i] = r;
+
+	coord->data.F32[1] = r;
+	coord->data.F32[0] = 0.0;
+	fmaj->data.F32[i] = log10(source->modelPSF->modelFunc (NULL, params, coord));
+
+	coord->data.F32[0] = r;
+	coord->data.F32[1] = 0.0;
+	fmin->data.F32[i] = log10(source->modelPSF->modelFunc (NULL, params, coord));
+    }
+    psFree (coord);
+    psFree (params);
+
+    float FWHM_MAJOR = 2.0*source->modelPSF->modelRadius (source->modelPSF->params, 0.5*source->modelPSF->params->data.F32[PM_PAR_I0]);
+    float FWHM_MINOR = FWHM_MAJOR * (axes.minor / axes.major);
+    if (FWHM_MAJOR < FWHM_MINOR) PS_SWAP (FWHM_MAJOR, FWHM_MINOR); 
+
+    psEllipseMoments emoments;
+    emoments.x2 = source->moments->Mxx;
+    emoments.xy = source->moments->Mxy;
+    emoments.y2 = source->moments->Myy;
+    axes = psEllipseMomentsToAxes (emoments, 20.0);
+    float MOMENTS_MAJOR = 2.355*axes.major;
+    float MOMENTS_MINOR = 2.355*axes.minor;
+
+    float logHM = log10(0.5*source->modelPSF->params->data.F32[PM_PAR_I0]);
+
     // reset source Add/Sub state to recorded
     if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);
@@ -1187,4 +1262,33 @@
     KapaPlotVector (myKapa, nb, fb->data.F32, "y");
 
+    graphdata.color = KapaColorByName ("blue");
+    graphdata.ptype = 0;
+    graphdata.size = 0.0;
+    graphdata.style = 0;
+    KapaPrepPlot   (myKapa, rmod->n, &graphdata);
+    KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
+    KapaPlotVector (myKapa, rmod->n, fmin->data.F32, "y");
+    plotline (myKapa, &graphdata, 0.0, logHM, 30.0, logHM);
+    plotline (myKapa, &graphdata, 0.5*FWHM_MINOR, 0.0, 0.5*FWHM_MINOR, 5.0);
+    graphdata.ltype = 1;
+    plotline (myKapa, &graphdata, 0.5*MOMENTS_MINOR, 0.0, 0.5*MOMENTS_MINOR, 5.0);
+    graphdata.ltype = 0;
+	
+    graphdata.color = KapaColorByName ("green");
+    graphdata.ptype = 0;
+    graphdata.size = 0.0;
+    graphdata.style = 0;
+    KapaPrepPlot   (myKapa, rmod->n, &graphdata);
+    KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
+    KapaPlotVector (myKapa, rmod->n, fmaj->data.F32, "y");
+    plotline (myKapa, &graphdata, 0.5*FWHM_MAJOR, 0.0, 0.5*FWHM_MAJOR, 5.0);
+    graphdata.ltype = 1;
+    plotline (myKapa, &graphdata, 0.5*MOMENTS_MAJOR, 0.0, 0.5*MOMENTS_MAJOR, 5.0);
+    graphdata.ltype = 0;
+	
+    for (int i = 0; i < rmod->n; i++) {
+	rmod->data.F32[i] = log10(rmod->data.F32[i]);
+    }
+
     // ** loglog **
     KapaSelectSection (myKapa, "loglog");
@@ -1195,4 +1299,5 @@
     graphdata.ymin = -0.05;
     graphdata.ymax = +5.05;
+    graphdata.color = KapaColorByName ("black");
     KapaSetLimits (myKapa, &graphdata);
 
@@ -1217,4 +1322,24 @@
     KapaPlotVector (myKapa, nb, Rb->data.F32, "x");
     KapaPlotVector (myKapa, nb, fb->data.F32, "y");
+
+    graphdata.color = KapaColorByName ("blue");
+    graphdata.ptype = 0;
+    graphdata.size = 0.0;
+    graphdata.style = 0;
+    KapaPrepPlot   (myKapa, rmod->n, &graphdata);
+    KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
+    KapaPlotVector (myKapa, rmod->n, fmin->data.F32, "y");
+
+    graphdata.color = KapaColorByName ("green");
+    graphdata.ptype = 0;
+    graphdata.size = 0.0;
+    graphdata.style = 0;
+    KapaPrepPlot   (myKapa, rmod->n, &graphdata);
+    KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
+    KapaPlotVector (myKapa, rmod->n, fmaj->data.F32, "y");
+
+    psFree (rmod);
+    psFree (fmin);
+    psFree (fmaj);
 
     psFree (rg);
@@ -1240,4 +1365,6 @@
     psImageMaskType maskVal = psMetadataLookupImageMask(&status, recipe, "MASK.PSPHOT"); // Mask value for bad pixels
     assert (maskVal);
+
+    section.bg  = KapaColorByName ("none"); // XXX probably should be 'none'
 
     KapaClearPlots (myKapa);
@@ -1405,5 +1532,4 @@
         if (source == NULL) continue;
 
-        // if (source->type != type) continue;
         if (mode) {
             if (keep) {
@@ -1478,4 +1604,6 @@
     KapaSetFont (myKapa, "courier", 14);
 
+    section.bg  = KapaColorByName ("none"); // XXX probably should be 'none'
+
     // select the max psfX,Y values for the plot limits
     float Xmin = 1000.0, Xmax = 0.0;
@@ -1529,4 +1657,9 @@
     psVector *sDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
 
+    psVector *xLOW = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
+    psVector *yLOW = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
+    psVector *mLOW = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
+    psVector *sLOW = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
+
     psVector *xCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     psVector *yCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
@@ -1539,8 +1672,12 @@
     int nPSF = 0;
     int nDEF = 0;
+    int nLOW = 0;
     int nCR  = 0;
     for (int i = 0; i < sources->n; i++) {
         pmSource *source = sources->data[i];
         if (source->moments == NULL) continue;
+
+	// only plot the measured sources...
+        if (!(source->tmpFlags & PM_SOURCE_TMPF_SIZE_MEASURED)) continue;
 
         if (source->mode & PM_SOURCE_MODE_CR_LIMIT) {
@@ -1574,5 +1711,10 @@
             continue;
         }
-        if ((source->mode & PM_SOURCE_MODE_CR_LIMIT) || (source->mode & PM_SOURCE_MODE_SATSTAR)) {
+        if (source->errMag > 0.1) {
+            xLOW->data.F32[nLOW] = source->moments->Mxx;
+            yLOW->data.F32[nLOW] = source->moments->Myy;
+            mLOW->data.F32[nLOW] = -2.5*log10(source->moments->Sum);
+            sLOW->data.F32[nLOW] = source->extNsigma;
+            nLOW++;
             continue;
         }
@@ -1583,4 +1725,5 @@
         nPSF++;
     }
+
     xSAT->n = nSAT;
     ySAT->n = nSAT;
@@ -1607,4 +1750,9 @@
     mDEF->n = nDEF;
     sDEF->n = nDEF;
+
+    xLOW->n = nLOW;
+    yLOW->n = nLOW;
+    mLOW->n = nLOW;
+    sLOW->n = nLOW;
 
     // four sections: MxxMyy, MagMxx, MagMyy, MagSigma
@@ -1626,4 +1774,8 @@
     KapaSetLimits (myKapa, &graphdata);
 
+    graphdata.padXm = NAN;
+    graphdata.padYm = NAN;
+    graphdata.padXp = 0.5;
+    graphdata.padYp = 0.5;
     KapaBox (myKapa, &graphdata);
     KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM);
@@ -1669,4 +1821,12 @@
     KapaPlotVector (myKapa, nSAT, xSAT->data.F32, "x");
     KapaPlotVector (myKapa, nSAT, ySAT->data.F32, "y");
+
+    graphdata.color = KapaColorByName ("black");
+    graphdata.ptype = 7;
+    graphdata.size = 1.0;
+    graphdata.style = 2;
+    KapaPrepPlot   (myKapa, nLOW, &graphdata);
+    KapaPlotVector (myKapa, nLOW, xLOW->data.F32, "x");
+    KapaPlotVector (myKapa, nLOW, yLOW->data.F32, "y");
 
     // second section: MagMyy
@@ -1681,9 +1841,13 @@
     graphdata.color = KapaColorByName ("black");
     graphdata.xmin = -17.1;
-    graphdata.xmax =  -7.9;
+    graphdata.xmax =  -6.9;
     graphdata.ymin = Ymin;
     graphdata.ymax = Ymax;
     KapaSetLimits (myKapa, &graphdata);
 
+    graphdata.padXm = 0.5;
+    graphdata.padYm = NAN;
+    graphdata.padXp = NAN;
+    graphdata.padYp = 0.5;
     strcpy (graphdata.labels, "0210");
     KapaBox (myKapa, &graphdata);
@@ -1734,5 +1898,5 @@
     section.dx = 0.25;
     section.dy = 0.60;
-    section.x  = 0.80;
+    section.x  = 0.75;
     section.y  = 0.00;
     section.name = psStringCopy ("MagMxx");
@@ -1743,8 +1907,12 @@
     graphdata.xmin = Xmin;
     graphdata.xmax = Xmax;
-    graphdata.ymin =  -7.9;
+    graphdata.ymin =  -6.9;
     graphdata.ymax = -17.1;
     KapaSetLimits (myKapa, &graphdata);
 
+    graphdata.padXm = NAN;
+    graphdata.padYm = 0.5;
+    graphdata.padXp = 0.5;
+    graphdata.padYp = NAN;
     strcpy (graphdata.labels, "2001");
     KapaBox (myKapa, &graphdata);
@@ -1794,7 +1962,7 @@
     // fourth section: MagSigma
     section.dx = 0.75;
-    section.dy = 0.15;
+    section.dy = 0.20;
     section.x  = 0.00;
-    section.y  = 0.65;
+    section.y  = 0.60;
     section.name = psStringCopy ("MagSigma");
     KapaSetSection (myKapa, &section);
@@ -1802,5 +1970,5 @@
 
     graphdata.color = KapaColorByName ("black");
-    graphdata.xmax =  -7.9;
+    graphdata.xmax =  -6.9;
     graphdata.xmin = -17.1;
     graphdata.ymin = -20.1;
@@ -1808,4 +1976,8 @@
     KapaSetLimits (myKapa, &graphdata);
 
+    graphdata.padXm = 0.5;
+    graphdata.padYm = NAN;
+    graphdata.padXp = 0.5;
+    graphdata.padYp = 0.5;
     strcpy (graphdata.labels, "0100");
     KapaBox (myKapa, &graphdata);
@@ -1862,5 +2034,5 @@
 
         int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS");
-        float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, analysis, "PSF_CLUMP_NSIGMA");
+        float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA");
 
         graphdata.color = KapaColorByName ("blue");
@@ -1901,20 +2073,30 @@
     psFree (ySAT);
     psFree (mSAT);
+    psFree (sSAT);
 
     psFree (xEXT);
     psFree (yEXT);
     psFree (mEXT);
+    psFree (sEXT);
 
     psFree (xPSF);
     psFree (yPSF);
     psFree (mPSF);
+    psFree (sPSF);
 
     psFree (xDEF);
     psFree (yDEF);
     psFree (mDEF);
+    psFree (sDEF);
+
+    psFree (xLOW);
+    psFree (yLOW);
+    psFree (mLOW);
+    psFree (sLOW);
 
     psFree (xCR);
     psFree (yCR);
     psFree (mCR);
+    psFree (sCR);
 
     pmVisualAskUser(NULL);
@@ -1929,5 +2111,5 @@
     if (myKapa == -1) return false;
 
-    psphotVisualScaleImage (myKapa, readout->image, "resid", 1);
+    psphotVisualScaleImage (myKapa, readout->image, readout->mask, "resid", 1);
 
     pmVisualAskUser(NULL);
@@ -2054,4 +2236,87 @@
 }
 
+bool psphotVisualPlotChisq (psArray *sources) {
+
+    Graphdata graphdata;
+
+    if (!pmVisualIsVisual()) return true;
+
+    int myKapa = psphotKapaChannel (2);
+    if (myKapa == -1) return false;
+
+    KapaClearPlots (myKapa);
+    KapaInitGraph (&graphdata);
+
+    psVector *x = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
+    psVector *y = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
+
+    graphdata.xmin = +32.0;
+    graphdata.xmax = -32.0;
+    graphdata.ymin = +32.0;
+    graphdata.ymax = -32.0;
+
+    FILE *f = fopen ("chisq.dat", "w");
+
+    // construct the plot vectors
+    int n = 0;
+    for (int i = 0; i < sources->n; i++) {
+        pmSource *source = sources->data[i];
+        if (!source) continue;
+        if (source->type != PM_SOURCE_TYPE_STAR) continue;
+        if (!source->moments) continue;
+        if (!isfinite(source->moments->Sum)) continue;
+        if (!source->modelPSF) continue;
+        if (!isfinite(source->modelPSF->chisq)) continue;
+
+        x->data.F32[n] = -2.5*log10(source->moments->Sum);
+        y->data.F32[n] = source->modelPSF->chisq / source->modelPSF->nDOF;
+        graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]);
+        graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]);
+        graphdata.ymin = PS_MIN(graphdata.ymin, y->data.F32[n]);
+        graphdata.ymax = PS_MAX(graphdata.ymax, y->data.F32[n]);
+
+        fprintf (f, "%d %d %f %f\n", i, n, x->data.F32[n], y->data.F32[n]);
+
+        n++;
+    }
+    x->n = y->n = n;
+    fclose (f);
+
+    float range;
+    range = graphdata.xmax - graphdata.xmin;
+    graphdata.xmax += 0.05*range;
+    graphdata.xmin -= 0.05*range;
+    range = graphdata.ymax - graphdata.ymin;
+    graphdata.ymax += 0.05*range;
+    graphdata.ymin -= 0.05*range;
+
+    // XXX test
+    graphdata.xmin = -17.0;
+    graphdata.xmax =  -3.0;
+    graphdata.ymin =  -0.1;
+    graphdata.ymax = +10.1;
+
+    KapaSetLimits (myKapa, &graphdata);
+
+    KapaSetFont (myKapa, "helvetica", 14);
+    KapaBox (myKapa, &graphdata);
+    KapaSendLabel (myKapa, "PSF Mag", KAPA_LABEL_XM);
+    KapaSendLabel (myKapa, "ChiSq", KAPA_LABEL_YM);
+
+    graphdata.color = KapaColorByName ("black");
+    graphdata.ptype = 2;
+    graphdata.size = 0.5;
+    graphdata.style = 2;
+    KapaPrepPlot (myKapa, n, &graphdata);
+    KapaPlotVector (myKapa, n, x->data.F32, "x");
+    KapaPlotVector (myKapa, n, y->data.F32, "y");
+
+    psFree (x);
+    psFree (y);
+
+    pmVisualAskUser(NULL);
+    return true;
+}
+
 bool psphotVisualShowPetrosians (psArray *sources) {
 
@@ -2073,29 +2338,28 @@
         if (!source) continue;
         if (!source->extpars) continue;
-        if (!source->extpars->profile) continue;
-        if (!source->extpars->petrosian_80) continue;
-
-        pmSourceRadialProfile *profile = source->extpars->profile;
-        pmSourceExtendedFlux *petrosian = source->extpars->petrosian_80;
+        if (!source->extpars->petProfile) continue;
+
+        float petrosianRadius = source->extpars->petrosianRadius;
+	psEllipseAxes *axes = &source->extpars->axes;
 
         overlay[Noverlay].type = KII_OVERLAY_CIRCLE;
         overlay[Noverlay].x = source->peak->xf;
         overlay[Noverlay].y = source->peak->yf;
-        overlay[Noverlay].dx = 2.0*petrosian->radius;
-        overlay[Noverlay].dy = 2.0*petrosian->radius*profile->axes.minor/profile->axes.major;
-        overlay[Noverlay].angle = profile->axes.theta * PS_DEG_RAD;
+        overlay[Noverlay].dx = 1.0*petrosianRadius;
+        overlay[Noverlay].dy = 1.0*petrosianRadius*axes->minor/axes->major;
+        overlay[Noverlay].angle = axes->theta * PS_DEG_RAD;
         overlay[Noverlay].text = NULL;
         Noverlay ++;
         CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);
 
-        overlay[Noverlay].type = KII_OVERLAY_CIRCLE;
-        overlay[Noverlay].x = source->peak->xf;
-        overlay[Noverlay].y = source->peak->yf;
-        overlay[Noverlay].dx = 4.0*petrosian->radius;
-        overlay[Noverlay].dy = 4.0*petrosian->radius*profile->axes.minor/profile->axes.major;
-        overlay[Noverlay].angle = profile->axes.theta * PS_DEG_RAD;
-        overlay[Noverlay].text = NULL;
-        Noverlay ++;
-        CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);
+        // overlay[Noverlay].type = KII_OVERLAY_CIRCLE;
+        // overlay[Noverlay].x = source->peak->xf;
+        // overlay[Noverlay].y = source->peak->yf;
+        // overlay[Noverlay].dx = 2.0*petrosianRadius;
+        // overlay[Noverlay].dy = 2.0*petrosianRadius*axes->minor/axes->major;
+        // overlay[Noverlay].angle = axes->theta * PS_DEG_RAD;
+        // overlay[Noverlay].text = NULL;
+        // Noverlay ++;
+        // CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);
     }
 
