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
|
include <imhdr.h>
# READCOR -- Create a readout image.
# Assume it is appropriate to perform this operation on the input image.
# There is no CCD type checking.
procedure readcor (input)
char input[ARB] # Input image
int readaxis # Readout axis
int i, nc, nl, c1, c2, cs, l1, l2, ls
int in_c1, in_c2, in_l1, in_l2, ccd_c1, ccd_c2, ccd_l1, ccd_l2
pointer sp, output, str, in, out, data
real asumr()
int clgwrd()
bool clgetb(), ccdflag()
pointer immap(), imgl2r(), impl2r(), imps2r()
errchk immap, ccddelete
begin
# Check if this operation is desired.
if (!clgetb ("readcor"))
return
# Check if this operation has been done. Unfortunately this requires
# mapping the image.
in = immap (input, READ_ONLY, 0)
if (ccdflag (in, "readcor")) {
call imunmap (in)
return
}
if (clgetb ("noproc")) {
call eprintf (
" [TO BE DONE] Convert %s to readout correction\n")
call pargstr (input)
call imunmap (in)
return
}
call smark (sp)
call salloc (output, SZ_FNAME, TY_CHAR)
call salloc (str, SZ_LINE, TY_CHAR)
# The default data section is the entire image.
nc = IM_LEN(in,1)
nl = IM_LEN(in,2)
c1 = 1
c2 = nc
cs = 1
l1 = 1
l2 = nl
ls = 1
call hdmgstr (in, "datasec", Memc[str], SZ_LINE)
call ccd_section (Memc[str], c1, c2, cs, l1, l2, ls)
if ((c1<1)||(c2>nc)||(l1<1)||(l2>nl)||(cs!=1)||(ls!=1))
call error (0, "Error in DATASEC parameter")
in_c1 = c1
in_c2 = c2
in_l1 = l1
in_l2 = l2
# The default ccd section is the data section.
call hdmgstr (in, "ccdsec", Memc[str], SZ_LINE)
call ccd_section (Memc[str], c1, c2, cs, l1, l2, ls)
if ((cs != 1) || (ls != 1))
call error (0, "Error in CCDSEC parameter")
ccd_c1 = c1
ccd_c2 = c2
ccd_l1 = l1
ccd_l2 = l2
if ((in_c2-in_c1 != ccd_c2-ccd_c1) || (in_l2-in_l1 != ccd_l2-ccd_l1))
call error (0, "Size of DATASEC and CCDSEC do not agree")
# Determine the readout axis.
readaxis = clgwrd ("readaxis", Memc[str], SZ_LINE, "|lines|columns|")
# Create output.
call mktemp ("tmp", Memc[output], SZ_FNAME)
call set_output (in, out, Memc[output])
# Average across the readout axis.
switch (readaxis) {
case 1:
IM_LEN(out,2) = 1
data = impl2r (out, 1)
call aclrr (Memr[data], nc)
nc = in_c2 - in_c1 + 1
nl = in_l2 - in_l1 + 1
data = data + in_c1 - 1
do i = in_l1, in_l2
call aaddr (Memr[imgl2r(in,i)+in_c1-1], Memr[data],
Memr[data], nc)
call adivkr (Memr[data], real (nl), Memr[data], nc)
call sprintf (Memc[str], SZ_LINE, "[%d:%d,1:1]")
call pargi (in_c1)
call pargi (in_c2)
call hdmpstr (out, "datasec", Memc[str])
call sprintf (Memc[str], SZ_LINE, "[%d:%d,*]")
call pargi (ccd_c1)
call pargi (ccd_c2)
call hdmpstr (out, "ccdsec", Memc[str])
case 2:
IM_LEN(out,1) = 1
data = imps2r (out, 1, 1, 1, nl)
call aclrr (Memr[data], nl)
nc = in_c2 - in_c1 + 1
nl = in_l2 - in_l1 + 1
do i = in_l1, in_l2
Memr[data+i-1] = asumr (Memr[imgl2r(in,i)+in_c1-1], nc) / nc
call sprintf (Memc[str], SZ_LINE, "[1:1,%d:%d]")
call pargi (in_l1)
call pargi (in_l2)
call hdmpstr (out, "datasec", Memc[str])
call sprintf (Memc[str], SZ_LINE, "[*,%d:%d]")
call pargi (ccd_l1)
call pargi (ccd_l2)
call hdmpstr (out, "ccdsec", Memc[str])
}
# Log the operation.
call sprintf (Memc[str], SZ_LINE,
"Converted to readout format")
call timelog (Memc[str], SZ_LINE)
call ccdlog (in, Memc[str])
call hdmpstr (out, "readcor", Memc[str])
# Replace the input image by the output image.
call imunmap (in)
call imunmap (out)
call ccddelete (input)
call imrename (Memc[output], input)
call sfree (sp)
end
|