aboutsummaryrefslogtreecommitdiff
path: root/noao/mtlocal/cyber/t_ridsout.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/mtlocal/cyber/t_ridsout.x')
-rw-r--r--noao/mtlocal/cyber/t_ridsout.x386
1 files changed, 386 insertions, 0 deletions
diff --git a/noao/mtlocal/cyber/t_ridsout.x b/noao/mtlocal/cyber/t_ridsout.x
new file mode 100644
index 00000000..473d120f
--- /dev/null
+++ b/noao/mtlocal/cyber/t_ridsout.x
@@ -0,0 +1,386 @@
+include <mach.h>
+include <ctype.h>
+include <imhdr.h>
+include <fset.h>
+include <error.h>
+include "cyber.h"
+
+define MAX_WIDTH 10 # Maximum format width for pixel data
+
+# T_RIDSOUT -- the IDSOUT format reader, which reads a text file of IDS
+# records in IDSOUT format. Each IDS record contains 133 card images: 4
+# cards of header information followed by 128 cards of pixel values and
+# one blank card. The IDSOUT reader will read the text file and optionally
+# convert the data to a sequence of one dimensional IRAF images. The
+# header information can be printed in long or short form; the pixel values
+# can also be listed.
+
+procedure t_ridsout ()
+
+pointer sp, cp
+int fd
+char in_fname[SZ_FNAME]
+int get_data_type(), clpopni(), clgfil(), btoi()
+bool clgetb()
+char clgetc()
+errchk clpopni
+
+begin
+ # Allocate space for the control parameter descriptor structure
+ call smark (sp)
+ call salloc (cp, LEN_CP, TY_STRUCT)
+
+ call fseti (STDOUT, F_FLUSHNL, YES)
+
+ # Get parameters from the cl and fill control parameter structure
+ fd = clpopni ("idsout_file")
+
+ LONG_HEADER(cp) = btoi (clgetb ("long_header"))
+ PRINT_PIXELS(cp) = btoi (clgetb ("print_pixels"))
+ call clgstr ("record_numbers", REC_NUMBERS(cp), SZ_LINE)
+
+ # If an output image is to be written, get root output file name
+ # and output data type.
+
+ MAKE_IMAGE(cp) = btoi (clgetb ("make_image"))
+ if (MAKE_IMAGE(cp) == YES) {
+ call clgstr ("iraf_file", IRAF_FILE(cp), SZ_FNAME)
+ DATA_TYPE(cp) = get_data_type (clgetc ("data_type"))
+ if (DATA_TYPE(cp) == ERR)
+ DATA_TYPE(cp) = TY_REAL
+ }
+
+ while (clgfil (fd, in_fname, SZ_FNAME) != EOF) {
+ call read_idsout (in_fname, cp)
+ }
+
+ call clpcls (fd)
+ call sfree (sp)
+end
+
+
+# READ_IDSOUT -- open IDSOUT text file and direct processing depending on
+# user's request.
+
+procedure read_idsout (in_fname, cp)
+
+char in_fname[SZ_FNAME] # Input file name
+pointer cp # Pointer to control parameter structure
+
+pointer sp, ids
+char out_fname[SZ_FNAME]
+int in, records[3, MAX_RANGES], nrecs, nrecs_read, stat
+bool is_in_range()
+int open(), decode_ranges(), idso_read_header(), strlen()
+errchk open, read, idso_read_header, decode_ranges, idso_write_image
+errchk copy_pixels
+
+begin
+ # Open text file and allocate space for descriptor structure ids
+ in = open (in_fname, READ_ONLY, TEXT_FILE)
+ call smark (sp)
+ call salloc (ids, LEN_IDS, TY_STRUCT)
+
+ if (decode_ranges (REC_NUMBERS(cp), records, MAX_RANGES, nrecs) == ERR)
+ call error (1, "Error in record_numbers specification")
+
+ nrecs_read = 0
+ repeat {
+ iferr {
+ stat = idso_read_header (in, ids)
+ } then {
+ call erract (EA_WARN)
+ call eprintf ("Bad header, attempting to skip pixels\n")
+ call copy_pixels (in, NULL)
+ next
+ }
+
+ if (stat == EOF) {
+ call printf ("\nIDSOUT file \"%s\" at EOF\n")
+ call pargstr (in_fname)
+ call close (in)
+ call sfree (sp)
+ return
+ }
+
+ if (is_in_range (records, RECORD_NUMBER(ids))) {
+ nrecs_read = nrecs_read + 1
+ call print_header (ids, LONG_HEADER(cp))
+
+ if (MAKE_IMAGE(cp) == YES) {
+ call strcpy (IRAF_FILE(cp), out_fname, SZ_FNAME)
+ call sprintf (out_fname[strlen(out_fname)+1], SZ_FNAME,
+ ".%04d")
+ call pargi (RECORD_NUMBER(ids))
+ iferr {
+ call idso_write_image (in, DATA_TYPE(cp),
+ PRINT_PIXELS(cp), out_fname, ids)
+ } then {
+ call erract (EA_WARN)
+ if (PRINT_PIXELS(cp) == YES)
+ call copy_pixels (in, STDOUT)
+ else
+ call copy_pixels (in, NULL)
+ next
+ }
+
+ } else if (PRINT_PIXELS(cp) == YES)
+ # Simply copy card image data to standard output
+ call copy_pixels (in, STDOUT)
+
+ if (PRINT_PIXELS(cp) == NO && MAKE_IMAGE(cp) == NO)
+ call copy_pixels (in, NULL)
+ } else
+ call copy_pixels (in, NULL)
+
+ } until (nrecs_read == nrecs)
+
+ call sfree (sp)
+ call close (in)
+end
+
+
+# IDSO_READ_HEADER -- decode header parameter from IDSOUT header cards. The
+# IDSO prefix implies IDSOUT format; IDSF is used for IDSFILE format. The
+# first four cards of each record in the IDSOUT file are the header.
+
+int procedure idso_read_header (in, ids)
+
+int in # File descriptor of input text file
+pointer ids # Pointer to program data structure
+
+pointer sp, temp
+int record, tape, junk, ip
+int fscan(), nscan(), strlen(), getline()
+errchk fscan
+
+begin
+ # Allocate space on stack for temporary char storage
+ call smark (sp)
+ call salloc (temp, SZ_LINE, TY_CHAR)
+
+ # Skip any blank lines that may preceede the first header card.
+ # Break out of repeat when first non-blank line is encountered.
+
+ repeat {
+ if (getline (in, Memc[temp]) == EOF) {
+ call sfree (sp)
+ return (EOF)
+ } else {
+ for (ip = temp; IS_WHITE (Memc[ip]); ip = ip + 1)
+ ;
+ if (Memc[ip] == '\n' || Memc[ip] == EOS)
+ # Blank line
+ ;
+ else
+ break
+ }
+ }
+
+ call sscan (Memc[temp]) {
+ # Values to be read from first card of file:
+ call gargi (record)
+ call gargi (ITM(ids))
+ call gargd (LAMBDA0(ids))
+ call gargd (DELTA_LAMBDA(ids))
+ call gargi (NP1(ids))
+ call gargi (NP2(ids))
+ call gargi (BEAM_NUMBER(ids))
+ call gargi (junk)
+ call gargi (junk)
+ call gargi (SMODE(ids))
+ call gargi (UT(ids))
+ if (nscan() < 11)
+ call error (2, "First header card incomplete")
+ }
+
+ if (fscan (in) == EOF) {
+ call sfree (sp)
+ return (EOF)
+ } else {
+ # Values to be read from second card of file
+ call gargi (ST(ids))
+ call gargd (RA(ids))
+ call gargd (DEC(ids))
+ call gargi (tape)
+ if (tape > 0)
+ RECORD_NUMBER(ids) = tape * 1000 + record
+ else
+ RECORD_NUMBER(ids) = record
+ call gargi (DF_FLAG(ids))
+ call gargi (SM_FLAG(ids))
+ call gargi (QF_FLAG(ids))
+ call gargi (DC_FLAG(ids))
+ call gargi (QD_FLAG(ids))
+ call gargi (EX_FLAG(ids))
+ call gargi (BS_FLAG(ids))
+ if (nscan() < 11)
+ call error (3, "Second header card incomplete")
+ }
+
+ if (fscan (in) == EOF) {
+ call sfree (sp)
+ return (EOF)
+ } else {
+ # Values to be read from third card of file
+ call gargi (CA_FLAG(ids))
+ call gargi (CO_FLAG(ids))
+ call gargwrd (ALPHA_ID(ids), 3)
+ call gargi (OFLAG(ids))
+ call gargd (HA(ids))
+ call gargd (AIRMASS(ids))
+ if (nscan() < 6) {
+ call error (4, "Third header card incomplete")
+ }
+ }
+
+ if (fscan (in) == EOF) {
+ call sfree (sp)
+ return (EOF)
+ } else {
+ call gargstr (Memc[temp], SZ_LINE)
+
+ # Count number of characters in id string by skipping trailing
+ # white space. 'END' are always the last 3 characters of the
+ # line of text containing the ID; they are also skipped.
+
+ for (ip = strlen(Memc[temp]) - 3; IS_WHITE (Memc[temp+ip-1]) &&
+ ip > 0 ; ip = ip - 1)
+ ;
+ Memc[temp+ip] = EOS
+ call strcpy (Memc[temp], LABEL(ids), SZ_LINE)
+ }
+
+ # Since this is IDSOUT format data, initialize COEFF(ids) to integer 0.
+ COEFF(ids) = 0
+
+ # Determine companion record number if appropriate
+ if (SMODE(ids) != 0) {
+ if (BEAM_NUMBER(ids) == 1)
+ COMPANION_RECORD(ids) = RECORD_NUMBER(ids) - 1
+ else
+ COMPANION_RECORD(IDS) = RECORD_NUMBER(IDS) + 1
+ }
+
+ call sfree (sp)
+ return (OK)
+
+end
+
+
+# COPY_PIXELS -- copy pixel values from input to output file. A blank line
+# terminates each IDS record.
+
+procedure copy_pixels (in, out)
+
+int in # File descriptor of input text file
+int out # File descriptor of output file
+
+pointer sp, line_buffer
+bool leading_blank
+int ip
+int getline()
+
+begin
+ # Allocate space on stack for line_buffer
+ call smark (sp)
+ call salloc (line_buffer, SZ_LINE, TY_CHAR)
+
+ # Ignore blank lines until first non_blank line encountered
+ leading_blank = true
+
+ repeat {
+ if (getline (in, Memc[line_buffer]) == EOF)
+ call error (5, "Unexpected EOF when copying pixels")
+
+ # Find first non-whitespace character
+ for (ip = line_buffer; IS_WHITE (Memc[ip]); ip = ip + 1)
+ ;
+
+ if (Memc[ip] == '\n' || Memc[ip] == EOS) {
+ # Blank line
+ if (leading_blank)
+ ;
+ else
+ break
+ } else {
+ leading_blank = false
+ if (out != NULL)
+ call putline (out, Memc[line_buffer])
+ }
+ }
+
+ call sfree (sp)
+end
+
+
+# IDSO_WRITE_IMAGE -- convert card image data values to reals and write
+# 1-d IRAF image.
+
+procedure idso_write_image (in, data_type, print_pixels, out_fname, ids)
+
+int in # File descriptor of input text file
+int data_type # Data type of image pixels to be written
+int print_pixels # Are pixel values to be listed (YES/NO)?
+char out_fname[SZ_FNAME] # Name of output image
+pointer ids # Pointer to program data structure
+
+pointer im, pixels, op
+char line[SZ_LINE], temp[MAX_WIDTH]
+int i, j, ip, iip, nchars
+pointer immap(), impl1r()
+int fscan(), nscan(), strlen(), ctowrd(), ctor()
+errchk immap, imunmap, fscan, impl1r, unpk_30, cy_store_keywords
+
+begin
+ im = immap (out_fname, NEW_IMAGE, LEN_USER_AREA)
+ IM_NDIM(im) = 1
+ IM_LEN(im, 1) = NPIX_IDS_RECORD
+ call strcpy (LABEL(ids), IM_TITLE(im), SZ_IMTITLE)
+ IM_PIXTYPE(im) = data_type
+ pixels = impl1r(im)
+ op = pixels
+
+ # Position to first non_blank line.
+ repeat {
+ if (fscan (in) == EOF) {
+ call imunmap (im)
+ return
+ } else
+ call gargstr (line, SZ_LINE)
+ } until (strlen (line) > 1)
+ call reset_scan()
+
+
+ # Scan and convert pixel values to image pixels. A blank line
+ # terminates the IDS record.
+
+ do i = 1, NLINES_PIXELS {
+ ip = 1
+ # Extract 8 pixel values from each line of text
+ do j = 1, NPIX_LINE {
+ iip = 1
+ call gargstr (line, SZ_LINE)
+ nchars = ctowrd (line, ip, temp, MAX_WIDTH)
+ nchars = ctor (temp, iip, Memr[op])
+ # call gargr (Memr[op])
+ op = op + 1
+ }
+
+ if (nscan () <= 1)
+ # Premature blank line encountered
+ break
+
+ # Get next line of pixels
+ if (fscan (in) == EOF)
+ break
+ }
+
+ if (print_pixels == YES)
+ call list_values (Memr[pixels])
+
+ # Write ids specific header words to iraf image header
+ call cy_store_keywords (ids, im)
+
+ call imunmap (im)
+end