Changeset 34404 for trunk/psphot/src/psphotVisual.c
- Timestamp:
- Sep 5, 2012, 4:19:30 PM (14 years ago)
- Location:
- trunk/psphot
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot
- Property svn:mergeinfo changed
/branches/eam_branches/ipp-20120805/psphot (added) merged: 34360,34368-34369,34377-34378,34380,34392,34399
- Property svn:mergeinfo changed
-
trunk/psphot/src
- Property svn:mergeinfo changed
/branches/eam_branches/ipp-20120805/psphot/src (added) merged: 34360,34368-34369,34377-34378,34380,34392,34399
- Property svn:mergeinfo changed
-
trunk/psphot/src/psphotVisual.c
r31452 r34404 262 262 } 263 263 264 static psImage *posImage = NULL; 265 static psImage *delImage = NULL; 266 264 267 bool psphotVisualShowImage (pmReadout *readout) { 265 268 … … 277 280 psphotVisualScaleImage (kapa, readout->variance, readout->mask, "variance", 1.0, 1); 278 281 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 } 279 286 280 287 pmVisualAskUser(NULL); … … 1139 1146 // after displaying (as an image) the psf stars, we cycle throught them and display their 1140 1147 // radial profiles: 1141 psphotVisualPlotRadialProfiles (recipe, sources );1148 psphotVisualPlotRadialProfiles (recipe, sources, PM_SOURCE_MODE_PSFSTAR); 1142 1149 1143 1150 return true; … … 1273 1280 } 1274 1281 1275 staticvoid plotline (int myKapa, Graphdata *graphdata, float x0, float y0, float x1, float y1)1282 void plotline (int myKapa, Graphdata *graphdata, float x0, float y0, float x1, float y1) 1276 1283 { 1277 1284 float x[2], y[2]; … … 1285 1292 } 1286 1293 1287 bool psphotVisualPlotRadialProfile (int myKapa, pmSource *source, psImageMaskType maskVal ) {1294 bool psphotVisualPlotRadialProfile (int myKapa, pmSource *source, psImageMaskType maskVal, pmSourceMode showmode) { 1288 1295 1289 1296 Graphdata graphdata; 1297 1298 float Rmax = (showmode & PM_SOURCE_MODE_SATSTAR) ? 100.0 : 30.0; 1290 1299 1291 1300 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); … … 1302 1311 int ng = 0; 1303 1312 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 1306 1325 for (int iy = 0; iy < source->pixels->numRows; iy++) { 1307 1326 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)) { 1309 1328 rb->data.F32[nb] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ; 1310 1329 // rb->data.F32[nb] = hypot (ix - Xo, iy - Yo) ; … … 1322 1341 } 1323 1342 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 recorded1385 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);1386 1387 1343 KapaInitGraph (&graphdata); 1388 1344 … … 1392 1348 // examine sources to set data range 1393 1349 graphdata.xmin = -0.05; 1394 graphdata.xmax = +30.05;1350 graphdata.xmax = Rmax + 0.05; 1395 1351 graphdata.ymin = -0.05; 1396 1352 graphdata.ymax = +8.05; … … 1418 1374 KapaPlotVector (myKapa, nb, fb->data.F32, "y"); 1419 1375 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 1449 1376 // ** loglog ** 1450 1377 KapaSelectSection (myKapa, "loglog"); … … 1452 1379 // examine sources to set data range 1453 1380 graphdata.xmin = -1.51; 1454 graphdata.xmax = +1.51;1381 graphdata.xmax = log10(Rmax) + 0.02; 1455 1382 graphdata.ymin = -0.05; 1456 1383 graphdata.ymax = +8.05; … … 1479 1406 KapaPlotVector (myKapa, nb, fb->data.F32, "y"); 1480 1407 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 } 1500 1527 1501 1528 psFree (rg); … … 1508 1535 } 1509 1536 1510 bool psphotVisualPlotRadialProfiles (psMetadata *recipe, psArray *sources ) {1537 bool psphotVisualPlotRadialProfiles (psMetadata *recipe, psArray *sources, pmSourceMode showmode) { 1511 1538 1512 1539 KapaSection section; // put the positive profile in one and the residuals in another? … … 1549 1576 1550 1577 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 } 1554 1601 1555 1602 // pause and wait for user input: … … 2540 2587 } 2541 2588 2542 if ( reshow) {2589 if (false && reshow) { 2543 2590 psphotVisualShowMask (myKapa, readout->mask, "mask", 2); 2544 2591 psphotVisualScaleImage (myKapa, readout->variance, readout->mask, "variance", 1.0, 1); 2545 2592 } 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); 2547 2601 2548 2602 pmVisualAskUser(NULL);
Note:
See TracChangeset
for help on using the changeset viewer.
