IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 5, 2012, 4:19:30 PM (14 years ago)
Author:
eugene
Message:

adding SATSTAR profile code (but keeping it disabled for now)

Location:
trunk/psphot
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot

  • trunk/psphot/src

  • trunk/psphot/src/psphotVisual.c

    r31452 r34404  
    262262}
    263263
     264static psImage *posImage = NULL;
     265static psImage *delImage = NULL;
     266
    264267bool psphotVisualShowImage (pmReadout *readout) {
    265268
     
    277280    psphotVisualScaleImage (kapa, readout->variance, readout->mask, "variance", 1.0, 1);
    278281    psphotVisualScaleImage (kapa, readout->image, readout->mask, "image", sqrt(factor), 0);
     282
     283    if (posImage == NULL) {
     284        posImage = psImageCopy (NULL, readout->image, PS_TYPE_F32);
     285    }
    279286
    280287    pmVisualAskUser(NULL);
     
    11391146    // after displaying (as an image) the psf stars, we cycle throught them and display their
    11401147    // radial profiles:
    1141     psphotVisualPlotRadialProfiles (recipe, sources);
     1148    psphotVisualPlotRadialProfiles (recipe, sources, PM_SOURCE_MODE_PSFSTAR);
    11421149
    11431150    return true;
     
    12731280}
    12741281
    1275 static void plotline (int myKapa, Graphdata *graphdata, float x0, float y0, float x1, float y1)
     1282void plotline (int myKapa, Graphdata *graphdata, float x0, float y0, float x1, float y1)
    12761283{
    12771284    float x[2], y[2];
     
    12851292}
    12861293
    1287 bool psphotVisualPlotRadialProfile (int myKapa, pmSource *source, psImageMaskType maskVal) {
     1294bool psphotVisualPlotRadialProfile (int myKapa, pmSource *source, psImageMaskType maskVal, pmSourceMode showmode) {
    12881295
    12891296    Graphdata graphdata;
     1297
     1298    float Rmax = (showmode & PM_SOURCE_MODE_SATSTAR) ? 100.0 : 30.0;
    12901299
    12911300    bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);
     
    13021311    int ng = 0;
    13031312    int nb = 0;
    1304     float Xo = source->modelPSF->params->data.F32[PM_PAR_XPOS] - source->pixels->col0;
    1305     float Yo = source->modelPSF->params->data.F32[PM_PAR_YPOS] - source->pixels->row0;
     1313
     1314    float Xo = NAN;
     1315    float Yo = NAN;
     1316
     1317    if (source->modelPSF) {
     1318        Xo = source->modelPSF->params->data.F32[PM_PAR_XPOS] - source->pixels->col0;
     1319        Yo = source->modelPSF->params->data.F32[PM_PAR_YPOS] - source->pixels->row0;
     1320    } else {
     1321        Xo = source->moments->Mx - source->pixels->col0;
     1322        Yo = source->moments->My - source->pixels->row0;
     1323    }
     1324
    13061325    for (int iy = 0; iy < source->pixels->numRows; iy++) {
    13071326        for (int ix = 0; ix < source->pixels->numCols; ix++) {
    1308             if (source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix]) {
     1327            if ((source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix] & maskVal)) {
    13091328                rb->data.F32[nb] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ;
    13101329                // rb->data.F32[nb] = hypot (ix - Xo, iy - Yo) ;
     
    13221341    }
    13231342
    1324     // generate model profiles (major and minor axis):
    1325     // create a model with theta = 0.0 so major and minor axes are equiv to x and y:
    1326     psEllipseShape rawShape, rotShape;
    1327 
    1328     rawShape.sx  = source->modelPSF->params->data.F32[PM_PAR_SXX] / M_SQRT2;
    1329     rawShape.sy  = source->modelPSF->params->data.F32[PM_PAR_SYY] / M_SQRT2;
    1330     rawShape.sxy = source->modelPSF->params->data.F32[PM_PAR_SXY];
    1331 
    1332     psEllipseAxes axes = psEllipseShapeToAxes (rawShape, 20.0);
    1333 
    1334     axes.theta = 0.0;
    1335 
    1336     rotShape = psEllipseAxesToShape (axes);
    1337 
    1338     psVector *params = psVectorAlloc(source->modelPSF->params->n, PS_TYPE_F32);
    1339     for (int i = 0; i < source->modelPSF->params->n; i++) {
    1340         params->data.F32[i] = source->modelPSF->params->data.F32[i];
    1341     }
    1342     params->data.F32[PM_PAR_SXX] = rotShape.sx * M_SQRT2;
    1343     params->data.F32[PM_PAR_SYY] = rotShape.sy * M_SQRT2;
    1344     params->data.F32[PM_PAR_SXY] = rotShape.sxy;
    1345     params->data.F32[PM_PAR_XPOS] = 0.0;
    1346     params->data.F32[PM_PAR_YPOS] = 0.0;
    1347 
    1348     psVector *rmod = psVectorAlloc(300, PS_TYPE_F32);
    1349     psVector *fmaj = psVectorAlloc(300, PS_TYPE_F32);
    1350     psVector *fmin = psVectorAlloc(300, PS_TYPE_F32);
    1351 
    1352     psVector *coord = psVectorAlloc(2, PS_TYPE_F32);
    1353 
    1354     float r = 0.0;
    1355     for (int i = 0; i < rmod->n; i++) {
    1356         r = i*0.1;
    1357         rmod->data.F32[i] = r;
    1358 
    1359         coord->data.F32[1] = r;
    1360         coord->data.F32[0] = 0.0;
    1361         fmaj->data.F32[i] = log10(source->modelPSF->modelFunc (NULL, params, coord));
    1362 
    1363         coord->data.F32[0] = r;
    1364         coord->data.F32[1] = 0.0;
    1365         fmin->data.F32[i] = log10(source->modelPSF->modelFunc (NULL, params, coord));
    1366     }
    1367     psFree (coord);
    1368     psFree (params);
    1369 
    1370     float FWHM_MAJOR = 2.0*source->modelPSF->modelRadius (source->modelPSF->params, 0.5*source->modelPSF->params->data.F32[PM_PAR_I0]);
    1371     float FWHM_MINOR = FWHM_MAJOR * (axes.minor / axes.major);
    1372     if (FWHM_MAJOR < FWHM_MINOR) PS_SWAP (FWHM_MAJOR, FWHM_MINOR);
    1373 
    1374     psEllipseMoments emoments;
    1375     emoments.x2 = source->moments->Mxx;
    1376     emoments.xy = source->moments->Mxy;
    1377     emoments.y2 = source->moments->Myy;
    1378     axes = psEllipseMomentsToAxes (emoments, 20.0);
    1379     float MOMENTS_MAJOR = 2.355*axes.major;
    1380     float MOMENTS_MINOR = 2.355*axes.minor;
    1381 
    1382     float logHM = log10(0.5*source->modelPSF->params->data.F32[PM_PAR_I0]);
    1383 
    1384     // reset source Add/Sub state to recorded
    1385     if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);
    1386 
    13871343    KapaInitGraph (&graphdata);
    13881344
     
    13921348    // examine sources to set data range
    13931349    graphdata.xmin =  -0.05;
    1394     graphdata.xmax = +30.05;
     1350    graphdata.xmax = Rmax + 0.05;
    13951351    graphdata.ymin = -0.05;
    13961352    graphdata.ymax = +8.05;
     
    14181374    KapaPlotVector (myKapa, nb, fb->data.F32, "y");
    14191375
    1420     graphdata.color = KapaColorByName ("blue");
    1421     graphdata.ptype = 0;
    1422     graphdata.size = 0.0;
    1423     graphdata.style = 0;
    1424     KapaPrepPlot   (myKapa, rmod->n, &graphdata);
    1425     KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
    1426     KapaPlotVector (myKapa, rmod->n, fmin->data.F32, "y");
    1427     plotline (myKapa, &graphdata, 0.0, logHM, 30.0, logHM);
    1428     plotline (myKapa, &graphdata, 0.5*FWHM_MINOR, 0.0, 0.5*FWHM_MINOR, 5.0);
    1429     graphdata.ltype = 1;
    1430     plotline (myKapa, &graphdata, 0.5*MOMENTS_MINOR, 0.0, 0.5*MOMENTS_MINOR, 5.0);
    1431     graphdata.ltype = 0;
    1432        
    1433     graphdata.color = KapaColorByName ("green");
    1434     graphdata.ptype = 0;
    1435     graphdata.size = 0.0;
    1436     graphdata.style = 0;
    1437     KapaPrepPlot   (myKapa, rmod->n, &graphdata);
    1438     KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
    1439     KapaPlotVector (myKapa, rmod->n, fmaj->data.F32, "y");
    1440     plotline (myKapa, &graphdata, 0.5*FWHM_MAJOR, 0.0, 0.5*FWHM_MAJOR, 5.0);
    1441     graphdata.ltype = 1;
    1442     plotline (myKapa, &graphdata, 0.5*MOMENTS_MAJOR, 0.0, 0.5*MOMENTS_MAJOR, 5.0);
    1443     graphdata.ltype = 0;
    1444        
    1445     for (int i = 0; i < rmod->n; i++) {
    1446         rmod->data.F32[i] = log10(rmod->data.F32[i]);
    1447     }
    1448 
    14491376    // ** loglog **
    14501377    KapaSelectSection (myKapa, "loglog");
     
    14521379    // examine sources to set data range
    14531380    graphdata.xmin = -1.51;
    1454     graphdata.xmax = +1.51;
     1381    graphdata.xmax = log10(Rmax) + 0.02;
    14551382    graphdata.ymin = -0.05;
    14561383    graphdata.ymax = +8.05;
     
    14791406    KapaPlotVector (myKapa, nb, fb->data.F32, "y");
    14801407
    1481     graphdata.color = KapaColorByName ("blue");
    1482     graphdata.ptype = 0;
    1483     graphdata.size = 0.0;
    1484     graphdata.style = 0;
    1485     KapaPrepPlot   (myKapa, rmod->n, &graphdata);
    1486     KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
    1487     KapaPlotVector (myKapa, rmod->n, fmin->data.F32, "y");
    1488 
    1489     graphdata.color = KapaColorByName ("green");
    1490     graphdata.ptype = 0;
    1491     graphdata.size = 0.0;
    1492     graphdata.style = 0;
    1493     KapaPrepPlot   (myKapa, rmod->n, &graphdata);
    1494     KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
    1495     KapaPlotVector (myKapa, rmod->n, fmaj->data.F32, "y");
    1496 
    1497     psFree (rmod);
    1498     psFree (fmin);
    1499     psFree (fmaj);
     1408    if (source->modelPSF) {
     1409        // generate model profiles (major and minor axis):
     1410        // create a model with theta = 0.0 so major and minor axes are equiv to x and y:
     1411        psEllipseShape rawShape, rotShape;
     1412
     1413        rawShape.sx  = source->modelPSF->params->data.F32[PM_PAR_SXX] / M_SQRT2;
     1414        rawShape.sy  = source->modelPSF->params->data.F32[PM_PAR_SYY] / M_SQRT2;
     1415        rawShape.sxy = source->modelPSF->params->data.F32[PM_PAR_SXY];
     1416
     1417        psEllipseAxes axes = psEllipseShapeToAxes (rawShape, 20.0);
     1418
     1419        axes.theta = 0.0;
     1420
     1421        rotShape = psEllipseAxesToShape (axes);
     1422
     1423        psVector *params = psVectorAlloc(source->modelPSF->params->n, PS_TYPE_F32);
     1424        for (int i = 0; i < source->modelPSF->params->n; i++) {
     1425            params->data.F32[i] = source->modelPSF->params->data.F32[i];
     1426        }
     1427        params->data.F32[PM_PAR_SXX] = rotShape.sx * M_SQRT2;
     1428        params->data.F32[PM_PAR_SYY] = rotShape.sy * M_SQRT2;
     1429        params->data.F32[PM_PAR_SXY] = rotShape.sxy;
     1430        params->data.F32[PM_PAR_XPOS] = 0.0;
     1431        params->data.F32[PM_PAR_YPOS] = 0.0;
     1432
     1433        psVector *rmod = psVectorAlloc(Rmax*10, PS_TYPE_F32);
     1434        psVector *fmaj = psVectorAlloc(Rmax*10, PS_TYPE_F32);
     1435        psVector *fmin = psVectorAlloc(Rmax*10, PS_TYPE_F32);
     1436
     1437        psVector *coord = psVectorAlloc(2, PS_TYPE_F32);
     1438
     1439        float r = 0.0;
     1440        for (int i = 0; i < rmod->n; i++) {
     1441            r = i*0.1;
     1442            rmod->data.F32[i] = r;
     1443
     1444            coord->data.F32[1] = r;
     1445            coord->data.F32[0] = 0.0;
     1446            fmaj->data.F32[i] = log10(source->modelPSF->modelFunc (NULL, params, coord));
     1447
     1448            coord->data.F32[0] = r;
     1449            coord->data.F32[1] = 0.0;
     1450            fmin->data.F32[i] = log10(source->modelPSF->modelFunc (NULL, params, coord));
     1451        }
     1452        psFree (coord);
     1453        psFree (params);
     1454
     1455        float FWHM_MAJOR = 2.0*source->modelPSF->modelRadius (source->modelPSF->params, 0.5*source->modelPSF->params->data.F32[PM_PAR_I0]);
     1456        float FWHM_MINOR = FWHM_MAJOR * (axes.minor / axes.major);
     1457        if (FWHM_MAJOR < FWHM_MINOR) PS_SWAP (FWHM_MAJOR, FWHM_MINOR);
     1458
     1459        psEllipseMoments emoments;
     1460        emoments.x2 = source->moments->Mxx;
     1461        emoments.xy = source->moments->Mxy;
     1462        emoments.y2 = source->moments->Myy;
     1463        axes = psEllipseMomentsToAxes (emoments, 20.0);
     1464        float MOMENTS_MAJOR = 2.355*axes.major;
     1465        float MOMENTS_MINOR = 2.355*axes.minor;
     1466
     1467        float logHM = log10(0.5*source->modelPSF->params->data.F32[PM_PAR_I0]);
     1468
     1469        // reset source Add/Sub state to recorded
     1470        if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);
     1471
     1472        // ** linlog **
     1473        KapaSelectSection (myKapa, "linlog");
     1474        KapaGetGraphData (myKapa, &graphdata);
     1475        graphdata.color = KapaColorByName ("blue");
     1476        graphdata.ptype = 0;
     1477        graphdata.size = 0.0;
     1478        graphdata.style = 0;
     1479        KapaPrepPlot   (myKapa, rmod->n, &graphdata);
     1480        KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
     1481        KapaPlotVector (myKapa, rmod->n, fmin->data.F32, "y");
     1482        plotline (myKapa, &graphdata, graphdata.xmin, logHM, graphdata.xmax, logHM);
     1483        plotline (myKapa, &graphdata, 0.5*FWHM_MINOR, graphdata.ymin, 0.5*FWHM_MINOR, graphdata.ymax);
     1484        graphdata.ltype = 1;
     1485        plotline (myKapa, &graphdata, 0.5*MOMENTS_MINOR, graphdata.ymin, 0.5*MOMENTS_MINOR, graphdata.ymax);
     1486        graphdata.ltype = 0;
     1487       
     1488        graphdata.color = KapaColorByName ("green");
     1489        graphdata.ptype = 0;
     1490        graphdata.size = 0.0;
     1491        graphdata.style = 0;
     1492        KapaPrepPlot   (myKapa, rmod->n, &graphdata);
     1493        KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
     1494        KapaPlotVector (myKapa, rmod->n, fmaj->data.F32, "y");
     1495        plotline (myKapa, &graphdata, 0.5*FWHM_MAJOR, graphdata.ymin, 0.5*FWHM_MAJOR, graphdata.ymax);
     1496        graphdata.ltype = 1;
     1497        plotline (myKapa, &graphdata, 0.5*MOMENTS_MAJOR, graphdata.ymin, 0.5*MOMENTS_MAJOR, graphdata.ymax);
     1498        graphdata.ltype = 0;
     1499       
     1500        for (int i = 0; i < rmod->n; i++) {
     1501            rmod->data.F32[i] = log10(rmod->data.F32[i]);
     1502        }
     1503
     1504        // ** loglog **
     1505        KapaSelectSection (myKapa, "loglog");
     1506        KapaGetGraphData (myKapa, &graphdata);
     1507        graphdata.color = KapaColorByName ("blue");
     1508        graphdata.ptype = 0;
     1509        graphdata.size = 0.0;
     1510        graphdata.style = 0;
     1511        KapaPrepPlot   (myKapa, rmod->n, &graphdata);
     1512        KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
     1513        KapaPlotVector (myKapa, rmod->n, fmin->data.F32, "y");
     1514
     1515        graphdata.color = KapaColorByName ("green");
     1516        graphdata.ptype = 0;
     1517        graphdata.size = 0.0;
     1518        graphdata.style = 0;
     1519        KapaPrepPlot   (myKapa, rmod->n, &graphdata);
     1520        KapaPlotVector (myKapa, rmod->n, rmod->data.F32, "x");
     1521        KapaPlotVector (myKapa, rmod->n, fmaj->data.F32, "y");
     1522
     1523        psFree (rmod);
     1524        psFree (fmin);
     1525        psFree (fmaj);
     1526    }
    15001527
    15011528    psFree (rg);
     
    15081535}
    15091536
    1510 bool psphotVisualPlotRadialProfiles (psMetadata *recipe, psArray *sources) {
     1537bool psphotVisualPlotRadialProfiles (psMetadata *recipe, psArray *sources, pmSourceMode showmode) {
    15111538
    15121539    KapaSection section;  // put the positive profile in one and the residuals in another?
     
    15491576
    15501577        pmSource *source = sources->data[i];
    1551         if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue;
    1552 
    1553         psphotVisualPlotRadialProfile (myKapa, source, maskVal);
     1578        if (!(source->mode & showmode)) continue;
     1579
     1580        psphotVisualPlotRadialProfile (myKapa, source, maskVal, showmode);
     1581
     1582        if (pmVisualTestLevel("psphot.image", 1)) {
     1583          int display = psphotKapaChannel (1);
     1584          KiiCenter (display, source->peak->xf, source->peak->yf, 1);
     1585          KiiOverlay overlay;
     1586          overlay.x = source->peak->xf;
     1587          overlay.y = source->peak->yf;
     1588          overlay.dx = 5;
     1589          overlay.dy = 5;
     1590          overlay.angle = 0.0;
     1591          overlay.type = KiiOverlayTypeByName ("circle");
     1592          KiiLoadOverlay (display, &overlay, 1, "red");
     1593          overlay.x = source->moments->Mx;
     1594          overlay.y = source->moments->My;
     1595          overlay.dx = 8;
     1596          overlay.dy = 8;
     1597          overlay.angle = 0.0;
     1598          overlay.type = KiiOverlayTypeByName ("circle");
     1599          KiiLoadOverlay (display, &overlay, 1, "blue");
     1600        }
    15541601
    15551602        // pause and wait for user input:
     
    25402587    }
    25412588
    2542     if (reshow) {
     2589    if (false && reshow) {
    25432590        psphotVisualShowMask (myKapa, readout->mask, "mask", 2);
    25442591        psphotVisualScaleImage (myKapa, readout->variance, readout->mask, "variance", 1.0, 1);
    25452592    }
    2546     psphotVisualScaleImage (myKapa, readout->image, readout->mask, "resid", sqrt(factor), 0);
     2593
     2594    if (posImage) {
     2595        delImage = (psImage *) psBinaryOp(delImage, posImage, "-", readout->image);
     2596        psphotVisualScaleImage (myKapa, posImage, readout->mask, "posimage", sqrt(factor), 0);
     2597        psphotVisualScaleImage (myKapa, delImage, readout->mask, "delimage", sqrt(factor), 2);
     2598    }
     2599
     2600    psphotVisualScaleImage (myKapa, readout->image, readout->mask, "resid", sqrt(factor), 1);
    25472601
    25482602    pmVisualAskUser(NULL);
Note: See TracChangeset for help on using the changeset viewer.