aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/sensfunc/sfstats.x
blob: a94691a496e2acfe884f64aef9d3fbe14d4c9d28 (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
include	"sensfunc.h"


# SF_STATS -- Print basic statistics about the stars and the fit.

procedure sf_stats (fd, stds, nstds, function, order, npts, rms)

int	fd			# Output file descriptor (may be STDOUT)
pointer	stds[nstds]		# Standard star data
int	nstds			# Number of standard stars
char	function[ARB]		# Fitted function
int	order			# Order of function
int	npts			# Number of points in fit
real	rms			# RMS of fit

int	i, j, n
real	rms1, dev1, dev2, dev3
pointer	sp, str, wts

begin
	# Start with system ID.
	call smark (sp)
	call salloc (str, SZ_LINE, TY_CHAR)
	call sysid (Memc[str], SZ_LINE)

	# Determine beam from first standard star not excluded.
	for (i=1; (i<nstds) && (STD_FLAG(stds[i])==SF_EXCLUDE); i=i+1)
	    ;
	call fprintf (fd, "%s\n")
	    call pargstr (Memc[str])
	call fprintf (fd, "Sensitivity function for aperture %d:\n")
	    call pargi (STD_BEAM(stds[i]))
	call fprintf (fd,
        "Fitting function is %s of order %d with %d points and RMS of %6.4f.\n")
	    call pargstr (function)
	    call pargi (order)
	    call pargi (npts)
	    call pargr (rms)

	call fprintf (fd, "%12s %7s %7s %7s %7s %7s %7s %7s\n")
	    call pargstr ("Image")
	    call pargstr ("Airmass")
	    call pargstr ("Points")
	    call pargstr ("Shift")
	    call pargstr ("RMS Fit")
	    call pargstr ("Dev 1")
	    call pargstr ("Dev 2")
	    call pargstr ("Dev 3")

	do i = 1, nstds {
	    if (STD_FLAG(stds[i]) == SF_EXCLUDE)
		next

	    n = 0
	    wts = STD_WTS(stds[i]) - 1
	    for (j=1; j<=STD_NWAVES(stds[i]); j=j+1)
		if (Memr[wts+j] != 0.)
		    n = n + 1
	    if ((i == nstds-1) && (n == 0))
		next

	    call sf_devs (stds[i], rms1, dev1, dev2, dev3)

	    call fprintf (fd, "%12s %7.3f %7d %7.4f %7.4f %7.4f %7.4f %7.4f")
		call pargstr (STD_IMAGE(stds[i]))
		call pargr (STD_AIRMASS(stds[i]))
		call pargi (n)
		call pargr (STD_SHIFT(stds[i]))
		call pargr (rms1)
		call pargr (dev1)
		call pargr (dev2)
		call pargr (dev3)

	    if (n == 0) {
	        call fprintf (fd, "%s")
		    call pargstr (" <-- deleted")
	    }
	    call fprintf (fd, "\n")
	}

	# Trailing spacer
	call fprintf (fd, "\n")
end


# SF_DEVS - Compute rms and mean deviations from the fit.
# The deviations are computed in three segments.

procedure  sf_devs (std, rms, dev1, dev2, dev3)

pointer	std		# Standard star data
real	rms		# RMS about fit
real	dev1		# Average deviation in first third of data
real	dev2		# Average deviation in second third of data
real	dev3		# Average deviation in last third of data

int	i, ndev1, ndev2, ndev3, nrms, nbin, nwaves
real	dev
pointer	sens, fit, wts

begin
	# Get elements froms standard star structure.
	nwaves = STD_NWAVES(std)
	sens = STD_SENS(std)
	fit = STD_FIT(std)
	wts = STD_WTS(std)

	# Divide into thirds.
	rms = 0.
	ndev1 = 0
	dev1 = 0.
	nbin = nwaves / 3
	for (i=1; i<= nbin; i=i+1)
	    if (Memr[wts+i-1] != 0.) {
		dev = Memr[sens+i-1] - Memr[fit+i-1]
		dev1 = dev1 + dev
		rms = rms + dev ** 2
		ndev1 = ndev1 + 1
	    }
	if (ndev1 > 0)
	    dev1 = dev1 / ndev1

	ndev2 = 0
	dev2 = 0.
	nbin = 2 * nwaves / 3
	for (; i<=nbin; i=i+1)
	    if (Memr[wts+i-1] != 0.) {
		dev = Memr[sens+i-1] - Memr[fit+i-1]
		dev2 = dev2 + dev
		rms = rms + dev ** 2
		ndev2 = ndev2 + 1
	    }
	if (ndev2 > 0)
	    dev2 = dev2 / ndev2

	ndev3 = 0
	dev3 = 0.
	nbin = nwaves
	for (; i<=nbin; i=i+1)
	    if (Memr[wts+i-1] != 0.) {
		dev = Memr[sens+i-1] - Memr[fit+i-1]
		dev3 = dev3 + dev
		rms = rms + dev ** 2
		ndev3 = ndev3 + 1
	    }
	if (ndev3 > 0)
	    dev3 = dev3 / ndev3

	nrms = ndev1 + ndev2 + ndev3
	if (nrms > 0)
	    rms = sqrt (rms / nrms)
end