aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/sensfunc/sfshift.x
blob: 07b204f3a477b472bb7bf01302fd2961741a5b6e (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
include	"sensfunc.h"


# SF_SHIFT -- Shift or unshift all standard stars to have zero mean residual.

procedure sf_shift (stds, nstds, flag)

pointer	stds[nstds]		# Standard star data
int	nstds			# Number of standard stars
int	flag			# Shift flag

pointer	x, y, w, f
int	i, j, n, nshift
real	shift, shift1, minshift

begin
	# If flag is YES then unshift the data.
	if (flag == YES) {
	    do i = 1, nstds {
	        if (STD_FLAG(stds[i]) == SF_EXCLUDE)
		    next
	        n = STD_NWAVES(stds[i])
	        if (n == 0)
		    next
	        y = STD_SENS(stds[i])
	        call asubkr (Memr[y], STD_SHIFT(stds[i]), Memr[y], n)
	        STD_SHIFT(stds[i]) = 0.
	    }
	    flag = NO
	    call printf ("Data unshifted")
	    return
	}

	# Determine the shifts needed to make the mean residual zero.
	# Also determine the minimum shift.

	minshift = 0.
	do i = 1, nstds {
	    if (STD_FLAG(stds[i]) == SF_EXCLUDE)
		next
	    n = STD_NWAVES(stds[i])
	    if (n == 0)
		next
	    x = STD_WAVES(stds[i])
	    y = STD_SENS(stds[i])
	    w = STD_WTS(stds[i])
	    f = STD_FIT(stds[i])
	    nshift = 0
	    shift = 0.
	    shift1 = 0.
	    do j = 1, n {
		shift1 = shift1 + Memr[f+j-1] - Memr[y+j-1]
		if (Memr[w+j-1] > 0.) {
		    shift = shift + Memr[f+j-1] - Memr[y+j-1]
		    nshift = nshift + 1
		}
	    }
	    if (nshift > 0) {
		shift = STD_SHIFT(stds[i]) + shift / nshift
		if (shift < minshift)
		    minshift = shift
	    } else
		shift = STD_SHIFT(stds[i]) + shift1 / n
	    STD_SHIFT(stds[i]) = shift
	}

	# Adjust the shifts to be upwards.
	do i = 1, nstds {
	    if (STD_FLAG(stds[i]) == SF_EXCLUDE)
		next
	    n = STD_NWAVES(stds[i])
	    if (n == 0)
		next
	    y = STD_SENS(stds[i])
	    shift = STD_SHIFT(stds[i]) - minshift
	    call aaddkr (Memr[y], shift, Memr[y], n)
	    STD_SHIFT(stds[i]) = shift
	}
	flag = YES
	call printf ("Data shifted")
end