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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
# AWVG -- Compute the mean and standard deviation (sigma) of a sample. Pixels
# whose value lies outside the specified lower and upper limits are not used.
# If the upper and lower limits have the same value (e.g., zero), no limit
# checking is performed. The number of pixels in the sample is returned as the
# function value.
int procedure awvgl (a, npix, mean, sigma, lcut, hcut)
long a[ARB]
double mean, sigma, lcut, hcut
double sum, sumsq, value, temp
int npix, i, ngpix
begin
sum = 0.0
sumsq = 0.0
ngpix = 0
# Accumulate sum, sum of squares. The test to disable limit checking
# requires numerical equality of two floating point numbers; this should
# be ok since they are used as flags not as numbers (they are not used
# in computations).
if (hcut == lcut) {
do i = 1, npix {
value = a[i]
sum = sum + value
sumsq = sumsq + value ** 2
}
ngpix = npix
} else {
do i = 1, npix {
value = a[i]
if (value >= lcut && value <= hcut) {
ngpix = ngpix + 1
sum = sum + value
sumsq = sumsq + value ** 2
}
}
}
switch (ngpix) { # compute mean and sigma
case 0:
mean = INDEFD
sigma = INDEFD
case 1:
mean = sum
sigma = INDEFD
default:
mean = sum / ngpix
temp = (sumsq - (sum/ngpix) * sum) / (ngpix - 1)
if (temp < 0) # possible with roundoff error
sigma = 0.0
else
sigma = sqrt (temp)
}
return (ngpix)
end
|