Index: /trunk/psModules/src/astrom/pmAstrometryObjects.c
===================================================================
--- /trunk/psModules/src/astrom/pmAstrometryObjects.c	(revision 20035)
+++ /trunk/psModules/src/astrom/pmAstrometryObjects.c	(revision 20036)
@@ -8,6 +8,6 @@
 *  @author EAM, IfA
 *
-*  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2008-04-11 07:42:05 $
+*  @version $Revision: 1.40 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2008-10-10 01:07:38 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -17,4 +17,5 @@
 #include <config.h>
 #endif
+
 
 /******************************************************************************/
@@ -28,10 +29,13 @@
 #include <unistd.h>   // for unlink
 #include <pslib.h>
+#include <kapa.h> // cnb: do I need an IFDEF?
 
 #include "pmHDU.h"
 #include "pmFPA.h"
 #include "pmAstrometryObjects.h"
+#include "pmKapaPlots.h"
 
 #define PM_ASTROMETRYOBJECTS_DEBUG 1
+
 /******************************************************************************
 pmAstromObjSortByMag(**a, **b): sort by mag (descending)
@@ -243,28 +247,28 @@
     // need to use the stats lookups functions to get the width and center
     for (int i = 0; i < nIter; i++) {
-	if (!psVectorClipFitPolynomial2D (map->x, results->xStats, mask, 0xff, x, wt, X, Y)) {
+        if (!psVectorClipFitPolynomial2D (map->x, results->xStats, mask, 0xff, x, wt, X, Y)) {
             psError(PS_ERR_UNKNOWN, false, "failure in clip-fitting for x\n");
-	    psFree (x);
-	    psFree (y);
-	    psFree (X);
-	    psFree (Y);
-	    psFree (wt);
-	    psFree (mask);
-
-	    return results;
-	}
+            psFree (x);
+            psFree (y);
+            psFree (X);
+            psFree (Y);
+            psFree (wt);
+            psFree (mask);
+
+            return results;
+        }
         psTrace ("psModules.astrom", 3, "x resid: %f +/- %f (%ld of %ld)\n", results->xStats->clippedMean, results->xStats->clippedStdev, results->xStats->clippedNvalues, x->n);
 
         if (!psVectorClipFitPolynomial2D (map->y, results->yStats, mask, 0xff, y, wt, X, Y)) {
             psError(PS_ERR_UNKNOWN, false, "failure in clip-fitting for y\n");
-	    psFree (x);
-	    psFree (y);
-	    psFree (X);
-	    psFree (Y);
-	    psFree (wt);
-	    psFree (mask);
-
-	    return results;
-	}
+            psFree (x);
+            psFree (y);
+            psFree (X);
+            psFree (Y);
+            psFree (wt);
+            psFree (mask);
+
+            return results;
+        }
         psTrace ("psModules.astrom", 3, "y resid: %f +/- %f (%ld of %ld)\n", results->yStats->clippedMean, results->yStats->clippedStdev, results->yStats->clippedNvalues, y->n);
     }
@@ -514,4 +518,5 @@
     const psMetadata *config)
 {
+
     PS_ASSERT_PTR_NON_NULL(raw, NULL);
     PS_ASSERT_PTR_NON_NULL(ref, NULL);
@@ -559,4 +564,9 @@
     psF32 **D2 = gridD2->data.F32;
 
+    // vectors to hold dX and dY
+    int nplot = raw->n * ref->n;
+    float dXplot[nplot];
+    float dYplot[nplot];
+
     // accumulate grids for focal plane (L,M) matches
     for (int i = 0; i < raw->n; i++) {
@@ -567,4 +577,6 @@
             dY = ob1->FP->y - ob2->FP->y;
 
+            dXplot[(i * ref->n) + j] = dX;
+            dYplot[(i * ref->n) + j] = dY;
             // fprintf (f, "dX,dY: %8.2f %8.2f : %8.2f %8.2f : %8.2f %8.2f\n", dX, dY, ob1->FP->x, ob2->FP->x, ob1->FP->y, ob2->FP->y);
             // find bin coordinates for this delta-delta
@@ -673,5 +685,59 @@
     // fprintf (stderr, "sigma: nMatch: %d, nTest: %d, nTen: %d\n", stats->nMatch, stats->nTest, sort->data.U32[sort->n - 10]);
 
-    psFree (sort);
+    /*** plot DXs and DYs ***/
+    KapaSection section = {"s1", 0.00, 0.00, 1.0, 1.0};
+    //KapaSection left = {"s2", 0.05, 0.05, 0.35, 0.8};
+    //KapaSection right = {"s3", 0.55, 0.05, 0.35, 0.8};
+    //KapaSection yprof = {"s4", 0.45, 0.05, 0.10, 0.9};
+    //KapaSection xprof = {"s5", .05, .90, .35, .1};
+
+    Graphdata graphdata;
+    int kapa = pmKapaOpen(true);
+    KapaClearPlots(kapa);
+    KapaInitGraph(&graphdata);
+    KapaSetSection(kapa, &section);
+    graphdata.xmin = stats->offset.x - 1.5 * maxOffpix;
+    graphdata.xmax = stats->offset.x + 1.5 * maxOffpix;
+    graphdata.ymin = stats->offset.y - 1.5 * maxOffpix;
+    graphdata.ymax = stats->offset.y + 1.5 * maxOffpix;
+
+    KapaSetLimits(kapa, &graphdata);
+    KapaSetFont(kapa, "helvetica", 14);
+    KapaBox(kapa, &graphdata);
+    KapaSendLabel (kapa, "X offset", KAPA_LABEL_XM);
+    KapaSendLabel (kapa, "Y offset", KAPA_LABEL_YM);
+    KapaSendLabel (kapa, "pmAstromGridAngle residuals. Big Box: Serach Region. Small Box: Correlation Peak.",
+                   KAPA_LABEL_XP);
+    graphdata.style = 2;
+    graphdata.ptype = 0;
+    graphdata.size = 0.4;
+    graphdata.color = KapaColorByName ("black");
+    KapaPrepPlot(kapa, nplot, &graphdata);
+    KapaPlotVector (kapa, nplot, dXplot, "x");
+    KapaPlotVector (kapa, nplot, dYplot, "y");
+
+    //Overplot bounding box, peak of distribution
+    float xbound[5] = { -maxOffpix, maxOffpix, maxOffpix, -maxOffpix, -maxOffpix};
+    float ybound[5] = { -maxOffpix, -maxOffpix, maxOffpix, maxOffpix, -maxOffpix};
+    float xbin[5] = {stats->offset.x - 0.5 * Scale, stats->offset.x + 0.5 * Scale, stats->offset.x + 0.5 * Scale,
+                     stats->offset.x - 0.5 * Scale, stats->offset.x - 0.5 * Scale};
+    float ybin[5] = {stats->offset.y - 0.5 * Scale, stats->offset.y - 0.5 * Scale, stats->offset.y + 0.5 * Scale,
+                     stats->offset.y + 0.5 * Scale, stats->offset.y - 0.5 * Scale};
+    graphdata.color = KapaColorByName("red");
+    graphdata.style = 0;
+    graphdata.size = 1.0;
+    KapaPrepPlot(kapa, 5, &graphdata);
+    KapaPlotVector (kapa, 5, xbound, "x");
+    KapaPlotVector (kapa, 5, ybound, "y");
+    KapaPrepPlot(kapa, 5, &graphdata);
+    KapaPlotVector (kapa, 5, xbin, "x");
+    KapaPlotVector (kapa, 5, ybin, "y");
+
+    KapaPNG(kapa, "dXdY.png");
+    char c;
+    fscanf(stdin, "%c", &c);
+    /*** end ***/
+
+  psFree (sort);
     psFree (listNP);
     psFree (gridNP);
