aboutsummaryrefslogtreecommitdiff
path: root/sys/imio/iki/stf/stfnewim.x
blob: 3e8a95ed3db26502be3c72cf3e384b55a45d9305 (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
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	<imhdr.h>
include	<imio.h>
include	<mach.h>
include	"stf.h"

define	NBITS_CHAR	(SZB_CHAR * NBITS_BYTE)


# STF_NEWIMAGE -- Set up the IMIO/STF descriptor for an image opened with mode
# new_image or new_copy of non-STF images.  Note that the parameters GROUP 
# and GCOUNT were set earlier by stf_open().

procedure stf_newimage (im)

pointer	im			# image descriptor

pointer	stf
pointer	o_im
long	totpix
char	pname[SZ_KEYWORD]
int	old_kernel, pixtype, bitpix, nbytes, pno, ndim, i, j
errchk	stf_addpar
string	zero "0"
string	one  "1"

include <szpixtype.inc>

begin
	# Get length of axes and datatype from imio descriptor;
	# these may be changed by the user between image mapping 
	# and first i/o to pixfile so we set up the group parameter block
	# and size of pixfile on first i/o operation

	stf = IM_KDES(im)
	o_im = IM_OHDR(im)
	ndim = IM_NDIM(im)
	STF_NAXIS(stf) = ndim
	do i = 1, ndim
	    STF_LENAXIS(stf,i) = IM_LEN(im,i)

	# Get datatype for the pixfile; stf_open has set this to datatype 
	# of template file if it exists, otherwise defaults to real(assuming
	# the user hasn't changed it by now)

	pixtype = IM_PIXTYPE(im)

	bitpix = pix_size[pixtype] * NBITS_CHAR
	nbytes = bitpix / NBITS_BYTE

	call sprintf (STF_DATATYPE(stf), SZ_DATATYPE, "%s*%d")
	    switch (pixtype) {
	    case TY_USHORT:
		call pargstr ("UNSIGNED")
	    case TY_SHORT, TY_LONG, TY_INT:
		call pargstr ("INTEGER")
	    case TY_REAL, TY_DOUBLE:
		call pargstr ("REAL")
	    case TY_COMPLEX:
		call pargstr ("COMPLEX")
	    default:
		pixtype = TY_REAL
		bitpix = SZ_REAL * NBITS_CHAR
		nbytes = bitpix / NBITS_BYTE
		call pargstr ("REAL")
	    }
	    call pargi (nbytes)

	STF_BITPIX(stf) = bitpix

	# Set the IMIO min/max fields.

	IM_MIN(im) = 0.
	IM_MAX(im) = 0.
	IM_LIMTIME(im) = 0

	# For a new copy image(of an already-existing file), DO NOT add group
	# parameters to the GPB, unless the original image is not an STF
	# image.  The following are the "standard" set of datamin/max and the
	# FITS coordinate parms which SDAS files are supposed to have.

	if (IM_ACMODE(im) == NEW_COPY && o_im != NULL)
	    old_kernel = IM_KERNEL(o_im)

	if ((IM_ACMODE(im) == NEW_FILE) || 
	   ((IM_ACMODE(im) == NEW_COPY) && IM_KERNEL(im) != old_kernel)) {

	    # Set up the standard STF group parameter block parameters.
	    STF_GROUPS(stf) = YES
	    STF_PCOUNT(stf) = 2 + (ndim * 3) + (ndim * ndim)
	    STF_PSIZE(stf) = 2 * (SZ_REAL * NBITS_CHAR) +	# DATAMIN/MAX
		ndim * (SZ_DOUBLE * NBITS_CHAR) +		# CRVALn
		ndim * (SZ_REAL * NBITS_CHAR) +			# CRPIXn
		ndim * (8 * NBITS_BYTE) +			# CTYPEn
		(ndim * ndim) * (SZ_REAL * NBITS_CHAR)		# CD matrix

	    # Free any unneeded space in the STF descriptor.
	    if (STF_PCOUNT(stf) > 0) {
		call realloc (stf,
		    LEN_STFBASE + STF_PCOUNT(stf)*LEN_PDES, TY_STRUCT)
		IM_KDES(im) = stf
	    }

	    # Set up the group data block in the STF descriptor and in 
	    # the IMIO FITS format user area.  WARNING--the STF kernel
	    # is implicitly assuming that the GPB related parameters
	    # in non-STF format images are at the beginning of the user
	    # area, if they are present at all.   If this is not true
	    # then the following code will APPEND them to the user area.
	    # At STScI, non-STF format images are usually made from STF
	    # images and these parameters are at the beginning of the user
	    # area in that case.

	    pno = 1
	    call stf_addpar (im, "DATAMIN", TY_REAL, 1, zero, pno)
	    call stf_addpar (im, "DATAMAX", TY_REAL, 1, zero, pno)

	    do i = 1, ndim {
		call sprintf (pname,  SZ_KEYWORD, "CRPIX%d"); call pargi (i)
		call stf_addpar (im, pname, TY_REAL, 1, zero, pno)
		call sprintf (pname,  SZ_KEYWORD, "CRVAL%d"); call pargi (i)
		call stf_addpar (im, pname, TY_DOUBLE, 1, zero, pno)
		call sprintf (pname,  SZ_KEYWORD, "CTYPE%d"); call pargi (i)
		call stf_addpar (im, pname, TY_CHAR, 8, "PIXEL", pno)

		do j = 1, ndim {
		    call sprintf (pname,  SZ_KEYWORD, "CD%d_%d")
			call pargi (j)
			call pargi (i)
		    if (i == j)
			call stf_addpar (im, pname, TY_REAL, 1, one,  pno)
		    else
			call stf_addpar (im, pname, TY_REAL, 1, zero, pno)
		}
	    }
	}

	# Compute the size of each group in the pixel file, in chars.
	totpix = IM_LEN(im,1)
	do i = 2, ndim
	    totpix = totpix * IM_LEN(im,i)

	STF_SZGROUP(stf) = totpix * pix_size[IM_PIXTYPE(im)] +
	    STF_PSIZE(stf) / (SZB_CHAR * NBITS_BYTE)
end