NAME: STRD PURPOSE: Open an STSDAS file and read into an image array and header. Combines the functions of SXREAD and SXOPEN. Can only be used on files without group parameters CALLING SEQUENCE: STRD, im, hdr, filename OPTIONAL INPUT: FILENAME - Character string giving the name of the SDAS file to be read. If omitted, then program will prompt for the file name. If an extension is given, then it must terminate in a 'h'. A default extension of '.hhh' is assumed, if one is not supplied. VMS Version numbers are ignored, and the most recent version is always used. OUTPUTS: IM - array containing image data HDR - string array containing header COMMON BLOCKS: STCOMMN - Created by SXOPEN. STRD uses STCOMMN to check for an open unit, and to get image dimensions. SIDE EFFECTS: STSDAS image array and header are read into IM and HD IF FILENAME is not supplied, then the program will check that the image and header variable do not already contain data. RESTRICTIONS: For use only on data without Groups!! SYSTEM VARIABLES: If !QUIET = 1 then program will not print the size of the image. PROCEDURE: Program checks that STSDAS files exists and that IDL variables do not already contain data, before calling SXOPEN and SXREAD to read in SDAS data. MODIFICATION HISTORY: Written W. Landsman, STI Corporation August 1986 Optional parameter "FILENAME" added November 1986
(See /usr/local/idl/lib/zastron/sdas/strd.pro)
NAME: STSUB PURPOSE: Read a subset of a space telescope SDAS image file. User can specify a subimage range or a step size Called by STSUBIM CALLING SEQUENCE: Result = stsub( unit, x1, x2, y1, y2, step) INPUTS: UNIT = Unit number of file, must be from 1 to 9. Unit must have been opened with SXOPEN. x1 = lower x value x2 = upper x value y1 = lower y value y2 = upper y value step = used to extract every nth pixel. If step = 1, a full res. subimage is extracted; step = 2, every other pixel is extracted, etc. Defaults to 1. The minimum value is 1. OUTPUTS: Result of function = array constructed from designated record. COMMON BLOCKS: Uses idl common stcommn to access parameters (see SXOPEN) MODIFICATION HISTORY: Written, M. Greason, STX, July 1990. Remove initialization of array for increased efficiency January, 1991 Removed call to STSUBC.EXE, do it all in IDL - K. Venkatakrishna, STX, April 1992
(See /usr/local/idl/lib/zastron/sdas/stsub.pro)
NAME: STSUBIM PURPOSE: Open an STSDAS file and read a portion of the file into an array. An enhanced version of STRD. Program will prompt for the file name and subimage bounds. CALLING SEQUENCE: STSUBIM, im, hdr, [ filename, x1, x2, y1, y2, step, SILENT = ] OPTIONAL INPUTS: FILENAME - Character string giving the name of the SDAS file to be read. If omitted, then program will prompt for the file name. If an extension is given, then it must terminate in a 'h'. A default extension of '.hhh' is assumed, if one is not supplied. In VMS, version numbers are ignored, and the most recent version is always used. X1 - Starting x value (def=0), integer scalar X2 - Ending x value (def=total record size), integer scalar Y1 - Starting y value (def = 0), integer scalar Y2 - Ending y value (def = total no. of records), integer scalar STEP - The number of pixels between extracted pixels. This allows the user to read every Nth pixel from the image. STEP=1 indicates full resolution, STEP=2 indicates every other pixel, etc. OUTPUTS: IM - array containing image data HDR - string array containing STSDAS header OPTIONAL KEYWORD INPUT: SILENT - If this keyword is present, the size of the image will not be printed. COMMON BLOCKS: STCOMMN - Created by SXOPEN. STSUBIM uses STCOMMN to check for an open unit, and to get image dimensions. SIDE EFFECTS: STSDAS image array and header are read into IM and HD IF FILENAME is not supplied, then the program will check that the image and header variable do not already contain data. RESTRICTIONS: For use only on data without Groups!! For use only on 2 dimensional data files. PROCEDURE: Program checks that STSDAS file exists and that IDL variables do not already contain data, before calling SXOPEN and STSUB to read in data. The header keywords NAXIS* and CRPIX* are updated to account for the actual image size. PROCEDURES CALLED: ORDINAL, STSUB, SXOPEN, FDECOMP, SPEC_DIR, SXADDPAR, SXADDHIST MODIFICATION HISTORY: Written B. Pfarr, STX, September 1987 from STRD Modifed to IDL Version 2, M. Greason, STX, May 1990. Prints 1st, 2nd, etc., instead of 1th, 2th... R. S.Hill, STX, Aug 1991 CRPIX transformation corrected. RSH, HSTX, 27-May-1992.
(See /usr/local/idl/lib/zastron/sdas/stsubim.pro)
NAME: STWRT PURPOSE: Write a STSDAS header and/or 2-D array to disk (without groups!) CALLING SEQUENCE: STWRT, hdr ;Write image header (.hhh file) only STWRT, im ;Create header to match image array STWRT, im, hdr,[ name, /SDAS, /NOUPDATE ] INPUT PARAMETERS: im - image array to be written to disk. If no header array is supplied, then a simple header appropiate to the image will be constructed. OPTIONAL INPUT PARAMETER: hdr - STSDAS header, string array. name - character string containing the name of output file to which the image is written. If omitted, then the program will prompt for the file name. A file name will have the default extension of '.HHH' OPTIONAL KEYWORD INPUTS: NOUPDATE-- By default, STWRT will modify the input FITS header to create a proper SDAS .hhh file. This includes ensuring that (1) a DATATYPE keyword exists, and (2) that BITPIX is a positive value. SDAS-- The SDAS keyword can be specified to modify the input header to ensure SDAS compatibility. RESTRICTIONS: (1) STWRT is only for 2 dimensional images. For other arrays use SXOPEN,1,NAME,HD,HISTORY,'W' ;HISTORY need not be defined SXWRITE,1,IM CLOSE,1 (2) The type of data written is determined by the DATATYPE keyword in the header. A DATATYPE keyword appropiate to the image array type will be added if does not already exist SIDE EFFECTS: A STSDAS header and/or image array is written to disk. Unit 2 is opened and closed. REVISION HISTORY: Written W. Landsman, STI Corp. August, 1986 Returned old version to not modify header. W. Landsman July 1991. Included call to CHKDType--option to change DATATYPE and BITPIX if they; do not match. J.D.Offenberg Dec 1991. Added call to CHECK_FITS, NOUPDATE keyword, remove autochange keyword W. Landsman May 1992
(See /usr/local/idl/lib/zastron/sdas/stwrt.pro)
NAME: SXADDHIST PURPOSE: Procedure to add history line(s) to FITS header CALLING SEQUENCE sxaddhist, history, header INPUTS: history - string or string array containing history line(s) to add to the header header - string array containing the FITS header OUTPUTS: header - unpdated header EXAMPLES: sxaddhist, 'I DID THIS', header hist = strarr(3) hist(0) = 'history line number 1' hist(1) = 'the next history line' hist(2) = 'the last history line' sxaddhist, hist, header HISTORY: D. Lindler Feb. 87 April 90 Converted to new idl D. Lindler Put only a single space after HISTORY W. Landsman November 1992
(See /usr/local/idl/lib/zastron/sdas/sxaddhist.pro)
NAME: SXADDPAR PURPOSE: Add or modify a parameter in a FITS or STSDAS header array. CALLING SEQUENCE: sxaddpar, Header, Name, Value, [ Comment, Location, BEFORE =, AFTER = , FORMAT= ] INPUTS: Header = String array containing FITS or STSDAS header. The length of each element must be 80 characters. If not defined, then SXADDPAR will create an empty FITS header array. Name = Name of parameter. If Name is already in the header the value and possibly comment fields are modified. Otherwise a new record is added to the header. If name = 'HISTORY' then the value will be added to the record without replacement. In this case the comment parameter is ignored. Value = Value for parameter. The value expression must be of the correct type, e.g. integer, floating or string. String values of 'T' or 'F' are considered logical values. OPTIONAL INPUT PARAMETERS: Comment = String field. The '/' is added by this routine. Added starting in position 31. If not supplied, or set equal to '', then the previous comment field is retained (when found) Location = Keyword string name. The parameter will be placed before the location of this keyword. This parameter is identical to the BEFORE keyword and is kept only for consistency with earlier versions of SXADDPAR. OPTIONAL INPUT KEYWORD PARAMETERS: BEFORE = Keyword string name. The parameter will be placed before the location of this keyword. For example, if BEFORE='HISTORY' then the parameter will be placed before the first history location. This applies only when adding a new keyword; keywords already in the header are kept in the same position. AFTER = Same as BEFORE, but the parameter will be placed after the location of this keyword. This keyword takes precedence over BEFORE. FORMAT = Specifies FORTRAN-like format for parameter, e.g. "F7.3". A scalar string should be used. For complex numbers the format should be defined so that it can be applied separately to the real and imaginary parts. OUTPUTS: Header = updated FITS header array. RESTRICTIONS: Warning -- Parameters and names are not checked against valid FITS parameter names, values and types. MODIFICATION HISTORY: DMS, RSI, July, 1983. D. Lindler Oct. 86 Added longer string value capability Converted to NEWIDL D. Lindler April 90 Added Format keyword, J. Isensee, July, 1990 Added keywords BEFORE and AFTER. K. Venkatakrishna, May '92 Pad string values to at least 8 characters W. Landsman April 94
(See /usr/local/idl/lib/zastron/sdas/sxaddpar.pro)
NAME: SXDELPAR PURPOSE: Procedure to delete a keyword parameter(s) from a FITS header CALLING SEQUENCE: sxdelpar, h, parname INPUTS: h - FITS header, string array parname - string or string array of keyword name(s) to delete OUTPUTS: h - updated header EXAMPLE: Delete the astrometry keywords CDn_n from a FITS header, h IDL> sxdelpar, h, ['CD1_1','CD1_2','CD2_1','CD2_2'] NOTES: (1) No message is returned if the keyword to be deleted is not found ( (2) All appearances of a keyword in the header will be deleted HISTORY: version 1 D. Lindler Feb. 1987 Converted to new IDL April 1990 by D. Lindler
(See /usr/local/idl/lib/zastron/sdas/sxdelpar.pro)
NAME: SXGPAR PURPOSE: Obtain group parameter value in SDAS/FITS file CALLING SEQUENCE: result = sxgpar( h, par, name, [ type, sbyte, nbytes] ) INPUTS: h - header returned by SXOPEN par - parameter block returned by SXREAD or multiple parameter blocks stored in array of dimension greater than one. name - parameter name (keyword PTYPEn) or integer parameter number. OPTIONAL INPUT/OUTPUT type - data type (if not supplied or null string, the header is searched for type,sbyte, and nbytes) sbyte - starting byte in parameter block for data nbytes - number of bytes in parameter block for data OUTPUT: parameter value or value(s) returned as function value SIDE EFFECTS: If an error occured then !err is set to -1 OPERATIONAL NOTES: Supplying type, sbyte and nbytes greatly decreases execution time. The best way to get the types is on the first call pass undefined variables for the three parameters or set type = ''. The routine will then return their values for use in subsequent calls. METHOD: The parameter type for parameter n is obtained from PDTYPEn keyword. If not found then DATATYPE keyword value is used. If that is not found then BITPIX is used. BITPIX=8, byte; BITPIX=16 integer*2; BITPIX=32 integer*4. HISTORY: version 1 D. Lindler Oct. 86 version 2 D. Lindler Jan. 90 added ability to process multiple parameter blocks in single call version 3 D. Lindler (converted to New vaxidl) Apr 14 1991 JKF/ACC - fixed make_array datatypes(float/double)
(See /usr/local/idl/lib/zastron/sdas/sxgpar.pro)
NAME: SXGREAD PURPOSE: Read group parameters from a Space Telescope STSDAS image file CALLING SEQUENCE: grouppar = sxgread( unit, group ) INPUTS: UNIT = Supply same unit as used in SXOPEN. GROUP = group number to read. if omitted, read first group. The first group is number 0. OUTPUTS: GROUPPAR = parameter values from fits group parameter block. It is a byte array which may contain multiple data types. The function SXGPAR can be used to retrieve values from it. COMMON BLOCKS: Uses IDL Common STCOMMN to access parameters. SIDE EFFECTS: IO is performed. MODIFICATION HISTORY: WRITTEN, Don Lindler, July, 1 1987 MODIFIED, Don Neill, Jan 11, 1991 - derived from sxread.pro
(See /usr/local/idl/lib/zastron/sdas/sxgread.pro)
NAME: SXHCOPY PURPOSE: Copies selected portions of one header to another CALLING SEQUENCE: sxhcopy, h, keyword1, keyword2, hout INPUTS: h - input header keyword1 - first keyword to copy keyword2 - last keyword to copy INPUT/OUTPUT: hout - header to copy the information to. METHOD: the headers lines from keyword1 to keyword2 are copied to the end of the output header. No check is made to verify that a keyword value already exists in the output header. HISTORY: version 1 D. Lindler Sept. 1989
(See /usr/local/idl/lib/zastron/sdas/sxhcopy.pro)
NAME: SXHEDIT PURPOSE: Routine to interactively edit a SDAS header on disk. VMS: uses EDT. Unix: uses whatever your EDITOR environment variable is set to. CALLING SEQUENCE: sxhedit,name,h INPUTS: name - header file name (default extension is .hhh) OUTPUTS: h - (optional) editted header SIDE EFFECTS: A new version of the file will be created. HISTORY: Version 1 D. Lindler July 1987 Version 2 JAH Dec '88: Converted to Sun IDL. Modified D. Neill Sept, 1990: Now deletes all versions of sxhedit.tmp made compatable with Unix Modified D. Neill Apr, 1991: Ensures 80 char headers and will not create new version if no changes made.
(See /usr/local/idl/lib/zastron/sdas/sxhedit.pro)
NAME: SXHMAKE PURPOSE: Create a basic STSDAS header file from an IDL data array CALLING SEQUENCE: sxhmake, Data, Groups, Header INPUTS: Data = IDL data array of the same type, dimensions and size as are to be written to file. Groups = # of groups to be written. OUTPUTS: Header = String array containing ST header file. PROCEDURE: Call sxhmake to create a header file. Then call sxopen to open output image, followed by sxwrite to write the data. If you do not plan to change the header created by sxhmake before calling sxopen, you might consider using sxmake which does both steps. MODIFICATION HISTORY: Don Lindler Feb 1990 modified from SXMAKE by DMS, July, 1983. D. Lindler April 90 Converted to new VMS IDL M. Greason May 1990 Header creation bugs eliminated.
(See /usr/local/idl/lib/zastron/sdas/sxhmake.pro)
NAME: SXHREAD PURPOSE: Procedure to read a STSDAS/GEIS (.hhh) header from disk. This version of SXHREAD can read three types of disk files (1) VMS Fixed record length 80 byte files, or GEIS files with VMS buckets (2) Unix stream files with a CR after every 80 bytes (3) Variable length record files CALLING SEQUENCE: sxhread, name, header INPUT: name - file name, scalar string. An extension of .hhh is appended if not already supplied OUTPUT: header - STSDAS header, string array NOTES: SXHREAD does not do any checking to see if the file is a valid STSDAS header. It simply reads the file into a string array with 80 byte elements HISTORY: Version 1 D. Lindler July, 1987 Version 2 M. Greason, August 1990 Use READU for certain ST VAX GEIS files W. Landsman January, 1992
(See /usr/local/idl/lib/zastron/sdas/sxhread.pro)
NAME: SXHWRITE PURPOSE: Procedure to write an STSDAS or FITS header to disk as a STSDAS *.hhh file. CALLING SEQUENCE: sxhwrite,name,h INPUTS: name - file name. If an extension is supplied it must be 3 characters ending in "h". h - FITS header, string array SIDE EFFECTS: File with specified name is written. If qualifier not specified then .hhh is used SXHWRITE will modify the header in the following ways, if necessary (1) If not already present, an END statement is added as the last line. Lines after an existing END statment are deleted. (2) Spaces are appended to force each line to be 80 characters. (3) On Unix machines, a carriage return is appended at the end of each line. This is consistent with STSDAS and allows the file to be directly displayed on a stream device PROCEDURES USED: zparcheck, fdecomp HISTORY: version 1 D. Lindler June 1987 conversion cleaned up. M. Greason, June 1990 Add carriage return at the end of Unix files W. Landsman Oct 1991
(See /usr/local/idl/lib/zastron/sdas/sxhwrite.pro)
NAME: SXMAKE PURPOSE: Create a basic St header file from an IDL Array before writing data. CALLING SEQUENCE: sxmake, Unit, File, Data, Par, Groups, Header INPUTS: Unit = Logical unit number from 1 to 9. File = file name of data and header files to create. The filetype extension must not appear in this name. The header file is created with the extension 'HHH' and the data file has 'HHD'. Data = IDL data array of the same type, dimensions and size as are to be written to file. Par = # of elements in each parameter block for each data record. If = to 0, parameter blocks will not be written. The data type of the parameter blocks must be the same as the data array. Groups = # of groups to write. If 0 then write in basic format without groups. OPTIONAL INPUT PARAMETERS: Header = String array containing ST header file. If this parameter is omitted, a basic header is constructed. If included, the basic parameters are added to the header using sxaddpar. The END keyword must terminate the parameters in Header. OPTIONAL OUTPUT PARAMETERS: Header = ST header array, an 80 by N character array. COMMON BLOCKS: Stcommn - as used in sxwrite, sxopen, etc. SIDE EFFECTS: The header file is created and written and then the data file is opened on the designated unit. RESTRICTIONS: Header files must be named .HHH and data files must be named .HHD. PROCEDURE: Call sxmake to create a header file. Then call sxwrite to output each group. MODIFICATION HISTORY: DMS, July, 1983. converted to new VMS IDL April 90
(See /usr/local/idl/lib/zastron/sdas/sxmake.pro)
NAME: SXOPEN PURPOSE: Open a Space Telescope formatted header file. Save the parameters required subsequent SX routines in the common block Stcommn. Optionally save the header in the string array Header, and the history in the string array History. Open the data file associated with this header on the same unit. CALLING SEQUENCE: SXOPEN, Unit, Fname [, Header [,History] [,Access]] INPUTS: Unit = IDL unit used for IO. Must be from 1 to 9. Fname = File name of header file. Default extension is .hhh for header files and .hhd for data files. If an extension is supplied it must have the form .xxH where xx are any to alphanumeric characters. The data file must have extension .xxD No version number is allowed. Most recent versions of the files are used. OPTIONAL INPUT PARAMETER: Access = 'R' to open for read, 'W' to open for write. OUTPUTS: Stcommn = Common block containing ST parameter blocks. (Long arrays.) OPTIONAL OUTPUT PARAMETERS: Header = 80 char by N string array containing the names, values and comments from the FITS header. Use the function SXPAR to obtain individual parameter values. History = String array containing the value of the history parameter. COMMON BLOCKS: STCOMMN - Contains RESULT(20,10) where RESULT(i,LUN) = 0 - 121147 for consistency check, 1 - Unit for consistency, 2 - bitpix, 3 - naxis, 4 - groups (0 or 1), 5 - pcount, 6 - gcount, 7 - psize, 8 - data type as idl type code, 9 - bytes / record, 10 to 10+N-1 - dimension N, 17 = record length of file in bytes. 18 - # of groups written, 19 = gcount. SIDE EFFECTS: The data and header files are accessed. RESTRICTIONS: Works only for disc files. The data file must have must have the extension ".hhd" and the header file must have the extension ".hhh". PROCEDURE: The header file is opened and each line is read. Important parameters are stored in the output parameter. If the last two parameters are specified the parameter names and values are stored. The common block STCOMMN is filled with the type of data, dimensions, etc. for use by SXREAD. If access is for write, each element of the header array, which must be supplied, is written to the header file. The common block is filled with relevant parameters for SXWRITE. A keyword of "END" ends the header. MODIFICATION HISTORY: Written, DMS, May, 1983. D. Lindler Feb. 1990 Modified to allow var. record length header files. D. Lindler April 1990 Conversion to new VMS IDL Added /BLOCK when opening new .hhd file
(See /usr/local/idl/lib/zastron/sdas/sxopen.pro)
NAME: SXPAR PURPOSE: Obtain the value of a parameter in a FITS header CALLING SEQUENCE: result = SXPAR( hdr, name,[ abort, COUNT= ]) INPUTS: Hdr = FITS header array, (e.g. as returned by SXOPEN or READFITS) string array, each element should have a length of 80 characters Name = String name of the parameter to return. If Name is of the form 'keyword*' then an array is returned containing values of keywordN where N is an integer. The value of keywordN will be placed in RESULT(N-1). The data type of RESULT will be the type of the first valid match of keywordN found. OPTIONAL INPUTS: ABORT - string specifying that SXPAR should do a RETALL if a parameter is not found. ABORT should contain a string to be printed if the keyword parameter is not found. If not supplied SXPAR will return with a negative !err if a keyword is not found. OPTIONAL KEYWORD OUTPUT: COUNT - Optional keyword to return a value equal to the number of parameters found by sxpar, integer scalar OUTPUTS: Function value = value of parameter in header. If parameter is double precision, floating, long or string, the result is of that type. Apostrophes are stripped from strings. If the parameter is logical, 1 is returned for T, and 0 is returned for F. If Name was of form 'keyword*' then a vector of values are returned. SIDE EFFECTS: Keyword COUNT returns the number of parameters found. !err is set to -1 if parameter not found, 0 for a scalar value returned. If a vector is returned it is set to the number of keyword matches found. If a keyword occurs more than once in a header, a warning is given, and the first occurence is used. EXAMPLES: Given a FITS header, h, return the values of all the NAXISi values into a vector. Then place the history records into a string vector. IDL> naxisi = sxpar( h ,'NAXIS*') ; Extract NAXISi value IDL> history = sxpar( h, 'HISTORY' ) ; Extract HISTORY records PROCEDURE: The first 8 chacters of each element of Hdr are searched for a match to Name. The value from the last 20 characters is returned. An error occurs if there is no parameter with the given name. If a numeric value has no decimal point it is returned as type LONG. If it contains more than 8 numerals, or contains the character 'D', then it is returned as type DOUBLE. Otherwise it is returned as type FLOAT MODIFICATION HISTORY: DMS, May, 1983, Written. D. Lindler Jan 90 added ABORT input parameter J. Isensee Jul,90 added COUNT keyword W. Thompson, Feb. 1992, added support for FITS complex values. W. Thompson, May 1992, corrected problem with HISTORY/COMMENT/blank keywords, and complex value error correction.
(See /usr/local/idl/lib/zastron/sdas/sxpar.pro)
NAME: SXREAD PURPOSE: Read a Space Telescope STSDAS image file CALLING SEQUENCE: result = sxread( Unit, group , [par] ) INPUTS: UNIT = Unit number of file, must be from 1 to 9. Unit must have been opened with SXOPEN. GROUP = group number to read. if omitted, read first record. The first record is number 0. OUTPUTS: Result of function = array constructed from designated record. OPTIONAL OUTPUT: PAR = Variable name into which parameter values from STSDAS group parameter block are read. It is a byte array which may contain multiple data types. The function SXGPAR can be used to retrieve values from it. COMMON BLOCKS: Uses IDL Common STCOMMN to access parameters. NOTES: Use the function SXGREAD to read the group parameter blocks without having to read the group array. If the STSDAS file does not contain groups, then the optional output parameter PAR is returned undefined, but no error message is given. SIDE EFFECTS: IO is performed. MODIFICATION HISTORY: WRITTEN, Don Lindler, July, 1 1987
(See /usr/local/idl/lib/zastron/sdas/sxread.pro)
NAME: SXWRITE PURPOSE: Write a group of data and parameters in ST format to a STSDAS data file. CALLING SEQUENCE: SXWRITE, Unit, Data,[ Par] INPUTS: Unit = unit number of file. The file must have been previously opened by SXOPEN. Data = Array of data to be written. The dimensions must agree with those supplied to SXOPEN and written into the FITS header. The type is converted if necessary. OPTIONAL INPUT PARAMETERS: Par = parameter block. The size of this array must agree with the Psize parameter in the FITS header. OUTPUTS: None. COMMON BLOCKS: STCOMMN - Contains RESULT(20,10) where RESULT(i,LUN) = 0 - 121147 for consistency check, 1 - Unit for consistency, 2 - bitpix, 3 - naxis, 4 - groups (0 or 1), 5 - pcount, 6 - gcount, 7 - psize, 8 - data type as idl type code, 9 - bytes / record, 10 to 10+N-1 - dimension N, 18 - # of groups written, 19 = gcount. SIDE EFFECTS: The data are written into the next group. RESTRICTIONS: SXOPEN must have been called to initialize the header and the common block. MODIFICATION HISTORY: DMS, July, 1983. D.Lindler July, 1986 - changed block size of file to 512 moved group parameters after the groups data. D.Lindler July, 1987 - modified to allow any size parameter block (in bytes). D. Lindler April, 1990 - converted to new VMS IDL
(See /usr/local/idl/lib/zastron/sdas/sxwrite.pro)