aboutsummaryrefslogtreecommitdiff
path: root/noao/imred/ccdred/src/t_mkskyflat.x
blob: 02696905fa88df351d9bf898630fbcbe6c6e6dc0 (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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
include <imhdr.h>
include	"ccdred.h"
include	"ccdtypes.h"


# T_MKSKYFLAT -- Apply a sky observation to a flat field to remove the
# residual illumination pattern.

procedure t_mkskyflat()

int	listin			# List of input CCD images
int	listout			# List of output CCD images
int	ccdtype			# CCD image type
int	interactive		# Fit overscan interactively?

bool	flatcor, ccdflag(), clgetb(), streq()
int	imtopenp(), imtgetim()
pointer	sp, input, output, tmp, str, in, out, ccd
errchk	set_input, set_output, ccddelete

begin
	call smark (sp)
	call salloc (input, SZ_FNAME, TY_CHAR)
	call salloc (output, SZ_FNAME, TY_CHAR)
	call salloc (tmp, SZ_FNAME, TY_CHAR)
	call salloc (str, SZ_LINE, TY_CHAR)

	# Get the lists and instrument translation file.  Open the translation
	# file.  Initialize the interactive flag and the calibration images.

	listin = imtopenp ("input")
	listout = imtopenp ("mkskyflat.output")
	call clgstr ("instrument", Memc[input], SZ_FNAME)
        if (Memc[input] == EOS)
            call error (1, "No 'instrument' translation file specified.")
	call hdmopen (Memc[input])
	call set_interactive ("", interactive)
 
	# Force flat fields even if flatcor=no
	flatcor = clgetb ("flatcor")
	call clputb ("flatcor", true)
	call cal_open (NULL)
	call ccd_open (0)
	call clputb ("flatcor", flatcor)

	# Process each image.
	while (imtgetim (listin, Memc[input], SZ_FNAME) != EOF) {
	    if (clgetb ("noproc")) {
		call printf ("%s: mkskyflat\n")
		    call pargstr (Memc[input])
	    }
	    
	    # Set input and output images.  Use temporary image if needed.
	    call set_input (Memc[input], in, ccdtype)
	    if (in == NULL)
		next

	    if (imtgetim (listout, Memc[output], SZ_FNAME) == EOF)
		call strcpy (Memc[input], Memc[output], SZ_FNAME)
	    if (Memc[output] == EOS)
		call strcpy (Memc[input], Memc[output], SZ_FNAME)
	    if (streq (Memc[input], Memc[output]))
	        call mktemp ("tmp", Memc[tmp], SZ_FNAME)
	    else
		call strcpy (Memc[output], Memc[tmp], SZ_FNAME)
	    call set_output (in, out, Memc[tmp])

	    # Process image as an illumination image.
	    call set_proc (in, out, ccd)
	    call set_sections (ccd)
	    call set_trim (ccd)
	    call set_fixpix (ccd)
	    call set_overscan (ccd)
	    call set_zero (ccd)
	    call set_dark (ccd)
	    call set_flat (ccd)

	    # Do the processing.
	    if (CORS(ccd) == YES) {
	        call doproc (ccd)
	        call set_header (ccd)

	        # Finish up
	        flatcor = ccdflag (out, "flatcor")
	        call imunmap (in)
	        call imunmap (out)
	        if (streq (Memc[input], Memc[output])) {
		    call ccddelete (Memc[input])
	            call imrename (Memc[tmp], Memc[input])
		} else
		    call strcpy (Memc[output], Memc[input], SZ_FNAME)
	    } else {
		# Delete the temporary output image.  Make a copy if needed.
	        flatcor = ccdflag (out, "flatcor")
	        call imunmap (in)
	        call imunmap (out)
		call imdelete (Memc[tmp])
	    }
	    call free_proc (ccd)

	    # Do special processing.
	    if (!flatcor) {
	        call eprintf (
		    "%s: WARNING - Image should be flat fielded first\n")
		    call pargstr (Memc[input])
	    }
	    call mkillumination (Memc[input], Memc[output], NO, YES)
	    call mkskyflat (Memc[input], Memc[output])
	    if (!streq (Memc[input], Memc[output]))
		call ccdcopy (Memc[input], Memc[output])
	}

	# Finish up.
	call hdmclose ()
	call imtclose (listin)
	call imtclose (listout)
	call cal_close ()
	call ccd_close ()
	call sfree (sp)
end


# MKSKYFLAT -- Make a sky flat by dividing the input illumination image by
# the flat field.

procedure mkskyflat (input, output)

char	input[SZ_FNAME]		# Input image
char	output[SZ_FNAME]	# Output image

int	i, nc, nl
long	time
real	scale
pointer	sp, str, flat, tmp, in, im, out, out1, data

int	hdmgeti()
bool	clgetb(), ccdflag(), streq()
real	hdmgetr()
pointer	immap(), imgl2r(), impl2r()
errchk	immap, ccddelete

begin
	# Check if this operation has been done.
	in = immap (input, READ_ONLY, 0)
	if (ccdflag (in, "skyflat")) {
	    call imunmap (in)
	    return
	}

	# Print operation if not processing.
	if (clgetb ("noproc")) {
	    call eprintf (
		"  [TO BE DONE] Convert %s to sky flat\n")
		call pargstr (input)
	    call imunmap (in)
	    return
	}

	call smark (sp)
	call salloc (str, SZ_LINE, TY_CHAR)
	call salloc (flat, SZ_FNAME, TY_CHAR)
	call salloc (tmp, SZ_FNAME, TY_CHAR)

	# Get the flat field.
	call cal_image (in, FLAT, 1, Memc[flat], SZ_FNAME)
	im = immap (Memc[flat], READ_ONLY, 0)
	iferr (scale = hdmgetr (im, "ccdmean"))
	    scale = 1.
	iferr (time = hdmgeti (im, "ccdmeant"))
	    time = IM_MTIME(im)
	if (time < IM_MTIME(im))
	    scale = 1.

	# Create the temporary output.
	if (streq (input, output)) {
	    call mktemp ("tmp", Memc[tmp], SZ_FNAME)
	    call set_output (in, out, Memc[tmp])
	    out1 = in
	} else {
	    call set_output (in, out, output)
	    out1 = out
	}

	# Multiply the illumination and flat field images with scaling.
	nc = IM_LEN(out,1)
	nl = IM_LEN(out,2)
	do i = 1, nl {
	    data = impl2r (out, i)
	    call amulr (Memr[imgl2r(in,i)], Memr[imgl2r(im,i)],
		Memr[data], nc)
	    if (scale != 1.)
	        call adivkr (Memr[data], scale, Memr[data], nc)
	}

	# Log the operation.
	call sprintf (Memc[str], SZ_LINE,
	    "Sky flat created from %s and %s")
	    call pargstr (input)
	    call pargstr (Memc[flat])
	call timelog (Memc[str], SZ_LINE)
	call ccdlog (out1, Memc[str])
	call hdmpstr (out, "skyflat", Memc[str])
	call hdmpstr (out, "imagetyp", "flat")

	# Finish up
	call imunmap (in)
	call imunmap (im)
	call imunmap (out)
	if (streq (input, output)) {
	    call ccddelete (input)
	    call imrename (Memc[tmp], input)
	} else
	    call strcpy (output, input, SZ_FNAME)
	call sfree (sp)
end