Index: trunk/psastro/src/psastroDemoPlot.c
===================================================================
--- trunk/psastro/src/psastroDemoPlot.c	(revision 15103)
+++ trunk/psastro/src/psastroDemoPlot.c	(revision 15195)
@@ -4,5 +4,7 @@
 # include <kapa.h>
 
-bool psastroPlotRawstars (psArray *rawstars, pmFPA *fpa, pmChip *chip)
+bool pmKapaPlotVectorTriple_AutoLimitsZscale_OpenGraph (int kapa, Graphdata *graphdata, psVector *xVec, psVector *yVec, psVector *zVec, bool increasing);
+
+bool psastroPlotRawstars (psArray *rawstars, pmFPA *fpa, pmChip *chip, psMetadata *recipe)
 {
     Graphdata graphdata;
@@ -15,4 +17,8 @@
     }
 
+    bool status = false;
+    float iMagMin = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.INST.MAG.MIN");
+    float iMagMax = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.INST.MAG.MAX");
+
     KapaResize (kapa, 1000, 1000);
     KapaInitGraph (&graphdata);
@@ -42,4 +48,7 @@
 	pmAstromObj *raw = rawstars->data[i];
 	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+
 	xVec->data.F32[n] = raw->chip->x;
 	yVec->data.F32[n] = raw->chip->y;
@@ -61,4 +70,7 @@
 	pmAstromObj *raw = rawstars->data[i];
 	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+
 	xVec->data.F32[n] = raw->FP->x;
 	yVec->data.F32[n] = raw->FP->y;
@@ -80,4 +92,7 @@
 	pmAstromObj *raw = rawstars->data[i];
 	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+
 	xVec->data.F32[n] = raw->TP->x;
 	yVec->data.F32[n] = raw->TP->y;
@@ -99,4 +114,7 @@
 	pmAstromObj *raw = rawstars->data[i];
 	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+
 	xVec->data.F32[n] = DEG_RAD*raw->sky->r;
 	yVec->data.F32[n] = DEG_RAD*raw->sky->d;
@@ -111,6 +129,5 @@
     char key[10], name[80];
     fprintf (stdout, "(s)ave plot or [c]ontinue? ");
-    fscanf (stdin, "%s", key);
-    fprintf (stderr, "got: %s\n", key);
+    fgets (key, 8, stdin);
     if (key[0] == 's') {
 	fprintf (stdout, "enter plot name [rawstars.png]: ");
@@ -126,5 +143,5 @@
 }
 
-bool psastroPlotRefstars (psArray *refstars)
+bool psastroPlotRefstars (psArray *refstars, psMetadata *recipe)
 {
     Graphdata graphdata;
@@ -136,4 +153,8 @@
     }
 
+    bool status = false;
+    float rMagMin = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.REF.MAG.MIN");
+    float rMagMax = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.REF.MAG.MAX");
+
     KapaResize (kapa, 1000, 1000);
     KapaInitGraph (&graphdata);
@@ -153,4 +174,7 @@
 	pmAstromObj *ref = refstars->data[i];
 	if (!isfinite(ref->Mag)) continue;
+	if (ref->Mag > rMagMax) continue;
+	if (ref->Mag < rMagMin) continue;
+
 	xVec->data.F32[n] = DEG_RAD*ref->sky->r;
 	yVec->data.F32[n] = DEG_RAD*ref->sky->d;
@@ -165,6 +189,5 @@
     char key[10], name[80];
     fprintf (stdout, "(s)ave plot or [c]ontinue? ");
-    fscanf (stdin, "%s", key);
-    fprintf (stderr, "got: %s\n", key);
+    fgets (key, 8, stdin);
     if (key[0] == 's') {
 	fprintf (stdout, "enter plot name [refstars.png]: ");
@@ -180,5 +203,5 @@
 }
 
