aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/apphot/fitpsf/apbfitpsf.x
blob: 9854ab9f366d432c7a85272df19637e285dd8c3f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
include <fset.h>
include "../lib/apphot.h"
include "../lib/display.h"

# APBFITPSF -- Procedure to fit a functional form to the PSF for a list of
# objects.

procedure apbfitpsf (ap, im, cl, out, gid, id, ld, interactive)

pointer ap			# pointer to apphot structure
pointer	im			# pointer to IRAF image
int	cl			# starlist file descriptor
int	out			# output file descriptor
pointer	gid			# image display stream
int	id			# initial id
int	ld			# list number
int	interactive		# interactive mode

int	ier, ild, stdin
pointer	sp, str
real	wx, wy
int	fscan, nscan(), strncmp(), apsffit(), apstati()

begin
	call smark (sp)
	call salloc (str, SZ_FNAME, TY_CHAR)
	call fstats (cl, F_FILENAME, Memc[str], SZ_FNAME)

	# Initialize.
	ild = ld

	# Print query if input is STDIN.
	if (strncmp ("STDIN", Memc[str], 5) == 0) {
	    stdin = YES
	    call printf ("Type object x and y coordinates (^Z or ^D to end): ")
	    call flush (STDOUT)
	} else
	    stdin = NO

	# Loop over the interesting objects.
	while (fscan(cl) != EOF) {

	    # Decode the centers.
	    call gargr (wx)
	    call gargr (wy)
	    if (nscan () != 2) {
		if (stdin == YES) {
	            call printf (
		        "Type object x and y coordinates (^Z or ^D to end): ")
	            call flush (STDOUT)
	        } 
		next
	    }

	    # Transform the input coordinates.
            switch (apstati(ap,WCSIN)) {
            case WCS_WORLD, WCS_PHYSICAL:
                call ap_itol (ap, wx, wy, wx, wy, 1)
            case WCS_TV:
                call ap_vtol (im, wx, wy, wx, wy, 1)
            default:
                ;
            }

	    # Store the current cursor coordinates.
	    call apsetr (ap, CWX, wx)
	    call apsetr (ap, CWY, wy)

	    # Fit the psf.
	    ier = apsffit (ap, im, wx, wy)

	    # Output the results.
	    if (interactive == YES) {
		call ap_qppsf (ap, ier)
		if (gid != NULL)
		    call appfmark (ap, gid, apstati (ap, MKPSFBOX))
	    }
	    if (id == 1)
	        call ap_param (ap, out, "fitpsf")
	    call ap_ppsf (ap, out, id, ild, ier)
	    
	    # Prepare for the next object.
	    id = id + 1
	    ild = ild + 1
	    call apsetr (ap, WX, wx)
	    call apsetr (ap, WY, wy)
	    if (stdin == YES) {
		call printf (
		    "Type object x and y coordinates (^D or ^Z to end): ")
		call flush (STDOUT)
	    } 

	}
	call sfree (sp)
end