.help fits Apr84 "Program Structure"
.sh
RFITS Structure Chart

.nf
t_rfits ()
# Returns when file list is satisfied or if EOT is encountered
# Errors from called routines are trapped and printed as a warning.

	read_fits (fitsfile, iraffile)
	# Returns OK or EOF

		read_header (fits_fd, fits, im)
		# Returns OK or EOF

	    		decode_fits_card (fits, im, card)
			# Returns YES or NO

				get_fits_string (card, str, maxchar)

		read_image (fits_fd, fits, im)
		# Invokes error handler if EOF is encountered

			set_image_header (fits, im)

			set_coords (im)
			# sets the coordinate transformations to a 1 to 1
			# mapping

			init_read_pixels (npix_record, bitpix, lsbf, spp_type)
			# Returns OK

			put_imageline (im, bufptr, v, pixel_type)
			# Outputs line to image

			read_pixels (fd, buffer, npix)
			# Returns EOF or the number of pixels converted

			map_blanks (a, blanks, im)

			scale_line (line, bufptr, npix, bscale, bzero,
				    pixel_type)
			# Converts the pixels to the output data type after
			# applying bscale and bzero to the data

			change_line(line, bufptr, npix, pixel_type)
			# Changes the FITS integers to the output pixel_type
			# without scaling.
.fi

.sh
RFITS Structure Summary

.ls 4 t_rfits
The main procedure reads the control parameters.
The files to be read and converted are calculated from the specified source
and file list.  A loop through
the files determines the specific input source names and output filenames
and calls READ_FITS for each conversion.
.ls read_fits
The input source is opened and the output image header file is created.
If only the FITS header is to be listed then a temporary image header file
is created.  The FITS header is read and decoded into the IRAF image
header by READ_HEADER.  If the image is to be read then MAKE_IMAGE is
called.  Finally, all files are closed.  If a temporary image header file
was created it is deleted.
.ls read_header
Some initialization is done on the IRAF header.
The FITS header cards are read one at a time.  If EOF is encountered
then EOF is returned.  If a long header listing has been specified then
the card is printed.  The card is passed to DECODE_FITS_CARD.  If
DECODE_FITS_CARD returns YES for the END card then the loop exits.  If a
short header listing has bee specified then the title and image size
is printed.  The routine returns OK if the header was successfully
interpreted or EOF if encountered.  All other errors are returned
via the error handler.
.ls decode_fits_card
A series of STRMATCHes are made against the recognized FITS keywords.
If a match is found the possible actions are:
.ls
Convert a value to the IRAF image header.  The conversions are defined in
fits.h
.le
.ls
Invoke an error condition
.le
.ls
Return a YES status if the keyword is END
.le

Otherwise, the card is concatenated to the User Area of the IRAF image
header.  If the keyword was not END then NO is returned.
.ls get_fits_string
The string field for a keyword with a string value is extracted.  The
leading and trailing quotes are removed as well as trailing blanks.
The EOS is marked by either ', /, or the end of the card.
.le
.le
.le
.ls read_image
The FITS image pixels are converted to an IRAF image file.
The image file header is set.
The lines of the image are converted one at a time.
Each line is checked for blank values.
When all the image data has been read the number of blank pixels encounter
is printed (unless the value is zero).
.ls set_image_header
The pixel type for the IRAF image is set to the user specified type.
If no type has been specified then the type is determined from the number
of bits per pixel given in the FITS header.
.le
.ls set_coords
Sets the coordinate transformation parameters to a 1 to 1 transformation.
.le
.ls init_read_pixels
The pixel reading routine is initialized.  The parameters are the number
of pixels per record, the number of bits per pixel which must be a
valid MII type, a byte order flag, and the SPP data type to be converted
to.  In the FITS reader the byte order is specified to be most significant
byte first and the SPP data type is TY_LONG.
.le
.ls put_imageline
Put_imageline outputs a single line of the FITS image to the IRAF image.
.le
.ls read_pixels
The pixels are read into a record buffer.  Data conversion is accomplished
with the MII routines since FITS format is the same as MII format.  The
specified number of pixels is returned in the specified buffer.
.le
.ls map_blanks
Pixels having the blank value as given in the FITS header are added into
the bad pixel count in the image header.  This routine will someday handle
mapping of bad pixels in a more detailed manner.
.le
.ls scale_line
The FITS integers from tape are converted to the output IRAF data type by
applying the FITS scaling parameters BSCALE and BZERO.
.le
.ls change_line
The FITS integers are converted directly to the output IRAF data type
without scaling (BSCALE = 1.0 and BZERO = 0.0).
.le
.le
.le

