aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/odcombine/src/icaverage.gx
blob: a95b76739184d15a47ac9a7f8f3b4fc37354a634 (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
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	<imhdr.h>
include	"../icombine.h"

$for (sird)
# IC_AVERAGE -- Compute the average (or summed) image line.
# Options include a weighted average/sum.

procedure ic_average$t (d, m, n, wts, npts, doblank, doaverage, average)

pointer	d[ARB]			# Data pointers
pointer	m[ARB]			# Image ID pointers
int	n[npts]			# Number of points
real	wts[ARB]		# Weights
int	npts			# Number of output points per line
int	doblank			# Set blank values?
int	doaverage		# Do average?
$if (datatype == sil)
real	average[npts]		# Average (returned)
$else
PIXEL	average[npts]		# Average (returned)
$endif

int	i, j, k
real	sumwt, wt
$if (datatype == sil)
real	sum
$else
PIXEL	sum
$endif

include	"../icombine.com"

begin
	# If no data has been excluded do the average/sum without checking
	# the number of points and using the fact that the weights are
	# normalized.  If all the data has been excluded set the average/sum
	# to the blank value if requested.

	if (dflag == D_ALL) {
	    if (dowts) {
		do i = 1, npts {
		    k = i - 1
		    wt = wts[Memi[m[1]+k]]
		    sum = Mem$t[d[1]+k] * wt
		    do j = 2, n[i] {
			wt = wts[Memi[m[j]+k]]
			sum = sum + Mem$t[d[j]+k] * wt
		    }
		    average[i] = sum
		}
	    } else {
		do i = 1, npts {
		    k = i - 1
		    sum = Mem$t[d[1]+k]
		    do j = 2, n[i]
			sum = sum + Mem$t[d[j]+k]
		    if (doaverage == YES)
			average[i] = sum / n[i]
		    else
			average[i] = sum
		}
	    }
	} else if (dflag == D_NONE) {
	    if (doblank == YES) {
		do i = 1, npts
		    average[i] = blank
	    }
	} else {
	    if (dowts) {
		do i = 1, npts {
		    if (n[i] > 0) {
			k = i - 1
			wt = wts[Memi[m[1]+k]]
			sum = Mem$t[d[1]+k] * wt
			sumwt = wt
			do j = 2, n[i] {
			    wt = wts[Memi[m[j]+k]]
			    sum = sum + Mem$t[d[j]+k] * wt
			    sumwt = sumwt + wt
			}
			if (doaverage == YES) {
			    if (sumwt > 0)
				average[i] = sum / sumwt
			    else {
				sum = Mem$t[d[1]+k]
				do j = 2, n[i]
				    sum = sum + Mem$t[d[j]+k]
				average[i] = sum / n[i]
			    }
			} else
			    average[i] = sum
		    } else if (doblank == YES)
			average[i] = blank
		}
	    } else {
		do i = 1, npts {
		    if (n[i] > 0) {
			k = i - 1
			sum = Mem$t[d[1]+k]
			do j = 2, n[i]
			    sum = sum + Mem$t[d[j]+k]
			if (doaverage == YES)
			    average[i] = sum / n[i]
			else
			    average[i] = sum
		    } else if (doblank == YES)
			average[i] = blank
		}
	    }
	}
end
$endfor