Changeset 25755 for trunk/psphot/src/psphotVisual.c
- Timestamp:
- Oct 2, 2009, 3:12:47 PM (17 years ago)
- Location:
- trunk/psphot/src
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
psphotVisual.c (modified) (68 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src
- Property svn:ignore
-
old new 18 18 psphotVersionDefinitions.h 19 19 psphotMomentsStudy 20 psphotPetrosianStudy
-
- Property svn:ignore
-
trunk/psphot/src/psphotVisual.c
r24636 r25755 15 15 # include <kapa.h> 16 16 17 bool pmVisualLimitsFromVectors (Graphdata *graphdata, psVector *xVec, psVector *yVec); 18 17 19 // functions used to visualize the analysis as it goes 18 20 // these are invoked by the -visual options 19 21 20 static int kapa = -1;22 static int kapa1 = -1; 21 23 static int kapa2 = -1; 22 24 static int kapa3 = -1; 23 25 26 int 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 } 24 61 25 62 bool psphotVisualShowMask (int kapaFD, psImage *inImage, const char *name, int channel) { … … 131 168 if (!pmVisualIsVisual()) return true; 132 169 133 if (kapa == -1) { 134 kapa = KapaOpenNamedSocket ("kapa", "psphot:images"); 135 if (kapa == -1) { 136 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 137 pmVisualSetVisual(false); 138 return false; 139 } 140 } 170 int kapa = psphotKapaChannel (1); 171 if (kapa == -1) return false; 141 172 142 173 // psphotVisualShowMask (kapa, readout->mask, "mask", 2); … … 144 175 psphotVisualScaleImage (kapa, readout->image, "image", 0); 145 176 146 // pause and wait for user input: 147 // continue, save (provide name), ?? 148 char key[10]; 149 fprintf (stdout, "[c]ontinue? "); 150 if (!fgets(key, 8, stdin)) { 151 psWarning("Unable to read option"); 152 } 177 pmVisualAskUser(NULL); 153 178 return true; 154 179 } … … 160 185 if (!pmVisualIsVisual()) return true; 161 186 162 if (kapa == -1) { 163 kapa = KapaOpenNamedSocket ("kapa", "psphot:images"); 164 if (kapa == -1) { 165 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 166 pmVisualSetVisual(false); 167 return false; 168 } 169 } 187 int kapa = psphotKapaChannel (1); 188 if (kapa == -1) return false; 170 189 171 190 bool status = false; … … 181 200 psphotVisualScaleImage (kapa, readout->image, "backsub", 0); 182 201 183 // pause and wait for user input: 184 // continue, save (provide name), ?? 185 char key[10]; 186 fprintf (stdout, "[c]ontinue? "); 187 if (!fgets(key, 8, stdin)) { 188 psWarning("Unable to read option"); 189 } 202 pmVisualAskUser(NULL); 190 203 return true; 191 204 } … … 195 208 if (!pmVisualIsVisual()) return true; 196 209 197 if (kapa == -1) { 198 kapa = KapaOpenNamedSocket ("kapa", "psphot:images"); 199 if (kapa == -1) { 200 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 201 pmVisualSetVisual(false); 202 return false; 203 } 204 } 205 206 // XXX test: image->data.F32[10][10] = 10000; 210 int kapa = psphotKapaChannel (1); 211 if (kapa == -1) return false; 212 207 213 psphotVisualRangeImage (kapa, image, "signif", 2, -1.0, 25.0*25.0); 208 214 209 // pause and wait for user input: 210 // continue, save (provide name), ?? 211 char key[10]; 212 fprintf (stdout, "[c]ontinue? "); 213 if (!fgets(key, 8, stdin)) { 214 psWarning("Unable to read option"); 215 } 215 pmVisualAskUser(NULL); 216 216 return true; 217 217 } … … 224 224 if (!pmVisualIsVisual()) return true; 225 225 226 if (kapa == -1) { 227 fprintf (stderr, "kapa not opened, skipping\n"); 228 return false; 229 } 226 int kapa = psphotKapaChannel (1); 227 if (kapa == -1) return false; 230 228 231 229 psArray *peaks = detections->peaks; … … 233 231 // note: this uses the Ohana allocation tools: 234 232 // ALLOCATE (overlay, KiiOverlay, 3*peaks->n + 1); 235 ALLOCATE (overlay, KiiOverlay, peaks->n );233 ALLOCATE (overlay, KiiOverlay, peaks->n + 2); 236 234 237 235 Noverlay = 0; … … 271 269 } 272 270 273 # if ( 0)271 # if (1) 274 272 overlay[Noverlay].type = KII_OVERLAY_BOX; 275 273 overlay[Noverlay].x = 10.0; 276 274 overlay[Noverlay].y = 10.0; 277 overlay[Noverlay].dx = 0.5;278 overlay[Noverlay].dy = 0.5;275 overlay[Noverlay].dx = 1.0; 276 overlay[Noverlay].dy = 1.0; 279 277 overlay[Noverlay].angle = 0.0; 280 278 overlay[Noverlay].text = NULL; … … 285 283 FREE (overlay); 286 284 287 // pause and wait for user input: 288 // continue, save (provide name), ?? 289 char key[10]; 290 fprintf (stdout, "[c]ontinue? "); 291 if (!fgets(key, 8, stdin)) { 292 psWarning("Unable to read option"); 293 } 285 pmVisualAskUser(NULL); 294 286 return true; 295 287 } … … 302 294 if (!pmVisualIsVisual()) return true; 303 295 304 if (kapa == -1) { 305 fprintf (stderr, "kapa not opened, skipping\n"); 306 return false; 307 } 296 int kapa = psphotKapaChannel (1); 297 if (kapa == -1) return false; 308 298 309 299 psArray *footprints = detections->footprints; … … 325 315 326 316 // draw the top 317 // XXX need to allow top (and bottom) to have more than one span 327 318 span = footprint->spans->data[0]; 328 319 overlay[Noverlay].type = KII_OVERLAY_LINE; … … 399 390 FREE (overlay); 400 391 401 // pause and wait for user input: 402 // continue, save (provide name), ?? 403 char key[10]; 404 fprintf (stdout, "[c]ontinue? "); 405 if (!fgets(key, 8, stdin)) { 406 psWarning("Unable to read option"); 407 } 392 pmVisualAskUser(NULL); 408 393 return true; 409 394 } … … 419 404 if (!pmVisualIsVisual()) return true; 420 405 421 if (kapa == -1) { 422 fprintf (stderr, "kapa not opened, skipping\n"); 423 return false; 424 } 406 int kapa = psphotKapaChannel (1); 407 if (kapa == -1) return false; 408 409 // XXX mark the different source classes with different color/shape dots 410 // XXX are moments S/N and peak S/N consistent? 425 411 426 412 // note: this uses the Ohana allocation tools: … … 448 434 overlay[Noverlay].dx = 2.0*axes.major; 449 435 overlay[Noverlay].dy = 2.0*axes.minor; 450 overlay[Noverlay].angle = -axes.theta * PS_DEG_RAD; // XXXXXXXX the axes angle is negative to display of object on kapa 436 437 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD; 438 451 439 overlay[Noverlay].text = NULL; 452 440 Noverlay ++; … … 456 444 FREE (overlay); 457 445 458 // pause and wait for user input: 459 // continue, save (provide name), ?? 460 char key[10]; 461 fprintf (stdout, "[c]ontinue? "); 462 if (!fgets(key, 8, stdin)) { 463 psWarning("Unable to read option"); 464 } 465 446 pmVisualAskUser(NULL); 466 447 return true; 467 448 } … … 475 456 if (!pmVisualIsVisual()) return true; 476 457 477 if (kapa3 == -1) { 478 kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots"); 479 if (kapa3 == -1) { 480 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 481 pmVisualSetVisual(false); 482 return false; 483 } 484 } 485 486 KapaClearPlots (kapa3); 458 int myKapa = psphotKapaChannel (2); 459 if (myKapa == -1) return false; 460 461 KapaClearPlots (myKapa); 487 462 KapaInitGraph (&graphdata); 488 KapaSetFont ( kapa3, "courier", 14);463 KapaSetFont (myKapa, "courier", 14); 489 464 490 465 float SN_LIM = psMetadataLookupF32(&status, recipe, "PSF_SN_LIM"); 491 466 492 467 // select the max psfX,Y values for the plot limits 493 float Xmin = 0.0, Xmax = 0.0;494 float Ymin = 0.0, Ymax = 0.0;468 float Xmin = 1000.0, Xmax = 0.0; 469 float Ymin = 1000.0, Ymax = 0.0; 495 470 { 496 471 int nRegions = psMetadataLookupS32 (&status, recipe, "PSF.CLUMP.NREGIONS"); … … 511 486 float Y1 = psfY + 4.0*psfdY; 512 487 513 if (isfinite(X0)) { Xmin = PS_M AX(Xmin, X0); }488 if (isfinite(X0)) { Xmin = PS_MIN(Xmin, X0); } 514 489 if (isfinite(X1)) { Xmax = PS_MAX(Xmax, X1); } 515 if (isfinite(Y0)) { Ymin = PS_M AX(Ymin, Y0); }490 if (isfinite(Y0)) { Ymin = PS_MIN(Ymin, Y0); } 516 491 if (isfinite(Y1)) { Ymax = PS_MAX(Ymax, Y1); } 517 492 } 518 493 } 494 Xmin = PS_MAX(Xmin, -0.1); 495 Ymin = PS_MAX(Ymin, -0.1); 519 496 520 497 // storage vectors for data to be plotted … … 564 541 section.y = 0.00; 565 542 section.name = psStringCopy ("MxxMyy"); 566 KapaSetSection ( kapa3, §ion);543 KapaSetSection (myKapa, §ion); 567 544 psFree (section.name); 568 545 … … 572 549 graphdata.xmax = Xmax; 573 550 graphdata.ymax = Ymax; 574 KapaSetLimits ( kapa3, &graphdata);575 576 KapaBox ( kapa3, &graphdata);577 KapaSendLabel ( kapa3, "M_xx| (pixels)", KAPA_LABEL_XM);578 KapaSendLabel ( kapa3, "M_yy| (pixels)", KAPA_LABEL_YM);551 KapaSetLimits (myKapa, &graphdata); 552 553 KapaBox (myKapa, &graphdata); 554 KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM); 555 KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM); 579 556 580 557 graphdata.color = KapaColorByName ("black"); … … 582 559 graphdata.size = 0.3; 583 560 graphdata.style = 2; 584 KapaPrepPlot ( kapa3, nF, &graphdata);585 KapaPlotVector ( kapa3, nF, xFaint->data.F32, "x");586 KapaPlotVector ( kapa3, nF, yFaint->data.F32, "y");561 KapaPrepPlot (myKapa, nF, &graphdata); 562 KapaPlotVector (myKapa, nF, xFaint->data.F32, "x"); 563 KapaPlotVector (myKapa, nF, yFaint->data.F32, "y"); 587 564 588 565 graphdata.color = KapaColorByName ("red"); … … 590 567 graphdata.size = 0.5; 591 568 graphdata.style = 2; 592 KapaPrepPlot ( kapa3, nB, &graphdata);593 KapaPlotVector ( kapa3, nB, xBright->data.F32, "x");594 KapaPlotVector ( kapa3, nB, yBright->data.F32, "y");569 KapaPrepPlot (myKapa, nB, &graphdata); 570 KapaPlotVector (myKapa, nB, xBright->data.F32, "x"); 571 KapaPlotVector (myKapa, nB, yBright->data.F32, "y"); 595 572 596 573 // second section: MagMyy … … 600 577 section.y = 0.80; 601 578 section.name = psStringCopy ("MagMyy"); 602 KapaSetSection ( kapa3, §ion);579 KapaSetSection (myKapa, §ion); 603 580 psFree (section.name); 604 581 … … 608 585 graphdata.ymin = Ymin; 609 586 graphdata.ymax = Ymax; 610 KapaSetLimits ( kapa3, &graphdata);587 KapaSetLimits (myKapa, &graphdata); 611 588 612 589 strcpy (graphdata.labels, "0210"); 613 KapaBox ( kapa3, &graphdata);614 KapaSendLabel ( kapa3, "inst mag", KAPA_LABEL_XP);615 KapaSendLabel ( kapa3, "M_yy| (pixels)", KAPA_LABEL_YM);590 KapaBox (myKapa, &graphdata); 591 KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_XP); 592 KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM); 616 593 617 594 graphdata.color = KapaColorByName ("black"); … … 619 596 graphdata.size = 0.3; 620 597 graphdata.style = 2; 621 KapaPrepPlot ( kapa3, nF, &graphdata);622 KapaPlotVector ( kapa3, nF, mFaint->data.F32, "x");623 KapaPlotVector ( kapa3, nF, yFaint->data.F32, "y");598 KapaPrepPlot (myKapa, nF, &graphdata); 599 KapaPlotVector (myKapa, nF, mFaint->data.F32, "x"); 600 KapaPlotVector (myKapa, nF, yFaint->data.F32, "y"); 624 601 625 602 graphdata.color = KapaColorByName ("red"); … … 627 604 graphdata.size = 0.5; 628 605 graphdata.style = 2; 629 KapaPrepPlot ( kapa3, nB, &graphdata);630 KapaPlotVector ( kapa3, nB, mBright->data.F32, "x");631 KapaPlotVector ( kapa3, nB, yBright->data.F32, "y");606 KapaPrepPlot (myKapa, nB, &graphdata); 607 KapaPlotVector (myKapa, nB, mBright->data.F32, "x"); 608 KapaPlotVector (myKapa, nB, yBright->data.F32, "y"); 632 609 633 610 // third section: MagMxx … … 637 614 section.y = 0.00; 638 615 section.name = psStringCopy ("MagMxx"); 639 KapaSetSection ( kapa3, §ion);616 KapaSetSection (myKapa, §ion); 640 617 psFree (section.name); 641 618 … … 645 622 graphdata.ymin = -7.9; 646 623 graphdata.ymax = -17.1; 647 KapaSetLimits ( kapa3, &graphdata);624 KapaSetLimits (myKapa, &graphdata); 648 625 649 626 strcpy (graphdata.labels, "2001"); 650 KapaBox ( kapa3, &graphdata);651 KapaSendLabel ( kapa3, "M_xx| (pixels)", KAPA_LABEL_XM);652 KapaSendLabel ( kapa3, "inst mag", KAPA_LABEL_YP);627 KapaBox (myKapa, &graphdata); 628 KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM); 629 KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_YP); 653 630 654 631 graphdata.color = KapaColorByName ("black"); … … 656 633 graphdata.size = 0.3; 657 634 graphdata.style = 2; 658 KapaPrepPlot ( kapa3, nF, &graphdata);659 KapaPlotVector ( kapa3, nF, xFaint->data.F32, "x");660 KapaPlotVector ( kapa3, nF, mFaint->data.F32, "y");635 KapaPrepPlot (myKapa, nF, &graphdata); 636 KapaPlotVector (myKapa, nF, xFaint->data.F32, "x"); 637 KapaPlotVector (myKapa, nF, mFaint->data.F32, "y"); 661 638 662 639 graphdata.color = KapaColorByName ("red"); … … 664 641 graphdata.size = 0.5; 665 642 graphdata.style = 2; 666 KapaPrepPlot ( kapa3, nB, &graphdata);667 KapaPlotVector ( kapa3, nB, xBright->data.F32, "x");668 KapaPlotVector ( kapa3, nB, mBright->data.F32, "y");643 KapaPrepPlot (myKapa, nB, &graphdata); 644 KapaPlotVector (myKapa, nB, xBright->data.F32, "x"); 645 KapaPlotVector (myKapa, nB, mBright->data.F32, "y"); 669 646 670 647 // draw N circles to outline the clumps 671 648 { 672 KapaSelectSection ( kapa3, "MxxMyy");649 KapaSelectSection (myKapa, "MxxMyy"); 673 650 674 651 // draw a circle centered on psfX,Y with size of the psf limit … … 686 663 graphdata.xmax = Xmax; 687 664 graphdata.ymax = Ymax; 688 KapaSetLimits ( kapa3, &graphdata);665 KapaSetLimits (myKapa, &graphdata); 689 666 690 667 for (int n = 0; n < nRegions; n++) { … … 705 682 yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY; 706 683 } 707 KapaPrepPlot ( kapa3, xLimit->n, &graphdata);708 KapaPlotVector ( kapa3, xLimit->n, xLimit->data.F32, "x");709 KapaPlotVector ( kapa3, yLimit->n, yLimit->data.F32, "y");684 KapaPrepPlot (myKapa, xLimit->n, &graphdata); 685 KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x"); 686 KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y"); 710 687 } 711 688 psFree (xLimit); 712 689 psFree (yLimit); 713 690 } 714 715 # if (0)716 // *** make a histogram of the source counts in the x and y directions717 psHistogram *nX = psHistogramAlloc (graphdata.xmin, graphdata.xmax, 50.0);718 psHistogram *nY = psHistogramAlloc (graphdata.ymin, graphdata.ymax, 50.0);719 psVectorHistogram (nX, xFaint, NULL, NULL, 0);720 psVectorHistogram (nY, yFaint, NULL, NULL, 0);721 psVector *dX = psVectorAlloc (nX->nums->n, PS_TYPE_F32);722 psVector *vX = psVectorAlloc (nX->nums->n, PS_TYPE_F32);723 psVector *dY = psVectorAlloc (nY->nums->n, PS_TYPE_F32);724 psVector *vY = psVectorAlloc (nY->nums->n, PS_TYPE_F32);725 for (int i = 0; i < nX->nums->n; i++) {726 dX->data.F32[i] = nX->nums->data.S32[i];727 vX->data.F32[i] = 0.5*(nX->bounds->data.F32[i] + nX->bounds->data.F32[i+1]);728 }729 for (int i = 0; i < nY->nums->n; i++) {730 dY->data.F32[i] = nY->nums->data.S32[i];731 vY->data.F32[i] = 0.5*(nY->bounds->data.F32[i] + nY->bounds->data.F32[i+1]);732 }733 734 graphdata.color = KapaColorByName ("black");735 graphdata.ptype = 0;736 graphdata.size = 0.0;737 graphdata.style = 0;738 KapaPrepPlot (kapa3, dX->n, &graphdata);739 KapaPlotVector (kapa3, dX->n, dX->data.F32, "x");740 KapaPlotVector (kapa3, vX->n, vX->data.F32, "y");741 742 psFree (nX);743 psFree (dX);744 psFree (vX);745 746 psFree (nY);747 psFree (dY);748 psFree (vY);749 # endif750 691 751 692 psFree (xBright); … … 756 697 psFree (mFaint); 757 698 758 // pause and wait for user input: 759 // continue, save (provide name), ?? 760 char key[10]; 761 fprintf (stdout, "[c]ontinue? "); 762 if (!fgets(key, 8, stdin)) { 763 psWarning("Unable to read option"); 764 } 699 pmVisualAskUser(NULL); 765 700 return true; 766 701 } 767 702 768 703 // assumes 'kapa' value is checked and set 769 bool psphotVisualShowRoughClass_Single ( psArray *sources, pmSourceType type, pmSourceMode mode, char *color) {704 bool psphotVisualShowRoughClass_Single (int myKapa, psArray *sources, pmSourceType type, pmSourceMode mode, char *color) { 770 705 771 706 int Noverlay; … … 802 737 overlay[Noverlay].dx = 2.0*axes.major; 803 738 overlay[Noverlay].dy = 2.0*axes.minor; 804 overlay[Noverlay].angle = -axes.theta * PS_DEG_RAD;739 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD; 805 740 overlay[Noverlay].text = NULL; 806 741 Noverlay ++; 807 742 } 808 743 809 KiiLoadOverlay ( kapa, overlay, Noverlay, color);744 KiiLoadOverlay (myKapa, overlay, Noverlay, color); 810 745 FREE (overlay); 811 746 … … 817 752 if (!pmVisualIsVisual()) return true; 818 753 819 if (kapa == -1) { 820 fprintf (stderr, "kapa not opened, skipping\n"); 821 return false; 822 } 823 824 KiiEraseOverlay (kapa, "yellow"); // moments 825 826 psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_STAR, 0, "red"); 827 psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_EXTENDED, 0, "blue"); 828 psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_DEFECT, 0, "blue"); 829 psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_SATURATED, 0, "red"); 830 psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_PSFSTAR, "yellow"); 831 psphotVisualShowRoughClass_Single (sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_SATSTAR, "green"); 832 833 // pause and wait for user input: 834 // continue, save (provide name), ?? 835 char key[10]; 754 int myKapa = psphotKapaChannel (1); 755 if (myKapa == -1) return false; 756 757 KiiEraseOverlay (myKapa, "yellow"); // moments 758 759 psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_STAR, 0, "red"); 760 psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_EXTENDED, 0, "blue"); 761 psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_DEFECT, 0, "blue"); 762 psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_SATURATED, 0, "red"); 763 psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_PSFSTAR, "yellow"); 764 psphotVisualShowRoughClass_Single (myKapa, sources, PM_SOURCE_TYPE_STAR, PM_SOURCE_MODE_SATSTAR, "green"); 765 836 766 fprintf (stdout, "red: STAR or SAT AREA; blue: EXTENDED or DEFECT; green: SATSTAR; yellow: PSFSTAR\n"); 837 fprintf (stdout, "[c]ontinue? "); 838 if (!fgets(key, 8, stdin)) { 839 psWarning("Unable to read option"); 840 } 767 pmVisualAskUser(NULL); 841 768 return true; 842 769 } … … 846 773 if (!pmVisualIsVisual()) return true; 847 774 848 if (kapa2 == -1) { 849 kapa2 = KapaOpenNamedSocket ("kapa", "psphot:psfstars"); 850 if (kapa2 == -1) { 851 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 852 pmVisualSetVisual(false); 853 return false; 854 } 855 } 775 int myKapa = psphotKapaChannel (3); 776 if (myKapa == -1) return false; 856 777 857 778 int DX = 64; … … 898 819 899 820 psImage *psfLogFlux = (psImage *) psUnaryOp (NULL, psfMosaic, "log"); 900 psphotVisualRangeImage ( kapa2, psfLogFlux, "psf_mosaic", 0, -2.0, 3.0);901 psphotVisualRangeImage ( kapa2, funMosaic, "psf_analytical", 1, -10.0, 100.0);902 psphotVisualRangeImage ( kapa2, resMosaic, "psf_residual", 2, -10.0, 100.0);821 psphotVisualRangeImage (myKapa, psfLogFlux, "psf_mosaic", 0, -2.0, 3.0); 822 psphotVisualRangeImage (myKapa, funMosaic, "psf_analytical", 1, -10.0, 100.0); 823 psphotVisualRangeImage (myKapa, resMosaic, "psf_residual", 2, -10.0, 100.0); 903 824 904 825 psFree (psfMosaic); … … 908 829 psFree (modelRef); 909 830 910 // pause and wait for user input: 911 // continue, save (provide name), ?? 912 char key[10]; 913 fprintf (stdout, "[c]ontinue? "); 914 if (!fgets(key, 8, stdin)) { 915 psWarning("Unable to read option"); 916 } 831 pmVisualAskUser(NULL); 917 832 return true; 918 833 } … … 924 839 if (!pmVisualIsVisual()) return true; 925 840 926 if (kapa2 == -1) { 927 kapa2 = KapaOpenNamedSocket ("kapa", "psphot:psfstars"); 928 if (kapa2 == -1) { 929 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 930 pmVisualSetVisual(false); 931 return false; 932 } 933 } 841 int myKapa = psphotKapaChannel (3); 842 if (myKapa == -1) return false; 934 843 935 844 // user-defined masks to test for good/bad pixels (build from recipe list if not yet set) … … 1017 926 if (Xo == 0) { 1018 927 // place source alone on this row 1019 psphotAddWithTest (source, true, maskVal); // replace source if subtracted 928 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 929 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1020 930 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true); 1021 931 1022 psphotSubWithTest (source, false, maskVal); // remove source (force) 932 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1023 933 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true); 1024 psphotSetState (source, false, maskVal); // reset source Add/Sub state to recorded 934 935 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1025 936 1026 937 Yo += DY; … … 1032 943 Xo = 0; 1033 944 1034 psphotAddWithTest (source, true, maskVal); // replace source if subtracted 945 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 946 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1035 947 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true); 1036 948 1037 psphotSubWithTest (source, false, maskVal); // remove source (force) 949 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1038 950 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true); 1039 psphotSetState (source, false, maskVal); // replace source (has been subtracted) 951 952 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1040 953 1041 954 Xo = DX; … … 1044 957 } else { 1045 958 // extend this row 1046 psphotAddWithTest (source, true, maskVal); // replace source if subtracted 959 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 960 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1047 961 psphotMosaicSubimage (outpos, source, Xo, Yo, DX, DY, true); 1048 962 1049 psphotSubWithTest (source, false, maskVal); // remove source (force) 963 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1050 964 psphotMosaicSubimage (outsub, source, Xo, Yo, DX, DY, true); 1051 psphotSetState (source, false, maskVal); // replace source (has been subtracted) 965 if (!subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1052 966 1053 967 Xo += DX; … … 1056 970 } 1057 971 1058 psphotVisualRangeImage (kapa2, outpos, "psfpos", 0, -0.05, 0.95); 1059 psphotVisualRangeImage (kapa2, outsub, "psfsub", 1, -0.05, 0.95); 1060 1061 // pause and wait for user input: 1062 // continue, save (provide name), ?? 1063 char key[10]; 1064 fprintf (stdout, "[c]ontinue? "); 1065 if (!fgets(key, 8, stdin)) { 1066 psWarning("Unable to read option"); 1067 } 1068 972 psphotVisualRangeImage (myKapa, outpos, "psfpos", 0, -0.05, 0.95); 973 psphotVisualRangeImage (myKapa, outsub, "psfsub", 1, -0.05, 0.95); 974 975 pmVisualAskUser(NULL); 1069 976 psFree (outpos); 1070 977 psFree (outsub); … … 1084 991 if (!pmVisualIsVisual()) return true; 1085 992 1086 if (kapa2 == -1) { 1087 kapa2 = KapaOpenNamedSocket ("kapa", "psphot:images"); 1088 if (kapa2 == -1) { 1089 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 1090 pmVisualSetVisual(false); 1091 return false; 1092 } 1093 } 993 int myKapa = psphotKapaChannel (3); 994 if (myKapa == -1) return false; 1094 995 1095 996 // user-defined masks to test for good/bad pixels (build from recipe list if not yet set) … … 1119 1020 pmSource *source = sources->data[i]; 1120 1021 1121 bool keep = false; 1122 keep |= (source->mode & PM_SOURCE_MODE_SATSTAR);1123 if ( !keep) continue;1022 // only show "real" saturated stars (not defects) 1023 if (!(source->mode & PM_SOURCE_MODE_SATSTAR)) continue;; 1024 if (source->mode & PM_SOURCE_MODE_DEFECT) continue;; 1124 1025 1125 1026 // how does this subimage get placed into the output image? … … 1164 1065 pmSource *source = sources->data[i]; 1165 1066 1166 bool keep = false; 1167 if (source->mode & PM_SOURCE_MODE_SATSTAR) { 1168 nSAT ++; 1169 keep = true; 1170 } 1171 if (!keep) continue; 1067 // only show "real" saturated stars (not defects) 1068 if (!(source->mode & PM_SOURCE_MODE_SATSTAR)) continue;; 1069 if (source->mode & PM_SOURCE_MODE_DEFECT) continue;; 1070 nSAT ++; 1172 1071 1173 1072 if (Xo + DX > NX) { … … 1175 1074 if (Xo == 0) { 1176 1075 // place source alone on this row 1177 psphotAddWithTest (source, true, maskVal); // replace source if subtracted 1076 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 1077 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1178 1078 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false); 1179 psphotSetState (source, true, maskVal); // reset source Add/Sub state to recorded 1079 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1180 1080 1181 1081 Yo += DY; … … 1186 1086 Yo += dY; 1187 1087 Xo = 0; 1188 psphotAddWithTest (source, true, maskVal); // replace source if subtracted 1088 1089 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 1090 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1189 1091 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false); 1190 psphotSetState (source, true, maskVal); // replace source (has been subtracted) 1092 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1191 1093 1192 1094 Xo = DX; … … 1195 1097 } else { 1196 1098 // extend this row 1197 psphotAddWithTest (source, true, maskVal); // replace source if subtracted 1099 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 1100 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1198 1101 psphotMosaicSubimage (outsat, source, Xo, Yo, DX, DY, false); 1199 psphotSetState (source, true, maskVal); // replace source (has been subtracted) 1102 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1200 1103 1201 1104 Xo += DX; … … 1204 1107 } 1205 1108 1206 psphotVisualScaleImage (kapa2, outsat, "satstar", 2); 1207 1208 // pause and wait for user input: 1209 // continue, save (provide name), ?? 1210 char key[10]; 1211 fprintf (stdout, "[c]ontinue? "); 1212 if (!fgets(key, 8, stdin)) { 1213 psWarning("Unable to read option"); 1214 } 1215 1109 psphotVisualScaleImage (myKapa, outsat, "satstar", 2); 1110 1111 pmVisualAskUser(NULL); 1216 1112 psFree (outsat); 1217 1113 return true; … … 1222 1118 Graphdata graphdata; 1223 1119 1224 bool s tate = !(source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED);1225 psphotAddWithTest (source, true, maskVal); // replace source if subtracted1120 bool subtracted = (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED); 1121 if (subtracted) pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal); 1226 1122 1227 1123 int nPts = source->pixels->numRows * source->pixels->numCols; … … 1240 1136 for (int ix = 0; ix < source->pixels->numCols; ix++) { 1241 1137 if (source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix]) { 1242 //rb->data.F32[nb] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ;1243 rb->data.F32[nb] = hypot (ix - Xo, iy - Yo) ;1138 rb->data.F32[nb] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ; 1139 // rb->data.F32[nb] = hypot (ix - Xo, iy - Yo) ; 1244 1140 Rb->data.F32[nb] = log10(rb->data.F32[nb]); 1245 1141 fb->data.F32[nb] = log10(source->pixels->data.F32[iy][ix]); 1246 1142 nb++; 1247 1143 } else { 1248 //rg->data.F32[ng] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ;1249 rg->data.F32[ng] = hypot (ix - Xo, iy - Yo) ;1144 rg->data.F32[ng] = hypot (ix + 0.5 - Xo, iy + 0.5 - Yo) ; 1145 // rg->data.F32[ng] = hypot (ix - Xo, iy - Yo) ; 1250 1146 Rg->data.F32[ng] = log10(rg->data.F32[ng]); 1251 1147 fg->data.F32[ng] = log10(source->pixels->data.F32[iy][ix]); … … 1256 1152 1257 1153 // reset source Add/Sub state to recorded 1258 psphotSetState (source, state, maskVal);1154 if (subtracted) pmSourceSub (source, PM_MODEL_OP_FULL, maskVal); 1259 1155 1260 1156 KapaInitGraph (&graphdata); … … 1337 1233 if (!pmVisualIsVisual()) return true; 1338 1234 1339 if (kapa3 == -1) { 1340 kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots"); 1341 if (kapa3 == -1) { 1342 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 1343 pmVisualSetVisual(false); 1344 return false; 1345 } 1346 } 1235 int myKapa = psphotKapaChannel (2); 1236 if (myKapa == -1) return false; 1347 1237 1348 1238 // user-defined masks to test for good/bad pixels (build from recipe list if not yet set) … … 1351 1241 assert (maskVal); 1352 1242 1353 KapaClearPlots ( kapa3);1243 KapaClearPlots (myKapa); 1354 1244 // first section : mag vs CR nSigma 1355 1245 section.dx = 1.0; … … 1359 1249 section.name = NULL; 1360 1250 psStringAppend (§ion.name, "linlog"); 1361 KapaSetSection ( kapa3, §ion);1251 KapaSetSection (myKapa, §ion); 1362 1252 psFree (section.name); 1363 1253 … … 1369 1259 section.name = NULL; 1370 1260 psStringAppend (§ion.name, "loglog"); 1371 KapaSetSection ( kapa3, §ion);1261 KapaSetSection (myKapa, §ion); 1372 1262 psFree (section.name); 1373 1263 … … 1378 1268 if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue; 1379 1269 1380 psphotVisualPlotRadialProfile ( kapa3, source, maskVal);1270 psphotVisualPlotRadialProfile (myKapa, source, maskVal); 1381 1271 1382 1272 // pause and wait for user input: … … 1388 1278 } 1389 1279 if (key[0] == 'e') { 1390 KapaClearPlots ( kapa3);1280 KapaClearPlots (myKapa); 1391 1281 } 1392 1282 if (key[0] == 's') { … … 1407 1297 psEllipseAxes axes; 1408 1298 1299 // XXX skip this for now: it is not very clear 1300 return true; 1301 1409 1302 if (!pmVisualIsVisual()) return true; 1410 1303 1411 if (kapa == -1) { 1412 fprintf (stderr, "kapa not opened, skipping\n"); 1413 return false; 1414 } 1304 int myKapa = psphotKapaChannel (1); 1305 if (myKapa == -1) return false; 1415 1306 1416 1307 // note: this uses the Ohana allocation tools: … … 1485 1376 } 1486 1377 1487 KiiLoadOverlay ( kapa, overlayE, NoverlayE, "red");1488 KiiLoadOverlay ( kapa, overlayO, NoverlayO, "yellow");1378 KiiLoadOverlay (myKapa, overlayE, NoverlayE, "red"); 1379 KiiLoadOverlay (myKapa, overlayO, NoverlayO, "yellow"); 1489 1380 FREE (overlayE); 1490 1381 FREE (overlayO); 1491 1382 1492 // pause and wait for user input:1493 // continue, save (provide name), ??1494 char key[10];1495 1383 fprintf (stdout, "even bits (0x0001, 0x0004, ... : red\n"); 1496 1384 fprintf (stdout, "odd bits (0x0002, 0x0008, ... : yellow\n"); 1497 fprintf (stdout, "[c]ontinue? "); 1498 if (!fgets(key, 8, stdin)) { 1499 psWarning("Unable to read option"); 1500 } 1501 1502 return true; 1503 } 1504 1505 bool psphotVisualShowSourceSize (pmReadout *readout, psArray *sources) { 1506 1507 int Noverlay, NOVERLAY; 1385 pmVisualAskUser(NULL); 1386 1387 return true; 1388 } 1389 1390 bool psphotVisualShowSourceSize_Single (int myKapa, psArray *sources, pmSourceMode mode, bool keep, float scale, char *color) { 1391 1392 int Noverlay; 1508 1393 KiiOverlay *overlay; 1509 1394 1510 if (!pmVisualIsVisual()) return true; 1511 1512 if (kapa == -1) { 1513 fprintf (stderr, "kapa not opened, skipping\n"); 1514 return false; 1515 } 1395 psEllipseMoments emoments; 1396 psEllipseAxes axes; 1516 1397 1517 1398 // note: this uses the Ohana allocation tools: 1399 ALLOCATE (overlay, KiiOverlay, sources->n); 1400 1518 1401 Noverlay = 0; 1519 NOVERLAY = 100;1520 ALLOCATE (overlay, KiiOverlay, sources->n);1521 1522 // mark CRs with red boxes1523 1402 for (int i = 0; i < sources->n; i++) { 1524 1403 … … 1526 1405 if (source == NULL) continue; 1527 1406 1528 if (!(source->mode & PM_SOURCE_MODE_CR_LIMIT)) continue; 1529 1530 overlay[Noverlay].type = KII_OVERLAY_BOX; 1531 overlay[Noverlay].x = source->peak->xf; 1532 overlay[Noverlay].y = source->peak->yf; 1533 1534 overlay[Noverlay].dx = 4; 1535 overlay[Noverlay].dy = 4; 1536 overlay[Noverlay].angle = 0; 1407 // if (source->type != type) continue; 1408 if (mode) { 1409 if (keep) { 1410 if (!(source->mode & mode)) continue; 1411 } else { 1412 if (source->mode & mode) continue; 1413 } 1414 } 1415 1416 pmMoments *moments = source->moments; 1417 if (moments == NULL) continue; 1418 1419 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 1420 overlay[Noverlay].x = moments->Mx; 1421 overlay[Noverlay].y = moments->My; 1422 1423 emoments.x2 = moments->Mxx; 1424 emoments.y2 = moments->Myy; 1425 emoments.xy = moments->Mxy; 1426 1427 axes = psEllipseMomentsToAxes (emoments, 20.0); 1428 1429 overlay[Noverlay].dx = scale*2.0*axes.major; 1430 overlay[Noverlay].dy = scale*2.0*axes.minor; 1431 overlay[Noverlay].angle = axes.theta * PS_DEG_RAD; 1537 1432 overlay[Noverlay].text = NULL; 1538 1433 Noverlay ++; 1539 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 1540 } 1541 KiiLoadOverlay (kapa, overlay, Noverlay, "red"); 1542 1543 1544 Noverlay = 0; 1545 for (int i = 0; i < sources->n; i++) { 1546 1547 pmSource *source = sources->data[i]; 1548 if (source == NULL) continue; 1549 1550 // mark EXTs with yellow circles 1551 if (!(source->mode & PM_SOURCE_MODE_EXT_LIMIT)) continue; 1552 1553 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 1554 overlay[Noverlay].x = source->peak->xf; 1555 overlay[Noverlay].y = source->peak->yf; 1556 1557 overlay[Noverlay].dx = 10; 1558 overlay[Noverlay].dy = 10; 1559 overlay[Noverlay].angle = 0; 1560 overlay[Noverlay].text = NULL; 1561 Noverlay ++; 1562 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 1563 } 1564 1565 KiiLoadOverlay (kapa, overlay, Noverlay, "blue"); 1434 } 1435 1436 KiiLoadOverlay (myKapa, overlay, Noverlay, color); 1566 1437 FREE (overlay); 1567 1438 1568 psphotVisualShowMask (kapa, readout->mask, "mask", 2); 1569 1570 // pause and wait for user input: 1571 // continue, save (provide name), ?? 1572 char key[10]; 1573 fprintf (stdout, "CR: 4pix red BOX; EXT: 10pix blue circle\n"); 1574 fprintf (stdout, "[c]ontinue? "); 1575 if (!fgets(key, 8, stdin)) { 1576 psWarning("Unable to read option"); 1577 } 1578 1579 return true; 1580 } 1581 1582 bool psphotVisualPlotSourceSize (psArray *sources) { 1583 1439 return true; 1440 } 1441 1442 bool psphotVisualShowSourceSize (pmReadout *readout, psArray *sources) { 1443 1444 if (!pmVisualIsVisual()) return true; 1445 1446 int myKapa = psphotKapaChannel (1); 1447 if (myKapa == -1) return false; 1448 1449 KiiEraseOverlay (myKapa, "red"); 1450 KiiEraseOverlay (myKapa, "blue"); 1451 KiiEraseOverlay (myKapa, "green"); 1452 KiiEraseOverlay (myKapa, "yellow"); 1453 1454 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"); 1455 psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_EXT_LIMIT, 1, 1.0, "blue"); 1456 psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_CR_LIMIT, 1, 1.0, "red"); 1457 psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_DEFECT, 1, 2.0, "red"); 1458 psphotVisualShowSourceSize_Single (myKapa, sources, PM_SOURCE_MODE_SATSTAR, 1, 1.0, "yellow"); 1459 1460 fprintf (stdout, "red: CR; blue: EXTENDED; green: PSF-like; yellow: SATSTAR\n"); 1461 pmVisualAskUser(NULL); 1462 return true; 1463 } 1464 1465 bool psphotVisualPlotSourceSize (psMetadata *recipe, psArray *sources) { 1466 1467 bool status; 1584 1468 Graphdata graphdata; 1585 1469 KapaSection section; … … 1587 1471 if (!pmVisualIsVisual()) return true; 1588 1472 1589 if (kapa3 == -1) { 1590 kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots"); 1591 if (kapa3 == -1) { 1592 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 1593 pmVisualSetVisual(false); 1594 return false; 1473 int myKapa = psphotKapaChannel (2); 1474 if (myKapa == -1) return false; 1475 1476 KapaClearPlots (myKapa); 1477 KapaInitGraph (&graphdata); 1478 KapaSetFont (myKapa, "courier", 14); 1479 1480 // select the max psfX,Y values for the plot limits 1481 float Xmin = 1000.0, Xmax = 0.0; 1482 float Ymin = 1000.0, Ymax = 0.0; 1483 { 1484 int nRegions = psMetadataLookupS32 (&status, recipe, "PSF.CLUMP.NREGIONS"); 1485 for (int n = 0; n < nRegions; n++) { 1486 1487 char regionName[64]; 1488 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n); 1489 psMetadata *regionMD = psMetadataLookupPtr (&status, recipe, regionName); 1490 1491 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); 1492 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); 1493 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); 1494 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); 1495 1496 float X0 = psfX - 10.0*psfdX; 1497 float X1 = psfX + 10.0*psfdX; 1498 float Y0 = psfY - 10.0*psfdY; 1499 float Y1 = psfY + 10.0*psfdY; 1500 1501 if (isfinite(X0)) { Xmin = PS_MIN(Xmin, X0); } 1502 if (isfinite(X1)) { Xmax = PS_MAX(Xmax, X1); } 1503 if (isfinite(Y0)) { Ymin = PS_MIN(Ymin, Y0); } 1504 if (isfinite(Y1)) { Ymax = PS_MAX(Ymax, Y1); } 1595 1505 } 1596 1506 } 1597 1598 KapaClearPlots (kapa3); 1507 Xmin = PS_MAX(Xmin, -0.1); 1508 Ymin = PS_MAX(Ymin, -0.1); 1509 1510 // storage vectors for data to be plotted 1511 psVector *xSAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1512 psVector *ySAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1513 psVector *mSAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1514 psVector *sSAT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1515 1516 psVector *xPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1517 psVector *yPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1518 psVector *mPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1519 psVector *sPSF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1520 1521 psVector *xEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1522 psVector *yEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1523 psVector *mEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1524 psVector *sEXT = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1525 1526 psVector *xDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1527 psVector *yDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1528 psVector *mDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1529 psVector *sDEF = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1530 1531 psVector *xCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1532 psVector *yCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1533 psVector *mCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1534 psVector *sCR = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1535 1536 // construct the vectors 1537 int nSAT = 0; 1538 int nEXT = 0; 1539 int nPSF = 0; 1540 int nDEF = 0; 1541 int nCR = 0; 1542 for (int i = 0; i < sources->n; i++) { 1543 pmSource *source = sources->data[i]; 1544 if (source->moments == NULL) continue; 1545 1546 if (source->mode & PM_SOURCE_MODE_CR_LIMIT) { 1547 xCR->data.F32[nCR] = source->moments->Mxx; 1548 yCR->data.F32[nCR] = source->moments->Myy; 1549 mCR->data.F32[nCR] = -2.5*log10(source->moments->Sum); 1550 sCR->data.F32[nCR] = source->extNsigma; 1551 nCR++; 1552 } 1553 if (source->mode & PM_SOURCE_MODE_SATSTAR) { 1554 xSAT->data.F32[nSAT] = source->moments->Mxx; 1555 ySAT->data.F32[nSAT] = source->moments->Myy; 1556 mSAT->data.F32[nSAT] = -2.5*log10(source->moments->Sum); 1557 sSAT->data.F32[nSAT] = source->extNsigma; 1558 nSAT++; 1559 } 1560 if (source->mode & PM_SOURCE_MODE_EXT_LIMIT) { 1561 xEXT->data.F32[nEXT] = source->moments->Mxx; 1562 yEXT->data.F32[nEXT] = source->moments->Myy; 1563 mEXT->data.F32[nEXT] = -2.5*log10(source->moments->Sum); 1564 sEXT->data.F32[nEXT] = source->extNsigma; 1565 nEXT++; 1566 continue; 1567 } 1568 if (source->mode & PM_SOURCE_MODE_DEFECT) { 1569 xDEF->data.F32[nDEF] = source->moments->Mxx; 1570 yDEF->data.F32[nDEF] = source->moments->Myy; 1571 mDEF->data.F32[nDEF] = -2.5*log10(source->moments->Sum); 1572 sDEF->data.F32[nDEF] = source->extNsigma; 1573 nDEF++; 1574 continue; 1575 } 1576 if ((source->mode & PM_SOURCE_MODE_CR_LIMIT) || (source->mode & PM_SOURCE_MODE_SATSTAR)) { 1577 continue; 1578 } 1579 xPSF->data.F32[nPSF] = source->moments->Mxx; 1580 yPSF->data.F32[nPSF] = source->moments->Myy; 1581 mPSF->data.F32[nPSF] = -2.5*log10(source->moments->Sum); 1582 sPSF->data.F32[nPSF] = source->extNsigma; 1583 nPSF++; 1584 } 1585 xSAT->n = nSAT; 1586 ySAT->n = nSAT; 1587 mSAT->n = nSAT; 1588 sSAT->n = nSAT; 1589 1590 xPSF->n = nPSF; 1591 yPSF->n = nPSF; 1592 mPSF->n = nPSF; 1593 sPSF->n = nPSF; 1594 1595 xEXT->n = nEXT; 1596 yEXT->n = nEXT; 1597 mEXT->n = nEXT; 1598 sEXT->n = nEXT; 1599 1600 xCR->n = nCR; 1601 yCR->n = nCR; 1602 mCR->n = nCR; 1603 sCR->n = nCR; 1604 1605 xDEF->n = nDEF; 1606 yDEF->n = nDEF; 1607 mDEF->n = nDEF; 1608 sDEF->n = nDEF; 1609 1610 // four sections: MxxMyy, MagMxx, MagMyy, MagSigma 1611 1612 // first section: MxxMyy 1613 section.dx = 0.75; 1614 section.dy = 0.60; 1615 section.x = 0.00; 1616 section.y = 0.00; 1617 section.name = psStringCopy ("MxxMyy"); 1618 KapaSetSection (myKapa, §ion); 1619 psFree (section.name); 1620 1621 graphdata.color = KapaColorByName ("black"); 1622 graphdata.xmin = Xmin; 1623 graphdata.ymin = Ymin; 1624 graphdata.xmax = Xmax; 1625 graphdata.ymax = Ymax; 1626 KapaSetLimits (myKapa, &graphdata); 1627 1628 KapaBox (myKapa, &graphdata); 1629 KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM); 1630 KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM); 1631 1632 graphdata.color = KapaColorByName ("black"); 1633 graphdata.ptype = 0; 1634 graphdata.size = 0.5; 1635 graphdata.style = 2; 1636 KapaPrepPlot (myKapa, nPSF, &graphdata); 1637 KapaPlotVector (myKapa, nPSF, xPSF->data.F32, "x"); 1638 KapaPlotVector (myKapa, nPSF, yPSF->data.F32, "y"); 1639 1640 graphdata.color = KapaColorByName ("blue"); 1641 graphdata.ptype = 0; 1642 graphdata.size = 0.5; 1643 graphdata.style = 2; 1644 KapaPrepPlot (myKapa, nEXT, &graphdata); 1645 KapaPlotVector (myKapa, nEXT, xEXT->data.F32, "x"); 1646 KapaPlotVector (myKapa, nEXT, yEXT->data.F32, "y"); 1647 1648 graphdata.color = KapaColorByName ("red"); 1649 graphdata.ptype = 0; 1650 graphdata.size = 0.5; 1651 graphdata.style = 2; 1652 KapaPrepPlot (myKapa, nDEF, &graphdata); 1653 KapaPlotVector (myKapa, nDEF, xDEF->data.F32, "x"); 1654 KapaPlotVector (myKapa, nDEF, yDEF->data.F32, "y"); 1655 1656 graphdata.color = KapaColorByName ("red"); 1657 graphdata.ptype = 7; 1658 graphdata.size = 1.0; 1659 graphdata.style = 2; 1660 KapaPrepPlot (myKapa, nCR, &graphdata); 1661 KapaPlotVector (myKapa, nCR, xCR->data.F32, "x"); 1662 KapaPlotVector (myKapa, nCR, yCR->data.F32, "y"); 1663 1664 graphdata.color = KapaColorByName ("blue"); 1665 graphdata.ptype = 7; 1666 graphdata.size = 1.0; 1667 graphdata.style = 2; 1668 KapaPrepPlot (myKapa, nSAT, &graphdata); 1669 KapaPlotVector (myKapa, nSAT, xSAT->data.F32, "x"); 1670 KapaPlotVector (myKapa, nSAT, ySAT->data.F32, "y"); 1671 1672 // second section: MagMyy 1673 section.dx = 0.75; 1674 section.dy = 0.20; 1675 section.x = 0.00; 1676 section.y = 0.80; 1677 section.name = psStringCopy ("MagMyy"); 1678 KapaSetSection (myKapa, §ion); 1679 psFree (section.name); 1680 1681 graphdata.color = KapaColorByName ("black"); 1682 graphdata.xmin = -17.1; 1683 graphdata.xmax = -7.9; 1684 graphdata.ymin = Ymin; 1685 graphdata.ymax = Ymax; 1686 KapaSetLimits (myKapa, &graphdata); 1687 1688 strcpy (graphdata.labels, "0210"); 1689 KapaBox (myKapa, &graphdata); 1690 KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_XP); 1691 KapaSendLabel (myKapa, "M_yy| (pixels)", KAPA_LABEL_YM); 1692 1693 graphdata.color = KapaColorByName ("black"); 1694 graphdata.ptype = 0; 1695 graphdata.size = 0.5; 1696 graphdata.style = 2; 1697 KapaPrepPlot (myKapa, nPSF, &graphdata); 1698 KapaPlotVector (myKapa, nPSF, mPSF->data.F32, "x"); 1699 KapaPlotVector (myKapa, nPSF, yPSF->data.F32, "y"); 1700 1701 graphdata.color = KapaColorByName ("blue"); 1702 graphdata.ptype = 0; 1703 graphdata.size = 0.5; 1704 graphdata.style = 2; 1705 KapaPrepPlot (myKapa, nEXT, &graphdata); 1706 KapaPlotVector (myKapa, nEXT, mEXT->data.F32, "x"); 1707 KapaPlotVector (myKapa, nEXT, yEXT->data.F32, "y"); 1708 1709 graphdata.color = KapaColorByName ("red"); 1710 graphdata.ptype = 0; 1711 graphdata.size = 0.5; 1712 graphdata.style = 2; 1713 KapaPrepPlot (myKapa, nDEF, &graphdata); 1714 KapaPlotVector (myKapa, nDEF, mDEF->data.F32, "x"); 1715 KapaPlotVector (myKapa, nDEF, yDEF->data.F32, "y"); 1716 1717 graphdata.color = KapaColorByName ("red"); 1718 graphdata.ptype = 7; 1719 graphdata.size = 1.0; 1720 graphdata.style = 2; 1721 KapaPrepPlot (myKapa, nCR, &graphdata); 1722 KapaPlotVector (myKapa, nCR, mCR->data.F32, "x"); 1723 KapaPlotVector (myKapa, nCR, yCR->data.F32, "y"); 1724 1725 graphdata.color = KapaColorByName ("blue"); 1726 graphdata.ptype = 7; 1727 graphdata.size = 1.0; 1728 graphdata.style = 2; 1729 KapaPrepPlot (myKapa, nSAT, &graphdata); 1730 KapaPlotVector (myKapa, nSAT, mSAT->data.F32, "x"); 1731 KapaPlotVector (myKapa, nSAT, ySAT->data.F32, "y"); 1732 1733 // third section: MagMxx 1734 section.dx = 0.25; 1735 section.dy = 0.60; 1736 section.x = 0.80; 1737 section.y = 0.00; 1738 section.name = psStringCopy ("MagMxx"); 1739 KapaSetSection (myKapa, §ion); 1740 psFree (section.name); 1741 1742 graphdata.color = KapaColorByName ("black"); 1743 graphdata.xmin = Xmin; 1744 graphdata.xmax = Xmax; 1745 graphdata.ymin = -7.9; 1746 graphdata.ymax = -17.1; 1747 KapaSetLimits (myKapa, &graphdata); 1748 1749 strcpy (graphdata.labels, "2001"); 1750 KapaBox (myKapa, &graphdata); 1751 KapaSendLabel (myKapa, "M_xx| (pixels)", KAPA_LABEL_XM); 1752 KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_YP); 1753 1754 graphdata.color = KapaColorByName ("black"); 1755 graphdata.ptype = 0; 1756 graphdata.size = 0.5; 1757 graphdata.style = 2; 1758 KapaPrepPlot (myKapa, nPSF, &graphdata); 1759 KapaPlotVector (myKapa, nPSF, xPSF->data.F32, "x"); 1760 KapaPlotVector (myKapa, nPSF, mPSF->data.F32, "y"); 1761 1762 graphdata.color = KapaColorByName ("blue"); 1763 graphdata.ptype = 0; 1764 graphdata.size = 0.5; 1765 graphdata.style = 2; 1766 KapaPrepPlot (myKapa, nEXT, &graphdata); 1767 KapaPlotVector (myKapa, nEXT, xEXT->data.F32, "x"); 1768 KapaPlotVector (myKapa, nEXT, mEXT->data.F32, "y"); 1769 1770 graphdata.color = KapaColorByName ("red"); 1771 graphdata.ptype = 0; 1772 graphdata.size = 0.5; 1773 graphdata.style = 2; 1774 KapaPrepPlot (myKapa, nDEF, &graphdata); 1775 KapaPlotVector (myKapa, nDEF, xDEF->data.F32, "x"); 1776 KapaPlotVector (myKapa, nDEF, mDEF->data.F32, "y"); 1777 1778 graphdata.color = KapaColorByName ("red"); 1779 graphdata.ptype = 7; 1780 graphdata.size = 1.0; 1781 graphdata.style = 2; 1782 KapaPrepPlot (myKapa, nCR, &graphdata); 1783 KapaPlotVector (myKapa, nCR, xCR->data.F32, "x"); 1784 KapaPlotVector (myKapa, nCR, mCR->data.F32, "y"); 1785 1786 graphdata.color = KapaColorByName ("blue"); 1787 graphdata.ptype = 7; 1788 graphdata.size = 1.0; 1789 graphdata.style = 2; 1790 KapaPrepPlot (myKapa, nSAT, &graphdata); 1791 KapaPlotVector (myKapa, nSAT, xSAT->data.F32, "x"); 1792 KapaPlotVector (myKapa, nSAT, mSAT->data.F32, "y"); 1793 1794 // fourth section: MagSigma 1795 section.dx = 0.75; 1796 section.dy = 0.15; 1797 section.x = 0.00; 1798 section.y = 0.65; 1799 section.name = psStringCopy ("MagSigma"); 1800 KapaSetSection (myKapa, §ion); 1801 psFree (section.name); 1802 1803 graphdata.color = KapaColorByName ("black"); 1804 graphdata.xmax = -7.9; 1805 graphdata.xmin = -17.1; 1806 graphdata.ymin = -20.1; 1807 graphdata.ymax = +20.1; 1808 KapaSetLimits (myKapa, &graphdata); 1809 1810 strcpy (graphdata.labels, "0100"); 1811 KapaBox (myKapa, &graphdata); 1812 // KapaSendLabel (myKapa, "inst mag", KAPA_LABEL_XM); 1813 KapaSendLabel (myKapa, "EXT&ss&c", KAPA_LABEL_YM); 1814 1815 graphdata.color = KapaColorByName ("black"); 1816 graphdata.ptype = 0; 1817 graphdata.size = 0.5; 1818 graphdata.style = 2; 1819 KapaPrepPlot (myKapa, nPSF, &graphdata); 1820 KapaPlotVector (myKapa, nPSF, mPSF->data.F32, "x"); 1821 KapaPlotVector (myKapa, nPSF, sPSF->data.F32, "y"); 1822 1823 graphdata.color = KapaColorByName ("blue"); 1824 graphdata.ptype = 0; 1825 graphdata.size = 0.5; 1826 graphdata.style = 2; 1827 KapaPrepPlot (myKapa, nEXT, &graphdata); 1828 KapaPlotVector (myKapa, nEXT, mEXT->data.F32, "x"); 1829 KapaPlotVector (myKapa, nEXT, sEXT->data.F32, "y"); 1830 1831 graphdata.color = KapaColorByName ("red"); 1832 graphdata.ptype = 0; 1833 graphdata.size = 0.5; 1834 graphdata.style = 2; 1835 KapaPrepPlot (myKapa, nDEF, &graphdata); 1836 KapaPlotVector (myKapa, nDEF, mDEF->data.F32, "x"); 1837 KapaPlotVector (myKapa, nDEF, sDEF->data.F32, "y"); 1838 1839 graphdata.color = KapaColorByName ("red"); 1840 graphdata.ptype = 7; 1841 graphdata.size = 1.0; 1842 graphdata.style = 2; 1843 KapaPrepPlot (myKapa, nCR, &graphdata); 1844 KapaPlotVector (myKapa, nCR, mCR->data.F32, "x"); 1845 KapaPlotVector (myKapa, nCR, sCR->data.F32, "y"); 1846 1847 graphdata.color = KapaColorByName ("blue"); 1848 graphdata.ptype = 7; 1849 graphdata.size = 1.0; 1850 graphdata.style = 2; 1851 KapaPrepPlot (myKapa, nSAT, &graphdata); 1852 KapaPlotVector (myKapa, nSAT, mSAT->data.F32, "x"); 1853 KapaPlotVector (myKapa, nSAT, sSAT->data.F32, "y"); 1854 1855 // draw N circles to outline the clumps 1856 { 1857 KapaSelectSection (myKapa, "MxxMyy"); 1858 1859 // draw a circle centered on psfX,Y with size of the psf limit 1860 psVector *xLimit = psVectorAlloc (120, PS_TYPE_F32); 1861 psVector *yLimit = psVectorAlloc (120, PS_TYPE_F32); 1862 1863 int nRegions = psMetadataLookupS32 (&status, recipe, "PSF.CLUMP.NREGIONS"); 1864 float PSF_CLUMP_NSIGMA = psMetadataLookupF32 (&status, recipe, "PSF_CLUMP_NSIGMA"); 1865 1866 graphdata.color = KapaColorByName ("blue"); 1867 graphdata.style = 0; 1868 1869 graphdata.xmin = Xmin; 1870 graphdata.ymin = Ymin; 1871 graphdata.xmax = Xmax; 1872 graphdata.ymax = Ymax; 1873 KapaSetLimits (myKapa, &graphdata); 1874 1875 for (int n = 0; n < nRegions; n++) { 1876 1877 char regionName[64]; 1878 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", n); 1879 psMetadata *regionMD = psMetadataLookupPtr (&status, recipe, regionName); 1880 1881 float psfX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); 1882 float psfY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); 1883 float psfdX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); 1884 float psfdY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); 1885 float Rx = psfdX * PSF_CLUMP_NSIGMA; 1886 float Ry = psfdY * PSF_CLUMP_NSIGMA; 1887 1888 for (int i = 0; i < xLimit->n; i++) { 1889 xLimit->data.F32[i] = Rx*cos(i*2.0*M_PI/120.0) + psfX; 1890 yLimit->data.F32[i] = Ry*sin(i*2.0*M_PI/120.0) + psfY; 1891 } 1892 KapaPrepPlot (myKapa, xLimit->n, &graphdata); 1893 KapaPlotVector (myKapa, xLimit->n, xLimit->data.F32, "x"); 1894 KapaPlotVector (myKapa, yLimit->n, yLimit->data.F32, "y"); 1895 } 1896 psFree (xLimit); 1897 psFree (yLimit); 1898 } 1899 1900 psFree (xSAT); 1901 psFree (ySAT); 1902 psFree (mSAT); 1903 1904 psFree (xEXT); 1905 psFree (yEXT); 1906 psFree (mEXT); 1907 1908 psFree (xPSF); 1909 psFree (yPSF); 1910 psFree (mPSF); 1911 1912 psFree (xDEF); 1913 psFree (yDEF); 1914 psFree (mDEF); 1915 1916 psFree (xCR); 1917 psFree (yCR); 1918 psFree (mCR); 1919 1920 pmVisualAskUser(NULL); 1921 return true; 1922 } 1923 1924 bool psphotVisualShowResidualImage (pmReadout *readout) { 1925 1926 if (!pmVisualIsVisual()) return true; 1927 1928 int myKapa = psphotKapaChannel (1); 1929 if (myKapa == -1) return false; 1930 1931 psphotVisualScaleImage (myKapa, readout->image, "resid", 1); 1932 1933 pmVisualAskUser(NULL); 1934 return true; 1935 } 1936 1937 bool psphotVisualPlotApResid (psArray *sources, float mean, float error) { 1938 1939 Graphdata graphdata; 1940 float lineX[2], lineY[2]; 1941 1942 if (!pmVisualIsVisual()) return true; 1943 1944 int myKapa = psphotKapaChannel (2); 1945 if (myKapa == -1) return false; 1946 1947 KapaClearPlots (myKapa); 1599 1948 KapaInitGraph (&graphdata); 1600 1601 // first section : mag vs CR nSigma1602 section.dx = 1.0;1603 section.dy = 0.5;1604 section.x = 0.0;1605 section.y = 0.0;1606 section.name = NULL;1607 psStringAppend (§ion.name, "a1");1608 KapaSetSection (kapa3, §ion);1609 psFree (section.name);1610 1949 1611 1950 psVector *x = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1612 1951 psVector *y = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1613 1614 graphdata.xmin = +32.0; 1615 graphdata.xmax = -32.0; 1616 graphdata.ymin = +32.0; 1617 graphdata.ymax = -32.0; 1618 1619 // construct the plot vectors 1620 int n = 0; 1621 for (int i = 0; i < sources->n; i++) { 1622 pmSource *source = sources->data[i]; 1623 if (!source) continue; 1624 if (source->type != PM_SOURCE_TYPE_STAR) continue; 1625 if (!isfinite (source->crNsigma)) continue; 1626 1627 x->data.F32[n] = -2.5*log10(source->peak->flux); 1628 y->data.F32[n] = source->crNsigma; 1629 graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]); 1630 graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]); 1631 graphdata.ymin = -0.5; 1632 graphdata.ymax = 10.0; 1633 1634 n++; 1635 } 1636 x->n = y->n = n; 1637 1638 float range; 1639 range = graphdata.xmax - graphdata.xmin; 1640 graphdata.xmax += 0.05*range; 1641 graphdata.xmin -= 0.05*range; 1642 1643 // XXX set the plot range to match the image 1644 KapaSetLimits (kapa3, &graphdata); 1645 1646 KapaSetFont (kapa3, "helvetica", 14); 1647 KapaBox (kapa3, &graphdata); 1648 KapaSendLabel (kapa3, "Peak as Mag", KAPA_LABEL_XM); 1649 KapaSendLabel (kapa3, "CR N Sigma", KAPA_LABEL_YM); 1650 1651 graphdata.color = KapaColorByName ("black"); 1652 graphdata.ptype = 2; 1653 graphdata.size = 0.5; 1654 graphdata.style = 2; 1655 KapaPrepPlot (kapa3, n, &graphdata); 1656 KapaPlotVector (kapa3, n, x->data.F32, "x"); 1657 KapaPlotVector (kapa3, n, y->data.F32, "y"); 1658 1659 // second section : mag vs EXT nSigma 1660 section.dx = 1.0; 1661 section.dy = 0.5; 1662 section.x = 0.0; 1663 section.y = 0.5; 1664 section.name = NULL; 1665 psStringAppend (§ion.name, "a2"); 1666 KapaSetSection (kapa3, §ion); 1667 psFree (section.name); 1668 1669 graphdata.xmin = +32.0; 1670 graphdata.xmax = -32.0; 1671 graphdata.ymin = +32.0; 1672 graphdata.ymax = -32.0; 1673 1674 // construct the plot vectors 1675 n = 0; 1676 for (int i = 0; i < sources->n; i++) { 1677 pmSource *source = sources->data[i]; 1678 if (!source) continue; 1679 if (source->type != PM_SOURCE_TYPE_STAR) continue; 1680 if (!isfinite (source->extNsigma)) continue; 1681 1682 x->data.F32[n] = -2.5*log10(source->peak->flux); 1683 y->data.F32[n] = source->extNsigma; 1684 graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]); 1685 graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]); 1686 graphdata.ymin = -0.5; 1687 graphdata.ymax = 10.0; 1688 1689 n++; 1690 } 1691 x->n = y->n = n; 1692 1693 range = graphdata.xmax - graphdata.xmin; 1694 graphdata.xmax += 0.05*range; 1695 graphdata.xmin -= 0.05*range; 1696 1697 // XXX set the plot range to match the image 1698 KapaSetLimits (kapa3, &graphdata); 1699 1700 KapaSetFont (kapa3, "helvetica", 14); 1701 KapaBox (kapa3, &graphdata); 1702 KapaSendLabel (kapa3, "EXT N Sigma", KAPA_LABEL_YM); 1703 1704 graphdata.color = KapaColorByName ("black"); 1705 graphdata.ptype = 2; 1706 graphdata.size = 0.5; 1707 graphdata.style = 2; 1708 KapaPrepPlot (kapa3, n, &graphdata); 1709 KapaPlotVector (kapa3, n, x->data.F32, "x"); 1710 KapaPlotVector (kapa3, n, y->data.F32, "y"); 1711 1712 psFree (x); 1713 psFree (y); 1714 1715 // pause and wait for user input: 1716 // continue, save (provide name), ?? 1717 char key[10]; 1718 fprintf (stdout, "[c]ontinue? "); 1719 if (!fgets(key, 8, stdin)) { 1720 psWarning("Unable to read option"); 1721 } 1722 return true; 1723 } 1724 1725 bool psphotVisualShowResidualImage (pmReadout *readout) { 1726 1727 if (!pmVisualIsVisual()) return true; 1728 1729 if (kapa == -1) { 1730 kapa = KapaOpenNamedSocket ("kapa", "psphot:images"); 1731 if (kapa == -1) { 1732 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 1733 pmVisualSetVisual(false); 1734 return false; 1735 } 1736 } 1737 1738 psphotVisualScaleImage (kapa, readout->image, "resid", 1); 1739 1740 // pause and wait for user input: 1741 // continue, save (provide name), ?? 1742 char key[10]; 1743 fprintf (stdout, "[c]ontinue? "); 1744 if (!fgets(key, 8, stdin)) { 1745 psWarning("Unable to read option"); 1746 } 1747 return true; 1748 } 1749 1750 bool psphotVisualPlotApResid (psArray *sources) { 1751 1752 Graphdata graphdata; 1753 1754 if (!pmVisualIsVisual()) return true; 1755 1756 if (kapa3 == -1) { 1757 kapa3 = KapaOpenNamedSocket ("kapa", "psphot:plots"); 1758 if (kapa3 == -1) { 1759 fprintf (stderr, "failure to open kapa; visual mode disabled\n"); 1760 pmVisualSetVisual(false); 1761 return false; 1762 } 1763 } 1764 1765 KapaClearPlots (kapa3); 1766 KapaInitGraph (&graphdata); 1767 1768 psVector *x = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1769 psVector *y = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1952 psVector *dy = psVectorAllocEmpty (sources->n, PS_TYPE_F32); 1770 1953 1771 1954 graphdata.xmin = +32.0; … … 1785 1968 x->data.F32[n] = source->psfMag; 1786 1969 y->data.F32[n] = source->apMag - source->psfMag; 1970 dy->data.F32[n] = source->errMag; 1787 1971 graphdata.xmin = PS_MIN(graphdata.xmin, x->data.F32[n]); 1788 1972 graphdata.xmax = PS_MAX(graphdata.xmax, x->data.F32[n]); … … 1792 1976 n++; 1793 1977 } 1794 x->n = y->n = n;1978 x->n = y->n = dy->n = n; 1795 1979 1796 1980 float range; … … 1802 1986 graphdata.ymin -= 0.05*range; 1803 1987 1804 // XXX set the plot range to match the image 1805 KapaSetLimits (kapa3, &graphdata); 1806 1807 KapaSetFont (kapa3, "helvetica", 14); 1808 KapaBox (kapa3, &graphdata); 1809 KapaSendLabel (kapa3, "PSF Mag", KAPA_LABEL_XM); 1810 KapaSendLabel (kapa3, "Ap Mag - PSF Mag", KAPA_LABEL_YM); 1988 // XXX test 1989 graphdata.xmin = -17.0; 1990 graphdata.xmax = -9.0; 1991 graphdata.ymin = -0.31; 1992 graphdata.ymax = +0.31; 1993 1994 KapaSetLimits (myKapa, &graphdata); 1995 1996 KapaSetFont (myKapa, "helvetica", 14); 1997 KapaBox (myKapa, &graphdata); 1998 KapaSendLabel (myKapa, "PSF Mag", KAPA_LABEL_XM); 1999 KapaSendLabel (myKapa, "Ap Mag - PSF Mag", KAPA_LABEL_YM); 1811 2000 1812 2001 graphdata.color = KapaColorByName ("black"); … … 1814 2003 graphdata.size = 0.5; 1815 2004 graphdata.style = 2; 1816 KapaPrepPlot (kapa3, n, &graphdata); 1817 KapaPlotVector (kapa3, n, x->data.F32, "x"); 1818 KapaPlotVector (kapa3, n, y->data.F32, "y"); 2005 graphdata.etype |= 0x01; 2006 KapaPrepPlot (myKapa, n, &graphdata); 2007 KapaPlotVector (myKapa, n, x->data.F32, "x"); 2008 KapaPlotVector (myKapa, n, y->data.F32, "y"); 2009 KapaPlotVector (myKapa, n, dy->data.F32, "dym"); 2010 KapaPlotVector (myKapa, n, dy->data.F32, "dyp"); 2011 2012 graphdata.color = KapaColorByName ("blue"); 2013 graphdata.ptype = 0; 2014 graphdata.size = 0.5; 2015 graphdata.style = 0; 2016 graphdata.etype = 0; 2017 lineX[0] = graphdata.xmin; 2018 lineX[1] = graphdata.xmax; 2019 lineY[0] = lineY[1] = mean; 2020 KapaPrepPlot (myKapa, 2, &graphdata); 2021 KapaPlotVector (myKapa, 2, lineX, "x"); 2022 KapaPlotVector (myKapa, 2, lineY, "y"); 2023 2024 graphdata.color = KapaColorByName ("red"); 2025 graphdata.ptype = 0; 2026 graphdata.size = 0.5; 2027 graphdata.style = 0; 2028 graphdata.etype = 0; 2029 lineX[0] = graphdata.xmin; 2030 lineX[1] = graphdata.xmax; 2031 lineY[0] = lineY[1] = mean + error; 2032 KapaPrepPlot (myKapa, 2, &graphdata); 2033 KapaPlotVector (myKapa, 2, lineX, "x"); 2034 KapaPlotVector (myKapa, 2, lineY, "y"); 2035 2036 graphdata.color = KapaColorByName ("red"); 2037 graphdata.ptype = 0; 2038 graphdata.size = 0.5; 2039 graphdata.style = 0; 2040 graphdata.etype = 0; 2041 lineX[0] = graphdata.xmin; 2042 lineX[1] = graphdata.xmax; 2043 lineY[0] = lineY[1] = mean - error; 2044 KapaPrepPlot (myKapa, 2, &graphdata); 2045 KapaPlotVector (myKapa, 2, lineX, "x"); 2046 KapaPlotVector (myKapa, 2, lineY, "y"); 1819 2047 1820 2048 psFree (x); 1821 2049 psFree (y); 1822 1823 // pause and wait for user input: 1824 // continue, save (provide name), ?? 1825 char key[10]; 1826 fprintf (stdout, "[c]ontinue? "); 1827 if (!fgets(key, 8, stdin)) { 1828 psWarning("Unable to read option"); 1829 } 2050 psFree (dy); 2051 2052 pmVisualAskUser(NULL); 2053 return true; 2054 } 2055 2056 bool psphotVisualShowPetrosians (psArray *sources) { 2057 2058 int Noverlay, NOVERLAY; 2059 KiiOverlay *overlay; 2060 2061 if (!pmVisualIsVisual()) return true; 2062 2063 int kapa = psphotKapaChannel (1); 2064 if (kapa == -1) return false; 2065 2066 Noverlay = 0; 2067 NOVERLAY = 100; 2068 ALLOCATE (overlay, KiiOverlay, NOVERLAY); 2069 2070 for (int i = 0; i < sources->n; i++) { 2071 pmSource *source = sources->data[i]; 2072 2073 if (!source) continue; 2074 if (!source->extpars) continue; 2075 if (!source->extpars->profile) continue; 2076 if (!source->extpars->petrosian_80) continue; 2077 2078 pmSourceRadialProfile *profile = source->extpars->profile; 2079 pmSourceExtendedFlux *petrosian = source->extpars->petrosian_80; 2080 2081 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 2082 overlay[Noverlay].x = source->peak->xf; 2083 overlay[Noverlay].y = source->peak->yf; 2084 overlay[Noverlay].dx = 2.0*petrosian->radius; 2085 overlay[Noverlay].dy = 2.0*petrosian->radius*profile->axes.minor/profile->axes.major; 2086 overlay[Noverlay].angle = profile->axes.theta * PS_DEG_RAD; 2087 overlay[Noverlay].text = NULL; 2088 Noverlay ++; 2089 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 2090 2091 overlay[Noverlay].type = KII_OVERLAY_CIRCLE; 2092 overlay[Noverlay].x = source->peak->xf; 2093 overlay[Noverlay].y = source->peak->yf; 2094 overlay[Noverlay].dx = 4.0*petrosian->radius; 2095 overlay[Noverlay].dy = 4.0*petrosian->radius*profile->axes.minor/profile->axes.major; 2096 overlay[Noverlay].angle = profile->axes.theta * PS_DEG_RAD; 2097 overlay[Noverlay].text = NULL; 2098 Noverlay ++; 2099 CHECK_REALLOCATE (overlay, KiiOverlay, NOVERLAY, Noverlay, 100); 2100 } 2101 2102 KiiLoadOverlay (kapa, overlay, Noverlay, "red"); 2103 FREE (overlay); 2104 2105 pmVisualAskUser(NULL); 1830 2106 return true; 1831 2107 } … … 1850 2126 1851 2127 # endif 2128 2129 # if (0) 2130 // *** make a histogram of the source counts in the x and y directions 2131 psHistogram *nX = psHistogramAlloc (graphdata.xmin, graphdata.xmax, 50.0); 2132 psHistogram *nY = psHistogramAlloc (graphdata.ymin, graphdata.ymax, 50.0); 2133 psVectorHistogram (nX, xFaint, NULL, NULL, 0); 2134 psVectorHistogram (nY, yFaint, NULL, NULL, 0); 2135 psVector *dX = psVectorAlloc (nX->nums->n, PS_TYPE_F32); 2136 psVector *vX = psVectorAlloc (nX->nums->n, PS_TYPE_F32); 2137 psVector *dY = psVectorAlloc (nY->nums->n, PS_TYPE_F32); 2138 psVector *vY = psVectorAlloc (nY->nums->n, PS_TYPE_F32); 2139 for (int i = 0; i < nX->nums->n; i++) { 2140 dX->data.F32[i] = nX->nums->data.S32[i]; 2141 vX->data.F32[i] = 0.5*(nX->bounds->data.F32[i] + nX->bounds->data.F32[i+1]); 2142 } 2143 for (int i = 0; i < nY->nums->n; i++) { 2144 dY->data.F32[i] = nY->nums->data.S32[i]; 2145 vY->data.F32[i] = 0.5*(nY->bounds->data.F32[i] + nY->bounds->data.F32[i+1]); 2146 } 2147 2148 graphdata.color = KapaColorByName ("black"); 2149 graphdata.ptype = 0; 2150 graphdata.size = 0.0; 2151 graphdata.style = 0; 2152 KapaPrepPlot (myKapa, dX->n, &graphdata); 2153 KapaPlotVector (myKapa, dX->n, dX->data.F32, "x"); 2154 KapaPlotVector (myKapa, vX->n, vX->data.F32, "y"); 2155 2156 psFree (nX); 2157 psFree (dX); 2158 psFree (vX); 2159 2160 psFree (nY); 2161 psFree (dY); 2162 psFree (vY); 2163 2164 # endif 2165
Note:
See TracChangeset
for help on using the changeset viewer.
