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 /pkg/plot/t_implot.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'pkg/plot/t_implot.x')
-rw-r--r-- | pkg/plot/t_implot.x | 1202 |
1 files changed, 1202 insertions, 0 deletions
diff --git a/pkg/plot/t_implot.x b/pkg/plot/t_implot.x new file mode 100644 index 00000000..fbf8f00a --- /dev/null +++ b/pkg/plot/t_implot.x @@ -0,0 +1,1202 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <error.h> +include <ctype.h> +include <imhdr.h> +include <mach.h> +include <gset.h> +include <mwset.h> + +define SEGLEN 10 +define SZ_PLOTTITLE 512 +define KEYSFILE "lib$scr/implot.key" +define MAX_COLORS 8 + + +# IMPLOT -- Image plot program. An interactive, cursor driven program for +# plotting lines and columns of images. This is an early version of the program +# lacking averaging and interaction with the image display cursor. +# +# implot (image [,line]) +# +# Keystrokes: +# +# ? help +# a plot the average of a range of lines of columns +# c plot column at position of cursor +# e expand plot by marking corners of new window +# j move down +# k move up +# l plot line at position of cursor +# m previous image +# n next image +# p measure profile (mark region and baseline with 2 pos) +# o overplot next vector +# r redraw +# s print statistics on a region +# / scroll status line +# +# +# In addition to the above keystrokes, the following ':' escapes are recognized +# by the program: +# +# :a N set number of lines or columns to average +# :c M [N] plot column M or avg of M to N +# :f format set label format +# :i imagename open a new image for input +# :l M [N] plot line M or avg of M to N +# :o overplot +# :log+,log- enable, disable log scaling in Y +# :step N set step size for j,k +# :solid overplot with solid, not dashed, lines +# :mono disable coloring of overplotted vectors +# :x x1 x2 fix plot window in X (no args to unfix) +# :y y1 y2 fix plot window in Y (no args to unfix) +# :w wcstype change world coordinate type + +procedure t_implot() + +int list +char image[SZ_FNAME] +char wcstype[SZ_FNAME] +char xlabel[SZ_FNAME] +char format[SZ_FNAME] +char fmt[SZ_FNAME] +char command[SZ_FNAME] +char device[SZ_FNAME] + +int xnticks, ynticks +bool overplot, lineplot, logscale, erase, rescale[2], p_rescale[2] +int key, wcs, ip, i1, i2, n, linetype, color, nltypes, linestep, navg +int npix, nlines, ncols, line, col, shift, step, p_navg, sline, nim, index +real x, y, px, py, qx, qy, x1, x2, y1, y2 +real median, mean, sigma, sum +pointer im, mw, ct, gp, xold, yold, xnew, ynew, sl, ptr + +real asumr(), amedr(), plt_iformatr() +int clgeti(), clgcur(), ctoi(), ctor(), ggeti(), imtlen(), imaccess() +pointer gopen(), immap(), mw_openim(), mw_sctran(), sl_getstr() +pointer imtopenp(), imtrgetim() +errchk mw_sctran + +define line_ 91 +define col_ 92 +define replotline_ 93 +define replotcol_ 94 +define nextim_ 95 +define quit_ 96 +string bell "\007" +string again "again:" + +begin + list = imtopenp ("image") + call clgstr ("device", device, SZ_FNAME) + gp = gopen (device, NEW_FILE, STDGRAPH) + call clgstr ("wcs", wcstype, SZ_FNAME) + + if (clgeti ("$nargs") > 1) + line = clgeti ("line") + else + line = INDEFI + + p_rescale[1] = true + rescale[1] = true + p_rescale[2] = true + rescale[2] = true + + logscale = false + overplot = false + lineplot = true + erase = false + xnticks = 5 + ynticks = 5 + format[1] = EOS + + linestep = 1 + linetype = 1 + color = 1 + nltypes = ggeti (gp, "lt") + p_navg = 1 + navg = 1 + step = clgeti ("step") + + # Loop through the images. Currently this loop is not actually + # used and instead the 'm' and 'n' keys explicitly change the + # image. The 'q' key exits the loop regardless of the position + # of the list. + + nim = imtlen (list) + index = 1 + while (imtrgetim (list, index, image, SZ_FNAME) != EOF) { + iferr { + im = NULL; mw = NULL; sl = NULL + + if (imaccess (image, READ_ONLY) == YES) { + ptr = immap (image, READ_ONLY, 0); + im = ptr + + } else { + call eprintf ("Error opening image '%s'") + call pargstr (image) + goto nextim_ + } + + ptr = mw_openim (im); mw = ptr + call mw_seti (mw, MW_USEAXMAP, NO) + + ct = mw_sctran (mw, "logical", wcstype, 0) + + ncols = IM_LEN(im,1) + if (IM_NDIM(im) <= 0) + call error (1, "image has no pixels") + else if (IM_NDIM(im) > 1) + nlines = IM_LEN(im,2) + else + nlines = 1 + + if (IS_INDEFI(line)) + line = max(1, min(nlines, (nlines + 1) / 2)) + + if (IS_INDEFI(step) || step < 1) + step = max (1, nlines / 10) + + npix = max (ncols, nlines) + call malloc (xold, npix, TY_REAL) + call malloc (yold, npix, TY_REAL) + call malloc (xnew, npix, TY_REAL) + call malloc (ynew, npix, TY_REAL) + + if (!overplot) + call gclear (gp) + call imp_getvector (im, mw, ct, wcstype, xnew, ynew, xlabel, + fmt, line, navg, lineplot) + if (format[1] == '%') + call strcpy (format, fmt, SZ_FNAME) + npix = ncols + + call gsets (gp, G_XTICKFORMAT, fmt) + if (xnticks >= 0) + call gseti (gp, G_XNMAJOR, xnticks) + if (ynticks >= 0) + call gseti (gp, G_YNMAJOR, ynticks) + call gseti (gp, G_NMINOR, 0) + call gseti (gp, G_PLTYPE, 1) + call gseti (gp, G_PLCOLOR, 1) + + call imp_plotvector (gp, im, Memr[xnew], Memr[ynew], ncols, + nlines, real(line), navg, lineplot, rescale, image, xlabel) + overplot = false + + call sl_init (sl, 1) + while (clgcur ("coords", x, y, wcs, key, command, SZ_FNAME) != + EOF) { + if (key == 'q') +quit_ break + + switch (key) { + case 'a': + # Plot the average over a range of lines or columns + # marked interactively with the cursor. + + x1 = x; y1 = y + call printf (again) + if (clgcur ("gcur", x2, y2, wcs, key, command, + SZ_FNAME) == EOF) + next + + if (abs(x2-x1) > abs(y2-y1)) { + # Range is in X. + + navg = abs (x2 - x1) + 1 + if (lineplot) { + col = nint (min (x1, x2)) + goto col_ + } else { + line = nint (min (x1, x2)) + goto line_ + } + + } else { + # Range is in Y. + + if (lineplot) { + call imp_tran (gp, x1, y1, x1, y1, Memr[xnew], + ncols, nlines) + call imp_tran (gp, x2, y2, x2, y2, Memr[xnew], + ncols, nlines) + navg = abs (y2 - y1) + 1 + line = nint (min (y1, y2)) + goto line_ + } else { + call imp_tran (gp, x1, y1, x1, y1, Memr[xnew], + nlines, ncols) + call imp_tran (gp, x2, y2, x2, y2, Memr[xnew], + nlines, ncols) + navg = abs (y2 - y1) + 1 + col = nint (min (y1, y2)) + goto col_ + } + } + + case 'j', 'k': + # Move viewport into image up (k) or down (j). This + # is done by erasing the old data vector and drawing + # a new one. + + erase = true + navg = p_navg + overplot = true + call amovr (Memr[xnew], Memr[xold], npix) + call amovr (Memr[ynew], Memr[yold], npix) + + shift = step + if (key == 'j') + shift = -shift + + if (lineplot) { + line = line + shift + goto line_ + } else { + col = col + shift + goto col_ + } + + case 'l': + # Plot a line. + if (lineplot) { + call imp_tran (gp, x, y, px, py, Memr[xnew], ncols, + nlines) + line = max(1, min(nlines, nint(py))) + } else { + call imp_tran (gp, x, y, px, py, Memr[xnew], nlines, + ncols) + line = max(1, min(nlines, nint(px))) + } + navg = p_navg + line = line - (navg - 1) / 2 +line_ + lineplot = true + line = max(1, min(nlines, line)) + call imp_getvector (im, mw, ct, wcstype, xnew, ynew, + xlabel, fmt, line, navg, lineplot) + if (format[1] == '%') + call strcpy (format, fmt, SZ_FNAME) + npix = ncols +replotline_ + if (overplot) { + if (erase) { + # Erase old vector and replace it with new + # vector. + + call imp_redraw (gp, Memr[xold], Memr[yold], + Memr[xnew], Memr[ynew], npix) + erase = false + + } else { + # Overplot new vector. + + linetype = linetype + linestep + if (linetype > nltypes) + linetype = 1 + call gseti (gp, G_PLTYPE, linetype) + + color = color + 1 + if (color > MAX_COLORS) + color = 1 + call gseti (gp, G_PLCOLOR, color) + + call gpline (gp, Memr[xnew], Memr[ynew], ncols) + } + + call imp_markpos (gp, line, nlines) + overplot = false + + } else { + call gclear (gp) + call gsets (gp, G_XTICKFORMAT, fmt) + if (logscale) + call gseti (gp, G_YTRAN, GW_LOG) + call gseti (gp, G_NMINOR, 0) + if (xnticks >= 0) + call gseti (gp, G_XNMAJOR, xnticks) + if (ynticks >= 0) + call gseti (gp, G_YNMAJOR, ynticks) + linetype = 1 + color = 1 + call imp_plotvector (gp, im, Memr[xnew], Memr[ynew], + ncols, nlines, real(line), navg, lineplot, + rescale, image, xlabel) + rescale[1] = p_rescale[1] + rescale[2] = p_rescale[2] + } + + case 'm', 'n': + if (key == 'm') { + if (index > 1) + index = index - 1 + else + next + } else if (key == 'n') { +nextim_ if (index < nim) + index = index + 1 + else + next + } + + if (imtrgetim (list, index, command, SZ_FNAME) == EOF) + break + + # Open a different image. + call mw_close (mw) + call imunmap (im) + + iferr (im = immap (command, READ_ONLY, 0)) { + call erract (EA_WARN) + im = immap (image, READ_ONLY, 0) + mw = mw_openim (im) + call mw_seti (mw, MW_USEAXMAP, NO) + ct = mw_sctran (mw, "logical", wcstype, 0) + next + } + + if (IM_NDIM(im) <= 0) { + call eprintf ("image has no pixels\n") + im = immap (image, READ_ONLY, 0) + mw = mw_openim (im) + call mw_seti (mw, MW_USEAXMAP, NO) + ct = mw_sctran (mw, "logical", wcstype, 0) + next + + } else { + mw = mw_openim (im) + call mw_seti (mw, MW_USEAXMAP, NO) + ct = mw_sctran (mw, "logical", wcstype, 0) + + ncols = IM_LEN(im,1) + if (IM_NDIM(im) > 1) + nlines = IM_LEN(im,2) + else { + lineplot = true + nlines = 1 + } + + npix = max (ncols, nlines) + call strcpy (command, image, SZ_FNAME) + call realloc (xold, npix, TY_REAL) + call realloc (yold, npix, TY_REAL) + call realloc (xnew, npix, TY_REAL) + call realloc (ynew, npix, TY_REAL) + + if (lineplot) + goto line_ + else + goto col_ + } + + case 'c': + # Plot a column. + if (lineplot) { + call imp_tran (gp, x, y, px, py, Memr[xnew], ncols, + nlines) + col = max(1, min(ncols, nint(px))) + } else { + call imp_tran (gp, x, y, px, py, Memr[xnew], nlines, + ncols) + col = max(1, min(ncols, nint(py))) + } + navg = p_navg + col = col - (navg - 1) / 2 +col_ + if (nlines == 1) { + call printf (bell) + next + } + lineplot = false + col = max(1, min(ncols, col)) + call imp_getvector (im, mw, ct, wcstype, xnew, ynew, + xlabel, fmt, col, navg, lineplot) + if (format[1] == '%') + call strcpy (format, fmt, SZ_FNAME) + npix = nlines +replotcol_ + if (overplot) { + if (erase) { + # Erase old vector and replace it with new + # vector. + + call imp_redraw (gp, Memr[xold], Memr[yold], + Memr[xnew], Memr[ynew], npix) + erase = false + + } else { + linetype = linetype + linestep + if (linetype > nltypes) + linetype = 1 + call gseti (gp, G_PLTYPE, linetype) + + color = color + 1 + if (color > MAX_COLORS) + color = 1 + call gseti (gp, G_PLCOLOR, color) + + call gpline (gp, Memr[xnew], Memr[ynew], nlines) + } + + call imp_markpos (gp, col, ncols) + overplot = false + + } else { + call gclear (gp) + call gsets (gp, G_XTICKFORMAT, fmt) + if (logscale) + call gseti (gp, G_YTRAN, GW_LOG) + call gseti (gp, G_NMINOR, 0) + if (xnticks >= 0) + call gseti (gp, G_XNMAJOR, xnticks) + if (ynticks >= 0) + call gseti (gp, G_YNMAJOR, ynticks) + linetype = 1 + color = 1 + call imp_plotvector (gp, im, Memr[xnew], Memr[ynew], + nlines, ncols, real(col), navg, lineplot, + rescale, image, xlabel) + rescale[1] = p_rescale[1] + rescale[2] = p_rescale[2] + } + + case 'e': + # Expand plot by marking corners of new window. We are + # called with the coords of the lower left corner. + + x1 = x; y1 = y + call printf (again) + if (clgcur ("gcur", x2, y2, wcs, key, command, + SZ_FNAME) == EOF) + next + + rescale[1] = false + rescale[2] = false + p_rescale[1] = true + p_rescale[2] = true + + # If the cursor moved only in X, with negligible range + # in Y, expand only in X. Do the comparisons in NDC + # space to avoid scaling problems. + + call gctran (gp, x1, y1, px, py, wcs, 0) + call gctran (gp, x2, y2, qx, qy, wcs, 0) + + if (abs (py - qy) < .01) { + y1 = INDEF; y2 = INDEF + rescale[2] = true + } + call imp_swind (x1, x2, y1, y2) + + if (lineplot) + goto replotline_ + else + goto replotcol_ + + case 'o': + overplot = true + + case 'r': + if (lineplot) + goto replotline_ + else + goto replotcol_ + + case 'p': + # Profile analysis. + x1 = x + y1 = y + call printf (again) + if (clgcur ("gcur", x2, y2, wcs, key, command, + SZ_FNAME) == EOF) + next + + call imp_profile (gp, Memr[xnew], Memr[ynew], npix, + x1, y1, x2, y2, sl, sline) + call printf (Memc[sl_getstr(sl,sline)]) + + case 's': + # Statistics. + x1 = x + call printf (again) + if (clgcur ("gcur", x2, y, wcs, key, command, + SZ_FNAME) == EOF) + next + + i1 = max(1, min(npix, nint(x1))) + i2 = max(1, min(npix, nint(x2))) + if (i1 > i2) { + n = i1 + i1 = i2 + i2 = n + } else if (i1 == i2) + i2 = i1 + 1 + + n = i2 - i1 + 1 + call aavgr (Memr[ynew+i1-1], n, mean, sigma) + median = amedr (Memr[ynew+i1-1], n) + sum = asumr (Memr[ynew+i1-1], n) + + call sl_init (sl, 1) + call sprintf (Memc[sl_getstr(sl,1)], SZ_LINE, + "median=%g, mean=%g, rms=%g, sum=%g, npix=%d\n") + call pargr (median) + call pargr (mean) + call pargr (sigma) + call pargr (sum) + call pargi (n) + sline = 1 + call printf (Memc[sl_getstr(sl,sline)]) + + case ' ': + # Print cursor coordinates. + call sl_init (sl, 1) + if (lineplot) { + call imp_tran (gp, x, y, px, py, Memr[xnew], ncols, + nlines) + col = px + call plt_wcscoord (im, mw, ct, wcstype, format, col, + line, Memr[ynew+col-1], Memc[sl_getstr(sl,1)], + SZ_LINE) + } else { + call imp_tran (gp, x, y, px, py, Memr[xnew], nlines, + ncols) + line = px + call plt_wcscoord (im, mw, ct, wcstype, format, col, + line, Memr[ynew+line-1], Memc[sl_getstr(sl,1)], + SZ_LINE) + } + sline = 1 + call printf (Memc[sl_getstr(sl,sline)]) + + case '?': + # Print command summary. + call gpagefile (gp, KEYSFILE, "implot cursor commands") + + case ':': + # Command mode. + for (ip=1; IS_WHITE (command[ip]); ip=ip+1) + ; + if (command[ip] == 'o') { + overplot = true + ip = ip + 1 + } + + switch (command[ip]) { + case 'a': + # Set number of lines or columns to average. + ip = ip + 1 + if (ctoi (command, ip, p_navg) <= 0) { + call printf (bell) + p_navg = 1 + } + + case 'i': + # Open a different image. + call mw_close (mw) + call imunmap (im) + ip = ip + 1 + while (IS_WHITE (command[ip])) + ip = ip + 1 + + iferr (im = immap (command[ip], READ_ONLY, 0)) { + call erract (EA_WARN) + im = immap (image, READ_ONLY, 0) + mw = mw_openim (im) + call mw_seti (mw, MW_USEAXMAP, NO) + ct = mw_sctran (mw, "logical", wcstype, 0) + + } else if (IM_NDIM(im) <= 0) { + call eprintf ("image has no pixels\n") + im = immap (image, READ_ONLY, 0) + mw = mw_openim (im) + call mw_seti (mw, MW_USEAXMAP, NO) + ct = mw_sctran (mw, "logical", wcstype, 0) + + } else { + mw = mw_openim (im) + call mw_seti (mw, MW_USEAXMAP, NO) + ct = mw_sctran (mw, "logical", wcstype, 0) + + ncols = IM_LEN(im,1) + if (IM_NDIM(im) > 1) + nlines = IM_LEN(im,2) + else + nlines = 1 + + npix = max (ncols, nlines) + call strcpy (command[ip], image, SZ_FNAME) + call realloc (xold, npix, TY_REAL) + call realloc (yold, npix, TY_REAL) + call realloc (xnew, npix, TY_REAL) + call realloc (ynew, npix, TY_REAL) + } + + case 'w': + # Change wcs type. + call mw_ctfree (ct) + ip = ip + 1 + while (IS_WHITE (command[ip])) + ip = ip + 1 + + iferr { + ct = mw_sctran (mw, "logical", command[ip], 0) + call strcpy (command[ip], wcstype, SZ_FNAME) + } then { + call erract (EA_WARN) + ct = mw_sctran (mw, "logical", wcstype, 0) + } else { + # Only replot if WCS command succeeds, + # otherwise the error message is lost. + if (lineplot) + goto line_ + else + goto col_ + } + + case 'f': + # Change label format. + ip = ip + 1 + while (IS_WHITE (command[ip])) + ip = ip + 1 + if (command[ip] == '%') { + call strcpy (command[ip], format, SZ_FNAME) + call strcpy (format, fmt, SZ_FNAME) + if (lineplot) + goto replotline_ + else + goto replotcol_ + } else if (format[1] == '%') { + call strcpy (command[ip], format, SZ_FNAME) + if (lineplot) + goto line_ + else + goto col_ + } + + case 'l': + if (command[ip+1] != 'o') { + # Plot a line. + ip = ip + 1 + if (ctoi (command, ip, i1) <= 0) { + call printf (bell) + next + } else if (ctoi (command, ip, i2) <= 0) { + line = max(1, min(nlines, i1)) + navg = p_navg + line = line - (navg - 1) / 2 + goto line_ + } else { + i1 = max(1, min(nlines, i1)) + i2 = max(1, min(nlines, i2)) + line = min (i1, i2) + navg = max (1, abs (i2 - i1) + 1) + goto line_ + } + } else { + # Enable/disable log scaling. + while (IS_ALPHA(command[ip])) + ip = ip + 1 + logscale = (command[ip] == '+') + } + + case 'c': + # Plot a column. + ip = ip + 1 + if (ctoi (command, ip, i1) <= 0) { + call printf (bell) + next + } else if (ctoi (command, ip, i2) <= 0) { + col = max(1, min(ncols, i1)) + navg = p_navg + col = col - (navg - 1) / 2 + goto col_ + } else { + i1 = max(1, min(ncols, i1)) + i2 = max(1, min(ncols, i2)) + col = min (i1, i2) + navg = max (1, abs (i2 - i1) + 1) + goto col_ + } + + case 's': + if (command[ip+1] == 'o') { + # Use only linetype=1 (solid). + linetype = 1 + linestep = 0 + color = 1 + } else { + # Set step size. + while (IS_ALPHA (command[ip])) + ip = ip + 1 + if (ctoi (command, ip, step) <= 0) { + call printf (bell) + step = 1 + } + } + + case 'x': + # Fix window in X and replot vector. If no args + # are given, unfix the window. + + ip = ip + 1 + if (ctor (command, ip, x1) <= 0) { + rescale[1] = true + p_rescale[1] = true + } else if (ctor (command, ip, x2) <= 0) { + call printf (bell) + } else { + x1 = plt_iformatr (x1, fmt) + x2 = plt_iformatr (x2, fmt) + call imp_swind (x1, x2, INDEF, INDEF) + rescale[1] = false + p_rescale[1] = false + } + + if (lineplot) + goto replotline_ + else + goto replotcol_ + + case 'y': + # Fix window in Y and replot vector. If no args + # are given, unfix the window. + + ip = ip + 1 + if (ctor (command, ip, y1) <= 0) { + rescale[2] = true + p_rescale[2] = true + } else if (ctor (command, ip, y2) <= 0) { + call printf (bell) + } else { + y1 = plt_iformatr (y1, fmt) + y2 = plt_iformatr (y2, fmt) + call imp_swind (INDEF, INDEF, y1, y2) + p_rescale[2] = false + rescale[2] = false + } + + if (lineplot) + goto replotline_ + else + goto replotcol_ + + case 'n': + ip = ip + 1 + if (command[ip] == 'x') { + while (IS_ALPHA(command[ip])) + ip = ip + 1 + if (ctoi (command, ip, xnticks) <= 0) + xnticks = -1 + } else if (command[ip] == 'y') { + while (IS_ALPHA(command[ip])) + ip = ip + 1 + if (ctoi (command, ip, ynticks) <= 0) + ynticks = -1 + } else + call printf (bell) + + default: + call printf (bell) + } + + case '/': + # Scroll or rewrite the status line. + + sline = sline + 1 + call printf (Memc[sl_getstr(sl,sline)]) + + default: + call printf (bell) + } + } + } then + call erract (EA_WARN) + + call mfree (xnew, TY_REAL) + call mfree (ynew, TY_REAL) + call mfree (xold, TY_REAL) + call mfree (yold, TY_REAL) + if (sl != NULL) + call sl_free (sl) + + if (mw != NULL) + call mw_close (mw) + if (im != NULL) + call imunmap (im) + + if (key == 'q') + break + } + + call gclose (gp) + call imtclose (list) +end + + +# IMP_GETVECTOR -- Get a data vector, i.e., line or column or average of +# lines and columns. + +procedure imp_getvector (im, mw, ct, wcstype, x, y, xlabel, format, linecol, + navg, lineplot) + +pointer im # image descriptor +pointer mw # mwcs descriptor +pointer ct # coordinate descriptor +char wcstype[ARB] # WCS type +pointer x, y # output vector +char xlabel[SZ_FNAME] # WCS label +char format[SZ_FNAME] # WCS format +int linecol # line or column number +int navg # number of lines or columns to be averaged +bool lineplot # true if line is to be extracted + +real norm +pointer sp, axvals, buf, off +int x1, x2, y1, y2 +int nx, ny, width, i, ndim +real asumr() +pointer imgl2r(), imgs2r(), imgl1r(), imgs1r() +errchk imgl2r, imgs2r, imgl1r, imgs1r, plt_wcs + +begin + call smark (sp) + call salloc (axvals, IM_NDIM(im), TY_REAL) + + call strcpy (wcstype, xlabel, SZ_FNAME) + + ndim = IM_NDIM(im) + nx = IM_LEN(im,1) + if (ndim > 1) + ny = IM_LEN(im,2) + else + ny = 1 + call amovkr (1., Memr[axvals], ndim) + + if (lineplot) { + # Extract a line vector. + + x1 = 1 + x2 = nx + y1 = max(1, min (ny, linecol)) + y2 = max(1, min (ny, linecol + navg - 1)) + + Memr[axvals+1] = (y1 + y2) / 2. + call plt_wcs (im, mw, ct, 1, Memr[axvals], real(x1), real(x2), + Memr[x], nx, xlabel, format, SZ_FNAME) + + if (ndim == 1) + call amovr (Memr[imgl1r(im)], Memr[y], nx) + + else { + # Compute sum. + call aclrr (Memr[y], nx) + do i = y1, y2 + call aaddr (Memr[imgl2r(im,i)], Memr[y], Memr[y], nx) + + # Normalize. + width = y2 - y1 + 1 + if (width > 1) + call amulkr (Memr[y], 1. / width, Memr[y], nx) + } + + } else { + # Extract a column vector. + + x1 = max(1, min(nx, linecol)) + x2 = max(1, min(nx, linecol + navg - 1)) + y1 = 1 + y2 = ny + + Memr[axvals] = (x1 + x2) / 2. + call plt_wcs (im, mw, ct, 2, Memr[axvals], real(y1), real(y2), + Memr[x], ny, xlabel, format, SZ_LINE) + + width = x2 - x1 + 1 + norm = 1.0 / real(width) + + if (width > 1) { + call aclrr (Memr[y], ny) + do i = y1, y2 { + if (ndim == 1) { + buf = imgs1r (im, x1, x2) + off = buf + } else if (nx > 1024) { + buf = imgs2r (im, x1, x2, i, i) + off = buf + } else { + buf = imgl2r (im, i) + off = buf + x1 - 1 + } + Memr[y+i-1] = asumr (Memr[off], width) * norm + } + } else { + buf = imgs2r (im, x1, x2, y1, y2) + call amovr (Memr[buf], Memr[y], ny) + } + } + + call sfree (sp) +end + + +# IMP_PLOTVECTOR -- Plot a line or column vector. + +procedure imp_plotvector (gp, im, xv, yv, nx, ny, y, navg, lineplot, rescale, + image, xlabel) + +pointer gp # graphics descriptor +pointer im # image descriptor +real xv[ARB] # coordinate vector +real yv[ARB] # data vector +int nx # number of pixels in vector +int ny # number of pixels on plot-Y axis +real y # position on plot Y-axis +int navg # number of lines or columns averaged +bool lineplot # are we plotting a line or a column +bool rescale[2] # rescale plot +char image[ARB] # image name +char xlabel[ARB] # X label + +real junkr +int i, i1, i2, npix, maxch +pointer sp, ip, plot_title, op +bool fp_equalr() + +real x1, x2, y1, y2 +common /implcom/ x1, x2, y1, y2 + +begin + call smark (sp) + call salloc (plot_title, SZ_PLOTTITLE, TY_CHAR) + + # Format the plot title, starting with the system banner. + call sysid (Memc[plot_title], SZ_PLOTTITLE) + for (op=plot_title; Memc[op] != '\n' && Memc[op] != EOS; op=op+1) + ; + Memc[op] = '\n' + op = op + 1 + maxch = SZ_PLOTTITLE - (op - plot_title) + # Format the remainder of the plot title. + + if (IM_LEN(im,2) <= 1) { + # Plot of a one-dim image. + call strcpy (IM_TITLE(im), Memc[op], maxch) + + } else if (navg > 1) { + call sprintf (Memc[op], maxch, "Average of %s %d to %d of %s\n%s") + if (lineplot) { + call pargstr ("lines") + npix = IM_LEN(im,2) + } else { + call pargstr ("columns") + npix = IM_LEN(im,1) + } + + i1 = max (1, min (npix, nint (y))) + i2 = max (1, min (npix, nint (y) + navg - 1)) + call pargi (i1) + call pargi (i2) + call pargstr (image) + call pargstr (IM_TITLE(im)) + + } else { + call sprintf (Memc[op], maxch, "%s %d of %s\n%s") + if (lineplot) + call pargstr ("Line") + else + call pargstr ("Column") + call pargi (nint(y)) + call pargstr (image) + call pargstr (IM_TITLE(im)) + } + + + # Delete trailing newline and any whitespace from image title string. + # Trailing whitespace causes plot title to not be drawn centered on + # plot. + + for (ip=plot_title; Memc[ip] != EOS; ip=ip+1) + ; + ip = ip - 1 + if (ip > plot_title && Memc[ip] == '\n') + ip = ip - 1 + while (ip > plot_title && IS_WHITE(Memc[ip])) + ip = ip - 1 + Memc[ip+1] = EOS + + # Autoscale the plot in X and or Y if so indicated. + if (rescale[1]) + call gascale (gp, xv, nx, 1) + else + call gswind (gp, x1, x2, INDEF, INDEF) + + call ggwind (gp, x1, x2, junkr, junkr) + junkr = min (x1, x2) + for (i1=1; i1<nx && xv[i1] < junkr; i1=i1+1) + ; + junkr = max (x1, x2) + for (i2=nx; i2>1 && xv[i2] > junkr; i2=i2-1) + ; + if (i2 < i1) { + i = i1 + i1 = i2 + i2 = i + } + npix = max (1, i2 - i1 + 1) + + if (rescale[2]) { + if (npix < 2) + call gascale (gp, yv[i1], nx, 2) + else + call gascale (gp, yv[i1], npix, 2) + } else + call gswind (gp, INDEF, INDEF, y1, y2) + + call ggwind (gp, x1, x2, y1, y2) + + # If the image is two dimensional plot the position within the image + # of the plotted vector on the plot-Y axis (which may refer to either + # X or Y on the image). + + if (IM_LEN(im,2) > 1) { + # Draw all but right axes. + if (fp_equalr (y1, y2)) { + y1 = 0.99 * y1 + y2 = 1.01 * y2 + call gswind (gp, INDEF, INDEF, y1, y2) + } + call gseti (gp, G_YDRAWAXES, 1) + call glabax (gp, Memc[plot_title], xlabel, "") + + # Draw right axis (pixel scale) + call ggwind (gp, x1, x2, y1, y2) + call gswind (gp, 1., real (nx), 1., real (ny)) + call gseti (gp, G_XDRAWAXES, 0) + call gseti (gp, G_YDRAWAXES, 2) + call glabax (gp, "", "", "") + call gswind (gp, x1, x2, y1, y2) + + # Mark position on Y axis. + if (abs(y) > .001) + call imp_markpos (gp, nint(y), ny) + } else { + call glabax (gp, Memc[plot_title], xlabel, "") + call ggwind (gp, x1, x2, y1, y2) + } + + # Draw data vector. + call gpline (gp, xv, yv, nx) + + call sfree (sp) +end + + +# IMP_SWIND -- Set all or part of the plotting window if autoscaling is not +# desired. + +procedure imp_swind (n_x1, n_x2, n_y1, n_y2) + +real n_x1, n_x2 # range of world coords in X +real n_y1, n_y2 # range of world coords in Y + +real x1, x2, y1, y2 +common /implcom/ x1, x2, y1, y2 + +begin + if (!IS_INDEF(n_x1)) + x1 = n_x1 + if (!IS_INDEF(n_x2)) + x2 = n_x2 + if (!IS_INDEF(n_y1)) + y1 = n_y1 + if (!IS_INDEF(n_y2)) + y2 = n_y2 +end + + +# IMP_REDRAW -- Erase the old vector and draw a new one in its place. + +procedure imp_redraw (gp, xold, yold, xnew, ynew, npix) + +pointer gp # graphics descriptor +real xold[ARB], yold[ARB] # old data vector +real xnew[ARB], ynew[ARB] # new data vector +int npix # length of the data vectors + +int i, n + +begin + # Erase the old vector and redraw the new in its place, in segments + # of length SEGLEN. These segments must overlap by one pixel to + # produce a continuous output polyline. + + do i = 1, npix, SEGLEN { + n = min (SEGLEN + 1, npix - i + 1) + + # Erase next segment of old vector. + call gseti (gp, G_PLTYPE, 0) + call gpline (gp, xold[i], yold[i], n) + + # Plot same segment of new vector. + call gseti (gp, G_PLTYPE, 1) + call gseti (gp, G_PLCOLOR, 1) + call gpline (gp, xnew[i], ynew[i], n) + } +end + + +# IMP_MARKPOS -- Mark the line or column number on the right axis of the plot. + +procedure imp_markpos (gp, line, nlines) + +pointer gp # graphics descriptor +int line # line or column +int nlines # number of lines or columns +real y, x1, x2, y1, y2 + +begin + if (nlines < 2) + return + + call ggwind (gp, x1, x2, y1, y2) + y = (y2 - y1) / (nlines - 1) * (line - 1) + y1 + call gmark (gp, x2, y, GM_PLUS, 3., 4.) +end + + +# IMP_TRAN -- Transform cursor coordinate to line and column in image. + +procedure imp_tran (gp, x, y, px, py, xvec, nx, ny) + +pointer gp # graphics descriptor +real x, y # cursor coordinate +real px, py # image coordinate +real xvec[nx] # x vector +int nx, ny # number of columns and lines + +int i +real x1, x2, y1, y2, diff, diffmin +bool fp_equalr() + +begin + call ggwind (gp, x1, x2, y1, y2) + if (fp_equalr (y1, y2)) + py = nint (ny / 2.) + else + py = nint ((ny - 1) / (y2 - y1) * (y - y1) + 1) + + px = 1 + diffmin = abs (x - xvec[1]) + do i = 2, nx { + diff = abs (x - xvec[i]) + if (diff < diffmin) { + px = i + diffmin = diff + } + } +end |