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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
|
IKI/STF -- IKI kernel for the STScI SDAS/GEIS image format. This format stores
images in a format which resembles FITS group format. A GROUP FORMAT IMAGE is
a set of one or more images, all of which are the same size, dimension, and
datatype, and which share a common FITS header. The individual images in a
group each has a binary GROUP PARAMETER BLOCK (GPB). The image and associated
group parameter block are commonly referred to as a GROUP. A group format
image consists of two files, the FITS format header file for the group,
and the pixel file containing the image data and GPBs.
1. Typical STF group format FITS image header (imname.hhh)
SIMPLE = F / Standard STF keywords
BITPIX = 32
DATATYPE= 'REAL*4 '
NAXIS = 2
NAXIS1 = 512
NAXIS2 = 512
GROUPS = T
PSIZE = 512
GCOUNT = 1
PCOUNT = 12
PTYPE1 = 'DATAMIN ' / Define binary group params
PSIZE1 = 32
PDTYPE1 = 'REAL*4 '
(etc, for a total of 3*PCOUNT entries)
(special keywords and HISTORY cards)
2. Pixel file format (imname.hhd) (byte stream, no alignment, no header)
[1].pixels
[1].group parameter block
[2].pixels
[2].group parameter block
...
[GCOUNT].pixels
[GCOUNT].group parameter block
The chief problems with this format are that the FITS format header can contain
only parameters which pertain to the group as a whole, while the format of the
GPBs is fixed at image creation time. Images may be neither deleted from nor
added to a group. It is possible for parameters in the FITS header to have
the same names as parameters in the GPBs. Multiple entries for the same
keyword may appear in the FITS header and the format does not define how
these are to be handled. Although the format is general enough to support
any datatype pixels, in practice only REAL*4 can be used as the SDAS software
maps the pixfile directly into virtual memory.
CAVEAT -- This is an awkward interface and some liberties have been taken in
the code (hidden, subtle semantics, etc.). At least we were able to confine
the bad code to this one directory; any problems can be fixed without any
changes to the rest of IMIO. All of this low level code is expected to be
thrown out when IMIO is cut over onto DBIO (the upcoming IRAF database
interface).
IKI/STF Pseudocode
----------------------------
1. Data structures:
1.1 IMIO image descriptor
header, pixel file descriptors
pointer to additional kernel descriptor, if any
index of IKI kernel in use
pathnames of header, pixel files
IM_NDIM, IM_LEN, etc., physical image parameters
1.2 STF image descriptor
Pointed to by IM_KDES field of IMIO descriptor.
Contains values of all reserved fields of STF image header,
some of which duplicate values in IMIO descriptor.
Group, gcount, size of a group in pixfile, description of
the group parameter block, i.e., for each parameter,
the offset, datatype type, name, length if array, etc.
1.3 IMIO user area (FITS cards)
While an image is open, the first few cards in the user area
contain the FITS encoded group parameters.
The remainder of the user area contains an exact image of
all non-reserved keyword cards found in the STF image
header (or in the header of some other type of image
when making a new_copy of an image stored in some other
format).
2. Major Procedures
procedure open_image
begin
if (mode is not new_image or new_copy) {
open_existing_image
return
}
We are opening a new_image or new_copy image. The problem here is
that the new image might be a group within an existing group format
image. This ambiguity is resolved by a simple test on the group
index, rather than by a context dependent test on the existence of
the group format image. If the mode is new_whatever and the group
is 1, a new group format image is created, else if the group is > 1,
the indicated group is initialized in an existing group format image.
if (group > 1) {
We are opening a new group within an existing group format image.
Call open_existing_image to open the group without reading the
group parameter block, which has not yet been initialized.
if (mode is new_image)
initialize GPB to pixel coords
else if (mode is new_copy)
copy old GPB to new image; transform coords if necessary
Note that when opening a new copy of an existing image as a new
group within a group format image, it is not clear what to do
with the FITS header of the old image. Our solution is to ignore
it, and retain only the GPB, the only part of the old header
pertaining directly to the group being accessed.
} else if (opening group 1 of a new image) {
We are creating a new group format image.
if (mode is new_image)
open_new_image
else
open_new_copy
}
end
procedure open_existing_image
begin
Allocate STF descriptor, save pointer in imio descriptor.
Open image header.
Read header:
process reserved cards into STF descriptor
spool other cards
Load group data block from pixfile, get datamin/datamax:
if (there is a gdb) {
open pixfile
read gdb into buffer
for (each param in gdb) {
set up parameter descriptor
format FITS card and put in imio user area
}
}
fetch datamin, datamax from user area
Set IM_MIN, IM_MAX, IM_LIMTIME from DATAMIN, DATAMAX.
Mark end of user area.
Copy spooled cards to user area.
(increase size of user area if necessary)
Call imioff to set up imio pixel offset parameters
end
procedure open_new_image
begin
Upon entry, the imio iminie procedure has already been called to
initialize the imio descriptor for the new image.
Allocate STF descriptor, save pointer in imio descriptor.
Create header file from template dev$pix.hhh.
Open new image header.
(At this point the IMIO header fields IM_NDIM, IM_LEN, etc., and
(the STF descriptor fields have not yet been set, and cannot be set
(until the image dimensions have been defined by the high level code.
(imopix() will later have to fix up the remaining header fields and
(set up the default group data block.
end
procedure open_new_copy
begin
Upon entry, the imio immaky procedure has already been called to
copy the old header to the new and initialize the data
dependent fields. This will include the FITS encoded group
parameters in the user area of the old image.
Allocate STF descriptor, save pointer in imio descriptor.
Create header file from template dev$pix.hhh.
Open new image header.
Copy the STF descriptor of the old image to the new. Preserve
the parameter marking the end of the GPB area of the old
user area, as we do not want to write these cards when the
header is updated.
(At this point all header information is set up, except that there
(is no pixel file and the pixfile offsets have not been set.
(Provided the image dimensions do not change, one could simply
(set the pixfile name, call imioff, and do i/o to the image.
end
procedure open_pixel_file
begin
(We are called when the first i/o is done to an image. When writing
(to a new image, the user may change any of the image header attributes
(after the open and before we are called.
if (pixel file already open)
return
else if (opening existing image) {
open pixel file
return
}
if (opening a new image) {
Given the values of IM_NDIM and IM_LEN set by the user, set up the
STF descriptor including the default group parameter block. Add
the FITS encoded cards for the GPB to the image header. Mark the
end of the GPB cards, i.e., the start of the real user parameter
area. Ignore IM_PIXTYPE; always open an image of type real since
that is what the SDAS software requires. Set up the WCS to linear
pixel coordinates.
} else if (opening a new_copy image) {
(The STF descriptor and GPB will already have been set up as a
(copy of the data structures used by the old image. However,
(the user may have changed the values of IM_NDIM and IM_LEN
(since the image was opened, and the value of GCOUNT set when
(the image was opened may be different than that of the old image.
Transform the coordinate system of the old image to produce the
WCS for the new image, i.e., if an image section was used to
reference the old image.
Make a new STF descriptor using the values of IM_NDIM and IM_LEN
given, as for a new_image, but using the WCS information for the
new image. The FITS encoded fields in the IMIO user area will be
automatically updated by the IMADD functions, or new cards added
if not present.
Merge any additional fields from the old STF descriptor into the
new one, e.g., any instrument dependent parameters stored in the
GPB.
(The STF and FITS encoded user area should now contain a full
(description of the GPB for the new image.
}
Allocate the pixel file, using the GCOUNT parameter set in the
STF descriptor at stf_open time.
Open the pixel file.
Set IM_MIN and IM_MAX to zero (not defined).
Call IMIOFF to initialize the pixel offsets.
end
procedure update_image_header
begin
Update the values of DATAMIN, DATAMAX from the IMIO header fields.
Update the binary GPB in the pixel file from the FITS encoded GPB
in the IMIO user area, using the GPB structure defined in the
STF descriptor.
Update the STF image header file:
Open a new, empty header file using FMKCOPY and OPEN.
Format and output FITS cards for the reserved header fields,
e.g., SIMPLE, BITPIX, GCOUNT, the GPB information, etc.
Copy the user area to the new header file, excluding the
GPB cards at the beginning of the user area.
Close the new header file and replace the old header file
with the new one via a rename operation.
end
procedure close_image
begin
(We assume that IMIO has already update the image header if such
(is necessary.
if (pixel file open)
close pixel file
if (header file open)
close header file
deallocate STF descriptor
(IMIO will deallocate the IMIO descriptor)
end
|