aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/splot/eqwidth.x
blob: 0594041ac7dbbd0ca0196a1a9a9b887cf1de65d4 (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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# EQWIDTH -- Compute equivalent width, flux and center

procedure eqwidth (sh, gfd, wx1, wy1, x, y, n, fd1, fd2)

pointer	sh
int	gfd
real	wx1, wy1
real	x[ARB]
real	y[ARB]
int	n
int	fd1, fd2

char	command[SZ_FNAME]
real	wx2, wy2, sigma0, invgain
real	flux_diff, rsum[2], esum[2], sum[2], cont, ctr[2]
int	i, wc, key
pointer	sp, s

real	clgetr()
int	clgcur()
double	shdr_wl()

begin
	# Get second position
	call printf ("e again:")
	i = clgcur ("cursor", wx2, wy2, wc, key, command, SZ_FNAME)

	if (wx1 == wx2) {
	    call printf ("Cannot get EQW - move cursor")
	    return
	}

	# Set noise.
	sigma0 = clgetr ("sigma0")
	invgain = clgetr ("invgain")
	if (IS_INDEF(sigma0) || IS_INDEF(invgain) || sigma0<0. || invgain<0.) {
	    sigma0 = INDEF
	    invgain = INDEF
	}
	call smark (sp)
	call salloc (s, n, TY_REAL)
	if (IS_INDEF(invgain))
	    call amovkr (INDEF, Memr[s], n)
	else {
	    do i = 1, n {
		if (y[i] > 0)
		    Memr[s+i-1] = sqrt (sigma0  ** 2 + invgain * y[i])
		else
		    Memr[s+i-1] = sqrt (sigma0  ** 2)
	    }
	}

	# Derive the needed values
	call sumflux (sh, x, y, Memr[s], n, wx1, wx2, wy1, wy2,
	    sum, rsum, esum, ctr)

	# Compute difference in flux between ramp and spectrum
	flux_diff = sum[1] - rsum[1]
	
	# Compute eq. width of feature using ramp midpoint as
	# continuum
	cont = 0.5 * (wy1 + wy2)

	# Print on status line - save in answer buffer
	call printf (
	    "center = %9.7g, eqw = %9.4f, continuum = %9.7g flux = %9.6g\n")
	    call pargr (ctr[1])
	    call pargr (esum[1])
	    call pargr (cont)
	    call pargr (flux_diff)

	if (fd1 != NULL) {
	    call fprintf (fd1, " %9.7g %9.7g %9.6g %9.4g\n")
		call pargr (ctr[1])
		call pargr (cont)
		call pargr (flux_diff)
		call pargr (esum[1])
	}
	if (fd2 != NULL) {
	    call fprintf (fd2, " %9.7g %9.7g %9.6g %9.4g\n")
		call pargr (ctr[1])
		call pargr (cont)
		call pargr (flux_diff)
		call pargr (esum[1])
	}
	if (!IS_INDEF(sigma0)) {
	    if (fd1 != NULL) {
		call fprintf (fd1,
		"  (%7.5g) %9w (%7.4g) (%7.2g)\n")
		    call pargr (ctr[2])
		    call pargr (sum[2])
		    call pargr (esum[2])
	    }
	    if (fd2 != NULL) {
		call fprintf (fd2,
		"  (%7.5g) %9w (%7.4g) (%7.2g)\n")
		    call pargr (ctr[2])
		    call pargr (sum[2])
		    call pargr (esum[2])
	    }
	}

	# Draw cursor position
	i = max (1, min (n, nint (shdr_wl (sh, double(ctr[1])))))
	call gline (gfd, wx1, wy1, wx2, wy2)
	call gline (gfd, ctr[1], cont, ctr[1], y[i])

	call sfree (sp)
end