aboutsummaryrefslogtreecommitdiff
path: root/noao/imred/src/fibers/skysub.cl
blob: b75225918b87ff7380dad42d563384f31b58bd20 (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
# SKYSUB -- Sky subtract fiber spectra.
#   Subtract the selected sky apertures from the selected object apertures.
#   The object apertures may include the sky apertures if desired.
#   The sky apertures are combined to a single master sky which is subtracted
#   from each selected object aperture.  match.  The subtracted sky may be
#   saved in an image with the prefix "sky" and the same output name.  Note
#   that existing output images are clobbered.

procedure skysub (input)

string	input = ""		{prompt="Input spectra to sky subtract"}

string	output = ""		{prompt="Output sky subtracted spectra"}
string	objaps = ""		{prompt="Object apertures"}
string	skyaps = ""		{prompt="Sky apertures"}
string	objbeams = ""		{prompt="Object beam numbers"}
string	skybeams = ""		{prompt="Sky beam numbers"}
bool	skyedit	= yes		{prompt="Edit the sky spectra?"}
string	combine = "average"	{prompt="Combining option",
				 enum="average|median|sum"}
string	reject	= "avsigclip"	{prompt="Sky rejection option",
				 enum="none|minmax|avsigclip"}
string	scale = "none"		{prompt="Sky scaling option",
				 enum="none|mode|median|mean"}
bool	saveskys = yes		{prompt="Save sky spectra?"}
file	logfile = ""		{prompt="Logfile"}

struct	*fd1
struct	*fd2
struct	*fd3

begin
	string	imtype, mstype
	string	in, out, out1, sky, log, aps, str, str2
	file	temp1, temp2, temp3, temp4
	int	i, j, n

	imtype = "." // envget ("imtype")
	i = stridx (",", imtype)
	if (i > 0)
	    imtype = substr (imtype, 1, i-1)
	n = strlen (imtype)

	temp1 = mktemp ("tmp$iraf")
	temp2 = mktemp ("tmp$iraf")
	temp3 = mktemp ("tmp$iraf")
	temp4 = mktemp ("tmp$iraf")

	if (logfile == "")
	    log = "dev$null"
	else
	    log = logfile

	sections (input, option="fullname", > temp1)
	sections (output, option="fullname", > temp2)
	fd1 = temp1
	fd2 = temp2
	while (fscan (fd1, in) != EOF) {
	    i = strlen (in)
	    if (i > n && substr (in, i-n+1, i) == imtype)
		in = substr (in, 1, i-n)
	    if (fscan (fd2, out) < 1)
		out = in
	    out1 = out
	    i = strlen (out1)
	    if (i > 3 && substr (out1, i-2, i) == ".ms")
		out1 = substr (out1, 1, i-3)

	    aps = skyaps
	    sky = "sky" // out1
	    if (access (sky // imtype))
		imdelete (sky, verify=no)
	    if (skyedit) {
		scopy (in, sky, w1=INDEF, w2=INDEF, apertures=aps, bands="1",
		    beams=skybeams, apmodulus=0, offset=0, clobber=yes,
		    format="multispec", merge=no, renumber=no,
		    verbose=yes, >> "dev$null")
		specplot (sky, apertures="", bands="1", autolayout=no,
		    autoscale=yes, fraction=1., scale=1., offset=0.,
		    step=0., ptype="1", labels="user", ulabels="",
		    sysid=yes, yscale=yes, xlpos=1.02, ylpos=0.,
		    title="Edit sky spectra from "//in, xlabel="",
		    ylabel="", xmin=INDEF, xmax=INDEF, ymin=INDEF,
		    ymax=INDEF, logfile=temp4, graphics="stdgraph")
		imdelete (sky, verify=no)
		system.match (sky, temp4, stop=no) |
		fields (fields="2", lines="1-9999") |
		system.sort (column=0, ignore=yes, numeric=no,
		    reverse_sort=no) |
		lists.unique (> temp3)
		delete (temp4, verify=no)
		aps = "@" // temp4
		fd3 = temp3
		while (fscan (fd3, str) != EOF) {
		    i = stridx ("(", str)
		    j = stridx (")", str)
		    if (i > 0 && j > i)
			str = substr(str,i+1,j-1)
		    else
			str = ""
		    print (str, >> temp4)
		}
		fd3 = ""; delete (temp3, verify=no)

		reject.p_mode="q"
		str = reject
		reject.p_mode="h"
	    }

	    if (skybeams == "") {
		scombine (in, sky, noutput="", logfile=logfile,
		    apertures=aps, group="all", combine=combine,
		    reject=reject, first=yes, scale=scale, zero="none",
		    weight="none", sample="", lthreshold=INDEF,
		    hthreshold=INDEF, nlow=1, nhigh=1, nkeep=1, mclip=yes,
		    lsigma=3., hsigma=2., rdnoise="0.", gain="1.", snoise="0.",
		    sigscale=0., pclip=-0.5, grow=0, blank=0.)
	    } else {
		temp3 = mktemp ("sky")
		scopy (in, sky, w1=INDEF, w2=INDEF, apertures=aps, bands="",
		    beams=skybeams, apmodulus=0, offset=0, clobber=yes,
		    format="multispec", merge=no, renumber=no,
		    verbose=yes, >> log)
		scombine (sky, temp3, noutput="", logfile=logfile,
		    apertures=aps, group="all", combine=combine,
		    reject=reject, first=yes, scale=scale, zero="none",
		    weight="none", sample="", lthreshold=INDEF,
		    hthreshold=INDEF, nlow=1, nhigh=1, nkeep=1, mclip=yes,
		    lsigma=3., hsigma=2., rdnoise="0.", gain="1.", snoise="0.",
		    sigscale=0., pclip=-0.5, grow=0, blank=0.)
		flpr
		imdelete (sky, verify=no)
		imrename (temp3, sky, verbose=yes, >> log)
	    }
	    sarith (in, "-", sky, out, w1=INDEF, w2=INDEF, apertures=objaps,
		bands="", beams=objbeams, reverse=no, ignoreaps=yes,
		format="multispec", renumber=no, offset=0, clobber=yes,
		merge=no, errval=0., verbose=yes, >> log)
	    if (!saveskys)
		imdelete (sky, verify=no)
	}
	fd1 = ""; delete (temp1, verify=no)
	fd2 = ""; delete (temp2, verify=no)
	delete (temp4, verify=no, >>& "dev$null")
end