@@ -730,42 +796,41 @@
     minStat->minMetric = 1e10;
     for (double scale = minScale; scale <= maxScale; scale += delScale) {
-	for (double angle = minAngle; angle <= maxAngle; angle += delAngle) {
-	    rot = pmAstromRotateObj (raw, center, angle, scale);
+        for (double angle = minAngle; angle <= maxAngle; angle += delAngle) {
+            rot = pmAstromRotateObj (raw, center, angle, scale);
 
 # if 0
-	    FILE *f1 = fopen ("raw.dat", "w");
-	    for (int i = 0; i < rot->n; i++) {
-		pmAstromObj *obj = rot->data[i];
-		fprintf (f1, "%8.2f %8.2f   %6.2f\n", obj->FP->x, obj->FP->y, obj->Mag);
-	    }
-	    fclose (f1);
-	    FILE *f2 = fopen ("ref.dat", "w");
-	    for (int i = 0; i < ref->n; i++) {
-		pmAstromObj *obj = ref->data[i];
-		fprintf (f2, "%8.2f %8.2f   %6.2f\n", obj->FP->x, obj->FP->y, obj->Mag);
-	    }
-	    fclose (f2);
-	    fprintf (stderr, "type return");
-	    char c;
-	    fscanf (stdin, "%c", &c);
+            FILE *f1 = fopen ("raw.dat", "w");
+            for (int i = 0; i < rot->n; i++) {
+                pmAstromObj *obj = rot->data[i];
+                fprintf (f1, "%8.2f %8.2f   %6.2f\n", obj->FP->x, obj->FP->y, obj->Mag);
+            }
+            fclose (f1);
+            FILE *f2 = fopen ("ref.dat", "w");
+            for (int i = 0; i < ref->n; i++) {
+                pmAstromObj *obj = ref->data[i];
+                fprintf (f2, "%8.2f %8.2f   %6.2f\n", obj->FP->x, obj->FP->y, obj->Mag);
+            }
+            fclose (f2);
+            fprintf (stderr, "type return");
+            char c;
+            fscanf (stdin, "%c", &c);
 # endif
-
-	    newStat = pmAstromGridAngle (rot, ref, config);
-	    newStat->angle  = angle;
-	    newStat->scale  = scale;
-	    newStat->center = center;
-
-	    if (isfinite(newStat->minMetric) && (newStat->minMetric > 0.0) && (newStat->minMetric < minStat->minMetric)) {
-		*minStat = *newStat;
-		psLogMsg ("psModule.astrom", 4, "grid test - offset: %7.2f,%7.2f @ %6.1f deg x %7.3f (%4d pts, %5.1f sig, %5.1f var, %6.3f log metric) *",
-			  minStat->offset.x, minStat->offset.y, PS_DEG_RAD*minStat->angle, minStat->scale, minStat->nMatch, minStat->nSigma, minStat->minVar, log10(minStat->minMetric));
-	    } else {
-		psLogMsg ("psModule.astrom", 4, "grid test - offset: %7.2f,%7.2f @ %6.1f deg x %7.3f (%4d pts, %5.1f sig, %5.1f var, %6.3f log metric)",
-			  newStat->offset.x, newStat->offset.y, PS_DEG_RAD*newStat->angle, newStat->scale, newStat->nMatch, newStat->nSigma, newStat->minVar, log10(newStat->minMetric));
-
-	    }
-	    psFree (newStat);
-	    psFree (rot);
-	}
+            newStat = pmAstromGridAngle (rot, ref, config);
+            newStat->angle  = angle;
+            newStat->scale  = scale;
+            newStat->center = center;
+
+            if (isfinite(newStat->minMetric) && (newStat->minMetric > 0.0) && (newStat->minMetric < minStat->minMetric)) {
+                *minStat = *newStat;
+                psLogMsg ("psModule.astrom", 4, "grid test - offset: %7.2f,%7.2f @ %6.1f deg x %7.3f (%4d pts, %5.1f sig, %5.1f var, %6.3f log metric) *",
+                          minStat->offset.x, minStat->offset.y, PS_DEG_RAD*minStat->angle, minStat->scale, minStat->nMatch, minStat->nSigma, minStat->minVar, log10(minStat->minMetric));
+            } else {
+                psLogMsg ("psModule.astrom", 4, "grid test - offset: %7.2f,%7.2f @ %6.1f deg x %7.3f (%4d pts, %5.1f sig, %5.1f var, %6.3f log metric)",
+                          newStat->offset.x, newStat->offset.y, PS_DEG_RAD*newStat->angle, newStat->scale, newStat->nMatch, newStat->nSigma, newStat->minVar, log10(newStat->minMetric));
+
+            }
+            psFree (newStat);
+            psFree (rot);
+        }
     }
     psLogMsg ("psModule.astrom.grid.match", 4, "grid best - offset: %7.2f,%7.2f @ %6.1f deg x %7.3f (%4d pts, %5.1f sig, %5.1f var, %6.3f log metric)",
Index: /trunk/psastro/src/psastro.h
===================================================================
--- /trunk/psastro/src/psastro.h	(revision 20035)
+++ /trunk/psastro/src/psastro.h	(revision 20036)
@@ -17,11 +17,11 @@
 // logN = offset + slope * logS
 typedef struct {
-    double mMin;			// minimum magnitude bin with data
-    double mMax;			// maximum magnitude bin with data
-    double offset;			// fitted line offset
-    double slope;			// fitted line slope
-    double mPeak;			// mag of peak bin 
-    int nPeak;				// # of stars in peak bin
-    int sPeak;				// sum of stars to peak bin
+    double mMin;                        // minimum magnitude bin with data
+    double mMax;                        // maximum magnitude bin with data
+    double offset;                      // fitted line offset
+    double slope;                       // fitted line slope
+    double mPeak;                       // mag of peak bin
+    int nPeak;                          // # of stars in peak bin
+    int sPeak;                          // sum of stars to peak bin
 } pmLumFunc;
 
@@ -47,5 +47,6 @@
 bool              psastroChooseRefstars (pmConfig *config, psArray *refs);
 bool              psastroRefstarSubset (pmReadout *readout);
-pmLumFunc        *psastroLuminosityFunction (psArray *stars);
+pmLumFunc        *psastroLuminosityFunction (psArray *stars, pmLumFunc *rawFunc);
+bool              psastroLuminosityFunctionPlot(psVector *lnMag, psVector *Mag, pmLumFunc *lumFunc, pmLumFunc *rawFunc);
 psArray          *psastroRemoveClumps (psArray *input, int scale);
 
@@ -56,36 +57,36 @@
 
 // mosaic fitting functions
-bool 		  psastroMosaicDistortion (pmFPA *fpa, psMetadata *recipe, int pass);
+bool              psastroMosaicDistortion (pmFPA *fpa, psMetadata *recipe, int pass);
 psPlaneTransform *psastroMosaicFitRotAndScale (pmFPA *fpa);
 bool              psastroMosaicApplyRotAndScale (pmFPA *fpa, psPlaneTransform *TPtoFP);
-bool 		  psastroMosaicDistortionFromGradients (pmFPA *fpa, psMetadata *recipe);
+bool              psastroMosaicDistortionFromGradients (pmFPA *fpa, psMetadata *recipe);
 bool              psastroMosaicCorrectDistortion (pmFPA *fpa, psPlaneTransform *TPtoFP);
-bool 		  psastroMosaicCommonScale (pmFPA *fpa, psMetadata *recipe);
-bool 		  psastroMosaicAstrom (pmConfig *config);
-bool 		  psastroMosaicChipAstrom (pmFPA *fpa, psMetadata *recipe, int iteration);
-bool 		  psastroMosaicSetMatch (pmFPA *fpa, psMetadata *recipe, int iteration);
-bool 		  psastroMosaicSetAstrom (pmFPA *fpa);
-bool 		  psastroMosaicHeaders (pmConfig *config);
-bool 		  psastroMosaicRescaleChips (pmFPA *fpa);
-bool 		  psastroMosaicOneChip (pmChip *chip, pmReadout *readout, psMetadata *recipe, psMetadata *updates, int iteration);
+bool              psastroMosaicCommonScale (pmFPA *fpa, psMetadata *recipe);
+bool              psastroMosaicAstrom (pmConfig *config);
+bool              psastroMosaicChipAstrom (pmFPA *fpa, psMetadata *recipe, int iteration);
+bool              psastroMosaicSetMatch (pmFPA *fpa, psMetadata *recipe, int iteration);
+bool              psastroMosaicSetAstrom (pmFPA *fpa);
+bool              psastroMosaicHeaders (pmConfig *config);
+bool              psastroMosaicRescaleChips (pmFPA *fpa);
+bool              psastroMosaicOneChip (pmChip *chip, pmReadout *readout, psMetadata *recipe, psMetadata *updates, int iteration);
 
 // Return version strings.
-psString 	  psastroVersion(void);
-psString 	  psastroVersionLong(void);
+psString          psastroVersion(void);
+psString          psastroVersionLong(void);
 
 // demo plots
-bool 		  psastroPlotRawstars (psArray *rawstars, pmFPA *fpa, pmChip *chip, psMetadata *recipe);
-bool 		  psastroPlotRefstars (psArray *refstars, psMetadata *recipe);
-bool 		  psastroPlotOneChipFit (psArray *rawstars, psArray *refstars, psArray *match, psMetadata *recipe);
+bool              psastroPlotRawstars (psArray *rawstars, pmFPA *fpa, pmChip *chip, psMetadata *recipe);
+bool              psastroPlotRefstars (psArray *refstars, psMetadata *recipe);
+bool              psastroPlotOneChipFit (psArray *rawstars, psArray *refstars, psArray *match, psMetadata *recipe);
 
-bool 		  psastroDumpRawstars (psArray *rawstars, pmFPA *fpa, pmChip *chip);
-bool 		  psastroDumpRefstars (psArray *refstars, char *filename);
-bool 		  psastroDumpMatches (pmFPA *fpa, char *filename);
-bool 		  psastroDumpStars (psArray *stars, char *filename);
+bool              psastroDumpRawstars (psArray *rawstars, pmFPA *fpa, pmChip *chip);
+bool              psastroDumpRefstars (psArray *refstars, char *filename);
+bool              psastroDumpMatches (pmFPA *fpa, char *filename);
+bool              psastroDumpStars (psArray *stars, char *filename);
 bool              psastroDumpMatchedStars (char *filename, psArray *rawstars, psArray *refstars, psArray *match);
 bool              psastroDumpGradients (psArray *gradients, char *filename);
 
-bool		  psastroMosaicSetAstrom_tmp (pmFPA *fpa);
-int 		  psastroSortByMag (const void *a, const void *b);
+bool              psastroMosaicSetAstrom_tmp (pmFPA *fpa);
+int               psastroSortByMag (const void *a, const void *b);
 
 bool              psastroFixChips (pmConfig *config, psMetadata *recipe);
Index: /trunk/psastro/src/psastroLuminosityFunction.c
===================================================================
--- /trunk/psastro/src/psastroLuminosityFunction.c	(revision 20035)
+++ /trunk/psastro/src/psastroLuminosityFunction.c	(revision 20036)
@@ -27,5 +27,5 @@
 }
 