-bool psastroPlotOneChipFit (psArray *rawstars, psArray *refstars, psArray *match, pmAstromFitResults *results) {
+bool psastroPlotOneChipFit (psArray *rawstars, psArray *refstars, psArray *match, psMetadata *recipe) {
 
     Graphdata graphdata;
@@ -190,4 +213,10 @@
         return false;
     }
+
+    bool status = false;
+    float iMagMin = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.INST.MAG.MIN");
+    float iMagMax = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.INST.MAG.MAX");
+    float rMagMin = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.REF.MAG.MIN");
+    float rMagMax = psMetadataLookupF32 (&status, recipe, "PSASTRO.PLOT.REF.MAG.MAX");
 
     KapaResize (kapa, 1000, 1000);
@@ -221,4 +250,9 @@
         pmAstromObj *ref = refstars->data[pair->ref];
 	
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+	if (ref->Mag < rMagMin) continue;
+	if (ref->Mag > rMagMax) continue;
+
 	xVec->data.F32[n] = raw->chip->x;
 	yVec->data.F32[n] = raw->chip->x - ref->chip->x;
@@ -244,4 +278,9 @@
 	
 	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+	if (ref->Mag < rMagMin) continue;
+	if (ref->Mag > rMagMax) continue;
+
 	xVec->data.F32[n] = raw->chip->x;
 	yVec->data.F32[n] = raw->chip->y - ref->chip->y;
@@ -267,4 +306,9 @@
 	
 	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+	if (ref->Mag < rMagMin) continue;
+	if (ref->Mag > rMagMax) continue;
+
 	xVec->data.F32[n] = raw->chip->y;
 	yVec->data.F32[n] = raw->chip->x - ref->chip->x;
@@ -290,4 +334,9 @@
 	
 	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+	if (ref->Mag < rMagMin) continue;
+	if (ref->Mag > rMagMax) continue;
+
 	xVec->data.F32[n] = raw->chip->y;
 	yVec->data.F32[n] = raw->chip->y - ref->chip->y;
@@ -297,4 +346,71 @@
     xVec->n = yVec->n = zVec->n = n;
     pmKapaPlotVectorTriple_AutoLimits_OpenGraph (kapa, &graphdata, xVec, yVec, zVec, false);
+
+    // *** X vs Y plot (different window)
+    int kapa2 = KapaOpenNamedSocket ("kapa", "XvsY");
+    if (kapa2 == -1) {
+        psError(PS_ERR_UNKNOWN, true, "failure to open kapa");
+        return false;
+    }
+
+    KapaResize (kapa2, 1000, 1000);
+    KapaInitGraph (&graphdata);
+    KapaClearPlots (kapa2);
+
+    graphdata.color = KapaColorByName ("black");
+    graphdata.ptype = 2;
+    graphdata.style = 2;
+
+    psFree (xVec);
+    psFree (yVec);
+    psFree (zVec);
+
+    xVec = psVectorAlloc (rawstars->n, PS_TYPE_F32);
+    yVec = psVectorAlloc (rawstars->n, PS_TYPE_F32);
+    zVec = psVectorAlloc (rawstars->n, PS_TYPE_F32);
+
+    // X vs Y by mag (raw)
+    n = 0;
+    for (int i = 0; i < rawstars->n; i++) {
+        pmAstromObj *raw = rawstars->data[i];
+	if (!isfinite(raw->Mag)) continue;
+	if (raw->Mag < iMagMin) continue;
+	if (raw->Mag > iMagMax) continue;
+
+	xVec->data.F32[n] = raw->chip->x;
+	yVec->data.F32[n] = raw->chip->y;
+	zVec->data.F32[n] = raw->Mag;
+	n++;
+    }	
+    xVec->n = yVec->n = zVec->n = n;
+    pmKapaPlotVectorTriple_AutoLimits_OpenGraph (kapa2, &graphdata, xVec, yVec, zVec, false);
+
+    graphdata.color = KapaColorByName ("red");
+    graphdata.ptype = 7;
+    graphdata.style = 2;
+
+    psFree (xVec);
+    psFree (yVec);
+    psFree (zVec);
+
+    xVec = psVectorAlloc (refstars->n, PS_TYPE_F32);
+    yVec = psVectorAlloc (refstars->n, PS_TYPE_F32);
+    zVec = psVectorAlloc (refstars->n, PS_TYPE_F32);
+
+    // X vs Y by mag (raw)
+    n = 0;
+    for (int i = 0; i < refstars->n; i++) {
+        pmAstromObj *ref = refstars->data[i];
+	if (!isfinite(ref->Mag)) continue;
+	if (ref->Mag < rMagMin) continue;
+	if (ref->Mag > rMagMax) continue;
+
+	xVec->data.F32[n] = ref->chip->x;
+	yVec->data.F32[n] = ref->chip->y;
+	zVec->data.F32[n] = ref->Mag;
+	n++;
+    }	
+    xVec->n = yVec->n = zVec->n = n;
+    pmKapaPlotVectorTriple_AutoLimitsZscale_OpenGraph (kapa2, &graphdata, xVec, yVec, zVec, false);
 
     // pause and wait for user input: 
@@ -302,6 +418,5 @@
     char key[10], name[80];
     fprintf (stdout, "(s)ave plot or [c]ontinue? ");
-    fscanf (stdin, "%s", key);
-    fprintf (stderr, "got: %s\n", key);
+    fgets (key, 8, stdin);
     if (key[0] == 's') {
 	fprintf (stdout, "enter plot name [chipfit.png]: ");
@@ -311,4 +426,5 @@
     }
 
+    close (kapa2);
     psFree (xVec);
     psFree (yVec);
@@ -317,4 +433,44 @@
 }
 
+bool pmKapaPlotVectorTriple_AutoLimitsZscale_OpenGraph (int kapa, Graphdata *graphdata, psVector *xVec, psVector *yVec, psVector *zVec, bool increasing)
+{
+
+    // set limits based on data values
+    float zmin = +FLT_MAX;
+    float zmax = -FLT_MAX;
+    for (int i = 0; i < xVec->n; i++) {
+        zmin = PS_MIN (zmin, zVec->data.F32[i]);
+        zmax = PS_MAX (zmax, zVec->data.F32[i]);
+    }
+
+    // set the scale vector
+    psVector *zScale = psVectorAlloc (zVec->n, PS_DATA_F32);
+
+    float range = zmax - zmin;
+    if (range == 0.0) {
+        psVectorInit (zScale, 1.0);
+    } else {
+        for (int i = 0; i < zVec->n; i++) {
+            if (increasing) {
+                zScale->data.F32[i] = PS_MIN (1.5, PS_MAX(0.05, 1.5*(zVec->data.F32[i] - zmin)/range));
+            } else {
+                zScale->data.F32[i] = PS_MIN (1.5, PS_MAX(0.05, 1.5*(zmax - zVec->data.F32[i])/range));
+            }
+        }
+    }
+
+    KapaSetFont (kapa, "helvetica", 14);
+    KapaBox (kapa, graphdata);
+
+    // the point size will be scaled from the z vector
+    graphdata->size = -1;
+    KapaPrepPlot (kapa, xVec->n, graphdata);
+    KapaPlotVector (kapa, xVec->n, xVec->data.F32, "x");
+    KapaPlotVector (kapa, yVec->n, yVec->data.F32, "y");
+    KapaPlotVector (kapa, zVec->n, zScale->data.F32, "z");
+    psFree (zScale);
+    return true;
+}
+
 # else
 
