Index: trunk/psphot/src/psphotVisual.c
===================================================================
--- trunk/psphot/src/psphotVisual.c	(revision 30624)
+++ trunk/psphot/src/psphotVisual.c	(revision 31154)
@@ -39,29 +39,11 @@
     switch (channel) {
       case 1:
-        if (kapa1 == -1) {
-            kapa1 = KapaOpenNamedSocket ("kapa", "psphot:images");
-            if (kapa1 == -1) {
-                fprintf (stderr, "failure to open kapa; visual mode disabled\n");
-                pmVisualSetVisual(false);
-            }
-        }
-        return kapa1;
+	pmVisualInitWindow (&kapa1, "psphot:images");
+	return kapa1;
       case 2:
-        if (kapa2 == -1) {
-            kapa2 = KapaOpenNamedSocket ("kapa", "psphot:plots");
-            if (kapa2 == -1) {
-                fprintf (stderr, "failure to open kapa; visual mode disabled\n");
-                pmVisualSetVisual(false);
-            }
-        }
+	pmVisualInitWindow (&kapa2, "psphot:plots");
         return kapa2;
       case 3:
-        if (kapa3 == -1) {
-            kapa3 = KapaOpenNamedSocket ("kapa", "psphot:stamps");
-            if (kapa3 == -1) {
-                fprintf (stderr, "failure to open kapa; visual mode disabled\n");
-                pmVisualSetVisual(false);
-            }
-        }
+	pmVisualInitWindow (&kapa3, "psphot:stamps");
         return kapa3;
       default:
@@ -74,4 +56,6 @@
 
     int myKapa = psphotKapaChannel (channel);
+    if (myKapa == -1) return false;
+
     if (!(strcasecmp (overlay, "all"))) {
 	KiiEraseOverlay (myKapa, "red");
@@ -218,5 +202,5 @@
 }
 
-bool psphotVisualScaleImage (int kapaFD, psImage *inImage, psImage *inMask, const char *name, int channel) {
+bool psphotVisualScaleImage (int kapaFD, psImage *inImage, psImage *inMask, const char *name, float factor, int channel) {
 
     KiiImage image;
@@ -239,6 +223,8 @@
     strcpy (data.name, name);
     strcpy (data.file, name);
-    data.zero = stats->robustMedian - stats->robustStdev;
-    data.range = 5*stats->robustStdev;
+    data.zero = stats->robustMedian - factor*stats->robustStdev;
+
+    // XXX I we have a smoothed image, this make a much-too-tight display range
+    data.range = 5*factor*stats->robustStdev;
     data.logflux = 0;
 
@@ -283,7 +269,12 @@
     if (kapa == -1) return false;
 
+    float factor = 1.0;
+    if (readout->covariance) {
+	factor = psImageCovarianceFactorForAperture(readout->covariance, 10.0);
+    }
+
     psphotVisualShowMask (kapa, readout->mask, "mask", 2);
-    psphotVisualScaleImage (kapa, readout->variance, readout->mask, "variance", 1);
-    psphotVisualScaleImage (kapa, readout->image, readout->mask, "image", 0);
+    psphotVisualScaleImage (kapa, readout->variance, readout->mask, "variance", 1.0, 1);
+    psphotVisualScaleImage (kapa, readout->image, readout->mask, "image", sqrt(factor), 0);
 
     pmVisualAskUser(NULL);
@@ -292,6 +283,4 @@
 
 bool psphotVisualShowBackground (pmConfig *config, const pmFPAview *view, pmReadout *readout) {
-
-    pmReadout *backgnd;
 
     if (!pmVisualTestLevel("psphot.image.backgnd", 2)) return true;
@@ -303,12 +292,13 @@
     pmFPAfile *file = psMetadataLookupPtr (&status, config->files, "PSPHOT.BACKGND");
 
-    if (file->mode == PM_FPA_MODE_INTERNAL) {
-	backgnd = file->readout;
-    } else {
-	backgnd = pmFPAviewThisReadout (view, file->fpa);
-    }
-
-    psphotVisualScaleImage (kapa, backgnd->image, readout->mask, "backgnd", 2);
-    psphotVisualScaleImage (kapa, readout->image, readout->mask, "backsub", 0);
+    pmReadout *backgnd = READOUT_OR_INTERNAL(view, file);
+
+    float factor = 1.0;
+    if (readout->covariance) {
+	factor = psImageCovarianceFactorForAperture(readout->covariance, 10.0);
+    }
+
+    psphotVisualScaleImage (kapa, backgnd->image, readout->mask, "backgnd", 1.0, 2);
+    psphotVisualScaleImage (kapa, readout->image, readout->mask, "backsub", sqrt(factor), 0);
 
     pmVisualAskUser(NULL);
@@ -339,4 +329,45 @@
     psphotVisualRangeImage (kapa, lsig, "log-signif", 2, min, max);
     psFree (lsig);
+
+    pmVisualAskUser(NULL);
+    return true;
+}
+
+// requires psphotVisualShowImage
+bool psphotVisualShowSources (psArray *sources) {
+
+    int Noverlay;
+    KiiOverlay *overlay;
+
+    if (!pmVisualTestLevel("psphot.objects.sources", 1)) return true;
+
+    int kapa = psphotKapaChannel (1);
+    if (kapa == -1) return false;
+
+    // note: this uses the Ohana allocation tools:
+    // ALLOCATE (overlay, KiiOverlay, 3*peaks->n + 1);
+    ALLOCATE (overlay, KiiOverlay, sources->n + 2);
+
+    Noverlay = 0;
+    for (int i = 0; i < sources->n; i++) {
+
+	pmSource *source = sources->data[i];
+	if (!source) continue;
+
+	pmPeak *peak = source->peak;
+	if (!peak) continue;
+
+	overlay[Noverlay].type = KII_OVERLAY_BOX;
+	overlay[Noverlay].x = peak->xf;
+	overlay[Noverlay].y = peak->yf;
+	overlay[Noverlay].dx = 4.0;
+	overlay[Noverlay].dy = 4.0;
+	overlay[Noverlay].angle = 0.0;
+	overlay[Noverlay].text = NULL;
+	Noverlay ++;
+    }
+
+    KiiLoadOverlay (kapa, overlay, Noverlay, "blue");
+    FREE (overlay);
 
     pmVisualAskUser(NULL);
@@ -839,5 +870,13 @@
 
 	if (source->type != type) continue;
-	if (mode && !(source->mode & mode)) continue;
+
+	if (mode == PM_SOURCE_MODE_PSFSTAR) {
+	    bool keep = false;
+	    keep |= (source->tmpFlags & PM_SOURCE_TMPF_CANDIDATE_PSFSTAR);
+	    keep |= (source->mode & PM_SOURCE_MODE_PSFSTAR);
+	    if (!keep) continue;
+	} else {
+	    if (mode && !(source->mode & mode)) continue;
+	}
 
 	pmMoments *moments = source->moments;
@@ -974,5 +1013,5 @@
 
     // examine PSF sources in S/N order (brightest first)
-    sources = psArraySort (sources, pmSourceSortBySN);
+    sources = psArraySort (sources, pmSourceSortByFlux);
 
     // counters to track the size of the image and area used in a row
@@ -1126,5 +1165,5 @@
 
     // examine PSF sources in S/N order (brightest first)
-    sources = psArraySort (sources, pmSourceSortBySN);
+    sources = psArraySort (sources, pmSourceSortByFlux);
 
     // counters to track the size of the image and area used in a row
@@ -1227,5 +1266,5 @@
     }
 
-    psphotVisualScaleImage (myKapa, outsat, NULL, "satstar", 2);
+    psphotVisualScaleImage (myKapa, outsat, NULL, "satstar", 1.0, 2);
 
     pmVisualAskUser(NULL);
@@ -1355,5 +1394,5 @@
     graphdata.xmax = +30.05;
     graphdata.ymin = -0.05;
-    graphdata.ymax = +5.05;
+    graphdata.ymax = +8.05;
     KapaSetLimits (myKapa, &graphdata);
 
@@ -1415,5 +1454,5 @@
     graphdata.xmax = +1.51;
     graphdata.ymin = -0.05;
-    graphdata.ymax = +5.05;
+    graphdata.ymax = +8.05;
     graphdata.color = KapaColorByName ("black");
     KapaSetLimits (myKapa, &graphdata);
@@ -2496,9 +2535,14 @@
     if (myKapa == -1) return false;
 
+    float factor = 1.0;
+    if (readout->covariance) {
+	factor = psImageCovarianceFactorForAperture(readout->covariance, 10.0);
+    }
+
     if (reshow) {
 	psphotVisualShowMask (myKapa, readout->mask, "mask", 2);
-	psphotVisualScaleImage (myKapa, readout->variance, readout->mask, "variance", 1);
-    }
-    psphotVisualScaleImage (myKapa, readout->image, readout->mask, "resid", 0);
+	psphotVisualScaleImage (myKapa, readout->variance, readout->mask, "variance", 1.0, 1);
+    }
+    psphotVisualScaleImage (myKapa, readout->image, readout->mask, "resid", sqrt(factor), 0);
 
     pmVisualAskUser(NULL);
@@ -2653,6 +2697,4 @@
     graphdata.ymax = -32.0;
 
-    FILE *f = fopen ("chisq.dat", "w");
-
     // construct the plot vectors
     int n = 0;
@@ -2672,11 +2714,7 @@
 	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;
