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

include	<error.h>
include	<mach.h>
include	<imhdr.h>
include	<imio.h>
include	<qpset.h>
include	<qpioset.h>
include	"qpf.h"

# QPF_OPEN -- Open a QPOE image.  New QPOE images can only be written by
# calling QPOE directly; under IMIO, only READ_ONLY access is supported.

procedure qpf_open (kernel, im, o_im,
	root, extn, ksection, cl_index, cl_size, acmode, status)

int	kernel			#I IKI kernel
pointer	im			#I image descriptor
pointer	o_im			#I [not used]
char	root[ARB]		#I root image name
char	extn[ARB]		#I filename extension
char	ksection[ARB]		#I QPIO filter expression
int	cl_index		#I [not used]
int	cl_size			#I [not used]
int	acmode			#I [not used]
int	status			#O ok|err

int	n
real	xblock, yblock, tol
pointer	sp, qp, io, v, fname, qpf

pointer	qp_open, qpio_open()
real	qpio_statr(), qp_statr()
int	qpio_getrange(), qp_geti(), qp_gstr(), qp_lenf()
define	err_ 91

begin
	call smark (sp)
	call salloc (fname, SZ_PATHNAME, TY_CHAR)
	call salloc (v, SZ_FNAME, TY_CHAR)

	io = NULL
	qp = NULL
	qpf = NULL
	tol = EPSILONR * 100

	# The only valid cl_index for a QPOE image is -1 (none specified) or 1.
	if (!(cl_index < 0 || cl_index == 1))
	    goto err_

	call malloc (qpf, LEN_QPFDES, TY_STRUCT)

	# Open the QPOE file.
	call iki_mkfname (root, extn, Memc[fname], SZ_PATHNAME)
	iferr (qp = qp_open (Memc[fname], READ_ONLY, 0)) {
	    qp = NULL
	    goto err_
	}

	# Open the event list under QPIO for sampled (pixel) i/o.
	iferr (io = qpio_open (qp, ksection, READ_ONLY))
	    io = NULL

	# Determine the data range and pixel type.
	iferr (IM_CTIME(im) = qp_geti (qp, "cretime"))
	    IM_CTIME(im) = 0
	iferr (IM_MTIME(im) = qp_geti (qp, "modtime"))
	    IM_MTIME(im) = 0
	iferr (IM_LIMTIME(im) = qp_geti (qp, "limtime"))
	    IM_LIMTIME(im) = 0

	# The min and max pixel values for a sampled event file depend
	# strongly on the blocking factor, which is a runtime variable.
	# Ideally when the poefile is written the vectors 'datamin' and
	# 'datamax' should be computed for the main event list.  These
	# give the min and max pixel values (counts/pixel) for each blocking
	# factor from 1 to len(data[min|max]), i.e., the blocking factor
	# serves as the index into these vectors.

	if (io != NULL) {
	    xblock = max (1.0, qpio_statr (io, QPIO_XBLOCKFACTOR))
	    yblock = max (1.0, qpio_statr (io, QPIO_YBLOCKFACTOR))
	} else {
	    xblock = max (1.0, qp_statr (qp, QPOE_XBLOCKFACTOR))
	    yblock = max (1.0, qp_statr (qp, QPOE_YBLOCKFACTOR))
	}
	call strcpy ("datamax", Memc[v], SZ_FNAME)
	n = qp_lenf (qp, Memc[v])

	if (n >= max(xblock,yblock)) {
	    call sprintf (Memc[v+7], SZ_FNAME-7, "[%d]")
		call pargi (nint((xblock+yblock)/2))
	    IM_MAX(im) = qp_geti (qp, Memc[v])
	    Memc[v+5] = 'i';  Memc[v+6] = 'n'
	    IM_MIN(im) = qp_geti (qp, Memc[v])
	} else
	    IM_LIMTIME(im) = 0

	# Set the image pixel type.  This is arbitrary, provided we have
	# enough dynamic range to represent the maximum pixel value.

	IM_PIXTYPE(im) = TY_INT
	if (IM_LIMTIME(im) != 0 && IM_LIMTIME(im) >= IM_MTIME(im))
	    if (int(IM_MAX(im)) <= MAX_SHORT)
		IM_PIXTYPE(im) = TY_SHORT

	# Set the image size parameters.  If the user has specified a rect
	# within which i/o is to occur, set the logical image size to the
	# size of the rect rather than the full matrix.

	if (io != NULL) {
	    IM_NDIM(im)  = qpio_getrange (io, QPF_VS(qpf,1), QPF_VE(qpf,1), 2)
	    IM_LEN(im,1) = (QPF_VE(qpf,1) - QPF_VS(qpf,1) + 1) / xblock + tol
	    IM_LEN(im,2) = (QPF_VE(qpf,2) - QPF_VS(qpf,2) + 1) / yblock + tol
	} else {
	    IM_NDIM(im)  = 2
	    IM_LEN(im,1) = qp_geti (qp, "axlen[1]") / xblock + tol
	    IM_LEN(im,2) = qp_geti (qp, "axlen[2]") / yblock + tol
	    QPF_VS(qpf,1) = 1;	QPF_VE(qpf,1) = IM_LEN(im,1)
	    QPF_VS(qpf,2) = 1;	QPF_VE(qpf,2) = IM_LEN(im,2)
	}
	call imioff (im, 1, YES, 1)

	iferr (n = qp_gstr (qp, "title", IM_TITLE(im), SZ_IMTITLE))
	    IM_TITLE(im) = EOS
	iferr (n = qp_gstr (qp, "history", IM_HISTORY(im), SZ_IMHIST))
	    IM_HISTORY(im) = EOS

	call strcpy (root, IM_HDRFILE(im), SZ_IMHDRFILE)
	IM_PIXFILE(im) = EOS
	IM_HFD(im) = NULL
	IM_PFD(im) = NULL

	# Set up the QPF descriptor.
	QPF_IM(qpf)	= im
	QPF_QP(qpf)	= qp
	QPF_IO(qpf)	= io
	QPF_XBLOCK(qpf)	= xblock
	QPF_YBLOCK(qpf)	= yblock
	QPF_IOSTAT(qpf)	= 0

	IM_KDES(im) = qpf

	# Copy any scalar QPOE file header parameters into the IMIO header.
	iferr (call qpf_copyparams (im, qp))
	    call erract (EA_WARN)

	status = OK
	call sfree (sp)
	return

err_
	# Error abort.
	if (io != NULL)
	    call qpio_close (io)
	if (qp != NULL)
	    call qp_close (qp)

	call mfree (qpf, TY_STRUCT)
	IM_KDES(im) = NULL

	status = ERR
	call erract (EA_WARN)
	call sfree (sp)
end