-pmLumFunc *psastroLuminosityFunction (psArray *stars) {
+pmLumFunc *psastroLuminosityFunction (psArray *stars, pmLumFunc *rawFunc) {
 
     if (stars->n == 0) return NULL;
@@ -36,13 +36,13 @@
     double mMax = star->Mag;
     for (int i = 0; i < stars->n; i++) {
-	star = stars->data[i];
-	mMin = PS_MIN (star->Mag, mMin);
-	mMax = PS_MAX (star->Mag, mMax);
+        star = stars->data[i];
+        mMin = PS_MIN (star->Mag, mMin);
+        mMax = PS_MAX (star->Mag, mMax);
     }
 
     int nBin = 1 + (mMax - mMin) / dMag;
     if (nBin <= 1) {
-	psLogMsg ("psastro", 4, "insufficient valid stars for this readout\n");
-	return NULL;
+        psLogMsg ("psastro", 4, "insufficient valid stars for this readout\n");
+        return NULL;
     }
 
@@ -54,10 +54,10 @@
 
     for (int i = 0; i < stars->n; i++) {
-	star = stars->data[i];
-	if (!isfinite(star->Mag)) continue;
-	int bin = (star->Mag - mMin) / dMag;
-	if (bin < 0) psAbort("bin cannot be negative!");
-	if (bin >= nBin) psAbort("bin cannot be > %d!", nBin);
-	nMags->data.F32[bin] += 1.0;
+        star = stars->data[i];
+        if (!isfinite(star->Mag)) continue;
+        int bin = (star->Mag - mMin) / dMag;
+        if (bin < 0) psAbort("bin cannot be negative!");
+        if (bin >= nBin) psAbort("bin cannot be > %d!", nBin);
+        nMags->data.F32[bin] += 1.0;
     }
 
@@ -67,8 +67,8 @@
     int sPeak = 0;
     for (int i = 0; i < nMags->n; i++) {
-	if (nMags->data.F32[i] < nPeak) continue;
-	iPeak = i;
-	nPeak = nMags->data.F32[i];
-	sPeak += nPeak;
+        if (nMags->data.F32[i] < nPeak) continue;
+        iPeak = i;
+        nPeak = nMags->data.F32[i];
+        sPeak += nPeak;
     }
 
@@ -81,9 +81,9 @@
     int n = 0;
     for (int i = 0; i < nMags->n; i++) {
-	if (nMags->data.F32[i] < 1) continue;
-	if ((i > iPeak) && (nMags->data.F32[i] < 0.8*nPeak)) continue;
-	lnMag->data.F32[n] = log10 (nMags->data.F32[i]);
-	Mag->data.F32[n] = mMin + (i + 0.5)*dMag;
-	n++;
+        if (nMags->data.F32[i] < 1) continue;
+        if ((i > iPeak) && (nMags->data.F32[i] < 0.8*nPeak)) continue;
+        lnMag->data.F32[n] = log10 (nMags->data.F32[i]);
+        Mag->data.F32[n] = mMin + (i + 0.5)*dMag;
+        n++;
     }
     lnMag->n = n;
@@ -100,6 +100,6 @@
 
     if (!psVectorClipFitPolynomial1D(line, stats, mask, 0xff, lnMag, NULL, Mag)) {
-	psLogMsg ("psastro", 4, "Failed to fit the luminosity function\n");
-	return(NULL);
+        psLogMsg ("psastro", 4, "Failed to fit the luminosity function\n");
+        return(NULL);
     }
 
@@ -108,11 +108,11 @@
     double mMaxValid = NAN;
     for (int i = 0; i < Mag->n; i++) {
-	if (mask->data.U8[i]) continue;
-	if (isnan(mMinValid) || (Mag->data.F32[i] < mMinValid)) {
-	    mMinValid = Mag->data.F32[i];
-	}
-	if (isnan(mMaxValid) || (Mag->data.F32[i] > mMaxValid)) {
-	    mMaxValid = Mag->data.F32[i];
-	}
+        if (mask->data.U8[i]) continue;
+        if (isnan(mMinValid) || (Mag->data.F32[i] < mMinValid)) {
+            mMinValid = Mag->data.F32[i];
+        }
+        if (isnan(mMaxValid) || (Mag->data.F32[i] > mMaxValid)) {
+            mMaxValid = Mag->data.F32[i];
+        }
     }
 
@@ -129,4 +129,6 @@
     lumFunc->sPeak = sPeak;
 
+    psastroLuminosityFunctionPlot(lnMag, Mag, lumFunc, rawFunc);
+
     psFree (lnMag);
     psFree (nMags);
Index: /trunk/psastro/src/psastroLuminosityFunctionPlot.c
===================================================================
--- /trunk/psastro/src/psastroLuminosityFunctionPlot.c	(revision 20036)
+++ /trunk/psastro/src/psastroLuminosityFunctionPlot.c	(revision 20036)
@@ -0,0 +1,100 @@
+#include "psastroInternal.h"
+
+bool psastroLuminosityFunctionPlot (psVector *lnMag, psVector *Mag,
+                                    pmLumFunc *lumFunc, pmLumFunc *rawFunc) {
+    //Set up graph window
+    Graphdata graphdata;
+    int kapa = pmKapaOpen(true);
+    KapaSection section1 = {"s1", .05, .05, .9, .4};
+    KapaSection section2 = {"s2", .05, .55, .9, .4};
+    KapaSection section;
+    if(rawFunc == NULL)
+        section = section1;
+    else
+        section = section2;
+    int DX = 1000, DY = 800;
+    KapaResize(kapa, DX, DY);
+    if (rawFunc == NULL)
+        KapaClearPlots(kapa);
+    KapaInitGraph(&graphdata);
+
+    //Determine Plot Limits
+    graphdata.xmin = 50;
+    graphdata.ymin = 50;
+    graphdata.xmax = -50;
+    graphdata.ymax = -50;
+
+    for(int i = 0; i < lnMag->n; i++) {
+        graphdata.xmin = PS_MIN(graphdata.xmin,   Mag->data.F32[i]);
+        graphdata.ymin = PS_MIN(graphdata.ymin, lnMag->data.F32[i]);
+        graphdata.xmax = PS_MAX(graphdata.xmax,   Mag->data.F32[i]);
+        graphdata.ymax = PS_MAX(graphdata.ymax, lnMag->data.F32[i]);
+    }
+
+    float range = graphdata.xmax - graphdata.xmin;
+    graphdata.xmin -= .05 * range;
+    graphdata.xmax += .05 * range;
+
+    range = graphdata.ymax - graphdata.ymin;
+    graphdata.ymin -= .05 * range;
+    graphdata.ymax += .05 * range;
+
+    //Make a line for the fit
+    float x[2] = {graphdata.xmin, graphdata.xmax};
+    float y[2] = {lumFunc->offset + x[0] * lumFunc->slope,
+                 lumFunc->offset + x[1] * lumFunc->slope};
+
+    //Plot Data
+    KapaSetSection(kapa, &section);
+    KapaSetLimits(kapa, &graphdata);
+
+    KapaSetFont (kapa, "helvetica", 14);
+    KapaBox (kapa, &graphdata);
+    KapaSendLabel (kapa, "Magnitude", KAPA_LABEL_XM);
+    KapaSendLabel (kapa, "Log(N)", KAPA_LABEL_YM);
+    if (rawFunc == NULL)
+        KapaSendLabel (kapa, "Raw Star Luminosity Function", KAPA_LABEL_XP);
+    else
+        KapaSendLabel (kapa,
+                       "Reference Star Luminosity Function, Shifted Raw Fit, and Cutoff",
+                       KAPA_LABEL_XP);
+    graphdata.color=KapaColorByName("black");
+    graphdata.style = 1;
+    KapaPrepPlot (kapa, lnMag->n, &graphdata);
+    KapaPlotVector(kapa, lnMag->n,   Mag->data.F32, "x");
+    KapaPlotVector(kapa, lnMag->n, lnMag->data.F32, "y");
+
+    //Overplot fit
+    graphdata.style=0;
+    KapaPrepPlot(kapa,2,&graphdata);
+    KapaPlotVector(kapa, 2, x, "x");
+    KapaPlotVector(kapa, 2, y, "y");
+
+    //If rawFunc was supplied, calculate the cutoff magnitude
+    if( rawFunc != NULL) {
+        double mRef = 0.5*(lumFunc->mMin + lumFunc->mMax);
+        double logRho = mRef * lumFunc->slope + lumFunc->offset;
+        double mRaw = (logRho - rawFunc->offset) / rawFunc->slope;
+        double deltaM = mRef - mRaw;
+        double mRefMax = rawFunc->mMax + deltaM;
+
+        float xraw[2] = {rawFunc->mMin + deltaM, rawFunc->mMax + deltaM};
+        float yraw[2] = {rawFunc->offset + (rawFunc->slope) * rawFunc->mMin,
+                        rawFunc->offset + (rawFunc->slope) * rawFunc->mMax};
+        float x[2] = {mRefMax, mRefMax};
+        float y[2] = {graphdata.ymin, graphdata.ymax};
+        graphdata.color= KapaColorByName("red");
+        KapaPrepPlot(kapa, 2, &graphdata);
+        KapaPlotVector(kapa, 2, x, "x");
+        KapaPlotVector(kapa, 2, y, "y");
+        KapaPrepPlot (kapa, 2, &graphdata);
+        KapaPlotVector (kapa, 2, xraw, "x");
+        KapaPlotVector (kapa, 2, yraw, "y");
+
+        KapaPNG(kapa,"LumPlot.png");
+        //char c;
+        //fscanf(stdin, "%c", &c);
+        //        pmKapaClose(kapa);
+    }
+    return true;
+}