.sh
WFITS Structure Chart

.nf
t_wfits()
# Returns when the input file list is satisfied.
# Errors from called routines are trapped, an error message is issued and
# wfits terminates.

	wrt_fits (iraf_file, fits_file)

		data_limits (im)

		wrt_header (im, fits, fits_fd)

			set_bitbix (bitpix, pixtype, data_bitpix)

			iraf_type (pixtype, pixstring)

			set_scale (fits_bitpix, datamax, datamin, bscale, bzero)

				tape_limits (fits_bitpix, tapemax, tapemin)

			set_blank (fits_bitpix, blank, blankstr)

			init_wrt_pixels (npix_record, spp_type, mii_type)

			init_card_encode (im, fits)
			# Returns YES

			card_encode (im, fits, card)
			# Returns YES if valid FITS card

				get_standard_card (cardno, im, fits, axisno,
						   card
				# Returns YES or NO

				get_option_card (im, fits, optiono, card)
				# Returns YES or NO

				get_coord_card (im, coordno, coordaxis, card)
				# Returns YES or NO

				get_history_card (im, histptr, card)
				# Returns YES or NO

				get_end_card (card)
				# Returns YES or NO

			wrt_pixels (fits_fd, card, len_card)

			wrt_last_record (fits_fd)

		wrt_image (im, fits, fits_fd)

			init_wrt_pixels (npix_record, spp_type, mii_type)

			get_image_line (im, bufptr, v, pixtype)
			# Returns EOF or number of pixels in a line

			scale_line (bufptr, long_array, npix, bscale, bzero,
				    pixtype)

			long_line (bufptr, long_array, npix, pixtype)

			map_blanks (im, long_array, blank)

			wrt_pixels (fits_fd, long_array, npix)

			wrt_last_record (fits_fd)
.fi
.sh
WFITS Structure Summary

.ls t_wfits
The main procedure reads the control parameters. The files to be read and
converted are calculated from the specified source and file list. A loop
through the files determines the specific input source names and output
file names and calls WRT_FITS for each file conversion. Write errors are trapped
and cause termination of the program.
.ls wrt_fits
The input source is opened. If the make_image switch is set the output
destination is opened. The IRAF image header parameters are encoded into
the FITS header and both header and pixels are written to the output
destination.
DATA_LIMITS is called if the autoscale switch is enabled and the IRAF image
data maximum and minimum values are unknown or the image has been modified
since they were last calculated.
If the make_image switch is turned off the FITS header is printed
on the standard output and a temporary output file is created. Finally
all the files are closed. If a temporary file was created it is deleted.
.ls data_limits
DATA_LIMITS calculates the minimum and maximum data values in an IRAF image.
The calculation is made only if these values are
undefined or the image has been modified since the last values were
calculated.
.le
.ls wrt_header
Some initialization is done on the FITS header. The appropriate FITS bitpix,
bzero and bscale factors, and the tape value for blank pixels are calculated
for each image.
The FITS header cards are encoded one at a time. If a long_header listing
has been specified then the FITS card is printed on the standard output.
If a short_header listing
is specified then the title and image size only are printed. Encoding terminates
when the FITS END keyword is encountered. Partial header records are filled
with blanks before being written to the output destination.
.ls set_bitpix
The value of the FITS bitpix is calculated. If the user given bitpix is
not a valid FITS bitpix, SET_BITPIX uses the precision of the IRAF image data
to set bitpix.
.le
.ls iraf_type
The IRAF datatype value is set to either INTEGER, FLOATING or COMPLEX.
.le
.ls set_scale
The bscale and bzero values are calculated from the IRAF minimum and maximum
data values and the FITS bitpix.
.ls tape_limits
The maximum and minimum FITS integer values are calculated from the FITS bitpix.
.le
.le
.ls set_blank
The FITS integer value for a blank pixel is calculated from the FITS bitpix.
.le
.ls init_wrt_pixels
The pixel writing routine is initialized. The parameters are the number of
pixels per record, the spp_type and the number of bits per pixel which
must be a valid mii type. For ASCII header card images the number of pixels
per record is normally 2880 and the bits per pixel is 8. The spp type is
always TY_CHAR.
.le
.ls init_card_encode
The card encoding procedure is initialized. The number of standard keyword,
optional keywords, coordinate transformation keywords, and history keywords
are calculated.
.le
.ls card_encode
An eighty character FITS format string is created for each permitted
FITS keyword.
.ls get_standard_card
The minimum required FITS header parameters, SIMPLE, BITPIX, NAXIS and NAXIS#
are encode into FITS cards.
.le
.ls get_option_card
A set of optional FITS  parameters are encoded into FITS cards.
At present the permitted keywords are BSCALE, BZERO, BUNIT, BLANK
OBJECT, ORIGIN, DATE, IRAFMAX, IRAFMIN, IRAF-B/P, and IRAFTYPE.
The BLANK card is only encoded if the number of bad pixels in the 
IRAF image header is nonzero. BUNIT and OBJECT cards are only encoded if
if the appropriate strings in the IRAF image header are defined.
.le
.ls get_coord_card
The coordinate transformation parameters are encoded into FITS header cards.
.le
.ls get_history_card
The IRAF history string is encoded into FITS header card(s). A maximum of
seven HISTORY cards are currently permitted by imio.
.le
.ls get_end_card
The FITS end card in encoded.
.le
.le
.ls wrt_pixels
The FITS card images are read into a record buffer. When the buffer is
full data conversion is accomplished using the mii routines since FITS
format is the same as mii format. After data conversion the record
buffer is written to the output destination.
.le
.ls wrt_last_record
The last partially filled header record is padded with blanks and written to
the output destination.
.le
.le
.ls wrt_image
The IRAF image pixels are converted to FITS image format. The lines of the
IRAF image are converted one at a time. Each line is scaled (if scaling is
enabled and appropriate) and the IRAF pixels are converted to long integers.
WRT_PIXELS is called to convert the integers to the appropriate FITS
output type using the MII routines.
.ls init_wrt_pixels
The pixel writing routine is initialized. The parameters are the number of
pixels per output record, the spp type and the number of FITS bits per pixel
which must be a valid mii type. The number of pixels per output record is
2880, 1440 or 720 for FITS bitpix of 8, 16 or 32 respectively. The spp type
is always TY_LONG.
.le
.ls get_image_line
A single IRAF image line is read into an internal buffer.
.le
.ls scale_line
The IRAF image line is scaled by the FITS BSCALE and
BZERO scaling factors and converted to long integers.
SCALE_LINE is called if the scale switch is set.
.le
.ls long_line
The IRAF image data values are converted directly to long integers.
LONG_LINE is called if scaling switch is turned off.
.le
.ls map_blanks
This function will eventually map IRAF blank pixels to the appropriate
FITS integer for blanks. Implementation of this function is will occur
after the imio mods.
.le
.ls wrt_pixels
The scaled IRAF image lines are read into a record buffer. When the buffer is
full data conversion is accomplished using the MII routines since FITS
format is the same as mii format. After data conversion the record
buffer is written to the output destination.
.le
.ls wrt_last_record
The last partially full data record is padded with zeros and written to the
output destination.
.le
.le
.le
.le
.endhelp
