1# To: bug-gnu-utils@prep.ai.mit.edu
2# Cc: arnold@gnu.ai.mit.edu
3# Date: Mon, 20 Nov 1995 11:39:29 -0500
4# From: "R. Hank Donnelly" <emory!head-cfa.harvard.edu!donnelly>
5#
6# Operating system: Linux1.2.13 (Slackware distrib)
7# GAWK version: 2.15 (?)
8# compiler: GCC (?)
9#
10# The following enclosed script does not want to fully process the input data
11# file. It correctly executes the operations on the first record, and then dies
12# on the second one. My true data file is much longer but this is
13# representative and it does fail on a file even as short as this one.
14# The failure appears to occur in the declared function add2output. Between the
15# steps of incrementing NF by one and setting $NF to the passed variable
16# the passed variable appears to vanish (i.e. NF does go from 68 to 69
17# and before incrementing it "variable" equals what it should but after
18# "variable" has no value at all.)
19#
20# The scripts have been developed using nawk on a Sun (where they run fine)
21# I have tried gawk there but get a different crash which I have not yet traced
22# down. Ideally I would like to keep the script the same so that it would run
23# on either gawk or nawk (that way I can step back and forth between laptop and
24# workstation.
25#
26# Any ideas why the laptop installation is having problems?
27# Hank
28#
29#
30# #!/usr/bin/gawk -f
31
32BEGIN {
33	# set a few values
34	FS = "\t"
35	OFS = "\t"
36	pi = atan2(0, -1)
37# distance from HRMA to focal plane in mm
38	fullradius = 10260.54
39
40	# set locations of parameters on input line
41	nf_nrg = 1
42	nf_order = 3
43	nf_item = 4
44	nf_suite = 5
45	nf_grating = 8
46	nf_shutter = 9
47	nf_type = 13
48	nf_src = 14
49	nf_target = 15
50	nf_voltage = 16
51	nf_flux = 17
52	nf_filt1 = 20
53	nf_filt1_th = 21
54	nf_filt2 = 22
55	nf_filt2_th = 23
56	nf_bnd = 24
57	nf_hrma_polar = 27
58	nf_hrma_az = 28
59	nf_detector = 30
60	nf_acis_read = 32
61	nf_acis_proc = 33
62	nf_acis_frame = 34
63	nf_hxda_aplist = 36
64	nf_hxda_y_range = 37
65	nf_hxda_z_range = 38
66	nf_hxda_y_step = 39
67	nf_hxda_z_step = 40
68	nf_sim_z = 41
69	nf_fam_polar = 43
70	nf_fam_az = 44
71	nf_fam_dither_type = 45
72	nf_mono_init = 51
73	nf_mono_range = 52
74	nf_mono_step = 53
75	nf_defocus = 54
76	nf_acis_temp = 55
77	nf_tight = 59
78	nf_offset_y = 64
79	nf_offset_z = 65
80
81	while( getline < "xrcf_mnemonics.dat" > 0 ) {
82		mnemonic[$1] = $2
83	}
84
85#	"date" | getline date_line
86# ADR: use a fixed date so that testing will work
87	date_line = "Sun Mar 10 23:00:27 EST 1996"
88        split(date_line, in_date, " ")
89        out_date = in_date[2] " " in_date[3] ", " in_date[6]
90}
91
92function add2output( variable ) {
93#print("hi1") >> "debug"
94	NF++
95#print("hi2") >> "debug"
96 	$NF = variable
97#print("hi3") >> "debug"
98}
99
100function error( ekey, message ) {
101	print "Error at input line " NR ", anode " ekey >> (ENVIRON["WORKDIR"] "/test.temp.errors.cleanup")
102	print "   " message "." >> (ENVIRON["WORKDIR"] "/test.temp.errors.cleanup")
103}
104
105function hxda_na() {
106	$nf_hxda_aplist = $nf_hxda_y_range = $nf_hxda_z_range = "N/A"
107	$nf_hxda_y_step = $nf_hxda_z_step = "N/A"
108}
109
110function acis_na() {
111	$nf_acis_read = $nf_acis_proc = $nf_acis_frame = $nf_acis_temp = "N/A"
112}
113
114function hrc_na() {
115#        print ("hi") >> "debug"
116}
117
118function fpsi_na() {
119	acis_na()
120	hrc_na()
121	$nf_sim_z = $nf_fam_polar = $nf_fam_az = $nf_fam_dither_type = "N/A"
122}
123
124function mono_na() {
125	$nf_mono_init = $nf_mono_range = $nf_mono_step = "N/A"
126}
127
128# this gives the pitch and yaw of the HRMA and FAM
129# positive pitch is facing the source "looking down"
130# positive yaw is looking left
131# 0 az is north 90 is up
132# this also adds in the FAM X,Y,Z positions
133
134function polaz2yawpitch(polar, az) {
135	theta = az * pi / 180
136	phi = polar * pi / 180 / 60
137
138
139	if( polar == 0 ) {
140		add2output( 0 )
141		add2output( 0 )
142	} else {
143		if(az == 0 || az == 180)
144			add2output( 0 )
145		else
146			add2output( - polar * sin(theta) )
147
148
149#			x = cos (phi)
150#			y = sin (phi) * cos (theta)
151#			add2output( atan2(y,x)*180 / pi * 60 )
152
153		if(az == 90 || az ==270 )
154			add2output( 0 )
155		else
156			add2output( - polar * cos(theta) )
157
158	}
159#			x = cos (phi)
160#			z= sin (phi) * sin (theta)
161#			add2output( atan2(z,x)*180 / pi * 60 )
162
163	if(config !~ /HXDA/) {
164# negative values of defocus move us farther from the source thus
165# increasing radius
166		radius = fullradius - defocus
167
168# FAM_x; FAM_y;  FAM_z
169	   	if((offset_y == 0) && (offset_z == 0)){
170			add2output( fullradius - radius * cos (phi) )
171
172			if (az == 90 || az ==270)
173				add2output( 0 )
174			else
175				add2output(  radius * sin (phi) * cos (theta) )
176
177			if (az == 0 || az == 180)
178				add2output( 0 )
179			else
180				add2output( - radius * sin (phi) * sin (theta) )
181	   	} else {
182# ******* THIS SEGMENT OF CODE IS NOT MATHEMATICALLY CORRECT FOR ****
183# OFF AXIS ANGLES AND IS SUPPLIED AS A WORKAROUND SINCE IT WILL
184# PROBABLY ONLY BE USED ON AXIS.
185			add2output( defocus )
186			add2output( offset_y )
187			add2output( offset_z )
188		}
189
190	} else {
191		add2output( "N/A" )
192		add2output( "N/A" )
193		add2output( "N/A" )
194	}
195}
196
197# set TIGHT/LOOSE to N/A if it is not one of the two allowed values
198function tight_na() {
199	if( $nf_tight !~ /TIGHT|LOOSE/ ) {
200		$nf_tight == "N/A"
201	}
202}
203
204# this entry is used to give certain entries names
205{
206	type = $nf_type
207	item = $nf_item
208	suite = $nf_suite
209	order = $nf_order
210	detector = $nf_detector
211	grating = $nf_grating
212	offset_y= $nf_offset_y
213	offset_z= $nf_offset_z
214	bnd = $nf_bnd
215	defocus = $nf_defocus
216}
217
218{
219	# make configuration parameter
220	# as well as setting configuration-dependent N/A values
221
222	if( $nf_bnd ~ "SCAN" ) {
223		# BND is scanning beam
224		config = "BND"
225		hxda_na()
226		fpsi_na()
227	} else {
228		if( grating == "NONE" ) {
229			config = "HRMA"
230		} else {
231			if( grating == "HETG" ) {
232				if( order != "Both" ) {
233				    $nf_shutter = order substr($nf_shutter, \
234					index($nf_shutter, ",") )
235				}
236			} else {
237				order = "N/A"
238			}
239			config = "HRMA/" grating
240		}
241
242		if( detector ~ /ACIS|HRC/ ) {
243			detsys = detector
244			nsub = sub("-", ",", detsys)
245			config = config "/" detsys
246			hxda_na()
247		} else {
248			config = config "/HXDA"
249			fpsi_na()
250			if( detector == "HSI" ) {
251				hxda_na()
252			}
253		}
254	}
255
256	add2output( config )
257
258	if( $nf_src ~ /EIPS|Penning/ ) mono_na()
259
260	if( $nf_src == "Penning" ) $nf_voltage = "N/A"
261
262	itm = sprintf("%03d", item)
263
264	if(config in mnemonic) {
265		if( type in mnemonic ) {
266		    ID = mnemonic[config] "-" mnemonic[type] "-" suite "." itm
267		    add2output( ID )
268		} else {
269			error(type, "measurement type not in list")
270		}
271	} else {
272		error(config, "measurement configuration not in list")
273	}
274
275	# add date to output line
276	add2output( out_date )
277
278	# Convert HRMA polar and azimuthal angles to yaw and pitch
279	polaz2yawpitch($nf_hrma_polar, $nf_hrma_az)
280
281	# set TIGHT/LOOSE to N/A if it is not one of the two allowed values
282	tight_na()
283
284	# compute number of HXDA apertures
285	if( config ~ /HXDA/ && $nf_hxda_aplist != "N/A")
286		add2output( split( $nf_hxda_aplist, dummy, "," ) )
287	else
288		add2output( "N/A" )
289
290	# make sure the BND value is properly set
291	if($nf_bnd == "FIXED" && detector ~ /ACIS/)
292		$nf_bnd =bnd"-SYNC"
293	else
294		$nf_bnd = bnd"-FREE"
295	print
296}
297