aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/sensfunc/sfshift.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/onedspec/sensfunc/sfshift.x')
-rw-r--r--noao/onedspec/sensfunc/sfshift.x81
1 files changed, 81 insertions, 0 deletions
diff --git a/noao/onedspec/sensfunc/sfshift.x b/noao/onedspec/sensfunc/sfshift.x
new file mode 100644
index 00000000..07b204f3
--- /dev/null
+++ b/noao/onedspec/sensfunc/sfshift.x
@@ -0,0 +1,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