aboutsummaryrefslogtreecommitdiff
path: root/noao/obsutil/src/starfocus/stfgraph.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /noao/obsutil/src/starfocus/stfgraph.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'noao/obsutil/src/starfocus/stfgraph.x')
-rw-r--r--noao/obsutil/src/starfocus/stfgraph.x2682
1 files changed, 2682 insertions, 0 deletions
diff --git a/noao/obsutil/src/starfocus/stfgraph.x b/noao/obsutil/src/starfocus/stfgraph.x
new file mode 100644
index 00000000..890dfc81
--- /dev/null
+++ b/noao/obsutil/src/starfocus/stfgraph.x
@@ -0,0 +1,2682 @@
+include <error.h>
+include <gset.h>
+include <mach.h>
+include "starfocus.h"
+
+# Interactive help files. There is one for STARFOCUS and one for PSFMEASUE.
+define STFHELP "starfocus$stfhelp.key"
+define PSFHELP "starfocus$psfhelp.key"
+define PROMPT "Options"
+
+# View ports for all plots.
+define VX1 .15 # Minimum X viewport for left graph
+define VX2 .47 # Maximum X viewport for left graph
+define VX3 .63 # Minimum X viewport for right graph
+define VX4 .95 # Maximum X viewport for right graph
+define VY1 .10 # Minimum Y viewport for bottom graph
+define VY2 .44 # Minimum Y viewport for bottom graph
+define VY3 .54 # Minimum Y viewport for top graph
+define VY4 .88 # Maximum Y viewport for top graph
+
+# Miscellaneous graphics parameters.
+define NMAX 5 # Maximum number of samples for labeling
+define HLCOLOR 2 # Highlight color
+define HLWIDTH 4. # Highlight width
+define GM_MARK GM_CROSS # Point marker
+define GM_MAG GM_PLUS+GM_CROSS # Magnitude marker
+
+
+# STF_GRAPH -- Interactive graphing of results.
+
+procedure stf_graph (sf)
+
+pointer sf #I Starfocus structure
+
+real wx, wy, x, y, r2, r2min, fa[8]
+int i, j, ix, iy, nx, ny, wcs, key, pkey, skey, redraw, clgcur()
+pointer sp, sysidstr, title, cmd, gp, gopen()
+pointer sfd, sfs, sff, current, nearest
+
+data fa/0.,1.,1.,0.,0.,0.,1.,1./
+
+begin
+ call smark (sp)
+ call salloc (sysidstr, SZ_LINE, TY_CHAR)
+ call salloc (title, SZ_LINE, TY_CHAR)
+ call salloc (cmd, SZ_LINE, TY_CHAR)
+
+ # Set system id label
+ call sysid (Memc[sysidstr], SZ_LINE)
+
+ # Open graphics and enter interactive graphics loop
+ SF_GP(sf) = gopen ("stdgraph", NEW_FILE, STDGRAPH)
+ gp = SF_GP(sf)
+ wcs = 0
+ if (SF_NF(sf) > 1)
+ key = 'f'
+ else if (SF_NS(sf) > 1)
+ key = 'a'
+ else
+ key = 'z'
+ pkey = 0
+ skey = 1
+ current = SF_BEST(sf)
+ repeat {
+ switch (key) {
+ case 'q': # Quit
+ break
+ case '?': # Help
+ if (SF_TASK(sf) == PSFMEASURE)
+ call gpagefile (gp, PSFHELP, PROMPT)
+ else
+ call gpagefile (gp, STFHELP, PROMPT)
+ next
+ case ':': # Colon commands
+ iferr (call stf_colon (sf, Memc[cmd], redraw))
+ redraw = NO
+ if (redraw == NO)
+ next
+ case 'a', 'b', 'e', 'f', 'g', 'm', 'p', 't', 'z': # Plots
+ # When there is not enough data for the requested plot
+ # map the key to another one. This is done mostly to
+ # avoid redrawing the same graph when different keys
+ # map to the same pkey. The 'e', 'g', and 'p' key may
+ # select a different object so the check for the same
+ # plot is deferred.
+
+ if (SF_NS(sf) > 1 && SF_NF(sf) > 1) {
+ ;
+ } else if (SF_NS(sf) > 1) {
+ if (key == 'b')
+ key = 'a'
+ if (key == 'f')
+ key = 'm'
+ } else if (SF_NF(sf) > 1) {
+ if (key == 'a' || key == 'b' || key == 'm' || key == 't')
+ key = 'f'
+ } else {
+ key = 'z'
+ }
+
+ switch (key) {
+ case 'e', 'g', 'p':
+ ;
+ default:
+ if (key == pkey)
+ next
+ }
+ case 's': # Toggle plotting of magnitude symbols
+ if (pkey != 'a' && pkey != 'b')
+ next
+ skey = mod (skey+1, 2)
+ case 'u': # Undelete all
+ j = 0
+ do i = 1, SF_NSFD(sf) {
+ sfd = SF_SFD(sf,i)
+ if (SFD_STATUS(sfd) != 0) {
+ SFD_STATUS(sfd) = 0
+ j = j + 1
+ }
+ }
+ if (j == 0)
+ next
+ call stf_fitfocus (sf)
+ case 'd', 'n', 'o', 'r', 'x', 'i', ' ': # Misc
+ ;
+ default: # Unknown
+ call printf ("\007")
+ next
+ }
+
+ # Find the nearest or next object if needed.
+ switch (key) {
+ case 'r', 's', 'u', ':': # Redraw last graph
+ pkey = pkey
+ nearest = current
+ case 'n', 'o': # Renormalize enclosed flux profile
+ if (wcs != 7 || pkey == 'p')
+ next
+ pkey = pkey
+ nearest = current
+ if (key == 'n')
+ call stf_norm (sf, nearest, wx, INDEF)
+ else
+ call stf_norm (sf, nearest, wx, wy)
+ call stf_widths (sf, nearest)
+ call stf_fwhms (sf, nearest)
+ call stf_fitfocus (sf)
+ case ' ': # Select next focus or star
+ switch (pkey) {
+ case 'a', 'm', 't':
+ sff = SFD_SFF(current)
+ for (i=1; SF_SFF(sf,i)!=sff; i=i+1)
+ ;
+ j = SF_NFOCUS(sf)
+ i = mod (i, j) + 1
+ for (; SFF_N(SF_SFF(sf,i))==0; i=mod(i,j)+1)
+ ;
+ if (SF_SFF(sf,i) == sff)
+ next
+ sff = SF_SFF(sf,i)
+ do i = 1, SFF_NSFD(sff) {
+ nearest = SFF_SFD(sff,i)
+ if (SFD_STATUS(nearest) == 0)
+ break
+ }
+ case 'e', 'g', 'p', 'z':
+ switch (wcs) {
+ case 7, 8, 11:
+ for (i=1; SF_SFD(sf,i)!=current; i=i+1)
+ ;
+ j = SF_NSFD(sf)
+ i = mod (i, j) + 1
+ for (; SFD_STATUS(SF_SFD(sf,i))!=0; i=mod(i,j)+1)
+ ;
+ nearest = SF_SFD(sf,i)
+ case 9:
+ sfs = SFD_SFS(current)
+ for (i=1; SFS_SFD(sfs,i)!=current; i=i+1)
+ ;
+ j = SFS_NSFD(sfs)
+ i = mod (i, j) + 1
+ for (; SFD_STATUS(SFS_SFD(sfs,i))!=0; i=mod(i,j)+1)
+ ;
+ nearest = SFS_SFD(sfs,i)
+ if (nearest == current)
+ next
+ case 10:
+ sff = SFD_SFF(current)
+ for (i=1; SFF_SFD(sff,i)!=current; i=i+1)
+ ;
+ j = SFF_NSFD(sff)
+ i = mod (i, j) + 1
+ for (; SFD_STATUS(SFF_SFD(sff,i))!=0; i=mod(i,j)+1)
+ ;
+ nearest = SFF_SFD(sff,i)
+ if (nearest == current)
+ next
+ }
+ default:
+ next
+ }
+ default: # Select nearest to cursor
+ switch (pkey) {
+ case 'a':
+ r2min = MAX_REAL
+ call gctran (gp, wx, wy, wx, wy, wcs, 0)
+ sff = SFD_SFF(current)
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ switch (wcs) {
+ case 1:
+ x = SFD_X(sfd)
+ y = SFD_Y(sfd)
+ case 2:
+ x = SFD_X(sfd)
+ y = SFD_W(sfd)
+ case 3:
+ x = SFD_W(sfd)
+ y = SFD_Y(sfd)
+ case 4:
+ x = SFD_X(sfd)
+ y = SFD_E(sfd)
+ case 5:
+ x = SFD_E(sfd)
+ y = SFD_Y(sfd)
+ }
+ call gctran (gp, x, y, x, y, wcs, 0)
+ r2 = (x-wx)**2 + (y-wy)**2
+ if (r2 < r2min) {
+ r2min = r2
+ nearest = sfd
+ }
+ }
+ case 'b':
+ r2min = MAX_REAL
+ call gctran (gp, wx, wy, wx, wy, wcs, 0)
+ do i = 1, SF_NSTARS(sf) {
+ sfs = SF_SFS(sf,i)
+ if (SFS_N(sfs) == 0)
+ next
+ switch (wcs) {
+ case 1:
+ x = SFD_X(SFS_SFD(sfs,1))
+ y = SFD_Y(SFS_SFD(sfs,1))
+ case 2:
+ x = SFD_X(SFS_SFD(sfs,1))
+ y = SFS_W(sfs)
+ case 3:
+ x = SFS_W(sfs)
+ y = SFD_Y(SFS_SFD(sfs,1))
+ case 4:
+ x = SFD_X(SFS_SFD(sfs,1))
+ y = SFS_F(sfs)
+ case 5:
+ x = SFS_F(sfs)
+ y = SFD_Y(SFS_SFD(sfs,1))
+ }
+ call gctran (gp, x, y, x, y, wcs, 0)
+ r2 = (x-wx)**2 + (y-wy)**2
+ if (r2 < r2min) {
+ r2min = r2
+ nearest = sfs
+ }
+ }
+ sfs = nearest
+ r2min = MAX_REAL
+ do i = 1, SFS_NSFD(sfs) {
+ sfd = SFS_SFD(sfs,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ r2 = SFD_W(sfd)
+ if (r2 < r2min) {
+ r2min = r2
+ nearest = sfd
+ }
+ }
+ case 'e', 'g', 'p':
+ switch (wcs) {
+ case 9:
+ sfs = SFD_SFS(current)
+ i = SFS_N(sfs)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+ ix = max (1, min (nx, nint(wx)))
+ iy = max (1, min (ny, nint(wy)))
+
+ j = 0
+ do i = 1, SFS_NSFD(sfs) {
+ sfd = SFS_SFD(sfs, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ if (ix == 1 + mod (j, nx) && iy == 1 + j / nx) {
+ nearest = sfd
+ break
+ }
+ j = j + 1
+ }
+ case 10:
+ sff = SFD_SFF(current)
+ i = SFF_N(sff)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+ ix = max (1, min (nx, nint(wx)))
+ iy = max (1, min (ny, nint(wy)))
+
+ j = 0
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ if (ix == 1 + mod (j, nx) && iy == 1 + j / nx) {
+ nearest = sfd
+ break
+ }
+ j = j + 1
+ }
+ }
+ if (key == pkey && nearest == current)
+ next
+ default:
+ switch (wcs) {
+ case 1, 2:
+ r2min = MAX_REAL
+ call gctran (gp, wx, wy, wx, wy, wcs, 0)
+ do i = 1, SF_NSFD(sf) {
+ sfd = SF_SFD(sf,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ switch (wcs) {
+ case 1:
+ x = SFD_F(sfd)
+ y = SFD_W(sfd)
+ case 2:
+ x = SFD_F(sfd)
+ y = SFD_E(sfd)
+ }
+ call gctran (gp, x, y, x, y, wcs, 0)
+ r2 = (x-wx)**2 + (y-wy)**2
+ if (r2 < r2min) {
+ r2min = r2
+ nearest = sfd
+ }
+ }
+ case 3, 4, 5, 6:
+ r2min = MAX_REAL
+ call gctran (gp, wx, wy, wx, wy, wcs, 0)
+ sff = SFD_SFF(current)
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ switch (wcs) {
+ case 3:
+ x = -2.5 * log10 (SFS_M(SFD_SFS(sfd))/SF_M(sf))
+ y = SFD_W(sfd)
+ case 4:
+ x = -2.5 * log10 (SFS_M(SFD_SFS(sfd))/SF_M(sf))
+ y = SFD_E(sfd)
+ case 5:
+ x = sqrt ((SFD_X(sfd) - SF_XF(sf)) ** 2 +
+ (SFD_Y(sfd) - SF_YF(sf)) ** 2)
+ y = SFD_W(sfd)
+ case 6:
+ x = sqrt ((SFD_X(sfd) - SF_XF(sf)) ** 2 +
+ (SFD_Y(sfd) - SF_YF(sf)) ** 2)
+ y = SFD_E(sfd)
+ }
+ call gctran (gp, x, y, x, y, wcs, 0)
+ r2 = (x-wx)**2 + (y-wy)**2
+ if (r2 < r2min) {
+ r2min = r2
+ nearest = sfd
+ }
+ }
+ default:
+ nearest = current
+ }
+ }
+
+ # Act on selection for delete or info.
+ switch (key) {
+ case 'd':
+ if (SF_NS(sf) > 1) {
+ sfs = SFD_SFS(nearest)
+ do i = 1, SFS_NSFD(sfs)
+ SFD_STATUS(SFS_SFD(sfs,i)) = 1
+ } else
+ SFD_STATUS(nearest) = 1
+ call stf_fitfocus (sf)
+ case 'x':
+ repeat {
+ switch (key) {
+ case 'f':
+ sff = SFD_SFF(nearest)
+ do i = 1, SFF_NSFD(sff)
+ SFD_STATUS(SFF_SFD(sff,i)) = 1
+ case 'i':
+ sfd = SFD_SFI(nearest)
+ do i = 1, SFI_NSFD(sfd)
+ SFD_STATUS(SFI_SFD(sfd,i)) = 1
+ case 'p':
+ SFD_STATUS(nearest) = 1
+ case 's':
+ sfs = SFD_SFS(nearest)
+ do i = 1, SFS_NSFD(sfs)
+ SFD_STATUS(SFS_SFD(sfs,i)) = 1
+ default:
+ call printf (
+ "Delete image, star, focus, or point? (i|s|f|p)")
+ next
+ }
+ call stf_fitfocus (sf)
+ break
+ } until (clgcur ("graphcur",
+ wx, wy, wcs, key, Memc[cmd], SZ_LINE) == EOF)
+ case 'i':
+ switch (pkey) {
+ case 'b':
+ sfs = SFD_SFS(nearest)
+ call stf_title (sf, NULL, sfs, NULL,
+ Memc[title], SZ_LINE)
+ default:
+ call stf_title (sf, nearest, NULL, NULL,
+ Memc[title], SZ_LINE)
+ }
+ call printf ("%s\n")
+ call pargstr (Memc[title])
+ next
+ default:
+ pkey = key
+ }
+ }
+
+ # If current object has been deleted select another.
+ if (SFD_STATUS(nearest) == 0)
+ current = nearest
+ else
+ current = SF_BEST(sf)
+
+ # Make the graphs. The graph depends on the number of stars
+ # and number of focus values. Note that the pkey has already
+ # been mapped but all the keys are shown for clarity.
+
+ call gclear (gp)
+ call gseti (gp, G_FACOLOR, 0)
+
+ if (SF_NS(sf) > 1 && SF_NF(sf) > 1) {
+ switch (pkey) {
+ case 'a':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 1)
+ call gsview (gp, VX1, VX4, VY1, VY4)
+ call stf_g11 (sf, current, skey, Memc[title])
+ case 'b':
+ call sprintf (Memc[title], SZ_LINE,
+ "Best focus estimates for each star")
+ call gseti (gp, G_WCS, 1)
+ call gsview (gp, VX1, VX4, VY1, VY4)
+ call stf_g12 (sf, current, skey, Memc[title])
+ case 'e':
+ sfs = SFD_SFS(current)
+ call sprintf (Memc[title], SZ_LINE,
+ "Star: x=%.2f, y=%.2f, m=%.2f")
+ call pargr (SFD_X(current))
+ call pargr (SFD_Y(current))
+ call pargr (-2.5 * log10 (SFS_M(sfs) / SF_M(sf)))
+ call gseti (gp, G_WCS, 9)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g2 (sf, current, Memc[title])
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 10)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call stf_g3 (sf, current, Memc[title])
+ case 'f':
+ call gseti (gp, G_WCS, 1)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g1 (sf, current, 'f', 'r', "", "", SF_WTYPE(sf))
+ call gseti (gp, G_WCS, 2)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g1 (sf, current, 'f', 'e', "", "Focus",
+ "Ellipticity")
+ case 'g':
+ sfs = SFD_SFS(current)
+ call sprintf (Memc[title], SZ_LINE,
+ "Star: x=%.2f, y=%.2f, m=%.2f")
+ call pargr (SFD_X(current))
+ call pargr (SFD_Y(current))
+ call pargr (-2.5 * log10 (SFS_M(sfs) / SF_M(sf)))
+ call gseti (gp, G_WCS, 9)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g9 (sf, current, Memc[title])
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 10)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call stf_g10 (sf, current, Memc[title])
+ case 'm':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 3)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g1 (sf, current, 'm', 'r', Memc[title],
+ "", SF_WTYPE(sf))
+ call gseti (gp, G_WCS, 4)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g1 (sf, current, 'm', 'e', "", "Magnitude",
+ "Ellipticity")
+ case 'p':
+ sfs = SFD_SFS(current)
+ call sprintf (Memc[title], SZ_LINE,
+ "Star: x=%.2f, y=%.2f, m=%.2f")
+ call pargr (SFD_X(current))
+ call pargr (SFD_Y(current))
+ call pargr (-2.5 * log10 (SFS_M(sfs) / SF_M(sf)))
+ call gseti (gp, G_WCS, 9)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g4 (sf, current, Memc[title])
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 10)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call stf_g5 (sf, current, Memc[title])
+ case 't':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 5)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g1 (sf, current, 't', 'r', Memc[title],
+ "", SF_WTYPE(sf))
+ call gseti (gp, G_WCS, 6)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g1 (sf, current, 't', 'e', "", "Field radius",
+ "Ellipticity")
+ case 'z':
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX2, VY3, VY4)
+ call stf_g6 (sf, current, "", "", "Enclosed flux")
+ call gseti (gp, G_WCS, 8)
+ call gsview (gp, VX1, VX2, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g7 (sf, current, "", "Radius", "Profile")
+ call gseti (gp, G_WCS, 11)
+ call gsview (gp, VX3, VX4, VY3, VY4)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g8 (sf, current, "", "Enclosed flux", "FWHM")
+
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 0)
+ call gsetr (gp, G_PLWIDTH, 2.0)
+ call gline (gp, 0., 0., 0., 0.)
+ call gtext (gp, 0.5, 0.93, Memc[title], "h=c,v=t")
+ }
+ } else if (SF_NS(sf) > 1) {
+ switch (pkey) {
+ case 'a', 'b':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 1)
+ call gsview (gp, VX1, VX4, VY1, VY4)
+ call stf_g11 (sf, current, skey, Memc[title])
+ case 'e':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 10)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g3 (sf, current, Memc[title])
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g6 (sf, current, Memc[title], "Radius",
+ "Enclosed flux")
+ case 'f', 'm':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 3)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g1 (sf, current, 'm', 'r', Memc[title], "",
+ SF_WTYPE(sf))
+ call gseti (gp, G_WCS, 4)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g1 (sf, current, 'm', 'e', "", "Magnitude",
+ "Ellipticity")
+ case 'g':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 10)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g10 (sf, current, Memc[title])
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 11)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g8 (sf, current, Memc[title], "Enclosed flux",
+ "FWHM")
+ case 'p':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 10)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g5 (sf, current, Memc[title])
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g7 (sf, current, Memc[title], "Radius", "Profile")
+ case 't':
+ sff = SFD_SFF(current)
+ call stf_title (sf, NULL, NULL, sff, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 5)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g1 (sf, current, 't', 'r', Memc[title], "",
+ SF_WTYPE(sf))
+ call gseti (gp, G_WCS, 6)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g1 (sf, current, 't', 'e', "", "Field radius",
+ "Ellipticity")
+ case 'z':
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX2, VY3, VY4)
+ call stf_g6 (sf, current, "", "", "Enclosed flux")
+ call gseti (gp, G_WCS, 8)
+ call gsview (gp, VX1, VX2, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g7 (sf, current, "", "Radius", "Profile")
+ call gseti (gp, G_WCS, 11)
+ call gsview (gp, VX3, VX4, VY3, VY4)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g8 (sf, current, "", "Enclosed flux", "FWHM")
+
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 0)
+ call gsetr (gp, G_PLWIDTH, 2.0)
+ call gline (gp, 0., 0., 0., 0.)
+ call gtext (gp, 0.5, 0.93, Memc[title], "h=c,v=t")
+ }
+ } else if (SF_NF(sf) > 1) {
+ switch (pkey) {
+ case 'a', 'b', 'f', 'm', 't':
+ call gseti (gp, G_WCS, 1)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g1 (sf, current, 'f', 'r', "", "", SF_WTYPE(sf))
+ call gseti (gp, G_WCS, 2)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g1 (sf, current, 'f', 'e', "", "Focus",
+ "Ellipticity")
+ case 'e':
+ sfs = SFD_SFS(current)
+ call sprintf (Memc[title], SZ_LINE,
+ "Star: x=%.2f, y=%.2f, m=%.2f")
+ call pargr (SFD_X(current))
+ call pargr (SFD_Y(current))
+ call pargr (-2.5 * log10 (SFS_M(sfs) / SF_M(sf)))
+ call gseti (gp, G_WCS, 9)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g2 (sf, current, Memc[title])
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g6 (sf, current, Memc[title], "Radius",
+ "Enclosed flux")
+ case 'g':
+ sfs = SFD_SFS(current)
+ call sprintf (Memc[title], SZ_LINE,
+ "Star: x=%.2f, y=%.2f, m=%.2f")
+ call pargr (SFD_X(current))
+ call pargr (SFD_Y(current))
+ call pargr (-2.5 * log10 (SFS_M(sfs) / SF_M(sf)))
+ call gseti (gp, G_WCS, 9)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g9 (sf, current, Memc[title])
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 11)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g8 (sf, current, Memc[title], "Enclosed flux",
+ "FWHM")
+ case 'p':
+ sfs = SFD_SFS(current)
+ call sprintf (Memc[title], SZ_LINE,
+ "Star: x=%.2f, y=%.2f, m=%.2f")
+ call pargr (SFD_X(current))
+ call pargr (SFD_Y(current))
+ call pargr (-2.5 * log10 (SFS_M(sfs) / SF_M(sf)))
+ call gseti (gp, G_WCS, 9)
+ call gsview (gp, VX1, VX4, VY3, VY4)
+ call stf_g4 (sf, current, Memc[title])
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX4, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g7 (sf, current, Memc[title], "Radius",
+ "profile")
+ case 'z':
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX2, VY3, VY4)
+ call stf_g6 (sf, current, "", "", "Enclosed flux")
+ call gseti (gp, G_WCS, 8)
+ call gsview (gp, VX1, VX2, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g7 (sf, current, "", "Radius", "Profile")
+ call gseti (gp, G_WCS, 11)
+ call gsview (gp, VX3, VX4, VY3, VY4)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g8 (sf, current, "", "Enclosed flux", "FWHM")
+
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 0)
+ call gsetr (gp, G_PLWIDTH, 2.0)
+ call gline (gp, 0., 0., 0., 0.)
+ call gtext (gp, 0.5, 0.93, Memc[title], "h=c,v=t")
+ }
+ } else {
+ switch (pkey) {
+ case 'a', 'b', 'f', 'm', 'p', 'z', 'e', 't':
+ call gseti (gp, G_WCS, 7)
+ call gsview (gp, VX1, VX2, VY3, VY4)
+ call stf_g6 (sf, current, "", "", "Enclosed flux")
+ call gseti (gp, G_WCS, 8)
+ call gsview (gp, VX1, VX2, VY1, VY2)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g7 (sf, current, "", "Radius", "Profile")
+ call gseti (gp, G_WCS, 11)
+ call gsview (gp, VX3, VX4, VY3, VY4)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+ call stf_g8 (sf, current, "", "Enclosed flux", "FWHM")
+
+ call stf_title (sf, current, NULL, NULL, Memc[title],
+ SZ_LINE)
+ call gseti (gp, G_WCS, 0)
+ call gsetr (gp, G_PLWIDTH, 2.0)
+ call gline (gp, 0., 0., 0., 0.)
+ call gtext (gp, 0.5, 0.93, Memc[title], "h=c,v=t")
+ }
+ }
+
+ # Add banner title.
+ call stf_title (sf, NULL, NULL, NULL, Memc[title], SZ_LINE)
+ call gseti (gp, G_WCS, 0)
+ call gsetr (gp, G_PLWIDTH, 2.0)
+ call gline (gp, 0., 0., 0., 0.)
+ call gtext (gp, 0.5, 0.99, Memc[sysidstr], "h=c,v=t")
+ call gtext (gp, 0.5, 0.96, Memc[title], "h=c,v=t")
+
+ if (SF_NSFD(sf) == 1)
+ break
+
+ } until (clgcur ("graphcur", wx, wy, wcs, key, Memc[cmd], SZ_LINE)==EOF)
+
+ call gclose (gp)
+ call sfree (sp)
+end
+
+
+# List of colon commands.
+define CMDS "|show|level|size|scale|radius|xcenter|ycenter\
+ |overplot|beta|"
+define SHOW 1 # Show current results
+define LEVEL 2 # Measurement level
+define SIZE 3 # Size type
+define SCALE 4 # Pixel scale
+define RADIUS 5 # Maximum radius
+define XCENTER 6 # X field center
+define YCENTER 7 # Y field center
+define OVERPLOT 8 # Overplot best profile
+define BETA 9 # Beta value for Moffat function
+
+# STF_COLON -- Respond to colon command.
+
+procedure stf_colon (sf, cmd, redraw)
+
+pointer sf #I Starfocus pointer
+char cmd[ARB] #I Colon command
+int redraw #O Redraw?
+
+bool bval
+real rval, stf_r2i()
+int i, j, ncmd, nscan(), strdic(), open(), btoi()
+pointer sp, str, sfd
+errchk open, delete, stf_log, stf_norm, stf_radius, stf_fitfocus
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_FNAME, TY_CHAR)
+
+ # Scan the command string and get the first word.
+ call sscan (cmd)
+ call gargwrd (Memc[str], SZ_FNAME)
+ ncmd = strdic (Memc[str], Memc[str], SZ_FNAME, CMDS)
+
+ switch (ncmd) {
+ case SHOW:
+ call gargwrd (Memc[str], SZ_FNAME)
+ iferr {
+ if (nscan() == 1) {
+ call mktemp ("tmp$iraf", Memc[str], SZ_FNAME)
+ i = open (Memc[str], APPEND, TEXT_FILE)
+ call stf_log (sf, i)
+ call close (i)
+ call gpagefile (SF_GP(sf), Memc[str], "starfocus")
+ call delete (Memc[str])
+ } else {
+ i = open (Memc[str], APPEND, TEXT_FILE)
+ call stf_log (sf, i)
+ call close (i)
+ }
+ } then
+ call erract (EA_WARN)
+ redraw = NO
+ case LEVEL:
+ call gargr (rval)
+ if (nscan() == 2) {
+ if (rval > 1.)
+ rval = rval / 100.
+ SF_LEVEL(sf) = max (0.05, min (0.95, rval))
+ do i = 1, SF_NSFD(sf) {
+ sfd = SF_SFD(sf,i)
+ call stf_radius (sf, sfd, SF_LEVEL(sf), SFD_R(sfd))
+ }
+ if (SF_WCODE(sf) == 1)
+ call stf_fitfocus (sf)
+ redraw = YES
+ } else {
+ call printf ("level %g\n")
+ call pargr (SF_LEVEL(sf))
+ redraw = NO
+ }
+ case SIZE:
+ call gargwrd (Memc[str], SZ_FNAME)
+ if (nscan() == 2) {
+ ncmd = strdic (Memc[str], Memc[str], SZ_FNAME, SF_WTYPES)
+ if (ncmd == 0) {
+ call eprintf ("Invalid size type\n")
+ redraw = NO
+ } else {
+ call strcpy (Memc[str], SF_WTYPE(sf), SF_SZWTYPE)
+ SF_WCODE(sf) = ncmd
+ do i = 1, SF_NSFD(sf) {
+ sfd = SF_SFD(sf,i)
+ switch (SF_WCODE(sf)) {
+ case 1:
+ SFD_W(sfd) = SFD_R(sfd)
+ case 2:
+ SFD_W(sfd) = SFD_DFWHM(sfd)
+ case 3:
+ SFD_W(sfd) = SFD_GFWHM(sfd)
+ case 4:
+ SFD_W(sfd) = SFD_MFWHM(sfd)
+ }
+ call stf_fwhms (sf, sfd)
+ }
+ call stf_fitfocus (sf)
+ redraw = YES
+ }
+ } else {
+ call printf ("size %s\n")
+ call pargstr (SF_WTYPE(sf))
+ redraw = NO
+ }
+ case SCALE:
+ call gargr (rval)
+ if (nscan() == 2) {
+ rval = rval / SF_SCALE(sf)
+ SF_SCALE(sf) = SF_SCALE(sf) * rval
+ do i = 1, SF_NSFD(sf) {
+ sfd = SF_SFD(sf,i)
+ switch (SF_WCODE(sf)) {
+ case 1:
+ SFD_R(sfd) = SFD_R(sfd) * rval
+ SFD_W(sfd) = SFD_R(sfd)
+ case 2:
+ SFD_DFWHM(sfd) = SFD_DFWHM(sfd) * rval
+ SFD_W(sfd) = SFD_DFWHM(sfd)
+ case 3:
+ SFD_SIGMA(sfd) = SFD_SIGMA(sfd) * rval
+ SFD_GFWHM(sfd) = SFD_GFWHM(sfd) * rval
+ SFD_W(sfd) = SFD_GFWHM(sfd)
+ case 4:
+ SFD_ALPHA(sfd) = SFD_ALPHA(sfd) * rval
+ SFD_MFWHM(sfd) = SFD_MFWHM(sfd) * rval
+ SFD_W(sfd) = SFD_MFWHM(sfd)
+ }
+ do j = 1, 19
+ SFD_FWHM(sfd,j) = SFD_FWHM(sfd,j) * rval
+ }
+ do i = 1, SF_NSTARS(sf) {
+ sfd = SF_SFS(sf,i)
+ SFS_W(sfd) = SFS_W(sfd) * rval
+ }
+ do i = 1, SF_NFOCUS(sf) {
+ sfd = SF_SFF(sf,i)
+ SFF_W(sfd) = SFF_W(sfd) * rval
+ }
+ SF_W(sf) = SF_W(sf) * rval
+ redraw = YES
+ } else {
+ call printf ("scale %g\n")
+ call pargr (SF_SCALE(sf))
+ redraw = NO
+ }
+ case RADIUS:
+ call gargr (rval)
+ if (nscan() == 2) {
+ j = stf_r2i (rval) + 1
+ SF_RADIUS(sf) = rval
+ do i = 1, SF_NSFD(sf) {
+ sfd = SF_SFD(sf,i)
+ if (j > SFD_NPMAX(sfd))
+ next
+ SFD_NP(sfd) = j
+ SFD_RADIUS(sf) = SF_RADIUS(sf)
+ call stf_norm (sf, sfd, INDEF, INDEF)
+ call stf_widths (sf, sfd)
+ call stf_fwhms (sf, sfd)
+ }
+ call stf_fitfocus (sf)
+ redraw = YES
+ } else {
+ call printf ("radius %g\n")
+ call pargr (SF_RADIUS(sf))
+ redraw = NO
+ }
+ case XCENTER:
+ call gargr (rval)
+ if (nscan() == 2) {
+ if (IS_INDEF(rval))
+ SF_XF(sf) = (SF_NCOLS(sf) + 1) / 2.
+ else
+ SF_XF(sf) = rval
+ redraw = NO
+ } else {
+ call printf ("xcenter %g\n")
+ call pargr (SF_XF(sf))
+ redraw = NO
+ }
+ case YCENTER:
+ call gargr (rval)
+ if (nscan() == 2) {
+ if (IS_INDEF(rval))
+ SF_YF(sf) = (SF_NLINES(sf) + 1) / 2.
+ else
+ SF_YF(sf) = rval
+ redraw = NO
+ } else {
+ call printf ("ycenter %g\n")
+ call pargr (SF_YF(sf))
+ redraw = NO
+ }
+ case OVERPLOT:
+ call gargb (bval)
+ if (nscan() == 2) {
+ SF_OVRPLT(sf) = btoi (bval)
+ redraw = YES
+ } else {
+ call printf ("overplot %b\n")
+ call pargi (SF_OVRPLT(sf))
+ redraw = NO
+ }
+ case BETA:
+ call gargr (rval)
+ if (nscan() == 2) {
+ SF_BETA(sf) = rval
+ do i = 1, SF_NSFD(sf) {
+ sfd = SF_SFD(sf,i)
+ call stf_widths (sf, sfd)
+ switch (SF_WCODE(sf)) {
+ case 1:
+ SFD_W(sfd) = SFD_R(sfd)
+ case 2:
+ SFD_W(sfd) = SFD_DFWHM(sfd)
+ case 3:
+ SFD_W(sfd) = SFD_GFWHM(sfd)
+ case 4:
+ SFD_W(sfd) = SFD_MFWHM(sfd)
+ }
+ call stf_fwhms (sf, sfd)
+ }
+ call stf_fitfocus (sf)
+ redraw = YES
+ } else {
+ call printf ("beta %g\n")
+ call pargr (SF_BETA(sf))
+ redraw = NO
+ }
+ default:
+ call printf ("Unrecognized or ambiguous command\007")
+ redraw = NO
+ }
+
+ call sfree (sp)
+end
+
+
+# STF_G1 -- Plot of size/ellip vs. focus/mag/radius.
+
+procedure stf_g1 (sf, current, xkey, ykey, title, xlabel, ylabel)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+int xkey #I X axis key
+int ykey #I Y axis key
+char title[ARB] #I Title
+char xlabel[ARB] #I X label
+char ylabel[ARB] #I Y label
+
+int i, j
+bool hl
+real x, x1, x2, dx, y, y1, y2, dy
+pointer gp, sff, sfd
+
+begin
+ # Determine data range
+ x1 = MAX_REAL
+ x2 = -MAX_REAL
+ switch (ykey) {
+ case 'r':
+ y1 = SF_W(sf)
+ y2 = 1.5 * SF_W(sf)
+ case 'e':
+ y1 = 0
+ y2 = 1
+ }
+ do j = 1, SF_NFOCUS(sf) {
+ sff = SF_SFF(sf,j)
+ if (xkey != 'f' && sff != SFD_SFF(current))
+ next
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) == 0) {
+ switch (xkey) {
+ case 'f':
+ x = SFD_F(sfd)
+ case 'm':
+ x = -2.5 * log10 (SFS_M(SFD_SFS(sfd)) / SF_M(sf))
+ case 't':
+ x = sqrt ((SFD_X(sfd) - SF_XF(sf)) ** 2 +
+ (SFD_Y(sfd) - SF_YF(sf)) ** 2)
+ }
+ switch (ykey) {
+ case 'r':
+ y = SFD_W(sfd)
+ case 'e':
+ y = SFD_E(sfd)
+ }
+ x1 = min (x1, x)
+ x2 = max (x2, x)
+ y1 = min (y1, y)
+ y2 = max (y2, y)
+ }
+ }
+ }
+
+ dx = (x2 - x1)
+ dy = (y2 - y1)
+ x1 = x1 - dx * 0.05
+ x2 = x2 + dx * 0.05
+ y1 = y1 - dy * 0.05
+ y2 = y2 + dy * 0.05
+ gp = SF_GP (sf)
+ call gswind (gp, x1, x2, y1, y2)
+ call glabax (gp, title, xlabel, ylabel)
+
+ do j = 1, SF_NFOCUS(sf) {
+ sff = SF_SFF(sf,j)
+ if (xkey != 'f' && sff != SFD_SFF(current))
+ next
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) == 0) {
+ hl = false
+ switch (xkey) {
+ case 'f':
+ x = SFD_F(sfd)
+ #hl = (SFD_SFS(sfd) == SFD_SFS(current))
+ case 'm':
+ x = -2.5 * log10 (SFS_M(SFD_SFS(sfd)) / SF_M(sf))
+ #hl = (SFD_SFF(sfd) != SFD_SFF(current))
+ case 't':
+ x = sqrt ((SFD_X(sfd) - SF_XF(sf)) ** 2 +
+ (SFD_Y(sfd) - SF_YF(sf)) ** 2)
+ #hl = (SFD_SFF(sfd) != SFD_SFF(current))
+ }
+ switch (ykey) {
+ case 'r':
+ y = SFD_W(sfd)
+ case 'e':
+ y = SFD_E(sfd)
+ }
+ if (hl) {
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ if (sfd == current)
+ call gmark (gp, x, y, GM_BOX, 3., 3.)
+ call gmark (gp, x, y, GM_PLUS, 3., 3.)
+ call gseti (gp, G_PLCOLOR, 1)
+ } else
+ call gmark (gp, x, y, GM_MARK, 2., 2.)
+ }
+ }
+ }
+
+ call gseti (gp, G_PLTYPE, 2)
+ if (xkey == 'f')
+ call gline (gp, SF_F(sf), y1, SF_F(sf), y2)
+ if (ykey == 'r')
+ call gline (gp, x1, SF_W(sf), x2, SF_W(sf))
+ call gseti (gp, G_PLTYPE, 1)
+end
+
+
+# STF_G2 -- Enclosed flux profiles for a given star.
+
+procedure stf_g2 (sf, current, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+char title[ARB] #I Title
+
+int i, j, np, np1, nx, ny, ix, iy
+real vx, dvx, vy, dvy, x1, x2, y1, y2, z, z1, r, r1, r2, dr, fa[10]
+pointer sp, str, gp, sfs, sfd, asi
+real stf_i2r(), stf_r2i(), asieval()
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ gp = SF_GP(sf)
+ sfs = SFD_SFS(current)
+ np = SFD_NP(current)
+
+ # Set grid layout
+ i = SFS_N(sfs)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+
+ # Set subview port parameters
+ call ggview (gp, vx, dvx, vy, dvy)
+ dvx = (dvx - vx) / nx
+ dvy = (dvy - vy) / ny
+
+ # Set data window parameters
+ x1 = -0.05
+ x2 = 1.05
+ y1 = -0.15
+ y2 = 1.05
+ call gswind (gp, x1, x2, y1, y2)
+
+ # Set fill area
+ fa[1] = x1; fa[6] = y1
+ fa[2] = x2; fa[7] = y1
+ fa[3] = x2; fa[8] = y2
+ fa[4] = x1; fa[9] = y2
+ fa[5] = x1; fa[10] = y1
+
+ # Draw profiles.
+ j = 0
+ do i = 1, SFS_NSFD(sfs) {
+ sfd = SFS_SFD(sfs, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ np1 = SFD_NP(sfd)
+ ix = 1 + mod (j, nx)
+ iy = 1 + j / nx
+ j = j + 1
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ call gfill (gp, fa, fa[6], 4, GF_SOLID)
+ call gseti (gp, G_DRAWTICKS, NO)
+ call glabax (gp, "", "", "")
+ if (sfd == current) {
+ call gsview (gp, vx+dvx*(ix-1)+.005, vx+dvx*ix-.005,
+ vy+dvy*(ny-iy)+.005, vy+(ny-iy+1)*dvy-.005)
+ call gsetr (gp, G_PLWIDTH, HLWIDTH)
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ call gpline (gp, fa, fa[6], 5)
+ call gsetr (gp, G_PLWIDTH, 1.)
+ call gseti (gp, G_PLCOLOR, 1)
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ }
+
+ asi = SFD_ASI1(sfd)
+ r2 = stf_i2r (real(np))
+ call gamove (gp, 0., 0.)
+ for (z = 1.; z <= np1; z = z + 0.1)
+ call gadraw (gp, stf_i2r(z)/r2, asieval(asi,z))
+ if (SF_OVRPLT(sf) == YES && sfd != SF_BEST(sf)) {
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ np1 = SFD_NP(SF_BEST(sf))
+ asi = SFD_ASI1(SF_BEST(sf))
+ r1 = stf_i2r (1.)
+ r2 = stf_i2r (real(np))
+ dr = 0.05 * (r2 - r1)
+ for (r = r1; r <= r2; r = r + dr) {
+ z = stf_r2i (r)
+ z1 = stf_r2i (r+0.7*dr)
+ if (z > 1. && z1 <= np1)
+ call gline (gp, r/r2, asieval(asi,z),
+ (r+0.7*dr)/r2, asieval(asi,z1))
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call sprintf (Memc[str], SZ_LINE, "%.3g")
+ call pargr (SFD_W(sfd))
+ call gtext (gp, 0.95, -0.1, Memc[str], "h=r;v=b")
+ if (nx < NMAX && ny < NMAX) {
+ call sprintf (Memc[str], SZ_LINE, "%.4g")
+ call pargr (SFD_F(sfd))
+ call gtext (gp, 0.05, -0.1, Memc[str], "h=l;v=b")
+ }
+ }
+
+ call gsview (gp, vx, vx+nx*dvx, vy, vy+ny*dvy)
+ call gswind (gp, 0.5, 0.5+nx, 0.5+ny, 0.5)
+ call gamove (gp, 1., 1.)
+
+ # Draw label
+ call gseti (gp, G_DRAWAXES, 0)
+ call glabax (gp, title, "", "")
+ call gseti (gp, G_DRAWAXES, 3)
+
+ call sfree (sp)
+end
+
+
+# STF_G3 -- Enclosed flux profiles for a given focus.
+
+procedure stf_g3 (sf, current, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+char title[ARB] #I Title
+
+int i, j, np, np1, nx, ny, ix, iy
+real vx, dvx, vy, dvy, x1, x2, y1, y2, z, z1, r, r1, r2, dr, fa[10]
+pointer sp, str, gp, sff, sfd, asi
+real stf_i2r(), stf_r2i(), asieval()
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ gp = SF_GP(sf)
+ sff = SFD_SFF(current)
+ np = SFD_NP(current)
+
+ # Set grid layout
+ i = SFF_N(sff)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+
+ # Set subview port parameters
+ call ggview (gp, vx, dvx, vy, dvy)
+ dvx = (dvx - vx) / nx
+ dvy = (dvy - vy) / ny
+
+ # Set data window parameters
+ x1 = -0.05
+ x2 = 1.05
+ y1 = -0.2
+ y2 = 1.05
+ call gswind (gp, x1, x2, y1, y2)
+
+ # Set fill area
+ fa[1] = x1; fa[6] = y1
+ fa[2] = x2; fa[7] = y1
+ fa[3] = x2; fa[8] = y2
+ fa[4] = x1; fa[9] = y2
+ fa[5] = x1; fa[10] = y1
+
+ # Draw profiles.
+ j = 0
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ np1 = SFD_NP(sfd)
+ ix = 1 + mod (j, nx)
+ iy = 1 + j / nx
+ j = j + 1
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ call gfill (gp, fa, fa[6], 4, GF_SOLID)
+ call gseti (gp, G_DRAWTICKS, NO)
+ call glabax (gp, "", "", "")
+ if (sfd == current) {
+ call gsview (gp, vx+dvx*(ix-1)+.005, vx+dvx*ix-.005,
+ vy+dvy*(ny-iy)+.005, vy+(ny-iy+1)*dvy-.005)
+ call gsetr (gp, G_PLWIDTH, HLWIDTH)
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ call gpline (gp, fa, fa[6], 5)
+ call gsetr (gp, G_PLWIDTH, 1.)
+ call gseti (gp, G_PLCOLOR, 1)
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ }
+
+ asi = SFD_ASI1(sfd)
+ r2 = stf_i2r (real(np))
+ call gamove (gp, 0., 0.)
+ for (z = 1.; z <= np1; z = z + 0.1)
+ call gadraw (gp, stf_i2r(z)/r2, asieval(asi,z))
+ if (SF_OVRPLT(sf) == YES && sfd != SF_BEST(sf)) {
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ np1 = SFD_NP(SF_BEST(sf))
+ asi = SFD_ASI1(SF_BEST(sf))
+ r1 = stf_i2r (1.)
+ r2 = stf_i2r (real(np))
+ dr = 0.05 * (r2 - r1)
+ for (r = r1; r <= r2; r = r + dr) {
+ z = stf_r2i (r)
+ z1 = stf_r2i (r+0.7*dr)
+ if (z > 1. && z1 <= np1)
+ call gline (gp, r/r2, asieval(asi,z),
+ (r+0.7*dr)/r2, asieval(asi,z1))
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call sprintf (Memc[str], SZ_LINE, "%.3g")
+ call pargr (SFD_W(sfd))
+ call gtext (gp, 0.95, -.1, Memc[str], "h=r;v=b")
+ if (nx < NMAX && ny < NMAX) {
+ call sprintf (Memc[str], SZ_LINE, "%d %d")
+ call pargr (SFD_X(sfd))
+ call pargr (SFD_Y(sfd))
+ call gtext (gp, 0.05, -.1, Memc[str], "h=l;v=b")
+ }
+ }
+
+ call gsview (gp, vx, vx+nx*dvx, vy, vy+ny*dvy)
+ call gswind (gp, 0.5, 0.5+nx, 0.5+ny, 0.5)
+ call gamove (gp, 1., 1.)
+
+ # Draw label
+ call gseti (gp, G_DRAWAXES, 0)
+ call glabax (gp, title, "", "")
+ call gseti (gp, G_DRAWAXES, 3)
+
+ call sfree (sp)
+end
+
+
+# STF_G4 -- Radial profiles (derivative of enclosed flux) for a given star.
+
+procedure stf_g4 (sf, current, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+char title[ARB] #I Title
+
+int i, j, np, np1, nx, ny, ix, iy
+real vx, dvx, vy, dvy, x1, x2, y1, y2, z, z1, r, r1, r2, dr, rmax, fa[10]
+pointer sp, str, gp, sfs, sfd, asi
+real stf_i2r(), stf_r2i(), asieval()
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ gp = SF_GP(sf)
+ sfs = SFD_SFS(current)
+ np = SFD_NP(current)
+
+ # Set grid layout
+ i = SFS_N(sfs)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+
+ # Set subview port parameters
+ call ggview (gp, vx, dvx, vy, dvy)
+ dvx = (dvx - vx) / nx
+ dvy = (dvy - vy) / ny
+
+ # Set data window parameters
+ x1 = -0.05
+ x2 = 1.05
+ z = SF_YP2(sf) - SF_YP1(sf)
+ y1 = SF_YP1(sf) - 0.05 * z
+ y2 = SF_YP2(sf) + 0.15 * z
+
+ # Set fill area
+ fa[1] = x1; fa[6] = y1
+ fa[2] = x2; fa[7] = y1
+ fa[3] = x2; fa[8] = y2
+ fa[4] = x1; fa[9] = y2
+ fa[5] = x1; fa[10] = y1
+
+ # Draw profiles.
+ j = 0
+ do i = 1, SFS_NSFD(sfs) {
+ sfd = SFS_SFD(sfs, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ np1 = SFD_NP(sfd)
+ ix = 1 + mod (j, nx)
+ iy = 1 + j / nx
+ j = j + 1
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ call gswind (gp, x1, x2, y1, y2)
+ call gfill (gp, fa, fa[6], 4, GF_SOLID)
+ call gseti (gp, G_DRAWTICKS, NO)
+ call glabax (gp, "", "", "")
+ if (sfd == current) {
+ call gsview (gp, vx+dvx*(ix-1)+.005, vx+dvx*ix-.005,
+ vy+dvy*(ny-iy)+.005, vy+(ny-iy+1)*dvy-.005)
+ call gsetr (gp, G_PLWIDTH, HLWIDTH)
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ call gpline (gp, fa, fa[6], 5)
+ call gsetr (gp, G_PLWIDTH, 1.)
+ call gseti (gp, G_PLCOLOR, 1)
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ }
+
+ asi = SFD_ASI2(sfd)
+ rmax = stf_i2r (real(np))
+ z = SF_XP1(sf)
+ call gamove (gp, stf_i2r(z)/rmax, asieval(asi,z))
+ for (; z <= SF_XP2(sf); z = z + 0.1)
+ call gadraw (gp, stf_i2r(z)/rmax, asieval(asi,z))
+ if (SF_OVRPLT(sf) == YES && sfd != SF_BEST(sf)) {
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ np1 = SFD_NP(SF_BEST(sf))
+ asi = SFD_ASI2(SF_BEST(sf))
+ rmax = stf_i2r (real(np))
+ r1 = stf_i2r (SF_XP1(sf))
+ r2 = stf_i2r (SF_XP2(sf))
+ dr = 0.05 * (rmax - stf_i2r(1.))
+ for (r = r1; r <= r2; r = r + dr) {
+ z = stf_r2i (r)
+ z1 = stf_r2i (r+0.7*dr)
+ if (z > 1. && z1 <= np1)
+ call gline (gp, r/rmax, asieval(asi,z),
+ (r+0.7*dr)/rmax, asieval(asi,z1))
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gswind (gp, 0., 1., 0., 1.)
+ call sprintf (Memc[str], SZ_LINE, "%.3g")
+ call pargr (SFD_W(sfd))
+ call gtext (gp, 0.95, 0.98, Memc[str], "h=r;v=t")
+ if (nx < NMAX && ny < NMAX) {
+ call sprintf (Memc[str], SZ_LINE, "%.4g")
+ call pargr (SFD_F(sfd))
+ call gtext (gp, 0.05, 0.98, Memc[str], "h=l;v=t")
+ }
+ }
+
+ call gsview (gp, vx, vx+nx*dvx, vy, vy+ny*dvy)
+ call gswind (gp, 0.5, 0.5+nx, 0.5+ny, 0.5)
+ call gamove (gp, 1., 1.)
+
+ # Draw label
+ call gseti (gp, G_DRAWAXES, 0)
+ call glabax (gp, title, "", "")
+ call gseti (gp, G_DRAWAXES, 3)
+
+ call sfree (sp)
+end
+
+
+# STF_G5 -- Radial profiles (derivative of enclosed flux) for a given focus.
+
+procedure stf_g5 (sf, current, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+char title[ARB] #I Title
+
+int i, j, np, np1, nx, ny, ix, iy
+real vx, dvx, vy, dvy, x1, x2, y1, y2, z, z1, r, r1, r2, dr, rmax, fa[10]
+pointer sp, str, gp, sff, sfd, asi
+real stf_i2r(), stf_r2i(), asieval()
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ gp = SF_GP(sf)
+ sff = SFD_SFF(current)
+ np = SFD_NP(current)
+
+ # Set grid layout
+ i = SFF_N(sff)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+
+ # Set subview port parameters
+ call ggview (gp, vx, dvx, vy, dvy)
+ dvx = (dvx - vx) / nx
+ dvy = (dvy - vy) / ny
+
+ # Set data window parameters
+ x1 = -0.05
+ x2 = 1.05
+ z = SF_YP2(sf) - SF_YP1(sf)
+ y1 = SF_YP1(sf) - 0.05 * z
+ y2 = SF_YP2(sf) + 0.15 * z
+
+ # Set fill area
+ fa[1] = x1; fa[6] = y1
+ fa[2] = x2; fa[7] = y1
+ fa[3] = x2; fa[8] = y2
+ fa[4] = x1; fa[9] = y2
+ fa[5] = x1; fa[10] = y1
+
+ # Draw profiles.
+ j = 0
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ np1 = SFD_NP(sfd)
+ ix = 1 + mod (j, nx)
+ iy = 1 + j / nx
+ j = j + 1
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ call gswind (gp, x1, x2, y1, y2)
+ call gfill (gp, fa, fa[6], 4, GF_SOLID)
+ call gseti (gp, G_DRAWTICKS, NO)
+ call glabax (gp, "", "", "")
+ if (sfd == current) {
+ call gsview (gp, vx+dvx*(ix-1)+.005, vx+dvx*ix-.005,
+ vy+dvy*(ny-iy)+.005, vy+(ny-iy+1)*dvy-.005)
+ call gsetr (gp, G_PLWIDTH, HLWIDTH)
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ call gpline (gp, fa, fa[6], 5)
+ call gsetr (gp, G_PLWIDTH, 1.)
+ call gseti (gp, G_PLCOLOR, 1)
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ }
+
+ asi = SFD_ASI2(sfd)
+ rmax = stf_i2r (real(np))
+ z = SF_XP1(sf)
+ call gamove (gp, stf_i2r(z)/rmax, asieval(asi,z))
+ for (; z <= SF_XP2(sf); z = z + 0.1)
+ call gadraw (gp, stf_i2r(z)/rmax, asieval(asi,z))
+ if (SF_OVRPLT(sf) == YES && sfd != SF_BEST(sf)) {
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ np1 = SFD_NP(SF_BEST(sf))
+ asi = SFD_ASI2(SF_BEST(sf))
+ rmax = stf_i2r (real(np))
+ r1 = stf_i2r (SF_XP1(sf))
+ r2 = stf_i2r (SF_XP2(sf))
+ dr = 0.05 * (rmax - stf_i2r (1.))
+ for (r = r1; r <= r2; r = r + dr) {
+ z = stf_r2i (r)
+ z1 = stf_r2i (r+0.7*dr)
+ if (z > 1. && z1 <= np1)
+ call gline (gp, r/rmax, asieval(asi,z),
+ (r+0.7*dr)/rmax, asieval(asi,z1))
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gswind (gp, 0., 1., 0., 1.)
+ call sprintf (Memc[str], SZ_LINE, "%.3g")
+ call pargr (SFD_W(sfd))
+ call gtext (gp, 0.95, 0.98, Memc[str], "h=r;v=t")
+ if (nx < NMAX && ny < NMAX) {
+ call sprintf (Memc[str], SZ_LINE, "%d %d")
+ call pargr (SFD_X(sfd))
+ call pargr (SFD_Y(sfd))
+ call gtext (gp, 0.05, 0.98, Memc[str], "h=l;v=t")
+ }
+ }
+
+ call gsview (gp, vx, vx+nx*dvx, vy, vy+ny*dvy)
+ call gswind (gp, 0.5, 0.5+nx, 0.5+ny, 0.5)
+ call gamove (gp, 1., 1.)
+
+ # Draw label
+ call gseti (gp, G_DRAWAXES, 0)
+ call glabax (gp, title, "", "")
+ call gseti (gp, G_DRAWAXES, 3)
+
+ call sfree (sp)
+end
+
+
+# STF_G6 -- Enclosed flux profile of a star.
+
+procedure stf_g6 (sf, current, title, xlabel, ylabel)
+
+pointer sf #I Starfocus pointer
+pointer current #I Star pointer
+char title[ARB] #I Title
+char xlabel[ARB] #I X label
+char ylabel[ARB] #I Y label
+
+int np, np1
+real scale, level, radius, flux, profile
+pointer gp, asi
+
+real x1, x2, y1, y2, z, z1, r, r1, r2, dr
+real stf_i2r(), stf_r2i(), asieval()
+
+begin
+ gp = SF_GP(sf)
+ level = SF_LEVEL(sf)
+ scale = SF_SCALE(sf)
+ np = SFD_NP(current)
+ asi = SFD_ASI1(current)
+
+ x1 = -0.5 * scale
+ x2 = (stf_i2r (real(np)) + 0.5) * scale
+ y1 = -0.05
+ y2 = 1.05
+ call gswind (gp, x1, x2, y1, y2)
+
+ call gseti (gp, G_DRAWTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call glabax (gp, title, xlabel, ylabel)
+
+ # Draw profiles.
+ if (SFD_STATUS(current) == 0) {
+ call gseti (gp, G_PLCOLOR, 1)
+ for (z = 1.; z <= np; z = z + 1)
+ call gmark (gp, stf_i2r(z)*scale, asieval(asi,z),
+ GM_PLUS, 2., 2.)
+ call gamove (gp, 0., 0.)
+ for (z = 1.; z <= np; z = z + 0.1)
+ call gadraw (gp, stf_i2r(z)*scale, asieval(asi,z))
+ switch (SF_WCODE(sf)) {
+ case 1:
+ radius = SFD_W(current)
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, x1, level, radius, level)
+ call gline (gp, radius, level, radius, y1)
+ call gseti (gp, G_PLTYPE, 1)
+ default:
+ radius = SFD_W(current) / 2.
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, radius, y1, radius, y2)
+ call gseti (gp, G_PLTYPE, 1)
+ }
+
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ call stf_model (sf, current, 0., profile, flux)
+ call gamove (gp, 0., flux)
+ for (z = 1.; z <= np; z = z + 0.1) {
+ r = stf_i2r(z) * scale
+ call stf_model (sf, current, r, profile, flux)
+ call gadraw (gp, r, flux)
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ if (SF_OVRPLT(sf) == YES && current != SF_BEST(sf)) {
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ np1 = SFD_NP(SF_BEST(sf))
+ asi = SFD_ASI1(SF_BEST(sf))
+ r1 = stf_i2r(1.)
+ r2 = stf_i2r (real(np))
+ dr = 0.05 * (r2 - r1)
+ for (r = r1; r <= r2; r = r + dr) {
+ z = stf_r2i (r)
+ z1 = stf_r2i (r+0.7*dr)
+ if (z > 1. && z1 <= np1)
+ call gline (gp, r*scale, asieval(asi,z),
+ (r+0.7*dr)*scale, asieval(asi,z1))
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+ }
+end
+
+
+# STF_G7 -- Radial profile (derivative of enclosed flux) for a star.
+
+procedure stf_g7 (sf, current, title, xlabel, ylabel)
+
+pointer sf #I Starfocus pointer
+pointer current #I Star pointer
+char title[ARB] #I Title
+char xlabel[ARB] #I X label
+char ylabel[ARB] #I Y label
+
+int np, np1
+real scale, level, radius, profile, flux
+pointer gp, asi
+
+real x1, x2, y1, y2, z, z1, r, r1, r2, dr
+real stf_i2r(), stf_r2i(), asieval()
+
+begin
+ gp = SF_GP(sf)
+ level = SF_LEVEL(sf)
+ scale = SF_SCALE(sf)
+ np = SFD_NP(current)
+ asi = SFD_ASI2(current)
+
+ x1 = -0.5 * scale
+ x2 = (stf_i2r (real(np)) + 0.5) * scale
+ z = SFD_YP2(current) - SFD_YP1(current)
+ y1 = SFD_YP1(current) - 0.05 * z
+ y2 = SFD_YP2(current) + 0.05 * z
+ call gswind (gp, x1, x2, y1, y2)
+
+ call gseti (gp, G_XDRAWTICKS, YES)
+ call gseti (gp, G_YDRAWTICKS, NO)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call glabax (gp, title, xlabel, ylabel)
+
+ # Draw profile
+ call gseti (gp, G_PLCOLOR, 1)
+ for (z = SF_XP1(sf); z <= SF_XP2(sf); z = z + 1)
+ call gmark (gp, stf_i2r(z)*scale, asieval(asi,z),
+ GM_PLUS, 2., 2.)
+ z = SF_XP1(sf)
+ call gamove (gp, stf_i2r(z)*scale, asieval(asi,z))
+ for (; z <= SF_XP2(sf); z = z + 0.1)
+ call gadraw (gp, stf_i2r (z)*scale, asieval(asi,z))
+
+ switch (SF_WCODE(sf)) {
+ case 1:
+ radius = SFD_W(current)
+ default:
+ radius = SFD_W(current) / 2.
+ }
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, radius, y1, radius, y2)
+ call gseti (gp, G_PLTYPE, 1)
+
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ z = SF_XP1(sf)
+ r = stf_i2r(z) * scale
+ call stf_model (sf, current, r, profile, flux)
+ call gamove (gp, r, profile)
+ for (; z <= np; z = z + 0.1) {
+ r = stf_i2r(z) * scale
+ call stf_model (sf, current, r, profile, flux)
+ call gadraw (gp, r, profile)
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ if (SF_OVRPLT(sf) == YES && current != SF_BEST(sf)) {
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ np1 = SFD_NP(SF_BEST(sf))
+ asi = SFD_ASI2(SF_BEST(sf))
+ r1 = stf_i2r (SF_XP1(sf))
+ r2 = stf_i2r (SF_XP2(sf))
+ dr = 0.05 * (r2 - r1)
+ for (r = r1; r <= r2; r = r + dr) {
+ z = stf_r2i (r)
+ z1 = stf_r2i (r+0.7*dr)
+ if (z > 1. && z1 <= np1)
+ call gline (gp, r*scale, asieval(asi,z),
+ (r+0.7*dr)*scale, asieval(asi,z1))
+ }
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+end
+
+
+# STF_G8 -- FWHM vs level.
+
+procedure stf_g8 (sf, current, title, xlabel, ylabel)
+
+pointer sf #I Starfocus pointer
+pointer current #I Star pointer
+char title[ARB] #I Title
+char xlabel[ARB] #I X label
+char ylabel[ARB] #I Y label
+
+real y1, y2, level, fwhm
+pointer gp
+
+begin
+ level = SF_LEVEL(sf)
+ if (SF_WCODE(sf) == 1)
+ fwhm = SFD_MFWHM(current)
+ else
+ fwhm = SFD_W(current)
+
+ call alimr (SFD_FWHM(current,2), 17, y1, y2)
+ y2 = y2 - y1
+ y1 = y1 - 0.05 * y2
+ y2 = y1 + 1.10 * y2
+ y1 = min (y1, 0.9 * fwhm)
+ y2 = max (y2, 1.1 * fwhm)
+
+ gp = SF_GP(sf)
+ call gseti (gp, G_DRAWTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call gswind (gp, 0., 1., y1, y2)
+ call glabax (gp, title, xlabel, ylabel)
+ call gvline (gp, SFD_FWHM(current,2), 17, 0.1, 0.9)
+ call gvmark (gp, SFD_FWHM(current,2), 17, 0.1, 0.9, GM_PLUS, 2., 2.)
+
+ switch (SF_WCODE(sf)) {
+ case 1:
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, 0., fwhm, level, fwhm)
+ call gline (gp, level, y1, level, fwhm)
+ call gseti (gp, G_PLTYPE, 1)
+ default:
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, 0., fwhm, 1., fwhm)
+ call gseti (gp, G_PLTYPE, 1)
+ }
+end
+
+
+# STF_G9 -- FWHM vs level for a given star.
+
+procedure stf_g9 (sf, current, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+char title[ARB] #I Title
+
+int i, j, nx, ny, ix, iy
+real level, fwhm, vx, dvx, vy, dvy, x1, x2, y1, y2, fa[10]
+pointer sp, str, gp, sfs, sfd
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ gp = SF_GP(sf)
+ sfs = SFD_SFS(current)
+ level = SF_LEVEL(sf)
+ if (SF_WCODE(sf) == 1)
+ fwhm = SFD_MFWHM(current)
+ else
+ fwhm = SFD_W(current)
+
+ # Set grid layout
+ i = SFS_N(sfs)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+
+ # Set subview port parameters
+ call ggview (gp, vx, dvx, vy, dvy)
+ dvx = (dvx - vx) / nx
+ dvy = (dvy - vy) / ny
+
+ # Set data window parameters
+ y1 = 0.9 * fwhm
+ y2 = 1.1 * fwhm
+ do i = 1, SFS_NSFD(sfs) {
+ sfd = SFS_SFD(sfs,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ call alimr (SFD_FWHM(sfd,2), 17, x1, x2)
+ x2 = x2 - x1
+ x1 = x1 - 0.05 * x2
+ x2 = x1 + 1.10 * x2
+ y1 = min (x1, y1)
+ y2 = max (x2, y2)
+ }
+ x2 = y2 - y1
+ y1 = min (y1, fwhm - 0.2 * x2)
+ y2 = max (y2, fwhm + 0.2 * x2)
+ x1 = 0.
+ x2 = 1.
+ call gswind (gp, x1, x2, y1, y2)
+
+ # Set fill area
+ fa[1] = x1; fa[6] = y1
+ fa[2] = x2; fa[7] = y1
+ fa[3] = x2; fa[8] = y2
+ fa[4] = x1; fa[9] = y2
+ fa[5] = x1; fa[10] = y1
+
+ # Draw profiles.
+ j = 0
+ do i = 1, SFS_NSFD(sfs) {
+ sfd = SFS_SFD(sfs, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ ix = 1 + mod (j, nx)
+ iy = 1 + j / nx
+ j = j + 1
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ call gfill (gp, fa, fa[6], 4, GF_SOLID)
+ call gseti (gp, G_DRAWTICKS, NO)
+ call glabax (gp, "", "", "")
+ if (sfd == current) {
+ call gsview (gp, vx+dvx*(ix-1)+.005, vx+dvx*ix-.005,
+ vy+dvy*(ny-iy)+.005, vy+(ny-iy+1)*dvy-.005)
+ call gsetr (gp, G_PLWIDTH, HLWIDTH)
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ call gpline (gp, fa, fa[6], 5)
+ call gsetr (gp, G_PLWIDTH, 1.)
+ call gseti (gp, G_PLCOLOR, 1)
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ }
+
+ call gvline (gp, SFD_FWHM(sfd,2), 17, 0.1, 0.9)
+ #call gseti (gp, G_PLTYPE, 2)
+ #call gline (gp, x1, fwhm, x2, fwhm)
+ #call gseti (gp, G_PLTYPE, 1)
+
+ call sprintf (Memc[str], SZ_LINE, "%.3g")
+ call pargr (SFD_W(sfd))
+ call gtext (gp, 0.95, 0.95*y2+0.05*y1, Memc[str], "h=r;v=t")
+ if (nx < NMAX && ny < NMAX) {
+ call sprintf (Memc[str], SZ_LINE, "%.4g")
+ call pargr (SFD_F(sfd))
+ call gtext (gp, 0.05, 0.95*y2+0.05*y1, Memc[str], "h=l;v=t")
+ }
+ }
+
+ call gsview (gp, vx, vx+nx*dvx, vy, vy+ny*dvy)
+ call gswind (gp, 0.5, 0.5+nx, 0.5+ny, 0.5)
+ call gamove (gp, 1., 1.)
+
+ # Draw label
+ call gseti (gp, G_DRAWAXES, 0)
+ call glabax (gp, title, "", "")
+ call gseti (gp, G_DRAWAXES, 3)
+
+ call sfree (sp)
+end
+
+
+# STF_G10 -- FWHM vs level for a given focus.
+
+procedure stf_g10 (sf, current, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+char title[ARB] #I Title
+
+int i, j, nx, ny, ix, iy
+real level, fwhm, vx, dvx, vy, dvy, x1, x2, y1, y2, fa[10]
+pointer sp, str, gp, sff, sfd
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ gp = SF_GP(sf)
+ sff = SFD_SFF(current)
+ level = SF_LEVEL(sf)
+ if (SF_WCODE(sf) == 1)
+ fwhm = SFD_MFWHM(current)
+ else
+ fwhm = SFD_W(current)
+
+ # Set grid layout
+ i = SFF_N(sff)
+ if (i < 4) {
+ nx = i
+ ny = 1
+ } else {
+ nx = nint (sqrt (real (i)))
+ if (mod (i-1, nx+1) >= mod (i-1, nx))
+ nx = nx + 1
+ ny = (i - 1) / nx + 1
+ }
+
+ # Set subview port parameters
+ call ggview (gp, vx, dvx, vy, dvy)
+ dvx = (dvx - vx) / nx
+ dvy = (dvy - vy) / ny
+
+ # Set data window parameters
+ y1 = 0.9 * fwhm
+ y2 = 1.1 * fwhm
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ call alimr (SFD_FWHM(sfd,2), 17, x1, x2)
+ x2 = x2 - x1
+ x1 = x1 - 0.05 * x2
+ x2 = x1 + 1.10 * x2
+ y1 = min (x1, y1)
+ y2 = max (x2, y2)
+ }
+ x2 = y2 - y1
+ y1 = min (y1, fwhm - 0.2 * x2)
+ y2 = max (y2, fwhm + 0.2 * x2)
+ x1 = 0.
+ x2 = 1.
+ call gswind (gp, x1, x2, y1, y2)
+
+ # Set fill area
+ fa[1] = x1; fa[6] = y1
+ fa[2] = x2; fa[7] = y1
+ fa[3] = x2; fa[8] = y2
+ fa[4] = x1; fa[9] = y2
+ fa[5] = x1; fa[10] = y1
+
+ # Draw plots.
+ j = 0
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff, i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ ix = 1 + mod (j, nx)
+ iy = 1 + j / nx
+ j = j + 1
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ call gfill (gp, fa, fa[6], 4, GF_SOLID)
+ call gseti (gp, G_DRAWTICKS, NO)
+ call glabax (gp, "", "", "")
+ if (sfd == current) {
+ call gsview (gp, vx+dvx*(ix-1)+.005, vx+dvx*ix-.005,
+ vy+dvy*(ny-iy)+.005, vy+(ny-iy+1)*dvy-.005)
+ call gsetr (gp, G_PLWIDTH, HLWIDTH)
+ call gseti (gp, G_PLCOLOR, HLCOLOR)
+ call gpline (gp, fa, fa[6], 5)
+ call gsetr (gp, G_PLWIDTH, 1.)
+ call gseti (gp, G_PLCOLOR, 1)
+ call gsview (gp, vx+dvx*(ix-1), vx+dvx*ix,
+ vy+dvy*(ny-iy), vy+(ny-iy+1)*dvy)
+ }
+
+ call gvline (gp, SFD_FWHM(sfd,2), 17, 0.1, 0.9)
+ #call gseti (gp, G_PLTYPE, 2)
+ #call gline (gp, x1, fwhm, x2, fwhm)
+ #call gseti (gp, G_PLTYPE, 1)
+
+ call sprintf (Memc[str], SZ_LINE, "%.3g")
+ call pargr (SFD_W(sfd))
+ call gtext (gp, 0.95, 0.95*y2+0.05*y1, Memc[str], "h=r;v=t")
+ if (nx < NMAX && ny < NMAX) {
+ call sprintf (Memc[str], SZ_LINE, "%d %d")
+ call pargr (SFD_X(sfd))
+ call pargr (SFD_Y(sfd))
+ call gtext (gp, 0.05, 0.95*y2+0.05*y1, Memc[str], "h=l;v=t")
+ }
+ }
+
+ call gsview (gp, vx, vx+nx*dvx, vy, vy+ny*dvy)
+ call gswind (gp, 0.5, 0.5+nx, 0.5+ny, 0.5)
+ call gamove (gp, 1., 1.)
+
+ # Draw label
+ call gseti (gp, G_DRAWAXES, 0)
+ call glabax (gp, title, "", "")
+ call gseti (gp, G_DRAWAXES, 3)
+
+ call sfree (sp)
+end
+
+
+# STF_G11 -- Spatial plot at one focus.
+
+procedure stf_g11 (sf, current, key, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+int key #I Plot magnitude symbol?
+char title[ARB] #I Title
+
+int i
+real x, y, z, x1, x2, y1, y2, rbest, rmin, rmax, emin, emax
+real vx[3,2], vy[3,2], dvx, dvy, fa[8]
+pointer gp, sfd, sff
+
+data fa/0.,1.,1.,0.,0.,0.,1.,1./
+
+begin
+ gp = SF_GP(sf)
+ sff = SFD_SFF(current)
+
+ # Range of X, Y, R, E.
+ x1 = 1.
+ y1 = 1.
+ x2 = SF_NCOLS(sf)
+ y2 = SF_NLINES(sf)
+
+ rbest = SFD_W(SF_BEST(sf))
+ rmin = SF_W(sf)
+ rmax = 1.5 * SF_W(sf)
+ emin = 0
+ emax = 1
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ rmin = min (rmin, SFD_W(sfd))
+ rmax = max (rmax, SFD_W(sfd))
+ emin = min (emin, SFD_E(sfd))
+ emax = max (emax, SFD_E(sfd))
+ }
+ z = rmax - rmin
+ rmin = rmin - 0.1 * z
+ rmax = rmax + 0.1 * z
+
+ # Set view ports
+ call ggview (gp, vx[1,1], vx[3,2], vy[1,1], vy[3,2])
+ dvx = vx[3,2] - vx[1,1]
+ dvy = vy[3,2] - vy[1,1]
+ vx[1,1] = vx[1,1] + 0.00 * dvx
+ vx[1,2] = vx[1,1] + 0.20 * dvx
+ vx[2,1] = vx[1,1] + 0.25 * dvx
+ vx[2,2] = vx[1,1] + 0.75 * dvx
+ vx[3,1] = vx[1,1] + 0.80 * dvx
+ vx[3,2] = vx[1,1] + 1.00 * dvx
+ vy[1,1] = vy[1,1] + 0.00 * dvy
+ vy[1,2] = vy[1,1] + 0.20 * dvy
+ vy[2,1] = vy[1,1] + 0.25 * dvy
+ vy[2,2] = vy[1,1] + 0.75 * dvy
+ vy[3,1] = vy[1,1] + 0.80 * dvy
+ vy[3,2] = vy[1,1] + 1.00 * dvy
+
+ # (X,R)
+ call gseti (gp, G_WCS, 2)
+ call gseti (gp, G_DRAWAXES, 3)
+ call gseti (gp, G_XLABELTICKS, YES)
+ call gseti (gp, G_YLABELTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 4)
+ call gseti (gp, G_YNMINOR, 0)
+ call gsview (gp, vx[2,1], vx[2,2], vy[1,1], vy[1,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, x1, x2, rmin, rmax)
+ call glabax (gp, "", "Column", "")
+
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ x = SFD_X(sfd)
+ y = SFD_W(sfd)
+ if (key == 1) {
+ z = sqrt (SFS_M(SFD_SFS(sfd)) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFD_W(sfd) < SF_W(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFD_W(sfd) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, x1, SF_W(sf), x2, SF_W(sf))
+ call gseti (gp, G_PLTYPE, 1)
+
+ # (R,Y)
+ call gseti (gp, G_WCS, 3)
+ call gseti (gp, G_XLABELTICKS, YES)
+ call gseti (gp, G_YLABELTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 4)
+ call gseti (gp, G_XNMINOR, 0)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call gsview (gp, vx[1,1], vx[1,2], vy[2,1], vy[2,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, rmin, rmax, y1, y2)
+ call glabax (gp, "", SF_WTYPE(sf), "Line")
+
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ x = SFD_W(sfd)
+ y = SFD_Y(sfd)
+ if (key == 1) {
+ z = sqrt (SFS_M(SFD_SFS(sfd)) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFD_W(sfd) < SF_W(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFD_W(sfd) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, SF_W(sf), y1, SF_W(sf), y2)
+ call gseti (gp, G_PLTYPE, 1)
+
+ # (E,R)
+ call gseti (gp, G_WCS, 4)
+ call gseti (gp, G_DRAWAXES, 3)
+ call gseti (gp, G_XLABELTICKS, NO)
+ call gseti (gp, G_YLABELTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 4)
+ call gseti (gp, G_YNMINOR, 0)
+ call gsview (gp, vx[2,1], vx[2,2], vy[3,1], vy[3,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, x1, x2, emin, emax)
+ call glabax (gp, "", "", "Ellip")
+
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ x = SFD_X(sfd)
+ y = SFD_E(sfd)
+ if (key == 1) {
+ z = sqrt (SFS_M(SFD_SFS(sfd)) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFD_W(sfd) < SF_W(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFD_W(sfd) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ # (E,Y)
+ call gseti (gp, G_WCS, 5)
+ call gseti (gp, G_XLABELTICKS, YES)
+ call gseti (gp, G_YLABELTICKS, NO)
+ call gseti (gp, G_XNMAJOR, 4)
+ call gseti (gp, G_XNMINOR, 0)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call gsview (gp, vx[3,1], vx[3,2], vy[2,1], vy[2,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, emin, emax, y1, y2)
+ call glabax (gp, "", "Ellip", "")
+
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ x = SFD_E(sfd)
+ y = SFD_Y(sfd)
+ if (key == 1) {
+ z = sqrt (SFS_M(SFD_SFS(sfd)) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFD_W(sfd) < SF_W(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFD_W(sfd) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ # Label window.
+ call gseti (gp, G_WCS, 1)
+ call gseti (gp, G_DRAWAXES, 0)
+ call gsview (gp, vx[1,1], vx[3,2], vy[1,1], vy[3,2])
+ call glabax (gp, title, "", "")
+
+ # (X,Y)
+ call gseti (gp, G_DRAWAXES, 3)
+ call gseti (gp, G_LABELTICKS, NO)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call gsview (gp, vx[2,1], vx[2,2], vy[2,1], vy[2,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, x1, x2, y1, y2)
+ call glabax (gp, "", "", "")
+
+ do i = 1, SFF_NSFD(sff) {
+ sfd = SFF_SFD(sff,i)
+ if (SFD_STATUS(sfd) != 0)
+ next
+ x = SFD_X(sfd)
+ y = SFD_Y(sfd)
+ if (key == 1) {
+ z = sqrt (SFS_M(SFD_SFS(sfd)) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFD_W(sfd) < SF_W(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFD_W(sfd) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+end
+
+
+# STF_G9 -- Spatial plots at best focus.
+
+procedure stf_g12 (sf, current, key, title)
+
+pointer sf #I Starfocus pointer
+pointer current #I Current sfd pointer
+int key #I Plot magnitude symbol?
+char title[ARB] #I Title
+
+int i
+real x, y, z, x1, x2, y1, y2, fmin, fmax, rbest, rmin, rmax
+real vx[3,2], vy[3,2], dvx, dvy, fa[8]
+pointer gp, sfs, sfd
+
+data fa/0.,1.,1.,0.,0.,0.,1.,1./
+
+begin
+ gp = SF_GP(sf)
+
+ # Range of X, Y, R, F.
+ x1 = 1.
+ y1 = 1.
+ x2 = SF_NCOLS(sf)
+ y2 = SF_NLINES(sf)
+
+ rbest = SFD_W(SF_BEST(sf))
+ fmin = MAX_REAL
+ fmax = -MAX_REAL
+ rmin = SF_W(sf)
+ rmax = 1.5 * SF_W(sf)
+ do i = 1, SF_NSTARS(sf) {
+ sfs = SF_SFS(sf,i)
+ if (SFS_N(sfs) == 0)
+ next
+ fmin = min (fmin, SFS_F(sfs))
+ fmax = max (fmax, SFS_F(sfs))
+ rmin = min (rmin, SFS_W(sfs))
+ rmax = max (rmax, SFS_W(sfs))
+ }
+ z = fmax - fmin
+ fmin = fmin - 0.1 * z
+ fmax = fmax + 0.1 * z
+ z = rmax - rmin
+ rmin = rmin - 0.1 * z
+ rmax = rmax + 0.1 * z
+
+ # Set view ports
+ call ggview (gp, vx[1,1], vx[3,2], vy[1,1], vy[3,2])
+ dvx = vx[3,2] - vx[1,1]
+ dvy = vy[3,2] - vy[1,1]
+ vx[1,1] = vx[1,1] + 0.00 * dvx
+ vx[1,2] = vx[1,1] + 0.20 * dvx
+ vx[2,1] = vx[1,1] + 0.25 * dvx
+ if (SF_NF(sf) > 1) {
+ vx[2,2] = vx[1,1] + 0.75 * dvx
+ vx[3,1] = vx[1,1] + 0.80 * dvx
+ vx[3,2] = vx[1,1] + 1.00 * dvx
+ } else {
+ vx[2,2] = vx[1,1] + 1.00 * dvx
+ vx[3,1] = vx[1,1] + 1.00 * dvx
+ vx[3,2] = vx[1,1] + 1.00 * dvx
+ }
+ vy[1,1] = vy[1,1] + 0.00 * dvy
+ vy[1,2] = vy[1,1] + 0.20 * dvy
+ vy[2,1] = vy[1,1] + 0.25 * dvy
+ if (SF_NF(sf) > 1) {
+ vy[2,2] = vy[1,1] + 0.75 * dvy
+ vy[3,1] = vy[1,1] + 0.80 * dvy
+ vy[3,2] = vy[1,1] + 1.00 * dvy
+ } else {
+ vy[2,2] = vy[1,1] + 1.00 * dvy
+ vy[3,1] = vy[1,1] + 1.00 * dvy
+ vy[3,2] = vy[1,1] + 1.00 * dvy
+ }
+
+ dvx = vx[2,1] - vx[2,2]
+ dvy = vy[1,1] - vy[1,2]
+ if (abs (dvx) > 0.01 && abs (dvy) > 0.01) {
+ # (X,R)
+ call gseti (gp, G_WCS, 2)
+ call gseti (gp, G_DRAWAXES, 3)
+ call gseti (gp, G_XLABELTICKS, YES)
+ call gseti (gp, G_YLABELTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 4)
+ call gseti (gp, G_YNMINOR, 0)
+ call gsview (gp, vx[2,1], vx[2,2], vy[1,1], vy[1,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, x1, x2, rmin, rmax)
+ call glabax (gp, "", "Column", "")
+
+ do i = 1, SF_NSTARS(sf) {
+ sfs = SF_SFS(sf,i)
+ if (SFS_N(sfs) == 0)
+ next
+ x = SFD_X(SFS_SFD(sfs,1))
+ y = SFS_W(sfs)
+ if (key == 1) {
+ z = sqrt (SFS_M(sfs) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFS_F(sfs) < SF_F(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFS_W(sfs) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, x1, SF_W(sf), x2, SF_W(sf))
+ call gseti (gp, G_PLTYPE, 1)
+ }
+
+ dvx = vx[1,1] - vx[1,2]
+ dvy = vy[2,1] - vy[2,2]
+ if (abs (dvx) > 0.01 && abs (dvy) > 0.01) {
+ # (R,Y)
+ call gseti (gp, G_WCS, 3)
+ call gseti (gp, G_XLABELTICKS, YES)
+ call gseti (gp, G_YLABELTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 4)
+ call gseti (gp, G_XNMINOR, 0)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call gsview (gp, vx[1,1], vx[1,2], vy[2,1], vy[2,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, rmin, rmax, y1, y2)
+ call glabax (gp, "", SF_WTYPE(sf), "Line")
+
+ do i = 1, SF_NSTARS(sf) {
+ sfs = SF_SFS(sf,i)
+ if (SFS_N(sfs) == 0)
+ next
+ x = SFS_W(sfs)
+ y = SFD_Y(SFS_SFD(sfs,1))
+ if (key == 1) {
+ z = sqrt (SFS_M(sfs) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFS_F(sfs) < SF_F(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFS_W(sfs) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, SF_W(sf), y1, SF_W(sf), y2)
+ call gseti (gp, G_PLTYPE, 1)
+ }
+
+ dvx = vx[2,1] - vx[2,2]
+ dvy = vy[3,1] - vy[3,2]
+ if (abs (dvx) > 0.01 && abs (dvy) > 0.01) {
+ # (X,F)
+ call gseti (gp, G_WCS, 4)
+ call gseti (gp, G_XLABELTICKS, NO)
+ call gseti (gp, G_YLABELTICKS, YES)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 4)
+ call gseti (gp, G_YNMINOR, 0)
+ call gsview (gp, vx[2,1], vx[2,2], vy[3,1], vy[3,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, x1, x2, fmin, fmax)
+ call glabax (gp, "", "", "Focus")
+
+ do i = 1, SF_NSTARS(sf) {
+ sfs = SF_SFS(sf,i)
+ if (SFS_N(sfs) == 0)
+ next
+ x = SFD_X(SFS_SFD(sfs,1))
+ y = SFS_F(sfs)
+ if (key == 1) {
+ z = sqrt (SFS_M(sfs) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFS_F(sfs) < SF_F(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFS_W(sfs) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, x1, SF_F(sf), x2, SF_F(sf))
+ call gseti (gp, G_PLTYPE, 1)
+ }
+
+ dvx = vx[3,1] - vx[3,2]
+ dvy = vy[2,1] - vy[2,2]
+ if (abs (dvx) > 0.01 && abs (dvy) > 0.01) {
+ # (F,Y)
+ call gseti (gp, G_WCS, 5)
+ call gseti (gp, G_XLABELTICKS, YES)
+ call gseti (gp, G_YLABELTICKS, NO)
+ call gseti (gp, G_XNMAJOR, 4)
+ call gseti (gp, G_XNMINOR, 0)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call gsview (gp, vx[3,1], vx[3,2], vy[2,1], vy[2,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, fmin, fmax, y1, y2)
+ call glabax (gp, "", "Focus", "")
+
+ do i = 1, SF_NSTARS(sf) {
+ sfs = SF_SFS(sf,i)
+ if (SFS_N(sfs) == 0)
+ next
+ x = SFS_F(sfs)
+ y = SFD_Y(SFS_SFD(sfs,1))
+ if (key == 1) {
+ z = sqrt (SFS_M(sfs) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFS_F(sfs) < SF_F(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFS_W(sfs) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+
+ call gseti (gp, G_PLTYPE, 2)
+ call gline (gp, SF_F(sf), y1, SF_F(sf), y2)
+ call gseti (gp, G_PLTYPE, 1)
+ }
+
+ # Label window.
+ call gseti (gp, G_WCS, 1)
+ call gseti (gp, G_DRAWAXES, 0)
+ call gsview (gp, vx[1,1], vx[3,2], vy[1,1], vy[3,2])
+ call glabax (gp, title, "", "")
+
+ dvx = vx[2,1] - vx[2,2]
+ dvy = vy[2,1] - vy[2,2]
+ if (abs (dvx) > 0.01 && abs (dvy) > 0.01) {
+ # (X,Y)
+ call gseti (gp, G_DRAWAXES, 3)
+ call gseti (gp, G_LABELTICKS, NO)
+ call gseti (gp, G_XNMAJOR, 6)
+ call gseti (gp, G_XNMINOR, 4)
+ call gseti (gp, G_YNMAJOR, 6)
+ call gseti (gp, G_YNMINOR, 4)
+ call gsview (gp, vx[2,1], vx[2,2], vy[2,1], vy[2,2])
+ call gswind (gp, 0., 1., 0., 1.)
+ call gfill (gp, fa, fa[5], 4, GF_SOLID)
+
+ call gswind (gp, x1, x2, y1, y2)
+ call glabax (gp, "", "", "")
+
+ do i = 1, SF_NSTARS(sf) {
+ sfs = SF_SFS(sf,i)
+ if (SFS_N(sfs) == 0)
+ next
+ sfd = SFS_SFD(sfs,1)
+ x = SFD_X(sfd)
+ y = SFD_Y(sfd)
+ if (key == 1) {
+ z = sqrt (SFS_M(sfs) / SF_M(sf))
+ z = max (0.005, 0.03 * z)
+ call gmark (gp, x, y, GM_MAG, z, z)
+ }
+ if (SFS_F(sfs) < SF_F(sf))
+ call gseti (gp, G_PLCOLOR, 2)
+ else
+ call gseti (gp, G_PLCOLOR, 3)
+ z = min (2., SFS_W(sfs) / rbest)
+ z = 0.010 * (1 + (z - 1) * 5)
+ call gmark (gp, x, y, GM_CIRCLE, z, z)
+ call gseti (gp, G_PLCOLOR, 1)
+ }
+ }
+end