aboutsummaryrefslogtreecommitdiff
path: root/pkg/lists/raverage.cl
blob: da350bdd0b39599e03e2c7bf1a515199bd375025 (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
# RAVERAGE -- Running average, standard deviation, and enevelope of a list.

procedure raverage (input, nwin)

file	input			{prompt="Input file"}
int	nwin			{prompt="Number of points in window", min=1}
bool	sort = no		{prompt="Sort input?"}
real	nsig = 0		{prompt="Number of sigma for envelope"}

struct	*fd1, *fd2

begin
	file	in, tmp
	int	i, j, n, nin
	real	x, y, z, x1, y1, sum1, sum2, sum3, xavg, yavg, sig
	real	ylow, yhigh

	# Get query parameters.
	in = input
	nin = nwin

	if (nwin < 1)
	    error (1, "Window size must be greater than zero")

	# Buffer the standard input and sort if requested.
	tmp = in
	if (in == "STDIN") {
	    tmp = mktemp ("tmp$iraf")
	    i = 0
	    while (YES) {
		j = scan(x,y)
		if (j != 2) {
		    if (j == EOF)
			break
		    else if (j < 1)
			next
		    else if (j < 2) {
			y = x
			x = i + 1
		    }
		}
		i += 1
		print (x, y, >> tmp)
	    }
	    if (sort) {
	        rename (tmp, tmp//"a")
	        sort (tmp//"a", col=1, num+, rev-, > tmp)
		delete (tmp//"a", verify-)
	    }
	} else if (sort) {
	    tmp = mktemp ("tmp$iraf")
	    sort (in,, col=1, num+, rev-, > tmp)
	}

	# Initialize.
	i = 0; n = 0; sum1 = 0; sum2 = 0; sum3 = 0

	# Accumulate the first window.
	fd1 = tmp
	while (n<nin) {
	    j = fscan (fd1, x, y)
	    if (j != 2) {
		if (j == EOF)
		    break
		else if (j < 1)
		    next
		else if (j < 2) {
		    y = x
		    x = i + 1
		}
	    }
	    i += 1
	    n += 1
	    sum1 += x
	    sum2 += y
	    sum3 += y*y
	}

	# Read the rest of the list adding and subtracting.
	fd2 = tmp
	while (YES) {
	    j = fscan (fd1, x, y)
	    if (j != 2) {
		if (j == EOF)
		    break
		else if (j == 0)
		    next
		else if (j == 1) {
		    y = x
		    x = i + 1
		}
	    }

	    while (YES) {
	        j = fscan(fd2, x1, y1)
		if (j != 2) {
		    if (j == 0)
			next
		    else if (j == 1) {
			y1 = x1
			x1 = i - n + 1
		    }
		}
		break
	    }

	    xavg = sum1 / n
	    yavg = sum2 / n
	    sig = sqrt (max (0., (n * sum3 - sum2 * sum2) / (n * max(1,n-1))))
	    if (nsig > 0) {
	        ylow = yavg - nsig * sig
	        yhigh = yavg + nsig * sig
		printf ("%g %g %g %d %g %g\n", xavg, yavg, sig, n, ylow, yhigh)
	    } else
		printf ("%g %g %g %d\n", xavg, yavg, sig, n)

	    i += 1
	    sum1 += x - x1
	    sum2 += y - y1
	    sum3 += y*y - y1*y1
	}
	fd1 = ""; fd2 = ""

	# Compute the final values.
	if (n <= 0) {
	    xavg = INDEF
	    yavg = INDEF
	    sig = INDEF
	    ylow = INDEF
	    yhigh = INDEF
	} else {
	    xavg = sum1 / n
	    yavg = sum2 / n
	    sig = sqrt (max (0., (n * sum3 - sum2 * sum2) / (n * max(1,n-1))))
	    ylow = yavg - nsig * sig
	    yhigh = yavg + nsig * sig
	}
	if (nsig > 0)
	    printf ("%g %g %g %d %g %g\n", xavg, yavg, sig, n, ylow, yhigh)
	else
	    printf ("%g %g %g %d\n", xavg, yavg, sig, n)

	# Delete temporary files.
	if (tmp != in)
	    delete (tmp, verify-)
end