diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /noao/digiphot/apphot/radprof/apradprof.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/digiphot/apphot/radprof/apradprof.x')
-rw-r--r-- | noao/digiphot/apphot/radprof/apradprof.x | 500 |
1 files changed, 500 insertions, 0 deletions
diff --git a/noao/digiphot/apphot/radprof/apradprof.x b/noao/digiphot/apphot/radprof/apradprof.x new file mode 100644 index 00000000..10448af2 --- /dev/null +++ b/noao/digiphot/apphot/radprof/apradprof.x @@ -0,0 +1,500 @@ +include <ctype.h> +include <gset.h> +include <imhdr.h> +include "../lib/apphot.h" +include "../lib/display.h" +include "../lib/center.h" +include "../lib/fitsky.h" +include "../lib/radprof.h" + +define HELPFILE "apphot$radprof/radprof.key" + +# AP_RADPROF -- Procedure to determine radial profiles for a list of objects +# in a list of images. + +int procedure ap_radprof (ap, im, cl, gd, mgd, id, out, stid, interactive, + cache) + +pointer ap # pointer to apphot structure +pointer im # pointer to IRAF image +int cl # starlist file descriptor +pointer gd # pointer to graphcis descriptor +pointer mgd # pointer to plot metacode stream +pointer id # pointer to image display stream +int out # output file descriptor +int stid # output file sequence number +int interactive # interactive mode +int cache # cache the input image pixels + +real wx, wy, xlist, ylist +pointer sp, cmd +int wcs, key, oid, ltid, newlist, colonkey, req_size, buf_size, old_size +int newimage, newskybuf, newsky, newcenterbuf, newcenter, newbuf, newfit +int ip, prev_num, req_num, cier, sier, pier, rier, memstat + +real apstatr() +int clgcur(), apfitsky(), aprefitsky(), apfitcenter(), aprefitcenter() +int apstati(), apgscur(), ap_frprof(), ctoi(), apgqverify(), apgtverify() +int apnew(), ap_avsky(), sizeof(), ap_memstat() +bool fp_equalr() + +define endswitch_ 99 + +begin + # Initialize. + call smark (sp) + call salloc (cmd, SZ_LINE, TY_CHAR) + + # Initialize the cursor command. + key = ' ' + Memc[cmd] = EOS + + # Initialize the fit. + newimage = NO + newcenterbuf = YES; newcenter = YES + newskybuf = YES; newsky = YES + newbuf = YES; newfit = YES + cier = AP_OK; sier = AP_OK; pier = AP_OK; rier = AP_OK + + # Initialize the sequencing. + newlist = NO + ltid = 0 + + # Loop over the coordinate file. + while (clgcur ("icommands", wx, wy, wcs, key, Memc[cmd], SZ_LINE) != + EOF) { + + # Store the cursor coords. + call ap_vtol (im, wx, wy, wx, wy, 1) + call apsetr (ap, CWX, wx) + call apsetr (ap, CWY, wy) + + # Test to see if the cursor has moved. + if (apnew (ap, wx, wy, xlist, ylist, newlist) == YES) { + newcenterbuf = YES; newcenter = YES + newskybuf = YES; newsky = YES + newbuf = YES; newfit = YES + } + + # Switch on the keystroke commands. + switch (key) { + + # Quit. + case 'q': + if (interactive == YES) { + if (apgqverify ("radprof", ap, key) == YES) { + call sfree (sp) + return (apgtverify (key)) + } + } else { + call sfree (sp) + return (NO) + } + + # Print the errors. + case 'e': + if (interactive == YES) + call ap_rferrors (ap, cier, sier, pier, rier) + + # Print the help page. + case '?': + if ((id != NULL) && (id == gd)) + call gpagefile (id, HELPFILE, "") + else if (interactive == YES) + call pagefile (HELPFILE, "[space=morehelp,q=quit,?=help]") + + # Rewind the list. + case 'r': + if (cl != NULL) { + call seek (cl, BOF) + ltid = 0 + } else if (interactive == YES) + call printf ("No coordinate list\n") + + # Move, measure next object in the coordinate list. + case 'm', 'n': + + # No coordinate file. + if (cl == NULL) { + if (interactive == YES) + call printf ("No coordinate list\n") + goto endswitch_ + } + + # Need to rewind the coordinate file. + prev_num = ltid + req_num = ltid + 1 + if (apgscur (cl, id, xlist, ylist, prev_num, req_num, + ltid) == EOF) { + if (interactive == YES) + call printf ( + "End of coordinate list, use r key to rewind\n") + goto endswitch_ + } + + # Convert coordinates if necessary. + switch (apstati (ap, WCSIN)) { + case WCS_PHYSICAL, WCS_WORLD: + call ap_itol (ap, xlist, ylist, xlist, ylist, 1) + case WCS_TV: + call ap_vtol (im, xlist, ylist, xlist, ylist, 1) + default: + ; + } + + # Move to the next object. + newlist = YES + if (key == 'm') { + newcenterbuf = YES; newcenter = YES + newskybuf = YES; newsky = YES + newbuf = YES; newfit = YES + goto endswitch_ + } + + # Measure next object. + cier = apfitcenter (ap, im, xlist, ylist) + sier = apfitsky (ap, im, apstatr (ap, XCENTER), apstatr (ap, + YCENTER), NULL, gd) + rier = ap_frprof (ap, im, apstatr (ap, XCENTER), apstatr (ap, + YCENTER), pier) + call aprmark (ap, id, apstati (ap, MKCENTER), apstati (ap, + MKSKY), apstati (ap, MKAPERT)) + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + call ap_rpplot (ap, stid, gd, apstati (ap, RADPLOTS)) + if (interactive == YES) + call ap_qprprof (ap, cier, sier, pier, rier) + if (stid == 1) + call ap_param (ap, out, "radprof") + call ap_prprof (ap, out, stid, ltid, cier, sier, pier, rier) + call ap_rpplot (ap, stid, mgd, YES) + stid = stid + 1 + newcenterbuf = NO; newcenter = NO + newskybuf = NO; newsky = NO + newbuf = NO; newfit = NO + + # Process the remainder of the list. + case 'l': + if (cl != NULL) { + oid = stid + ltid = ltid + 1 + call ap_bradprof (ap, im, cl, id, gd, mgd, out, stid, ltid, + YES) + ltid = ltid + stid - oid + 1 + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + } else if (interactive == YES) + call printf ("No coordinate list\n") + + # Process radprof colon commands. + case ':': + for (ip = 1; IS_WHITE(Memc[cmd+ip-1]); ip = ip + 1) + ; + colonkey = Memc[cmd+ip-1] + switch (colonkey) { + case 'm', 'n': + + # Show/set radprof parameters. + if (Memc[cmd+ip] != EOS && Memc[cmd+ip] != ' ') { + call ap_rpcolon (ap, im, cl, out, stid, ltid, Memc[cmd], + newimage, newcenterbuf, newcenter, newskybuf, + newsky, newbuf, newfit) + goto endswitch_ + } + + # Process the next object. + if (cl == NULL) { + if (interactive == YES) + call printf ("No coordinate list\n") + goto endswitch_ + } + + # Get next object from the list. + ip = ip + 1 + prev_num = ltid + if (ctoi (Memc[cmd], ip, req_num) <= 0) + req_num = ltid + 1 + + # Fetch next object from the list. + if (apgscur (cl, id, xlist, ylist, prev_num, req_num, + ltid) == EOF) { + if (interactive == YES) + call printf ( + "End of coordinate list, use r key to rewind\n") + goto endswitch_ + + } + + # Convert the coordinates. + switch (apstati (ap, WCSIN)) { + case WCS_PHYSICAL, WCS_WORLD: + call ap_itol (ap, xlist, ylist, xlist, ylist, 1) + case WCS_TV: + call ap_vtol (im, xlist, ylist, xlist, ylist, 1) + default: + ; + } + + # Move to next object. + newlist = YES + if (colonkey == 'm') { + newcenterbuf = YES; newcenter = YES + newskybuf = YES; newsky = YES + newbuf = YES; newfit = YES + } + + # Measure the next object. + cier = apfitcenter (ap, im, xlist, ylist) + sier = apfitsky (ap, im, apstatr (ap, XCENTER), + apstatr (ap, YCENTER), NULL, gd) + rier = ap_frprof (ap, im, apstatr (ap, XCENTER), + apstatr (ap, YCENTER), pier) + call aprmark (ap, id, apstati (ap, MKCENTER), apstati (ap, + MKSKY), apstati (ap, MKAPERT)) + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + call ap_rpplot (ap, stid, gd, apstati (ap, RADPLOTS)) + if (interactive == YES) + call ap_qprprof (ap, cier, sier, pier, rier) + + if (stid == 1) + call ap_param (ap, out, "radprof") + call ap_prprof (ap, out, stid, ltid, cier, sier, pier, rier) + call ap_rpplot (ap, stid, mgd, YES) + stid = stid + 1 + newcenterbuf = NO; newcenter = NO + newskybuf = NO; newsky = NO + newbuf = NO; newfit = NO + + default: + call ap_rpcolon (ap, im, cl, out, stid, ltid, Memc[cmd], + newimage, newcenterbuf, newcenter, newskybuf, newsky, + newbuf, newfit) + } + + # Reestablish the image viewport and window. + if (newimage == YES) { + if ((id != NULL) && (id != gd)) + call ap_gswv (id, Memc[cmd], im, 4) + req_size = MEMFUDGE * IM_LEN(im,1) * IM_LEN(im,2) * + sizeof (IM_PIXTYPE(im)) + memstat = ap_memstat (cache, req_size, old_size) + if (memstat == YES) + call ap_pcache (im, INDEFI, buf_size) + } + + newimage = NO + + # Save the parameters. + case 'w': + call ap_rpars (ap) + + # Plot a simple centered radial profile. + case 'd': + if (interactive == YES) { + call ap_qrad (ap, im, wx, wy, gd) + newcenterbuf = YES; newcenter = YES + newskybuf = YES; newsky = YES + newbuf = YES; newfit = YES + } + + + # Setup the radial profile fitting parameters interactively. + case 'i': + if (interactive == YES) { + call ap_profsetup (ap, im, wx, wy, gd, out, stid) + newcenterbuf = YES; newcenter = YES + newskybuf = YES; newsky = YES + newbuf = YES; newfit = YES + } + + # Verify the critical radprof parameters. + case 'v': + call ap_rconfirm (ap, out, stid) + newcenterbuf = YES; newcenter = YES + newskybuf = YES; newsky = YES + newbuf = YES; newfit = YES + + # Fit the center around the current cursor value. + case 'c': + if (newcenterbuf == YES) + cier = apfitcenter (ap, im, wx, wy) + else if (newcenter == YES) + cier = aprefitcenter (ap, im, cier) + call aprmark (ap, id, apstati (ap, MKCENTER), NO, NO) + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + call ap_cplot (ap, stid, gd, apstati (ap, RADPLOTS)) + if (interactive == YES) + call ap_qcenter (ap, cier) + newcenterbuf = NO; newcenter = NO + + # Fit the sky around the current cursor value. + case 't': + if (newskybuf == YES || ! fp_equalr (wx, + apstatr (ap, SXCUR)) || ! fp_equalr (wy, apstatr (ap, + SYCUR))) + sier = apfitsky (ap, im, wx, wy, NULL, gd) + else if (newsky == YES) + sier = aprefitsky (ap, im, gd) + call aprmark (ap, id, NO, apstati (ap, MKSKY), NO) + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + call ap_splot (ap, stid, gd, apstati (ap, RADPLOTS)) + if (interactive == YES) + call ap_qspsky (ap, sier) + newskybuf = NO; newsky = NO + + # Compute the average of several sky measurements around + # different cursor postions. + case 'a': + sier = ap_avsky (ap, im, stid, NULL, id, gd, interactive) + if (interactive == YES) + call ap_qaspsky (ap, sier) + newskybuf = NO; newsky = NO + + # Fit the sky around derived center value. + case 's': + if (newskybuf == YES || ! fp_equalr (apstatr (ap, XCENTER), + apstatr (ap, SXCUR)) || ! fp_equalr (apstatr (ap, + SYCUR), apstatr (ap, YCENTER))) + sier = apfitsky (ap, im, apstatr (ap, XCENTER), + apstatr (ap, YCENTER), NULL, gd) + else if (newsky == YES) + sier = aprefitsky (ap, im, gd) + call aprmark (ap, id, NO, apstati (ap, MKSKY), NO) + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + call ap_splot (ap, stid, gd, apstati (ap, RADPLOTS)) + if (interactive == YES) + call ap_qspsky (ap, sier) + newskybuf = NO; newsky = NO + + # Compute magnitudes around the current cursor position using + # the current sky. + case 'p', 'o': + if (newcenterbuf == YES) + cier = apfitcenter (ap, im, wx, wy) + else if (newcenter == YES) + cier = aprefitcenter (ap, im, cier) + call aprmark (ap, id, apstati (ap, MKCENTER), NO, + apstati (ap, MKAPERT)) + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + if (newfit == YES || newbuf == YES || ! fp_equalr (apstatr (ap, + XCENTER), apstatr (ap, RPXCUR)) || + ! fp_equalr (apstatr (ap, RPYCUR), apstatr (ap, YCENTER))) + rier = ap_frprof (ap, im, apstatr (ap, XCENTER), + apstatr (ap, YCENTER), pier) + if (interactive == YES) + call ap_qprprof (ap, cier, sier, pier, rier) + newcenterbuf = NO; newcenter = NO + newbuf = NO; newfit = NO + + if (key == 'o') { + if (stid == 1) + call ap_param (ap, out, "radprof") + if (newlist == YES) + call ap_prprof (ap, out, stid, ltid, cier, sier, pier, + rier) + else + call ap_prprof (ap, out, stid, 0, cier, sier, pier, + rier) + call ap_rpplot (ap, stid, mgd, YES) + stid = stid + 1 + } + + # Center, fit the sky, and compute magnitudes. + # Compute the centers, fit the sky, compute the magnitudes + # and save the results. + case 'f', ' ': + if (newcenterbuf == YES) + cier = apfitcenter (ap, im, wx, wy) + else if (newcenter == YES) + cier = aprefitcenter (ap, im, cier) + if (newskybuf == YES || ! fp_equalr (apstatr (ap, XCENTER), + apstatr (ap, SXCUR)) || ! fp_equalr (apstatr (ap, YCENTER), + apstatr (ap, SYCUR))) + sier = apfitsky (ap, im, apstatr (ap, XCENTER), + apstatr (ap, YCENTER), NULL, gd) + else if (newsky == YES) + sier = aprefitsky (ap, im, gd) + + if (newfit == YES || newbuf == YES || ! fp_equalr (apstatr (ap, + XCENTER), apstatr (ap, RPXCUR)) || ! fp_equalr (apstatr (ap, + YCENTER), apstatr (ap, RPYCUR))) + rier = ap_frprof (ap, im, apstatr (ap, XCENTER), + apstatr (ap, YCENTER), pier) + call aprmark (ap, id, apstati (ap, MKCENTER), apstati (ap, + MKSKY), apstati (ap, MKAPERT)) + if (id != NULL) { + if (id == gd) + call gflush (id) + else + call gframe (id) + } + call ap_rpplot (ap, stid, gd, apstati (ap, RADPLOTS)) + if (interactive == YES) + call ap_qprprof (ap, cier, sier, pier, rier) + + newcenterbuf = NO; newcenter = NO + newskybuf = NO; newsky = NO + newbuf = NO; newfit = NO + + if (key == ' ') { + if (stid == 1) + call ap_param (ap, out, "radprof") + if (newlist == YES) + call ap_prprof (ap, out, stid, ltid, cier, sier, pier, + rier) + else + call ap_prprof (ap, out, stid, 0, cier, sier, pier, + rier) + call ap_rpplot (ap, stid, mgd, YES) + stid = stid + 1 + } + + default: + # do nothing + call printf ("Print unknown or ambiguous colon command\n") + } + +endswitch_ + # Prepare for the next object. + key = ' ' + Memc[cmd] = EOS + call apsetr (ap, WX, apstatr (ap, CWX)) + call apsetr (ap, WY, apstatr (ap, CWY)) + + } + + call sfree (sp) +end |