IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 25387


Ignore:
Timestamp:
Sep 15, 2009, 3:22:03 PM (17 years ago)
Author:
eugene
Message:

lots of updates to psphot visual for moments and sizes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/20090715/psphot/src/psphotVisual.c

    r25356 r25387  
    2020// these are invoked by the -visual options
    2121
    22 static int kapa = -1;
     22static int kapa1 = -1;
    2323static int kapa2 = -1;
    2424static int kapa3 = -1;
    2525
     26int psphotKapaChannel (int channel) {
     27
     28    switch (channel) {
     29      case 1:
     30        if (kapa1 == -1) {
     31            kapa1 = KapaOpenNamedSocket ("kapa", "psphot:images");
     32            if (kapa1 == -1) {
     33                fprintf (stderr, "failure to open kapa; visual mode disabled\n");
     34                pmVisualSetVisual(false);
     35            }
     36        }
     37        return kapa1;
     38      case 2:
     39        if (kapa2 == -1) {
     40            kapa2 = KapaOpenNamedSocket ("kapa", "psphot:plots");
     41            if (kapa2 == -1) {
     42                fprintf (stderr, "failure to open kapa; visual mode disabled\n");
     43                pmVisualSetVisual(false);
     44            }
     45        }
     46        return kapa2;
     47      case 3:
     48        if (kapa3 == -1) {
     49            kapa3 = KapaOpenNamedSocket ("kapa", "psphot:stamps");
     50            if (kapa3 == -1) {
     51                fprintf (stderr, "failure to open kapa; visual mode disabled\n");
     52                pmVisualSetVisual(false);
     53            }
     54        }
     55        return kapa3;
     56      default:
     57        psAbort ("unknown kapa channel");
     58    }
     59    psAbort ("unknown kapa channel");
     60}
    2661
    2762bool psphotVisualShowMask (int kapaFD, psImage *inImage, const char *name, int channel) {
     
    131166bool psphotVisualShowImage (pmReadout *readout) {
    132167
    133     if (!pmVisualIsVisual()) return true;
    134 
    135     if (kapa == -1) {
    136         kapa = KapaOpenNamedSocket ("kapa", "psphot:images");
    137         if (kapa == -1) {
    138             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    139             pmVisualSetVisual(false);
    140             return false;
    141         }
    142     }
     168    // if (!pmVisualIsVisual()) return true;
     169
     170    int kapa = psphotKapaChannel (1);
     171    if (kapa == -1) return false;
    143172
    144173    // psphotVisualShowMask (kapa, readout->mask, "mask", 2);
     
    162191    if (!pmVisualIsVisual()) return true;
    163192
    164     if (kapa == -1) {
    165         kapa = KapaOpenNamedSocket ("kapa", "psphot:images");
    166         if (kapa == -1) {
    167             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    168             pmVisualSetVisual(false);
    169             return false;
    170         }
    171     }
     193    int kapa = psphotKapaChannel (1);
     194    if (kapa == -1) return false;
    172195
    173196    bool status = false;
     
    197220    if (!pmVisualIsVisual()) return true;
    198221
    199     if (kapa == -1) {
    200         kapa = KapaOpenNamedSocket ("kapa", "psphot:images");
    201         if (kapa == -1) {
    202             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    203             pmVisualSetVisual(false);
    204             return false;
    205         }
    206     }
     222    int kapa = psphotKapaChannel (1);
     223    if (kapa == -1) return false;
    207224
    208225    // XXX test: image->data.F32[10][10] = 10000;
     
    226243    if (!pmVisualIsVisual()) return true;
    227244
    228     if (kapa == -1) {
    229         fprintf (stderr, "kapa not opened, skipping\n");
    230         return false;
    231     }
     245    int kapa = psphotKapaChannel (1);
     246    if (kapa == -1) return false;
    232247
    233248    psArray *peaks = detections->peaks;
     
    304319    if (!pmVisualIsVisual()) return true;
    305320
    306     if (kapa == -1) {
    307         fprintf (stderr, "kapa not opened, skipping\n");
    308         return false;
    309     }
     321    int kapa = psphotKapaChannel (1);
     322    if (kapa == -1) return false;
    310323
    311324    psArray *footprints = detections->footprints;
     
    422435    if (!pmVisualIsVisual()) return true;
    423436
    424     if (kapa == -1) {
    425         fprintf (stderr, "kapa not opened, skipping\n");
    426         return false;
    427     }
     437    int kapa = psphotKapaChannel (1);
     438    if (kapa == -1) return false;
    428439
    429440    // XXX mark the different source classes with different color/shape dots
     
    483494    if (!pmVisualIsVisual()) return true;
    484495
    485     if (kapa3 == -1) {
    486         kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots");
    487         if (kapa3 == -1) {
    488             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    489             pmVisualSetVisual(false);
    490             return false;
    491         }
    492     }
    493 
    494     KapaClearPlots (kapa3);
     496    int myKapa = psphotKapaChannel (2);
     497    if (myKapa == -1) return false;
     498
     499    KapaClearPlots (myKapa);
    495500    KapaInitGraph (&graphdata);
    496     KapaSetFont (kapa3, "courier", 14);
     501    KapaSetFont (myKapa, "courier", 14);
    497502
    498503    float SN_LIM = psMetadataLookupF32(&status, recipe, "PSF_SN_LIM");
     
    525530        }
    526531    }
     532    Xmin = PS_MAX(Xmin, -0.1);
     533    Ymin = PS_MAX(Ymin, -0.1);
    527534
    528535    // storage vectors for data to be plotted
     
    572579    section.y  = 0.00;
    573580    section.name = psStringCopy ("MxxMyy");
    574     KapaSetSection (kapa3, &section);
     581    KapaSetSection (myKapa, &section);
    575582    psFree (section.name);
    576583
     
    580587    graphdata.xmax = Xmax;
    581588    graphdata.ymax = Ymax;
    582     KapaSetLimits (kapa3, &graphdata);
    583 
    584     KapaBox (kapa3, &graphdata);
    585     KapaSendLabel (kapa3, "M_xx| (pixels)", KAPA_LABEL_XM);
    586     KapaSendLabel (kapa3, "M_yy| (pixels)", KAPA_LABEL_YM);
     589    KapaSetLimits (myKapa, &graphdata);
     590
     591    KapaBox (myKapa, &graphdata);
     592    KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM);
     593    KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM);
    587594
    588595    graphdata.color = KapaColorByName ("black");
     
    590597    graphdata.size = 0.3;
    591598    graphdata.style = 2;
    592     KapaPrepPlot (kapa3, nF, &graphdata);
    593     KapaPlotVector (kapa3, nF, xFaint->data.F32, "x");
    594     KapaPlotVector (kapa3, nF, yFaint->data.F32, "y");
     599    KapaPrepPlot (myKapa, nF, &graphdata);
     600    KapaPlotVector (myKapa, nF, xFaint->data.F32, "x");
     601    KapaPlotVector (myKapa, nF, yFaint->data.F32, "y");
    595602
    596603    graphdata.color = KapaColorByName ("red");
     
    598605    graphdata.size = 0.5;
    599606    graphdata.style = 2;
    600     KapaPrepPlot (kapa3, nB, &graphdata);
    601     KapaPlotVector (kapa3, nB, xBright->data.F32, "x");
    602     KapaPlotVector (kapa3, nB, yBright->data.F32, "y");
     607    KapaPrepPlot (myKapa, nB, &graphdata);
     608    KapaPlotVector (myKapa, nB, xBright->data.F32, "x");
     609    KapaPlotVector (myKapa, nB, yBright->data.F32, "y");
    603610
    604611    // second section: MagMyy
     
    608615    section.y  = 0.80;
    609616    section.name = psStringCopy ("MagMyy");
    610     KapaSetSection (kapa3, &section);
     617    KapaSetSection (myKapa, &section);
    611618    psFree (section.name);
    612619
     
    616623    graphdata.ymin = Ymin;
    617624    graphdata.ymax = Ymax;
    618     KapaSetLimits (kapa3, &graphdata);
     625    KapaSetLimits (myKapa, &graphdata);
    619626
    620627    strcpy (graphdata.labels, "0210");
    621     KapaBox (kapa3, &graphdata);
    622     KapaSendLabel (kapa3, "inst mag", KAPA_LABEL_XP);
    623     KapaSendLabel (kapa3, "M_yy| (pixels)", KAPA_LABEL_YM);
     628    KapaBox (myKapa, &graphdata);
     629    KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_XP);
     630    KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM);
    624631
    625632    graphdata.color = KapaColorByName ("black");
     
    627634    graphdata.size = 0.3;
    628635    graphdata.style = 2;
    629     KapaPrepPlot (kapa3, nF, &graphdata);
    630     KapaPlotVector (kapa3, nF, mFaint->data.F32, "x");
    631     KapaPlotVector (kapa3, nF, yFaint->data.F32, "y");
     636    KapaPrepPlot (myKapa, nF, &graphdata);
     637    KapaPlotVector (myKapa, nF, mFaint->data.F32, "x");
     638    KapaPlotVector (myKapa, nF, yFaint->data.F32, "y");
    632639
    633640    graphdata.color = KapaColorByName ("red");
     
    635642    graphdata.size = 0.5;
    636643    graphdata.style = 2;
    637     KapaPrepPlot (kapa3, nB, &graphdata);
    638     KapaPlotVector (kapa3, nB, mBright->data.F32, "x");
    639     KapaPlotVector (kapa3, nB, yBright->data.F32, "y");
     644    KapaPrepPlot (myKapa, nB, &graphdata);
     645    KapaPlotVector (myKapa, nB, mBright->data.F32, "x");
     646    KapaPlotVector (myKapa, nB, yBright->data.F32, "y");
    640647
    641648    // third section: MagMxx
     
    645652    section.y  = 0.00;
    646653    section.name = psStringCopy ("MagMxx");
    647     KapaSetSection (kapa3, &section);
     654    KapaSetSection (myKapa, &section);
    648655    psFree (section.name);
    649656
     
    653660    graphdata.ymin =  -7.9;
    654661    graphdata.ymax = -17.1;
    655     KapaSetLimits (kapa3, &graphdata);
     662    KapaSetLimits (myKapa, &graphdata);
    656663
    657664    strcpy (graphdata.labels, "2001");
    658     KapaBox (kapa3, &graphdata);
    659     KapaSendLabel (kapa3, "M_xx| (pixels)", KAPA_LABEL_XM);
    660     KapaSendLabel (kapa3, "inst mag", KAPA_LABEL_YP);
     665    KapaBox (myKapa, &graphdata);
     666    KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM);
     667    KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_YP);
    661668
    662669    graphdata.color = KapaColorByName ("black");
     
    664671    graphdata.size = 0.3;
    665672    graphdata.style = 2;
    666     KapaPrepPlot (kapa3, nF, &graphdata);
    667     KapaPlotVector (kapa3, nF, xFaint->data.F32, "x");
    668     KapaPlotVector (kapa3, nF, mFaint->data.F32, "y");
     673    KapaPrepPlot (myKapa, nF, &graphdata);
     674    KapaPlotVector (myKapa, nF, xFaint->data.F32, "x");
     675    KapaPlotVector (myKapa, nF, mFaint->data.F32, "y");
    669676
    670677    graphdata.color = KapaColorByName ("red");
     
    672679    graphdata.size = 0.5;
    673680    graphdata.style = 2;
    674     KapaPrepPlot (kapa3, nB, &graphdata);
    675     KapaPlotVector (kapa3, nB, xBright->data.F32, "x");
    676     KapaPlotVector (kapa3, nB, mBright->data.F32, "y");
     681    KapaPrepPlot (myKapa, nB, &graphdata);
     682    KapaPlotVector (myKapa, nB, xBright->data.F32, "x");
     683    KapaPlotVector (myKapa, nB, mBright->data.F32, "y");
    677684
    678685    // draw N circles to outline the clumps
    679686    {
    680         KapaSelectSection (kapa3, "MxxMyy");
     687        KapaSelectSection (myKapa, "MxxMyy");
    681688
    682689        // draw a circle centered on psfX,Y with size of the psf limit
     
    694701        graphdata.xmax = Xmax;
    695702        graphdata.ymax = Ymax;
    696         KapaSetLimits (kapa3, &graphdata);
     703        KapaSetLimits (myKapa, &graphdata);
    697704
    698705        for (int n = 0; n < nRegions; n++) {
     
    713720                yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY;
    714721            }
    715             KapaPrepPlot (kapa3, xLimit->n, &graphdata);
    716             KapaPlotVector (kapa3, xLimit->n, xLimit->data.F32, "x");
    717             KapaPlotVector (kapa3, yLimit->n, yLimit->data.F32, "y");
     722            KapaPrepPlot (myKapa, xLimit->n, &graphdata);
     723            KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x");
     724            KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y");
    718725        }
    719726        psFree (xLimit);
    720727        psFree (yLimit);
    721728    }
    722 
    723 # if (0)
    724     // *** make a histogram of the source counts in the x and y directions
    725     psHistogram *nX = psHistogramAlloc (graphdata.xmin, graphdata.xmax, 50.0);
    726     psHistogram *nY = psHistogramAlloc (graphdata.ymin, graphdata.ymax, 50.0);
    727     psVectorHistogram (nX, xFaint, NULL, NULL, 0);
    728     psVectorHistogram (nY, yFaint, NULL, NULL, 0);
    729     psVector *dX = psVectorAlloc (nX->nums->n, PS_TYPE_F32);
    730     psVector *vX = psVectorAlloc (nX->nums->n, PS_TYPE_F32);
    731     psVector *dY = psVectorAlloc (nY->nums->n, PS_TYPE_F32);
    732     psVector *vY = psVectorAlloc (nY->nums->n, PS_TYPE_F32);
    733     for (int i = 0; i < nX->nums->n; i++) {
    734         dX->data.F32[i] = nX->nums->data.S32[i];
    735         vX->data.F32[i] = 0.5*(nX->bounds->data.F32[i] + nX->bounds->data.F32[i+1]);
    736     }
    737     for (int i = 0; i < nY->nums->n; i++) {
    738         dY->data.F32[i] = nY->nums->data.S32[i];
    739         vY->data.F32[i] = 0.5*(nY->bounds->data.F32[i] + nY->bounds->data.F32[i+1]);
    740     }
    741 
    742     graphdata.color = KapaColorByName ("black");
    743     graphdata.ptype = 0;
    744     graphdata.size = 0.0;
    745     graphdata.style = 0;
    746     KapaPrepPlot (kapa3, dX->n, &graphdata);
    747     KapaPlotVector (kapa3, dX->n, dX->data.F32, "x");
    748     KapaPlotVector (kapa3, vX->n, vX->data.F32, "y");
    749 
    750     psFree (nX);
    751     psFree (dX);
    752     psFree (vX);
    753 
    754     psFree (nY);
    755     psFree (dY);
    756     psFree (vY);
    757 # endif
    758729
    759730    psFree (xBright);
     
    775746
    776747// assumes 'kapa' value is checked and set
    777 bool psphotVisualShowRoughClass_Single (psArray *sources, pmSourceType type, pmSourceMode mode, char *color) {
     748bool psphotVisualShowRoughClass_Single (int myKapa, psArray *sources, pmSourceType type, pmSourceMode mode, char *color) {
    778749
    779750    int Noverlay;
     
    815786    }
    816787
    817     KiiLoadOverlay (kapa, overlay, Noverlay, color);
     788    KiiLoadOverlay (myKapa, overlay, Noverlay, color);
    818789    FREE (overlay);
    819790
     
    825796    if (!pmVisualIsVisual()) return true;
    826797
    827     if (kapa == -1) {
    828         fprintf (stderr, "kapa not opened, skipping\n");
    829         return false;
    830     }
    831 
    832     KiiEraseOverlay (kapa, "yellow"); // moments
    833 
    834     psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_STAR, 0, "red");
    835     psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_EXTENDED, 0, "blue");
    836     psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_DEFECT, 0, "blue");
    837     psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_SATURATED, 0, "red");
    838     psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_PSFSTAR, "yellow");
    839     psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_SATSTAR, "green");
     798    int myKapa = psphotKapaChannel (1);
     799    if (myKapa == -1) return false;
     800
     801    KiiEraseOverlay (myKapa, "yellow"); // moments
     802
     803    psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_STAR, 0, "red");
     804    psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_EXTENDED, 0, "blue");
     805    psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_DEFECT, 0, "blue");
     806    psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_SATURATED, 0, "red");
     807    psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_PSFSTAR, "yellow");
     808    psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_SATSTAR, "green");
    840809
    841810    // pause and wait for user input:
     
    854823    if (!pmVisualIsVisual()) return true;
    855824
    856     if (kapa2 == -1) {
    857         kapa2 = KapaOpenNamedSocket ("kapa", "psphot:psfstars");
    858         if (kapa2 == -1) {
    859             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    860             pmVisualSetVisual(false);
    861             return false;
    862         }
    863     }
     825    int myKapa = psphotKapaChannel (3);
     826    if (myKapa == -1) return false;
    864827
    865828    int DX = 64;
     
    906869
    907870    psImage *psfLogFlux = (psImage *) psUnaryOp (NULL, psfMosaic, "log");
    908     psphotVisualRangeImage (kapa2, psfLogFlux, "psf_mosaic",    0, -2.0, 3.0);
    909     psphotVisualRangeImage (kapa2, funMosaic, "psf_analytical", 1, -10.0, 100.0);
    910     psphotVisualRangeImage (kapa2, resMosaic, "psf_residual",   2, -10.0, 100.0);
     871    psphotVisualRangeImage (myKapa, psfLogFlux, "psf_mosaic",    0, -2.0, 3.0);
     872    psphotVisualRangeImage (myKapa, funMosaic, "psf_analytical", 1, -10.0, 100.0);
     873    psphotVisualRangeImage (myKapa, resMosaic, "psf_residual",   2, -10.0, 100.0);
    911874
    912875    psFree (psfMosaic);
     
    932895    if (!pmVisualIsVisual()) return true;
    933896
    934     if (kapa2 == -1) {
    935         kapa2 = KapaOpenNamedSocket ("kapa", "psphot:psfstars");
    936         if (kapa2 == -1) {
    937             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    938             pmVisualSetVisual(false);
    939             return false;
    940         }
    941     }
     897    int myKapa = psphotKapaChannel (3);
     898    if (myKapa == -1) return false;
    942899
    943900    // user-defined masks to test for good/bad pixels (build from recipe list if not yet set)
     
    10641021    }
    10651022
    1066     psphotVisualRangeImage (kapa2, outpos, "psfpos", 0, -0.05, 0.95);
    1067     psphotVisualRangeImage (kapa2, outsub, "psfsub", 1, -0.05, 0.95);
     1023    psphotVisualRangeImage (myKapa, outpos, "psfpos", 0, -0.05, 0.95);
     1024    psphotVisualRangeImage (myKapa, outsub, "psfsub", 1, -0.05, 0.95);
    10681025
    10691026    // pause and wait for user input:
     
    10921049    if (!pmVisualIsVisual()) return true;
    10931050
    1094     if (kapa2 == -1) {
    1095         kapa2 = KapaOpenNamedSocket ("kapa", "psphot:images");
    1096         if (kapa2 == -1) {
    1097             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    1098             pmVisualSetVisual(false);
    1099             return false;
    1100         }
    1101     }
     1051    int myKapa = psphotKapaChannel (3);
     1052    if (myKapa == -1) return false;
    11021053
    11031054    // user-defined masks to test for good/bad pixels (build from recipe list if not yet set)
     
    12121163    }
    12131164
    1214     psphotVisualScaleImage (kapa2, outsat, "satstar", 2);
     1165    psphotVisualScaleImage (myKapa, outsat, "satstar", 2);
    12151166
    12161167    // pause and wait for user input:
     
    13451296    if (!pmVisualIsVisual()) return true;
    13461297
    1347     if (kapa3 == -1) {
    1348         kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots");
    1349         if (kapa3 == -1) {
    1350             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    1351             pmVisualSetVisual(false);
    1352             return false;
    1353         }
    1354     }
     1298    int myKapa = psphotKapaChannel (2);
     1299    if (myKapa == -1) return false;
    13551300
    13561301    // user-defined masks to test for good/bad pixels (build from recipe list if not yet set)
     
    13591304    assert (maskVal);
    13601305
    1361     KapaClearPlots (kapa3);
     1306    KapaClearPlots (myKapa);
    13621307    // first section : mag vs CR nSigma
    13631308    section.dx = 1.0;
     
    13671312    section.name = NULL;
    13681313    psStringAppend (&section.name, "linlog");
    1369     KapaSetSection (kapa3, &section);
     1314    KapaSetSection (myKapa, &section);
    13701315    psFree (section.name);
    13711316
     
    13771322    section.name = NULL;
    13781323    psStringAppend (&section.name, "loglog");
    1379     KapaSetSection (kapa3, &section);
     1324    KapaSetSection (myKapa, &section);
    13801325    psFree (section.name);
    13811326
     
    13861331        if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue;
    13871332
    1388         psphotVisualPlotRadialProfile (kapa3, source, maskVal);
     1333        psphotVisualPlotRadialProfile (myKapa, source, maskVal);
    13891334
    13901335        // pause and wait for user input:
     
    13961341        }
    13971342        if (key[0] == 'e') {
    1398             KapaClearPlots (kapa3);
     1343            KapaClearPlots (myKapa);
    13991344        }
    14001345        if (key[0] == 's') {
     
    14171362    if (!pmVisualIsVisual()) return true;
    14181363
    1419     if (kapa == -1) {
    1420         fprintf (stderr, "kapa not opened, skipping\n");
    1421         return false;
    1422     }
     1364    int myKapa = psphotKapaChannel (1);
     1365    if (myKapa == -1) return false;
    14231366
    14241367    // note: this uses the Ohana allocation tools:
     
    14931436    }
    14941437
    1495     KiiLoadOverlay (kapa, overlayE, NoverlayE, "red");
    1496     KiiLoadOverlay (kapa, overlayO, NoverlayO, "yellow");
     1438    KiiLoadOverlay (myKapa, overlayE, NoverlayE, "red");
     1439    KiiLoadOverlay (myKapa, overlayO, NoverlayO, "yellow");
    14971440    FREE (overlayE);
    14981441    FREE (overlayO);
     
    15111454}
    15121455
    1513 bool psphotVisualShowSourceSize (pmReadout *readout, psArray *sources) {
    1514 
    1515     int Noverlay, NOVERLAY;
     1456bool psphotVisualShowSourceSize_Single (int myKapa, psArray *sources, pmSourceMode mode, bool keep, float scale, char *color) {
     1457
     1458    int Noverlay;
    15161459    KiiOverlay *overlay;
    15171460
    1518     if (!pmVisualIsVisual()) return true;
    1519 
    1520     if (kapa == -1) {
    1521         fprintf (stderr, "kapa not opened, skipping\n");
    1522         return false;
    1523     }
     1461    psEllipseMoments emoments;
     1462    psEllipseAxes axes;
    15241463
    15251464    // note: this uses the Ohana allocation tools:
     1465    ALLOCATE (overlay, KiiOverlay, sources->n);
     1466
    15261467    Noverlay = 0;
    1527     NOVERLAY = 100;
    1528     ALLOCATE (overlay, KiiOverlay, sources->n);
    1529 
    1530     // mark CRs with red boxes
    15311468    for (int i = 0; i < sources->n; i++) {
    15321469
     
    15341471        if (source == NULL) continue;
    15351472
    1536         if (!(source->mode & PM_SOURCE_MODE_CR_LIMIT)) continue;
    1537 
    1538         overlay[Noverlay].type = KII_OVERLAY_BOX;
    1539         overlay[Noverlay].x = source->peak->xf;
    1540         overlay[Noverlay].y = source->peak->yf;
    1541 
    1542         overlay[Noverlay].dx = 4;
    1543         overlay[Noverlay].dy = 4;
    1544         overlay[Noverlay].angle = 0;
     1473        // if (source->type != type) continue;
     1474        if (mode) {
     1475            if (keep) {
     1476                if (!(source->mode & mode)) continue;
     1477            } else {
     1478                if (source->mode & mode) continue;
     1479            }
     1480        }
     1481
     1482        pmMoments *moments = source->moments;
     1483        if (moments == NULL) continue;
     1484
     1485        overlay[Noverlay].type = KII_OVERLAY_CIRCLE;
     1486        overlay[Noverlay].x = moments->Mx;
     1487        overlay[Noverlay].y = moments->My;
     1488
     1489        emoments.x2 = moments->Mxx;
     1490        emoments.y2 = moments->Myy;
     1491        emoments.xy = moments->Mxy;
     1492
     1493        axes = psEllipseMomentsToAxes (emoments, 20.0);
     1494
     1495        overlay[Noverlay].dx = scale*2.0*axes.major;
     1496        overlay[Noverlay].dy = scale*2.0*axes.minor;
     1497        overlay[Noverlay].angle = axes.theta * PS_DEG_RAD;
    15451498        overlay[Noverlay].text = NULL;
    15461499        Noverlay ++;
    1547         CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);
    1548     }
    1549     KiiLoadOverlay (kapa, overlay, Noverlay, "red");
    1550 
    1551 
    1552     Noverlay = 0;
    1553     for (int i = 0; i < sources->n; i++) {
    1554 
    1555         pmSource *source = sources->data[i];
    1556         if (source == NULL) continue;
    1557 
    1558         // mark EXTs with yellow circles
    1559         if (!(source->mode & PM_SOURCE_MODE_EXT_LIMIT)) continue;
    1560 
    1561         overlay[Noverlay].type = KII_OVERLAY_CIRCLE;
    1562         overlay[Noverlay].x = source->peak->xf;
    1563         overlay[Noverlay].y = source->peak->yf;
    1564 
    1565         overlay[Noverlay].dx = 10;
    1566         overlay[Noverlay].dy = 10;
    1567         overlay[Noverlay].angle = 0;
    1568         overlay[Noverlay].text = NULL;
    1569         Noverlay ++;
    1570         CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);
    1571     }
    1572 
    1573     KiiLoadOverlay (kapa, overlay, Noverlay, "blue");
     1500    }
     1501
     1502    KiiLoadOverlay (myKapa, overlay, Noverlay, color);
    15741503    FREE (overlay);
    15751504
    1576     psphotVisualShowMask (kapa, readout->mask, "mask", 2);
     1505    return true;
     1506}
     1507
     1508bool psphotVisualShowSourceSize (pmReadout *readout, psArray *sources) {
     1509
     1510    // if (!pmVisualIsVisual()) return true;
     1511
     1512    int myKapa = psphotKapaChannel (1);
     1513    if (myKapa == -1) return false;
     1514
     1515    KiiEraseOverlay (myKapa, "red");
     1516    KiiEraseOverlay (myKapa, "blue");
     1517    KiiEraseOverlay (myKapa, "green");
     1518    KiiEraseOverlay (myKapa, "yellow");
     1519
     1520    psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_EXT_LIMIT | PM_SOURCE_MODE_DEFECT | PM_SOURCE_MODE_CR_LIMIT | PM_SOURCE_MODE_SATSTAR, 0, 1.0, "green");
     1521    psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_EXT_LIMIT, 1, 1.0, "blue");
     1522    psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_CR_LIMIT, 1, 1.0, "red");
     1523    psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_DEFECT, 1, 2.0, "red");
     1524    psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_SATSTAR, 1, 1.0, "yellow");
    15771525
    15781526    // pause and wait for user input:
    15791527    // continue, save (provide name), ??
    15801528    char key[10];
    1581     fprintf (stdout, "CR: 4pix red BOX; EXT: 10pix blue circle\n");
     1529    fprintf (stdout, "red: CR; blue: EXTENDED; green: PSF-like; yellow: SATSTAR\n");
    15821530    fprintf (stdout, "[c]ontinue? ");
    15831531    if (!fgets(key, 8, stdin)) {
    15841532        psWarning("Unable to read option");
    15851533    }
    1586 
    1587     return true;
    1588 }
    1589 
    1590 bool psphotVisualPlotSourceSize (psArray *sources) {
    1591 
     1534    return true;
     1535}
     1536
     1537bool psphotVisualPlotSourceSize (psMetadata *recipe, psArray *sources) {
     1538
     1539    bool status;
    15921540    Graphdata graphdata;
    15931541    KapaSection section;
    15941542
    1595     if (!pmVisualIsVisual()) return true;
    1596 
    1597     if (kapa3 == -1) {
    1598         kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots");
    1599         if (kapa3 == -1) {
    1600             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    1601             pmVisualSetVisual(false);
    1602             return false;
     1543    // if (!pmVisualIsVisual()) return true;
     1544
     1545    int myKapa = psphotKapaChannel (2);
     1546    if (myKapa == -1) return false;
     1547
     1548    KapaClearPlots (myKapa);
     1549    KapaInitGraph (&graphdata);
     1550    KapaSetFont (myKapa, "courier", 14);
     1551
     1552    // select the max psfX,Y values for the plot limits
     1553    float Xmin = 1000.0, Xmax = 0.0;
     1554    float Ymin = 1000.0, Ymax = 0.0;
     1555    {
     1556        int nRegions = psMetadataLookupS32 (&status, recipe, "PSF.CLUMP.NREGIONS");
     1557        for (int n = 0; n < nRegions; n++) {
     1558
     1559            char regionName[64];
     1560            snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n);
     1561            psMetadata *regionMD = psMetadataLookupPtr (&status, recipe, regionName);
     1562
     1563            float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");
     1564            float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");
     1565            float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");
     1566            float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");
     1567
     1568            float X0 = psfX - 10.0*psfdX;
     1569            float X1 = psfX + 10.0*psfdX;
     1570            float Y0 = psfY - 10.0*psfdY;
     1571            float Y1 = psfY + 10.0*psfdY;
     1572
     1573            if (isfinite(X0)) { Xmin = PS_MIN(Xmin, X0); }
     1574            if (isfinite(X1)) { Xmax = PS_MAX(Xmax, X1); }
     1575            if (isfinite(Y0)) { Ymin = PS_MIN(Ymin, Y0); }
     1576            if (isfinite(Y1)) { Ymax = PS_MAX(Ymax, Y1); }
    16031577        }
    16041578    }
    1605 
    1606     KapaClearPlots (kapa3);
    1607     KapaInitGraph (&graphdata);
    1608 
    1609     // first section : mag vs CR nSigma
    1610     section.dx = 1.0;
    1611     section.dy = 0.5;
    1612     section.x = 0.0;
    1613     section.y = 0.0;
    1614     section.name = NULL;
    1615     psStringAppend (&section.name, "a1");
    1616     KapaSetSection (kapa3, &section);
    1617     psFree (section.name);
    1618 
    1619     psVector *x = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
    1620     psVector *y = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
    1621 
    1622     graphdata.xmin = +32.0;
    1623     graphdata.xmax = -32.0;
    1624     graphdata.ymin = +32.0;
    1625     graphdata.ymax = -32.0;
    1626 
    1627     // construct the plot vectors
    1628     int n = 0;
     1579    Xmin = PS_MAX(Xmin, -0.1);
     1580    Ymin = PS_MAX(Ymin, -0.1);
     1581
     1582    // storage vectors for data to be plotted
     1583    psVector *xSAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1584    psVector *ySAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1585    psVector *mSAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1586    psVector *sSAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1587
     1588    psVector *xPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1589    psVector *yPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1590    psVector *mPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1591    psVector *sPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1592
     1593    psVector *xEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1594    psVector *yEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1595    psVector *mEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1596    psVector *sEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1597
     1598    psVector *xDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1599    psVector *yDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1600    psVector *mDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1601    psVector *sDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1602
     1603    psVector *xCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1604    psVector *yCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1605    psVector *mCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1606    psVector *sCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     1607
     1608    // construct the vectors
     1609    int nSAT = 0;
     1610    int nEXT = 0;
     1611    int nPSF = 0;
     1612    int nDEF = 0;
     1613    int nCR  = 0;
    16291614    for (int i = 0; i < sources->n; i++) {
    16301615        pmSource *source = sources->data[i];
    1631         if (!source) continue;
    1632         if (source->type != PM_SOURCE_TYPE_STAR) continue;
    1633         if (!isfinite (source->crNsigma)) continue;
    1634         if (!isfinite (source->peak->flux)) continue;
    1635         if (source->peak->flux < 0) continue;
    1636 
    1637         x->data.F32[n] = -2.5*log10(source->peak->flux);
    1638         y->data.F32[n] = source->crNsigma;
    1639         graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]);
    1640         graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]);
    1641         graphdata.ymin = -0.5;
    1642         graphdata.ymax = 10.0;
    1643 
    1644         n++;
    1645     }
    1646     x->n = y->n = n;
    1647 
    1648     float range;
    1649     range = graphdata.xmax - graphdata.xmin;
    1650     graphdata.xmax += 0.05*range;
    1651     graphdata.xmin -= 0.05*range;
    1652 
    1653     // XXX set the plot range to match the image
    1654     KapaSetLimits (kapa3, &graphdata);
    1655 
    1656     KapaSetFont (kapa3, "helvetica", 14);
    1657     KapaBox (kapa3, &graphdata);
    1658     KapaSendLabel (kapa3, "Peak as Mag", KAPA_LABEL_XM);
    1659     KapaSendLabel (kapa3, "CR N Sigma", KAPA_LABEL_YM);
     1616        if (source->moments == NULL) continue;
     1617
     1618        if (source->mode & PM_SOURCE_MODE_CR_LIMIT) {
     1619            xCR->data.F32[nCR] = source->moments->Mxx;
     1620            yCR->data.F32[nCR] = source->moments->Myy;
     1621            mCR->data.F32[nCR] = -2.5*log10(source->moments->Sum);
     1622            sCR->data.F32[nCR] = source->extNsigma;
     1623            nCR++;
     1624        }
     1625        if (source->mode & PM_SOURCE_MODE_SATSTAR) {
     1626            xSAT->data.F32[nSAT] = source->moments->Mxx;
     1627            ySAT->data.F32[nSAT] = source->moments->Myy;
     1628            mSAT->data.F32[nSAT] = -2.5*log10(source->moments->Sum);
     1629            sSAT->data.F32[nSAT] = source->extNsigma;
     1630            nSAT++;
     1631        }
     1632        if (source->mode & PM_SOURCE_MODE_EXT_LIMIT) {
     1633            xEXT->data.F32[nEXT] = source->moments->Mxx;
     1634            yEXT->data.F32[nEXT] = source->moments->Myy;
     1635            mEXT->data.F32[nEXT] = -2.5*log10(source->moments->Sum);
     1636            sEXT->data.F32[nEXT] = source->extNsigma;
     1637            nEXT++;
     1638            continue;
     1639        }
     1640        if (source->mode & PM_SOURCE_MODE_DEFECT) {
     1641            xDEF->data.F32[nDEF] = source->moments->Mxx;
     1642            yDEF->data.F32[nDEF] = source->moments->Myy;
     1643            mDEF->data.F32[nDEF] = -2.5*log10(source->moments->Sum);
     1644            sDEF->data.F32[nDEF] = source->extNsigma;
     1645            nDEF++;
     1646            continue;
     1647        }
     1648        if ((source->mode & PM_SOURCE_MODE_CR_LIMIT) || (source->mode & PM_SOURCE_MODE_SATSTAR)) {
     1649            continue;
     1650        }
     1651        xPSF->data.F32[nPSF] = source->moments->Mxx;
     1652        yPSF->data.F32[nPSF] = source->moments->Myy;
     1653        mPSF->data.F32[nPSF] = -2.5*log10(source->moments->Sum);
     1654        sPSF->data.F32[nPSF] = source->extNsigma;
     1655        nPSF++;
     1656    }
     1657    xSAT->n = nSAT;
     1658    ySAT->n = nSAT;
     1659    mSAT->n = nSAT;
     1660    sSAT->n = nSAT;
     1661
     1662    xPSF->n = nPSF;
     1663    yPSF->n = nPSF;
     1664    mPSF->n = nPSF;
     1665    sPSF->n = nPSF;
     1666
     1667    xEXT->n = nEXT;
     1668    yEXT->n = nEXT;
     1669    mEXT->n = nEXT;
     1670    sEXT->n = nEXT;
     1671
     1672    xCR->n = nCR;
     1673    yCR->n = nCR;
     1674    mCR->n = nCR;
     1675    sCR->n = nCR;
     1676
     1677    xDEF->n = nDEF;
     1678    yDEF->n = nDEF;
     1679    mDEF->n = nDEF;
     1680    sDEF->n = nDEF;
     1681
     1682    // four sections: MxxMyy, MagMxx, MagMyy, MagSigma
     1683
     1684    // first section: MxxMyy
     1685    section.dx = 0.75;
     1686    section.dy = 0.60;
     1687    section.x  = 0.00;
     1688    section.y  = 0.00;
     1689    section.name = psStringCopy ("MxxMyy");
     1690    KapaSetSection (myKapa, &section);
     1691    psFree (section.name);
    16601692
    16611693    graphdata.color = KapaColorByName ("black");
    1662     graphdata.ptype = 2;
     1694    graphdata.xmin = Xmin;
     1695    graphdata.ymin = Ymin;
     1696    graphdata.xmax = Xmax;
     1697    graphdata.ymax = Ymax;
     1698    KapaSetLimits (myKapa, &graphdata);
     1699
     1700    KapaBox (myKapa, &graphdata);
     1701    KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM);
     1702    KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM);
     1703
     1704    graphdata.color = KapaColorByName ("black");
     1705    graphdata.ptype = 0;
    16631706    graphdata.size = 0.5;
    16641707    graphdata.style = 2;
    1665     KapaPrepPlot (kapa3, n, &graphdata);
    1666     KapaPlotVector (kapa3, n, x->data.F32, "x");
    1667     KapaPlotVector (kapa3, n, y->data.F32, "y");
    1668 
    1669     // second section : mag vs EXT nSigma
    1670     section.dx = 1.0;
    1671     section.dy = 0.5;
    1672     section.x = 0.0;
    1673     section.y = 0.5;
    1674     section.name = NULL;
    1675     psStringAppend (&section.name, "a2");
    1676     KapaSetSection (kapa3, &section);
     1708    KapaPrepPlot   (myKapa, nPSF, &graphdata);
     1709    KapaPlotVector (myKapa, nPSF, xPSF->data.F32, "x");
     1710    KapaPlotVector (myKapa, nPSF, yPSF->data.F32, "y");
     1711
     1712    graphdata.color = KapaColorByName ("blue");
     1713    graphdata.ptype = 0;
     1714    graphdata.size = 0.5;
     1715    graphdata.style = 2;
     1716    KapaPrepPlot   (myKapa, nEXT, &graphdata);
     1717    KapaPlotVector (myKapa, nEXT, xEXT->data.F32, "x");
     1718    KapaPlotVector (myKapa, nEXT, yEXT->data.F32, "y");
     1719
     1720    graphdata.color = KapaColorByName ("red");
     1721    graphdata.ptype = 0;
     1722    graphdata.size = 0.5;
     1723    graphdata.style = 2;
     1724    KapaPrepPlot   (myKapa, nDEF, &graphdata);
     1725    KapaPlotVector (myKapa, nDEF, xDEF->data.F32, "x");
     1726    KapaPlotVector (myKapa, nDEF, yDEF->data.F32, "y");
     1727
     1728    graphdata.color = KapaColorByName ("red");
     1729    graphdata.ptype = 7;
     1730    graphdata.size = 1.0;
     1731    graphdata.style = 2;
     1732    KapaPrepPlot   (myKapa, nCR, &graphdata);
     1733    KapaPlotVector (myKapa, nCR, xCR->data.F32, "x");
     1734    KapaPlotVector (myKapa, nCR, yCR->data.F32, "y");
     1735
     1736    graphdata.color = KapaColorByName ("blue");
     1737    graphdata.ptype = 7;
     1738    graphdata.size = 1.0;
     1739    graphdata.style = 2;
     1740    KapaPrepPlot   (myKapa, nSAT, &graphdata);
     1741    KapaPlotVector (myKapa, nSAT, xSAT->data.F32, "x");
     1742    KapaPlotVector (myKapa, nSAT, ySAT->data.F32, "y");
     1743
     1744    // second section: MagMyy
     1745    section.dx = 0.75;
     1746    section.dy = 0.20;
     1747    section.x  = 0.00;
     1748    section.y  = 0.80;
     1749    section.name = psStringCopy ("MagMyy");
     1750    KapaSetSection (myKapa, &section);
    16771751    psFree (section.name);
    16781752
    1679     graphdata.xmin = +32.0;
    1680     graphdata.xmax = -32.0;
    1681     graphdata.ymin = +32.0;
    1682     graphdata.ymax = -32.0;
    1683 
    1684     // construct the plot vectors
    1685     n = 0;
    1686     for (int i = 0; i < sources->n; i++) {
    1687         pmSource *source = sources->data[i];
    1688         if (!source) continue;
    1689         if (source->type != PM_SOURCE_TYPE_STAR) continue;
    1690         if (!isfinite (source->extNsigma)) continue;
    1691         if (!isfinite (source->peak->flux)) continue;
    1692         if (source->peak->flux < 0) continue;
    1693 
    1694         x->data.F32[n] = -2.5*log10(source->peak->flux);
    1695         y->data.F32[n] = source->extNsigma;
    1696         graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]);
    1697         graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]);
    1698         graphdata.ymin = -0.5;
    1699         graphdata.ymax = 10.0;
    1700 
    1701         n++;
    1702     }
    1703     x->n = y->n = n;
    1704 
    1705     range = graphdata.xmax - graphdata.xmin;
    1706     graphdata.xmax += 0.05*range;
    1707     graphdata.xmin -= 0.05*range;
    1708 
    1709     // XXX set the plot range to match the image
    1710     KapaSetLimits (kapa3, &graphdata);
    1711 
    1712     KapaSetFont (kapa3, "helvetica", 14);
    1713     KapaBox (kapa3, &graphdata);
    1714     KapaSendLabel (kapa3, "EXT N Sigma", KAPA_LABEL_YM);
    1715 
    17161753    graphdata.color = KapaColorByName ("black");
    1717     graphdata.ptype = 2;
     1754    graphdata.xmin = -17.1;
     1755    graphdata.xmax =  -7.9;
     1756    graphdata.ymin = Ymin;
     1757    graphdata.ymax = Ymax;
     1758    KapaSetLimits (myKapa, &graphdata);
     1759
     1760    strcpy (graphdata.labels, "0210");
     1761    KapaBox (myKapa, &graphdata);
     1762    KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_XP);
     1763    KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM);
     1764
     1765    graphdata.color = KapaColorByName ("black");
     1766    graphdata.ptype = 0;
    17181767    graphdata.size = 0.5;
    17191768    graphdata.style = 2;
    1720     KapaPrepPlot (kapa3, n, &graphdata);
    1721     KapaPlotVector (kapa3, n, x->data.F32, "x");
    1722     KapaPlotVector (kapa3, n, y->data.F32, "y");
    1723 
    1724     psFree (x);
    1725     psFree (y);
     1769    KapaPrepPlot   (myKapa, nPSF, &graphdata);
     1770    KapaPlotVector (myKapa, nPSF, mPSF->data.F32, "x");
     1771    KapaPlotVector (myKapa, nPSF, yPSF->data.F32, "y");
     1772
     1773    graphdata.color = KapaColorByName ("blue");
     1774    graphdata.ptype = 0;
     1775    graphdata.size = 0.5;
     1776    graphdata.style = 2;
     1777    KapaPrepPlot   (myKapa, nEXT, &graphdata);
     1778    KapaPlotVector (myKapa, nEXT, mEXT->data.F32, "x");
     1779    KapaPlotVector (myKapa, nEXT, yEXT->data.F32, "y");
     1780
     1781    graphdata.color = KapaColorByName ("red");
     1782    graphdata.ptype = 0;
     1783    graphdata.size = 0.5;
     1784    graphdata.style = 2;
     1785    KapaPrepPlot   (myKapa, nDEF, &graphdata);
     1786    KapaPlotVector (myKapa, nDEF, mDEF->data.F32, "x");
     1787    KapaPlotVector (myKapa, nDEF, yDEF->data.F32, "y");
     1788
     1789    graphdata.color = KapaColorByName ("red");
     1790    graphdata.ptype = 7;
     1791    graphdata.size = 1.0;
     1792    graphdata.style = 2;
     1793    KapaPrepPlot   (myKapa, nCR, &graphdata);
     1794    KapaPlotVector (myKapa, nCR, mCR->data.F32, "x");
     1795    KapaPlotVector (myKapa, nCR, yCR->data.F32, "y");
     1796
     1797    graphdata.color = KapaColorByName ("blue");
     1798    graphdata.ptype = 7;
     1799    graphdata.size = 1.0;
     1800    graphdata.style = 2;
     1801    KapaPrepPlot   (myKapa, nSAT, &graphdata);
     1802    KapaPlotVector (myKapa, nSAT, mSAT->data.F32, "x");
     1803    KapaPlotVector (myKapa, nSAT, ySAT->data.F32, "y");
     1804
     1805    // third section: MagMxx
     1806    section.dx = 0.25;
     1807    section.dy = 0.60;
     1808    section.x  = 0.80;
     1809    section.y  = 0.00;
     1810    section.name = psStringCopy ("MagMxx");
     1811    KapaSetSection (myKapa, &section);
     1812    psFree (section.name);
     1813
     1814    graphdata.color = KapaColorByName ("black");
     1815    graphdata.xmin = Xmin;
     1816    graphdata.xmax = Xmax;
     1817    graphdata.ymin =  -7.9;
     1818    graphdata.ymax = -17.1;
     1819    KapaSetLimits (myKapa, &graphdata);
     1820
     1821    strcpy (graphdata.labels, "2001");
     1822    KapaBox (myKapa, &graphdata);
     1823    KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM);
     1824    KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_YP);
     1825
     1826    graphdata.color = KapaColorByName ("black");
     1827    graphdata.ptype = 0;
     1828    graphdata.size = 0.5;
     1829    graphdata.style = 2;
     1830    KapaPrepPlot   (myKapa, nPSF, &graphdata);
     1831    KapaPlotVector (myKapa, nPSF, xPSF->data.F32, "x");
     1832    KapaPlotVector (myKapa, nPSF, mPSF->data.F32, "y");
     1833
     1834    graphdata.color = KapaColorByName ("blue");
     1835    graphdata.ptype = 0;
     1836    graphdata.size = 0.5;
     1837    graphdata.style = 2;
     1838    KapaPrepPlot   (myKapa, nEXT, &graphdata);
     1839    KapaPlotVector (myKapa, nEXT, xEXT->data.F32, "x");
     1840    KapaPlotVector (myKapa, nEXT, mEXT->data.F32, "y");
     1841
     1842    graphdata.color = KapaColorByName ("red");
     1843    graphdata.ptype = 0;
     1844    graphdata.size = 0.5;
     1845    graphdata.style = 2;
     1846    KapaPrepPlot   (myKapa, nDEF, &graphdata);
     1847    KapaPlotVector (myKapa, nDEF, xDEF->data.F32, "x");
     1848    KapaPlotVector (myKapa, nDEF, mDEF->data.F32, "y");
     1849
     1850    graphdata.color = KapaColorByName ("red");
     1851    graphdata.ptype = 7;
     1852    graphdata.size = 1.0;
     1853    graphdata.style = 2;
     1854    KapaPrepPlot   (myKapa, nCR, &graphdata);
     1855    KapaPlotVector (myKapa, nCR, xCR->data.F32, "x");
     1856    KapaPlotVector (myKapa, nCR, mCR->data.F32, "y");
     1857
     1858    graphdata.color = KapaColorByName ("blue");
     1859    graphdata.ptype = 7;
     1860    graphdata.size = 1.0;
     1861    graphdata.style = 2;
     1862    KapaPrepPlot   (myKapa, nSAT, &graphdata);
     1863    KapaPlotVector (myKapa, nSAT, xSAT->data.F32, "x");
     1864    KapaPlotVector (myKapa, nSAT, mSAT->data.F32, "y");
     1865
     1866    // fourth section: MagSigma
     1867    section.dx = 0.75;
     1868    section.dy = 0.15;
     1869    section.x  = 0.00;
     1870    section.y  = 0.65;
     1871    section.name = psStringCopy ("MagSigma");
     1872    KapaSetSection (myKapa, &section);
     1873    psFree (section.name);
     1874
     1875    graphdata.color = KapaColorByName ("black");
     1876    graphdata.xmax =  -7.9;
     1877    graphdata.xmin = -17.1;
     1878    graphdata.ymin = -20.1;
     1879    graphdata.ymax = +20.1;
     1880    KapaSetLimits (myKapa, &graphdata);
     1881
     1882    strcpy (graphdata.labels, "0100");
     1883    KapaBox (myKapa, &graphdata);
     1884    // KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_XM);
     1885    KapaSendLabel (myKapa, "EXT&ss&c", KAPA_LABEL_YM);
     1886
     1887    graphdata.color = KapaColorByName ("black");
     1888    graphdata.ptype = 0;
     1889    graphdata.size = 0.5;
     1890    graphdata.style = 2;
     1891    KapaPrepPlot   (myKapa, nPSF, &graphdata);
     1892    KapaPlotVector (myKapa, nPSF, mPSF->data.F32, "x");
     1893    KapaPlotVector (myKapa, nPSF, sPSF->data.F32, "y");
     1894
     1895    graphdata.color = KapaColorByName ("blue");
     1896    graphdata.ptype = 0;
     1897    graphdata.size = 0.5;
     1898    graphdata.style = 2;
     1899    KapaPrepPlot   (myKapa, nEXT, &graphdata);
     1900    KapaPlotVector (myKapa, nEXT, mEXT->data.F32, "x");
     1901    KapaPlotVector (myKapa, nEXT, sEXT->data.F32, "y");
     1902
     1903    graphdata.color = KapaColorByName ("red");
     1904    graphdata.ptype = 0;
     1905    graphdata.size = 0.5;
     1906    graphdata.style = 2;
     1907    KapaPrepPlot   (myKapa, nDEF, &graphdata);
     1908    KapaPlotVector (myKapa, nDEF, mDEF->data.F32, "x");
     1909    KapaPlotVector (myKapa, nDEF, sDEF->data.F32, "y");
     1910
     1911    graphdata.color = KapaColorByName ("red");
     1912    graphdata.ptype = 7;
     1913    graphdata.size = 1.0;
     1914    graphdata.style = 2;
     1915    KapaPrepPlot   (myKapa, nCR, &graphdata);
     1916    KapaPlotVector (myKapa, nCR, mCR->data.F32, "x");
     1917    KapaPlotVector (myKapa, nCR, sCR->data.F32, "y");
     1918
     1919    graphdata.color = KapaColorByName ("blue");
     1920    graphdata.ptype = 7;
     1921    graphdata.size = 1.0;
     1922    graphdata.style = 2;
     1923    KapaPrepPlot   (myKapa, nSAT, &graphdata);
     1924    KapaPlotVector (myKapa, nSAT, mSAT->data.F32, "x");
     1925    KapaPlotVector (myKapa, nSAT, sSAT->data.F32, "y");
     1926
     1927    // draw N circles to outline the clumps
     1928    {
     1929        KapaSelectSection (myKapa, "MxxMyy");
     1930
     1931        // draw a circle centered on psfX,Y with size of the psf limit
     1932        psVector *xLimit  = psVectorAlloc (120, PS_TYPE_F32);
     1933        psVector *yLimit  = psVectorAlloc (120, PS_TYPE_F32);
     1934
     1935        int nRegions = psMetadataLookupS32 (&status, recipe, "PSF.CLUMP.NREGIONS");
     1936        float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA");
     1937
     1938        graphdata.color = KapaColorByName ("blue");
     1939        graphdata.style = 0;
     1940
     1941        graphdata.xmin = Xmin;
     1942        graphdata.ymin = Ymin;
     1943        graphdata.xmax = Xmax;
     1944        graphdata.ymax = Ymax;
     1945        KapaSetLimits (myKapa, &graphdata);
     1946
     1947        for (int n = 0; n < nRegions; n++) {
     1948
     1949            char regionName[64];
     1950            snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n);
     1951            psMetadata *regionMD = psMetadataLookupPtr (&status, recipe, regionName);
     1952
     1953            float psfX  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");
     1954            float psfY  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");
     1955            float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");
     1956            float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");
     1957            float Rx = psfdX * PSF_CLUMP_NSIGMA;
     1958            float Ry = psfdY * PSF_CLUMP_NSIGMA;
     1959
     1960            for (int i = 0; i < xLimit->n; i++) {
     1961                xLimit->data.F32[i] = Rx*cos(i*2.0*M_PI/120.0) + psfX;
     1962                yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY;
     1963            }
     1964            KapaPrepPlot (myKapa, xLimit->n, &graphdata);
     1965            KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x");
     1966            KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y");
     1967        }
     1968        psFree (xLimit);
     1969        psFree (yLimit);
     1970    }
     1971
     1972    psFree (xSAT);
     1973    psFree (ySAT);
     1974    psFree (mSAT);
     1975
     1976    psFree (xEXT);
     1977    psFree (yEXT);
     1978    psFree (mEXT);
     1979
     1980    psFree (xPSF);
     1981    psFree (yPSF);
     1982    psFree (mPSF);
     1983
     1984    psFree (xDEF);
     1985    psFree (yDEF);
     1986    psFree (mDEF);
     1987
     1988    psFree (xCR);
     1989    psFree (yCR);
     1990    psFree (mCR);
    17261991
    17271992    // pause and wait for user input:
     
    17392004    if (!pmVisualIsVisual()) return true;
    17402005
    1741     if (kapa == -1) {
    1742         kapa = KapaOpenNamedSocket ("kapa", "psphot:images");
    1743         if (kapa == -1) {
    1744             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    1745             pmVisualSetVisual(false);
    1746             return false;
    1747         }
    1748     }
    1749 
    1750     psphotVisualScaleImage (kapa, readout->image, "resid", 1);
     2006    int myKapa = psphotKapaChannel (1);
     2007    if (myKapa == -1) return false;
     2008
     2009    psphotVisualScaleImage (myKapa, readout->image, "resid", 1);
    17512010
    17522011    // pause and wait for user input:
     
    17662025    if (!pmVisualIsVisual()) return true;
    17672026
    1768     if (kapa3 == -1) {
    1769         kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots");
    1770         if (kapa3 == -1) {
    1771             fprintf (stderr, "failure to open kapa; visual mode disabled\n");
    1772             pmVisualSetVisual(false);
    1773             return false;
    1774         }
    1775     }
    1776 
    1777     KapaClearPlots (kapa3);
     2027    int myKapa = psphotKapaChannel (2);
     2028    if (myKapa == -1) return false;
     2029
     2030    KapaClearPlots (myKapa);
    17782031    KapaInitGraph (&graphdata);
    17792032
     
    18152068
    18162069    // XXX set the plot range to match the image
    1817     KapaSetLimits (kapa3, &graphdata);
    1818 
    1819     KapaSetFont (kapa3, "helvetica", 14);
    1820     KapaBox (kapa3, &graphdata);
    1821     KapaSendLabel (kapa3, "PSF Mag", KAPA_LABEL_XM);
    1822     KapaSendLabel (kapa3, "Ap Mag - PSF Mag", KAPA_LABEL_YM);
     2070    KapaSetLimits (myKapa, &graphdata);
     2071
     2072    KapaSetFont (myKapa, "helvetica", 14);
     2073    KapaBox (myKapa, &graphdata);
     2074    KapaSendLabel (myKapa, "PSF Mag", KAPA_LABEL_XM);
     2075    KapaSendLabel (myKapa, "Ap Mag - PSF Mag", KAPA_LABEL_YM);
    18232076
    18242077    graphdata.color = KapaColorByName ("black");
     
    18262079    graphdata.size = 0.5;
    18272080    graphdata.style = 2;
    1828     KapaPrepPlot (kapa3, n, &graphdata);
    1829     KapaPlotVector (kapa3, n, x->data.F32, "x");
    1830     KapaPlotVector (kapa3, n, y->data.F32, "y");
     2081    KapaPrepPlot (myKapa, n, &graphdata);
     2082    KapaPlotVector (myKapa, n, x->data.F32, "x");
     2083    KapaPlotVector (myKapa, n, y->data.F32, "y");
    18312084
    18322085    psFree (x);
     
    18502103
    18512104    if (!pmVisualIsVisual()) return true;
     2105
     2106    int kapa = psphotKapaChannel (3);
     2107    if (kapa == -1) return false;
    18522108
    18532109    if (kapa == -1) {
     
    18962152
    18972153# endif
     2154
     2155# if (0)
     2156    // *** make a histogram of the source counts in the x and y directions
     2157    psHistogram *nX = psHistogramAlloc (graphdata.xmin, graphdata.xmax, 50.0);
     2158    psHistogram *nY = psHistogramAlloc (graphdata.ymin, graphdata.ymax, 50.0);
     2159    psVectorHistogram (nX, xFaint, NULL, NULL, 0);
     2160    psVectorHistogram (nY, yFaint, NULL, NULL, 0);
     2161    psVector *dX = psVectorAlloc (nX->nums->n, PS_TYPE_F32);
     2162    psVector *vX = psVectorAlloc (nX->nums->n, PS_TYPE_F32);
     2163    psVector *dY = psVectorAlloc (nY->nums->n, PS_TYPE_F32);
     2164    psVector *vY = psVectorAlloc (nY->nums->n, PS_TYPE_F32);
     2165    for (int i = 0; i < nX->nums->n; i++) {
     2166        dX->data.F32[i] = nX->nums->data.S32[i];
     2167        vX->data.F32[i] = 0.5*(nX->bounds->data.F32[i] + nX->bounds->data.F32[i+1]);
     2168    }
     2169    for (int i = 0; i < nY->nums->n; i++) {
     2170        dY->data.F32[i] = nY->nums->data.S32[i];
     2171        vY->data.F32[i] = 0.5*(nY->bounds->data.F32[i] + nY->bounds->data.F32[i+1]);
     2172    }
     2173
     2174    graphdata.color = KapaColorByName ("black");
     2175    graphdata.ptype = 0;
     2176    graphdata.size = 0.0;
     2177    graphdata.style = 0;
     2178    KapaPrepPlot (myKapa, dX->n, &graphdata);
     2179    KapaPlotVector (myKapa, dX->n, dX->data.F32, "x");
     2180    KapaPlotVector (myKapa, vX->n, vX->data.F32, "y");
     2181
     2182    psFree (nX);
     2183    psFree (dX);
     2184    psFree (vX);
     2185
     2186    psFree (nY);
     2187    psFree (dY);
     2188    psFree (vY);
     2189
     2190
     2191bool psphotVisualShowSourceSize_old (pmReadout *readout, psArray *sources) {
     2192
     2193    int Noverlay, NOVERLAY;
     2194    KiiOverlay *overlay;
     2195
     2196    if (!pmVisualIsVisual()) return true;
     2197
     2198    if (kapa == -1) {
     2199        fprintf (stderr, "kapa not opened, skipping\n");
     2200        return false;
     2201    }
     2202
     2203    // note: this uses the Ohana allocation tools:
     2204    Noverlay = 0;
     2205    NOVERLAY = 100;
     2206    ALLOCATE (overlay, KiiOverlay, sources->n);
     2207
     2208    // mark CRs with red boxes
     2209    for (int i = 0; i < sources->n; i++) {
     2210
     2211        pmSource *source = sources->data[i];
     2212        if (source == NULL) continue;
     2213
     2214        if (!(source->mode & PM_SOURCE_MODE_CR_LIMIT)) continue;
     2215
     2216        overlay[Noverlay].type = KII_OVERLAY_BOX;
     2217        overlay[Noverlay].x = source->peak->xf;
     2218        overlay[Noverlay].y = source->peak->yf;
     2219
     2220        overlay[Noverlay].dx = 4;
     2221        overlay[Noverlay].dy = 4;
     2222        overlay[Noverlay].angle = 0;
     2223        overlay[Noverlay].text = NULL;
     2224        Noverlay ++;
     2225        CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);
     2226    }
     2227    KiiLoadOverlay (kapa, overlay, Noverlay, "red");
     2228
     2229
     2230    Noverlay = 0;
     2231    for (int i = 0; i < sources->n; i++) {
     2232
     2233        pmSource *source = sources->data[i];
     2234        if (source == NULL) continue;
     2235
     2236        // mark EXTs with yellow circles
     2237        if (!(source->mode & PM_SOURCE_MODE_EXT_LIMIT)) continue;
     2238
     2239        overlay[Noverlay].type = KII_OVERLAY_CIRCLE;
     2240        overlay[Noverlay].x = source->peak->xf;
     2241        overlay[Noverlay].y = source->peak->yf;
     2242
     2243        overlay[Noverlay].dx = 10;
     2244        overlay[Noverlay].dy = 10;
     2245        overlay[Noverlay].angle = 0;
     2246        overlay[Noverlay].text = NULL;
     2247        Noverlay ++;
     2248        CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100);
     2249    }
     2250
     2251    KiiLoadOverlay (kapa, overlay, Noverlay, "blue");
     2252    FREE (overlay);
     2253
     2254    psphotVisualShowMask (kapa, readout->mask, "mask", 2);
     2255
     2256    // pause and wait for user input:
     2257    // continue, save (provide name), ??
     2258    char key[10];
     2259    fprintf (stdout, "CR: 4pix red BOX; EXT: 10pix blue circle\n");
     2260    fprintf (stdout, "[c]ontinue? ");
     2261    if (!fgets(key, 8, stdin)) {
     2262        psWarning("Unable to read option");
     2263    }
     2264
     2265    return true;
     2266}
     2267
     2268bool psphotVisualPlotSourceSize_old (psArray *sources) {
     2269
     2270    Graphdata graphdata;
     2271    KapaSection section;
     2272
     2273    if (!pmVisualIsVisual()) return true;
     2274
     2275    int kapa = psphotKapaChannel (2);
     2276    if (kapa == -1) return false;
     2277
     2278    KapaClearPlots (kapa3);
     2279    KapaInitGraph (&graphdata);
     2280
     2281    // first section : mag vs CR nSigma
     2282    section.dx = 1.0;
     2283    section.dy = 0.5;
     2284    section.x = 0.0;
     2285    section.y = 0.0;
     2286    section.name = NULL;
     2287    psStringAppend (&section.name, "a1");
     2288    KapaSetSection (kapa3, &section);
     2289    psFree (section.name);
     2290
     2291    psVector *x = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     2292    psVector *y = psVectorAllocEmpty (sources->n, PS_TYPE_F32);
     2293
     2294    graphdata.xmin = +32.0;
     2295    graphdata.xmax = -32.0;
     2296    graphdata.ymin = +32.0;
     2297    graphdata.ymax = -32.0;
     2298
     2299    // construct the plot vectors
     2300    int n = 0;
     2301    for (int i = 0; i < sources->n; i++) {
     2302        pmSource *source = sources->data[i];
     2303        if (!source) continue;
     2304        if (source->type != PM_SOURCE_TYPE_STAR) continue;
     2305        if (!isfinite (source->crNsigma)) continue;
     2306        if (!isfinite (source->peak->flux)) continue;
     2307        if (source->peak->flux < 0) continue;
     2308
     2309        x->data.F32[n] = -2.5*log10(source->peak->flux);
     2310        y->data.F32[n] = source->crNsigma;
     2311        graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]);
     2312        graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]);
     2313        graphdata.ymin = -0.5;
     2314        graphdata.ymax = 10.0;
     2315
     2316        n++;
     2317    }
     2318    x->n = y->n = n;
     2319
     2320    float range;
     2321    range = graphdata.xmax - graphdata.xmin;
     2322    graphdata.xmax += 0.05*range;
     2323    graphdata.xmin -= 0.05*range;
     2324
     2325    // XXX set the plot range to match the image
     2326    KapaSetLimits (kapa3, &graphdata);
     2327
     2328    KapaSetFont (kapa3, "helvetica", 14);
     2329    KapaBox (kapa3, &graphdata);
     2330    KapaSendLabel (kapa3, "Peak as Mag", KAPA_LABEL_XM);
     2331    KapaSendLabel (kapa3, "CR N Sigma", KAPA_LABEL_YM);
     2332
     2333    graphdata.color = KapaColorByName ("black");
     2334    graphdata.ptype = 2;
     2335    graphdata.size = 0.5;
     2336    graphdata.style = 2;
     2337    KapaPrepPlot (kapa3, n, &graphdata);
     2338    KapaPlotVector (kapa3, n, x->data.F32, "x");
     2339    KapaPlotVector (kapa3, n, y->data.F32, "y");
     2340
     2341    // second section : mag vs EXT nSigma
     2342    section.dx = 1.0;
     2343    section.dy = 0.5;
     2344    section.x = 0.0;
     2345    section.y = 0.5;
     2346    section.name = NULL;
     2347    psStringAppend (&section.name, "a2");
     2348    KapaSetSection (kapa3, &section);
     2349    psFree (section.name);
     2350
     2351    graphdata.xmin = +32.0;
     2352    graphdata.xmax = -32.0;
     2353    graphdata.ymin = +32.0;
     2354    graphdata.ymax = -32.0;
     2355
     2356    // construct the plot vectors
     2357    n = 0;
     2358    for (int i = 0; i < sources->n; i++) {
     2359        pmSource *source = sources->data[i];
     2360        if (!source) continue;
     2361        if (source->type != PM_SOURCE_TYPE_STAR) continue;
     2362        if (!isfinite (source->extNsigma)) continue;
     2363        if (!isfinite (source->peak->flux)) continue;
     2364        if (source->peak->flux < 0) continue;
     2365
     2366        x->data.F32[n] = -2.5*log10(source->peak->flux);
     2367        y->data.F32[n] = source->extNsigma;
     2368        graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]);
     2369        graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]);
     2370        graphdata.ymin = -0.5;
     2371        graphdata.ymax = 10.0;
     2372
     2373        n++;
     2374    }
     2375    x->n = y->n = n;
     2376
     2377    range = graphdata.xmax - graphdata.xmin;
     2378    graphdata.xmax += 0.05*range;
     2379    graphdata.xmin -= 0.05*range;
     2380
     2381    // XXX set the plot range to match the image
     2382    KapaSetLimits (kapa3, &graphdata);
     2383
     2384    KapaSetFont (kapa3, "helvetica", 14);
     2385    KapaBox (kapa3, &graphdata);
     2386    KapaSendLabel (kapa3, "EXT N Sigma", KAPA_LABEL_YM);
     2387
     2388    graphdata.color = KapaColorByName ("black");
     2389    graphdata.ptype = 2;
     2390    graphdata.size = 0.5;
     2391    graphdata.style = 2;
     2392    KapaPrepPlot (kapa3, n, &graphdata);
     2393    KapaPlotVector (kapa3, n, x->data.F32, "x");
     2394    KapaPlotVector (kapa3, n, y->data.F32, "y");
     2395
     2396    psFree (x);
     2397    psFree (y);
     2398
     2399    // pause and wait for user input:
     2400    // continue, save (provide name), ??
     2401    char key[10];
     2402    fprintf (stdout, "[c]ontinue? ");
     2403    if (!fgets(key, 8, stdin)) {
     2404        psWarning("Unable to read option");
     2405    }
     2406    return true;
     2407}
     2408
     2409# endif
     2410
Note: See TracChangeset for help on using the changeset viewer.