This page was created by the IDL library routine mk_html_help2.

Last modified: Wed Dec 20 10:37:44 2023.


Directory Listing of Routines


Routine Descriptions

CHECK_FITS

[Next Routine] [List of Routines]
 NAME:
       CHECK_FITS
 PURPOSE:
       Check that keywords in a FITS header array match the associated data  
 EXPLANATION:
       Given a FITS array IM, and a associated FITS header HDR, this
       procedure will check that
               (1) HDR is a string array, and IM is defined and numeric   
               (2) The NAXISi values in HDR are appropriate to the dimensions 
                   of IM
               (3) The BITPIX value in HDR is appropriate to the datatype of IM
       If the /UPDATE keyword is present, then the FITS header will be 
       modified, if necessary, to force agreement with the image array

 CALLING SEQUENCE:
       check_FITS, im, hdr, [ dimen, idltype, /UPDATE, /NOTYPE, /SILENT
                              ERRMSG = ]'

 INPUT PARAMETERS:
       IM -  FITS array, e.g. as read by READFITS
       HDR - FITS header (string array) associated with IM

 OPTIONAL OUTPUTS:
       dimen - vector containing actual array dimensions
       idltype- data type of the FITS array as specified in the IDL SIZE
               function (1 for BYTE, 2 for 16 bit integer, 3 for 32 bit integer etc.)

 OPTIONAL KEYWORD INPUTS:
       /NOTYPE - If this keyword is set, then only agreement of the array
               dimensions with the FITS header are checked, and not the 
               data type.
       /UPDATE - If this keyword is set then the BITPIX, NAXIS and NAXISi
               FITS keywords will be updated to agree with the array
       /FITS, /SDAS -  these are obsolete keywords that now do nothing 
       /SILENT - If keyword is set and nonzero, the informational messages 
               will not be printed
       /ALLOW_DEGEN - Don't check for degenerate axes.
 OPTIONAL KEYWORD OUTPUT:
       ERRMSG  = If this keyword is present, then any error messages will be
                 returned to the user in this parameter rather than
                 depending on the MESSAGE routine in IDL.  If no errors are
                 encountered, then a null string is returned.  

 PROCEDURE:
       Program checks the NAXIS and NAXISi keywords in the header to
       see if they match the image array dimensions, and checks whether
       the BITPIX keyword agrees with the array type.

 PROCEDURE CALLS:
       FXADDPAR, FXPAR(), SXDELPAR
 MODIFICATION HISTORY:
       Written, December 1991  W. Landsman Hughes/STX to replace CHKIMHD
       No error returned if NAXIS=0 and IM is a scalar   W. Landsman  Feb 93
       Fixed bug for REAL*8 STSDAS data W. Landsman July 93
       Make sure NAXIS agrees with NAXISi  W. Landsman  October 93
        Converted to IDL V5.0   W. Landsman   September 1997
       Allow unsigned data types   W. Landsman December 1999
       Allow BZERO = 0 for unsigned data types   W. Landsman January 2000
       Added ERRMSG keyword, W. Landsman February 2000
       Use FXADDPAR to put NAXISi in proper order   W. Landsman August 2000
       Improper FXADDPAR call for DATATYPE keyword  W. Landsman December 2000
       Remove explicit setting of obsolete !err W. Landsman February 2004
       Remove SDAS support   W. Landsman       November 2006
       Fix dimension errors introduced Nov 2006
       Work again for null arrays W. Landsman/E. Hivon May 2007
       Use V6.0 notation  W.L.  Feb. 2011
       Add /ALLOW_DEGEN, William Thompson, 26-Jun-2019

(See external/astron/fits/check_fits.pro)


FITSDIR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
     FITSDIR 
 PURPOSE:
     Display selected FITS keywords from the headers of FITS files.   
 EXPLANATION:

     The values of either user-specified or default FITS keywords are 
     displayed in either the primary header and/or the first extension header.
     Unless the /NOSIZE keyword is set, the data size is also displayed.
     The default keywords are as follows (with keywords in 2nd row used if
     those in the first row not found, and the 3rd row if neither the keywords
     in the first or second rows found:)

     DATE-OBS     TELESCOP   OBJECT    EXPTIME       
     TDATEOBS     TELNAME    TARGNAME  INTEG        ;First Alternative
     DATE         OBSERVAT             EXPOSURE     ;Second Alternative
                  INSTRUME             EXPTIM       ;Third Alternative

      FITSDIR will also recognize gzip compressed files (must have a .gz 
      or FTZ extension).
 CALLING SEQUENCE:
     FITSDIR , [ directory, TEXTOUT =, EXTEN=, KEYWORDS=, /NOSIZE, /NoTELESCOPE
                            ALT1_KEYWORDS= ,ALT2_KEYWORDS = ,ALT3_KEYWORDS =  

 OPTIONAL INPUT PARAMETERS:
     DIRECTORY - Scalar string giving file name, disk or directory to be 
             searched.   Wildcard file names are allowed.    Examples of 
             valid names include 'iraf/*.fits' (Unix) or 'd:\myfiles\f*.fits',
             (Windows).  
            
 OPTIONAL KEYWORD INPUT PARAMETER
      KEYWORDS - FITS keywords to display, as either a vector of strings or as
                 a comma delimited scalar string, e.g.'testname,dewar,filter'
                 If not supplied, then the default keywords are 'DATE-OBS',
                 'TELESCOP','OBJECT','EXPTIME'
      ALT1_KEYWORDS - A list (either a vector of strings or a comma delimited
                 strings of alternative keywords to use if the default 
                 KEYWORDS cannot be found.   By default, 'TDATEOBS', is the 
                 alternative to DATE-OBS, 'TELNAME' for 'TELESCOP','TARGNAME'
                 for 'OBJECT', and 'INTEG' for EXPTIME
      ALT2_KEYWORDS - A list (either a vector of strings or a comma delimited
                 strings of alternative keywords to use if neither KEYWORDS 
                 nor ALT1_KEYWORDS can be found.    
      ALT3_KEYWORDS - A list (either a vector of strings or a comma delimited
                 strings of alternative keywords to use if neither KEYWORDS 
                 nor ALT1_KEYWORDS nor ALT2_KEYWORDS can be found.    
      /NOSIZE - if set then information about the image size is not displayed  
      TEXTOUT - Controls output device as described in TEXTOPEN procedure
               textout=1       TERMINAL using /more option
               textout=2       TERMINAL without /more option
               textout=3       <program>.prt
               textout=4       laser.tmp
               textout=5       user must open file
               textout=7       Append to existing <program>.prt file
               textout = filename (default extension of .prt)
       EXTEN - Specifies an extension number (/EXTEN works for first extension)
               which is checked for the  desired keywords.      FITSDIR searches
               both the extension header and the primary header when an extension
               number is specified.
       /NOTELESCOPE - If set, then if the default keywords are used, then the
                TELESCOPE (or TELNAME, OBSERVAT, INSTRUME) keywords are omitted
                to give more room for display other keywords.   The /NOTELESCOP
                 keyword has no effect if the default keywords are not used.
 OUTPUT PARAMETERS:
       None.

 EXAMPLES:  
  (1) Print info on all'*.fits' files in the current  directory using default
          keywords.   Include information from the first extension    
       IDL> fitsdir,/exten

  (2) Write a driver program to display selected keywords in HST/ACS drizzled
       (*drz) images
         pro acsdir
        keywords = 'date-obs,targname,detector,filter1,filter2,exptime'
        fitsdir,'*drz.fits',key=keywords,/exten
        return & end

   (3)  Write info on all *.fits files in the Unix directory /usr2/smith, to a 
       file 'smith.txt' using the default keywords, but don't display the value
        of the TELESCOPE keyword

       IDL> fitsdir ,'/usr2/smith/*.fits',t='smith.txt', /NoTel 

 PROCEDURE:
       FILE_SEARCH() is used to find the specified FITS files.   The 
       header of each file is read, and the selected keywords are extracted.
       The formatting is adjusted so that no value is truncated on display.        

 SYSTEM VARIABLES:
       TEXTOPEN (called by FITSDIR) will automatically define the following 
       non-standard system variables if they are not previously defined:

       DEFSYSV,'!TEXTOUT',1
       DEFSYSV,'!TEXTUNIT',0

 PROCEDURES USED:
       FDECOMP, FXMOVE(), MRD_HREAD, REMCHAR, SPEC_DIR(), TEXTOPEN, TEXTCLOSE
 MODIFICATION HISTORY:
       Written, W. Landsman,  HSTX    February, 1993
       Search alternate keyword names    W.Landsman    October 1998
       Avoid integer truncation for NAXISi >32767  W. Landsman  July 2000
       Don't leave open unit    W. Landsman  July 2000 
       Added EXTEN keyword, work with compressed files, additional alternate
       keywords W. Landsman     December 2000
       Don't assume floating pt. exposure time W. Landsman   September 2001
       Major rewrite, KEYWORD & ALT*_KEYWORDS keywords, no truncation, 
             /NOSIZE keyword     W. Landsman,  SSAI   August 2002
       Assume V5.3 or later W. Landsman November 2002
       Fix case where no keywords supplied  W. Landsman January 2003
       NAXIS* values must be integers W. Landsman SSAI  June 2003
       Trim spaces off of input KEYWORD values W. Landsman March 2004
       Treat .FTZ extension as gzip compressed  W. Landsman September 2004
       Assume since V5.5, file_search() available W. Landsman Aug 2006
       Don't assume all images compressed or uncompressed W. L. Apr 2010
       Use V6.0 notation W.L. Feb 2011
       Don't let a corrupted file cause an abort    W.L. Feb 2014
       Let textopen.pro define !TEXTUNIT            W.L. Sep 2016

(See external/astron/fits/fitsdir.pro)


FITSRGB_TO_TIFF

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       FITSRGB_to_TIFF
 PURPOSE:
       Combine separate red, green, and blue FITS images into TIFF format
 EXPLANATION:
       The output TIFF (class R) file can have colors interleaved either
       by pixel or image.  The colour mix is also adjustable.

 CALLING SEQUENCE:
       FITSRGB_to_TIFF, path, rgb_files, tiff_name [,/BY_PIXEL, /PREVIEW,
                         RED= , GREEN =, BLUE =]

 INPUTS:
       path = file system directory path to the RGB files required.
       rgb_files = string array with three components - the red FITS file
                   filename, the blue FITS file filename and the green FITS
                   file filename

 OUTPUTS:
       tiff_name = string containing name of tiff file to be produced

 OPTIONAL OUTPUT:
       Header = String array containing the header from the FITS file.

 OPTIONAL INPUT KEYWORDS:
       BY_PIXEL = This causes TIFF file RGB to be interleaved by pixel
                  rather than the default of by image.
       PREVIEW  = Allows a 24 bit image to be displayed on the screen
                  to check the colour mix.
       RED = Real number containing the fractional mix of red
       GREEN = Real number containing the fractional mix of green
       BLUE = Real number containing the fractional mix of blue

 EXAMPLE:
       Read three FITS files, 'red.fits', 'blue.fits' and 'green.fits' from
       the directory '/data/images/space' and output a TIFF file named
       'colour.tiff'

               IDL> FITSRGB_to_TIFF, '/data/images/space', ['red.fits', $
                    'blue.fits', 'green.fits'], 'colour.tiff'

       Read three FITS files, 'red.fits', 'blue.fits' and 'green.fits' from
       the current directory and output a TIFF file named '/images/out.tiff'
       In this case, the red image is twice as strong as the green and the
       blue is a third more intense.  A preview on screen is also wanted.

               IDL> FITSRGB_to_TIFF, '.', ['red.fits', $
                    'blue.fits', 'green.fits'], '/images/out.tiff', $
                    /PREVIEW, RED=0.5, GREEN=1.0, BLUE=0.666


 RESTRICTIONS:
       (1) Limited to the ability of the routine READFITS

 NOTES:
       None

 PROCEDURES USED:
     Functions:   READFITS, CONCAT_DIR
     Procedures:  WRITE_TIFF

 MODIFICATION HISTORY:
     16th January 1995 - Written by Carl Shaw, Queen's University Belfast
	27 Jan 1995 - W. Landsman, Add CONCAT_DIR for VMS, Windows compatibility
	Converted to IDL V5.0   W. Landsman   September 1997
    Use WRITE_TIFF instead of obsolete TIFF_WRITE  W. Landsman  December 1998
    Cosmetic changes  W. Landsman    February 2000

(See external/astron/fits/fitsrgb_to_tiff.pro)


FITS_ADD_CHECKSUM

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
    FITS_ADD_CHECKSUM
 PURPOSE:
    Add or update the CHECKSUM and DATASUM keywords in a FITS header
 EXPLANATION: 
     Follows the May 2002 version of the FITS checksum proposal at 
     http://fits.gsfc.nasa.gov/registry/checksum.html 
 CALLING SEQUENCE:
     FITS_ADD_CHECKSUM, Hdr, [ Data, /No_TIMESTAMP, /FROM_IEEE ]
 INPUT-OUTPUT:
     Hdr - FITS header (string array), it will be updated with new 
           (or modified) CHECKSUM and DATASUM keywords 
 OPTIONAL INPUT:
     Data - data array associated with the FITS header.   If not supplied, or
           set to a scalar, then the program checks whether there is a 
           DATASUM keyword already in the FITS header containing the 32bit
           checksum for the data.  If there is no such keyword then there 
           assumed to be no data array associated with the FITS header.
 OPTIONAL INPUT KEYWORDS:
    /FROM_IEEE - If this keyword is set, then the input is assumed to be in 
             big endian format (e.g. an untranslated FITS array).    This 
             keyword only has an effect on little endian machines (e.g. 
             a Linux box).
    /No_TIMESTAMP - If set, then a time stamp is not included in the comment
             field of the CHECKSUM and DATASUM keywords.   Unless the 
             /No_TIMESTAMP keyword is set, repeated calls to FITS_ADD_CHECKSUM
             with the same header and data will yield different values of 
             CHECKSUM (as the date stamp always changes).   However, use of the
             date stamp is recommended in the checksum proposal. 
 PROCEDURES USED:
     CHECKSUM32, FITS_ASCII_ENCODE(), GET_DATE, SXADDPAR, SXPAR()
 REVISION HISTORY:
     W. Landsman    SSAI    December 2002
     Fix problem with images with a multiple of 2880 bytes.  W.L. May 2008
     Avoid conversion error when DATASUM is an empty string  W.L.  June 2008
     Don't update DATASUM if not already present and no data array supplied 
                       W.L. July 2008 
     Make sure input header array has 80 chars/line  W.L. Aug 2009
     Make sure CHECKSUM is placed right after an already present DATASUM
     keyword. Mats Löfdahl October 2019

(See external/astron/fits/fits_add_checksum.pro)


FITS_ASCII_ENCODE()

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
    FITS_ASCII_ENCODE()
 PURPOSE:
    Encode an unsigned longword as an ASCII string to insert in a FITS header
 EXPLANATION:
     Follows the July 2007 version of the FITS checksum proposal at 
       http://fits.gsfc.nasa.gov/registry/checksum.html
 CALLING SEQUENCE:
     result = FITS_ASCII_ENCODE( sum32)
 INPUTS:
     sum32 - 32bit *unsigned longword* (e.g. as returned by CHECKSUM32)
 RESULT:
     A 16 character scalar string suitable for the CHECKSUM keyword
 EXAMPLE:
      A FITS header/data unit has a checksum of 868229149.  Encode the 
      complement of this value (3426738146) into an ASCII string

      IDL> print,FITS_ASCII_ENCODE(3426738146U)
           ===> "hcHjjc9ghcEghc9g"

 METHOD:
      The 32bit value is interpreted as a sequence of 4 unsigned 8 bit 
      integers, and divided by 4.    Add an offset of 48b (ASCII '0'). 
      Remove non-alphanumeric ASCII characters (byte values 58-64 and 91-96)
      by simultaneously incrementing and decrementing the values in pairs.
      Cyclicly shift the string one place to the right.
                  
 REVISION HISTORY:
     Written  W. Landsman  SSAI              December 2002
     Use V6.0 notation  W.L.                 August 2013

(See external/astron/fits/fits_ascii_encode.pro)


FITS_CLOSE

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
      FITS_CLOSE

*PURPOSE:
       Close a FITS data file

*CATEGORY:
       INPUT/OUTPUT

*CALLING SEQUENCE:
       FITS_CLOSE,fcb

*INPUTS:
       FCB: FITS control block returned by FITS_OPEN.

*KEYWORD PARAMETERS:
       /NO_ABORT: Set to return to calling program instead of a RETALL
               when an I/O error is encountered.  If set, the routine will
               return  a non-null string (containing the error message) in the
               keyword MESSAGE.   If /NO_ABORT not set, then FITS_CLOSE will 
               print the message and issue a RETALL
       MESSAGE = value: Output error message
       
*EXAMPLES:
       Open a FITS file, read some data, and close it with FITS_CLOSE

               FITS_OPEN,'infile',fcb
               FITS_READ,fcb,data
               FITS_READ,fcb,moredata
               FITS_CLOSE,fcb

*HISTORY:
       Written by:     D. Lindler      August, 1995
       Converted to IDL V5.0   W. Landsman   September 1997
       Do nothing if fcb an invalid structure D. Schlegel/W. Landsman Oct. 2000
       Return Message='' for to signal normal operation W. Landsman Nov. 2000

(See external/astron/fits/fits_close.pro)


FITS_HELP

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       FITS_HELP

 PURPOSE:
       To print a summary of the primary data units and extensions in a
       FITS file.
;
 CALLING SEQUENCE:
       FITS_HELP,filename_or_fcb

 INPUTS:
       FILENAME_OR_FCB - name of the fits file or the FITS Control Block (FCB)
               structure returned by FITS_OPEN.     The  file name is allowed 
               to be gzip compressed (with a .gz  extension)

 OUTPUTS:
       A summary of the FITS file is printed.   For each extension, the values
       of the XTENSION, EXTNAME EXTVER EXTLEVEL BITPIX GCOUNT, PCOUNT NAXIS 
       and NAXIS* keywords are displayed. 
 

 EXAMPLES:
       FITS_HELP,'myfile.fits'

       FITS_OPEN,'anotherfile.fits',fcb
       FITS_HELP,fcb

 PROCEDURES USED:
       FITS_OPEN, FITS_CLOSE
 HISTORY:
       Written by:     D. Lindler      August, 1995
       Converted to IDL V5.0   W. Landsman   September 1997
       Don't truncate EXTNAME values at 10 chars  W. Landsman Feb. 2005
       Use V6.0 notation W. Landsman Jan 2012

(See external/astron/fits/fits_help.pro)


FITS_INFO

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
     FITS_INFO
 PURPOSE:
     Provide information about the contents of a FITS file
 EXPLANATION:
     Information includes number of header records and size of data array.
     Applies to primary header and all extensions.    Information can be 
     printed at the terminal and/or stored in a common block

     This routine is mostly obsolete, and better results can be usually be
     performed with FITS_HELP (for display) or FITS_OPEN (to read FITS
     information into a structure)

 CALLING SEQUENCE:
     FITS_INFO, Filename, [ /SILENT , TEXTOUT = , N_ext =, EXTNAME= ]

 INPUT:
     Filename - Scalar string giving the name of the FITS file(s)
               Can include wildcards such as '*.fits', or regular
               expressions
               allowed by the FILE_SEARCH() function.     One can also search
               gzip compressed  FITS files, but their extension must
               end in .gz or .ftz.
 OPTIONAL INPUT KEYWORDS:
     /SILENT - If set, then the display of the file description on the 
                terminal will be suppressed

      TEXTOUT - specifies output device.
               textout=1        TERMINAL using /more option
               textout=2        TERMINAL without /more option
               textout=3        <program>.prt
               textout=4        laser.tmp
               textout=5        user must open file, see TEXTOPEN
               textout=7       append to existing <program.prt> file
               textout = filename (default extension of .prt)

               If TEXTOUT is not supplied, then !TEXTOUT is used
 OPTIONAL OUTPUT KEYWORDS:
       The following keyowrds are for use when only one file is processed

       N_ext - Returns an integer scalar giving the number of extensions in
               the FITS file
       extname - returns a list containing the EXTNAME keywords for each
       		extension.

 COMMON BLOCKS
       DESCRIPTOR =  File descriptor string of the form N_hdrrec Naxis IDL_type
               Naxis1 Naxis2 ... Naxisn [N_hdrrec table_type Naxis
               IDL_type Naxis1 ... Naxisn] (repeated for each extension) 
               For example, the following descriptor 
                    167 2 4 3839 4 55 BINTABLE 2 1 89 5

               indicates that the  primary header containing 167 lines, and 
               the primary (2D) floating point image (IDL type 4) 
               is of size 3839 x 4.    The first extension header contains
               55 lines, and the  byte (IDL type 1) table array is of
               size
               89 x 5.

               The DESCRIPTOR is *only* computed if /SILENT is set.
 EXAMPLE:
       Display info about all FITS files of the form '*.fit' in the current
               directory

               IDL> fits_info, '*.fit'

       Any time a *.fit file is found which is *not* in FITS format, an error 
       message is displayed at the terminal and the program continues

 PROCEDURES USED:
       GETTOK(), MRD_SKIP, STRN(), SXPAR(), TEXTOPEN, TEXTCLOSE 

 SYSTEM VARIABLES:
       The non-standard system variables !TEXTOUT and !TEXTUNIT will be  
       created by FITS_INFO if they are not previously defined.   

       DEFSYSV,'!TEXTOUT',1
       DEFSYSV,'!TEXTUNIT',0

       See TEXTOPEN.PRO for more info
 MODIFICATION HISTORY:
       Written, K. Venkatakrishna, Hughes STX, May 1992
       Added N_ext keyword, and table_name info, G. Reichert
       Work on *very* large FITS files   October 92
       More checks to recognize corrupted FITS files     February, 1993
       Proper check for END keyword    December 
       Correctly size variable length binary tables  WBL December 1994
       EXTNAME keyword can be anywhere in extension header WBL  January 1998
       Correctly skip past extensions with no data   WBL   April 1998
       Converted to IDL V5.0, W. Landsman, April 1998
       No need for !TEXTOUT if /SILENT D.Finkbeiner   February 2002
       Define !TEXTOUT if needed.  R. Sterner, 2002 Aug 27
       Work on gzip compressed files for V5.3 or later  W. Landsman 2003 Jan
       Improve speed by only reading first 36 lines of header 
       Count headers with more than 32767 lines         W. Landsman Feb. 2003
       Assume since V5.3 (OPENR,/COMPRESS)   W. Landsman Feb 2004
       EXTNAME keyword can be anywhere in extension header again 
                         WBL/S. Bansal Dec 2004
       Read more than 200 extensions  WBL   March 2005
       Work for FITS files with SIMPLE=F   WBL July 2005
       Assume since V5.4, fstat.compress available WBL April 2006
       Added EXTNAME as an IDL keyword to return values. M. Perrin Dec 2007
       make Ndata a long64 to deal with large files. E. Hivon Mar 2008
       For GDL compatibility, first check if file is compressed  before using
          OPENR,/COMPRESS  B. Roukema/WL    Apr 2010
       Increased nmax (max number of extensions) from 400 to 2000   Sept 2012
       Correctly fills EXTNAME when SILENT is set    EH   Jan 2013
       Turned ptr to long64 for very large files EH Dec 2013
       Replace 2880L with 2880LL for very large files  EH  Mar 2015
       Let TEXTOPEN test for !TEXTOUT  WL Sep 2016
       Replace || with OR to work on multiple files L.Haffner/WL Apr 30 2022

(See external/astron/fits/fits_info.pro)


FITS_OPEN

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       FITS_OPEN

 PURPOSE:
       Opens a FITS (Flexible Image Transport System) data file.

 EXPLANATION:
       Used by FITS_READ and FITS_WRITE

 CALLING SEQUENCE:
       FITS_OPEN, filename, fcb

 INPUTS:
       filename : name of the FITS file to open, scalar string
                  FITS_OPEN can also open gzip compressed (.gz) files or Unix
                  compressed files *for  reading only*, although there is a 
                  performance penalty. FPACK (
                  http://heasarc.gsfc.nasa.gov/fitsio/fpack/ ) 
                  compressed FITS files can be read provided that the FPACK 
                  software is installed.
*OUTPUTS:
       fcb : (FITS Control Block) a IDL structure containing information
               concerning the file.  It is an input to FITS_READ, FITS_WRITE
               FITS_CLOSE and MODFITS.  
 INPUT KEYWORD PARAMETERS:
       /APPEND: Set to append to an existing file.
       /FPACK - Signal that the file is compressed with the FPACK software. 
               http://heasarc.gsfc.nasa.gov/fitsio/fpack/ ) By default, 
               FITS_OPEN assumes that if the file name extension ends in 
               .fz that it is fpack compressed.     The FPACK software must
               be installed on the system 
       /HPRINT - print headers with routine HPRINT as they are read.
               (useful for debugging a strange file)
       /NO_ABORT: Set to quietly return to calling program when an I/O error  
               is encountered, and return  a non-null string
               (containing the error message) in the keyword MESSAGE.    
               If /NO_ABORT not set, then FITS_OPEN will display the error 
               message and return to the calling program.
       /UPDATE Set this keyword to open an existing file for update
       /WRITE: Set this keyword to open a new file for writing. 

 OUTPUT KEYWORD PARAMETERS:
       MESSAGE = value: Output error message.    If the FITS file was opened
               successfully, then message = ''.
       
 NOTES:
       The output FCB should be passed to the other FITS routines (FITS_OPEN,
       FITS_READ, FITS_HELP, and FITS_WRITE).  It has the following structure
       when FITS_OPEN is called without /WRITE or /APPEND keywords set.

           FCB.FILENAME - name of the input file
               .UNIT - unit number the file is opened to
               .FCOMPRESS - 1 if unit is a FPACK compressed file opened with
                    a pipe to SPAWN
               .NEXTEND - number of extensions in the file.
               .XTENSION - string array giving the extension type for each
                       extension.
               .EXTNAME - string array giving the extension name for each
                       extension. (null string if not defined the extension)
               .EXTVER - vector of extension version numbers (0 if not
                       defined)
               .EXTLEVEL - vector of extension levels (0 if not defined)
               .GCOUNT - vector with the number of groups in each extension.
               .PCOUNT - vector with parameter count for each group
               .BITPIX - BITPIX for each extension with values
                                  8    byte data
                                16     short word integers
                                32     long word integers
                               -32     IEEE floating point
                               -64     IEEE double precision floating point
               .NAXIS - number of axes for each extension.  (0 for null data
                       units)
               .AXIS - 2-D array where axis[*,N] gives the size of each axes
                       for extension N
               .START_HEADER - vector giving the starting byte in the file
                               where each extension header begins
               .START_DATA - vector giving the starting byte in the file
                               where the data for each extension begins

               .HMAIN - keyword parameters (less standard required FITS
                               keywords) for the primary data unit.
               .OPEN_FOR_WRITE - flag (0= open for read, 1=open for write, 
                                                2=open for update)
               .LAST_EXTENSION - last extension number read.
               .RANDOM_GROUPS - 1 if the PDU is random groups format,
                               0 otherwise
               .NBYTES - total number of (uncompressed) bytes in the FITS file

       When FITS open is called with the /WRITE or /APPEND option, FCB
       contains:

           FCB.FILENAME - name of the input file
               .UNIT - unit number the file is opened to
               .NEXTEND - number of extensions in the file.
               .OPEN_FOR_WRITE - flag (1=open for write, 2=open for append
                                       3=open for update)


 EXAMPLES:
       Open a FITS file for reading:
               FITS_OPEN,'myfile.fits',fcb

       Open a new FITS file for output:
               FITS_OPEN,'newfile.fits',fcb,/write
 PROCEDURES USED:
       GET_PIPE_FILESIZE (for Fcompress'ed files) HPRINT, SXDELPAR, SXPAR()
 HISTORY:
       Written by:     D. Lindler      August, 1995
       July, 1996      NICMOS  Modified to allow open for overwrite
                               to allow primary header to be modified
       DJL Oct. 15, 1996   corrected to properly extend AXIS when more
                       than 100 extensions present
       Converted to IDL V5.0   W. Landsman   September 1997
       Use Message = '' rather than !ERR =1 as preferred signal of normal
           operation   W. Landsman  November 2000
       Lindler, Dec, 2001, Modified to use 64 bit words for storing byte
             positions within the file to allow support for very large
             files 
       Work with gzip compressed files W. Landsman    January 2003
       Fix gzip compress for V5.4 and earlier  W.Landsman/M.Fitzgerald Dec 2003 
       Assume since V5.3 (STRSPLIT, OPENR,/COMPRESS) W. Landsman Feb 2004
       Treat FTZ extension as gzip compressed W. Landsman Sep 2004
       Assume since V5.4 fstat.compress available W. Landsman Apr 2006
       FCB.Filename  now expands any wildcards W. Landsman July 2006
       Make ndata 64bit for very large files B. Garwood/W. Landsman Sep 2006
       Open with /SWAP_IF_LITTLE_ENDIAN, remove obsolete keywords to OPEN
                W. Landsman  Sep 2006
       Warn that one cannot open a compressed file for update W.L. April 2007
       Use post-V6.0 notation W.L. October 2010
       Support FPACK compressed files, new .FCOMPRESS tag to FCB structure
               W.L.  December 2010
       Read gzip'ed files even if gzip is not installed W.L. October 2012
       Handle axis sizes requiring 64 integer W.L.  April 2014
       Support for .Z compressed files M. Zechmeister/W.L.  April 2014
       Wrap filenames in "" when spawning subprocesses, to handle paths
       with spaces or other atypical characters. M. Perrin Nov 2014

(See external/astron/fits/fits_open.pro)


FITS_READ

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       FITS_READ
 PURPOSE:
       To read a FITS file.

 CALLING SEQUENCE:
       FITS_READ, filename_or_fcb, data [,header, group_par]

 INPUTS:
       FILENAME_OR_FCB - this parameter can be the FITS Control Block (FCB)
               returned by FITS_OPEN or the file name of the FITS file.  If
               a file name is supplied, FITS_READ will open the file with
               FITS_OPEN and close the file with FITS_CLOSE before exiting.
               When multiple extensions are to be read from the file, it is
               more efficient for the user to call FITS_OPEN and leave the
               file open until all extensions are read. FPACK 
               ( http://heasarc.gsfc.nasa.gov/fitsio/fpack/ ) compressed FITS 
               files can be read provided that the FPACK software is installed.
               Both Gzip compressed (.gz) and Unix compressed (*.Z) files can
               be read, although there is a performance penalty..

 OUTPUTS:
       DATA - data array.  If /NOSCALE is specified, BSCALE and BZERO
               (if present in the header) will not be used to scale the data.
               If Keywords FIRST and LAST are used to read a portion of the
               data or the heap portion of an extension, no scaling is done
               and data is returned as a 1-D vector. The user can use the IDL
               function REFORM to convert the data to the correct dimensions
               if desired.  If /DATA_ONLY is specified, no scaling is done.
       HEADER - FITS Header.  The STScI inheritance convention is recognized
               http://fits.gsfc.nasa.gov/registry/inherit/fits_inheritance.txt
               If an extension is read, and the INHERIT keyword exists with a 
               value of T, and the /NO_PDU keyword keyword is not supplied, 
               then the primary data unit header and the extension header will
                be combined.  The header will have the form:

                       <required keywords for the extension: XTENSION, BITPIX,
                               NAXIS, ...>
                       BEGIN MAIN HEADER --------------------------------
                       <PDU header keyword and history less required keywords:
                               SIMPLE, BITPIX, NAXIS, ...>
                       BEGIN EXTENSION HEADER ---------------------------
                       <extension header less required keywords that were
                               placed at the beginning of the header.
                       END
               
               The structure of the header is such that if a keyword is
               duplicated in both the PDU and extension headers, routine
               SXPAR will print a warning and return the extension value of
               the keyword. 

       GROUP_PAR - Group parameter block for FITS random groups format files
               or the heap area for variable length binary tables.
               Any scale factors in the header (PSCALn and PZEROn) are not
               applied to the group parameters.

 INPUT KEYWORD PARAMETERS:

       /NOSCALE: Set to return the FITS data without applying the scale
               factors BZERO and BSCALE.
       /HEADER_ONLY: set to read the header only.
       /DATA_ONLY: set to read the data only.  If set, if any scale factors
               are present (BSCALE or BZERO), they will not be applied.
       /NO_PDU: By default, FITS_READ will add the primary data unit header 
               keywords to the output header, *if* the header includes 
               INHERIT = T.   Set /NO_PDU to never append the primary header.
       /NO_ABORT: Set to return to calling program instead of a RETALL
               when an I/O error is encountered.  If set, the routine will
               return  a non-null string (containing the error message) in the
               keyword MESSAGE.    (For backward compatibility, the obsolete 
               system variable !ERR is also set to -1 in case of an error.)   
               If /NO_ABORT not set, then FITS_READ will print the message and
               issue a RETALL
       /NO_UNSIGNED - By default, if  the header indicates an unsigned integer
              (BITPIX = 16, BZERO=2^15, BSCALE=1) then FITS_READ will output 
               an IDL unsigned integer data type (UINT).   But if /NO_UNSIGNED
               is set, then the data is converted to type LONG.  
       /PDU - If set, then always add the primary data unit header keywords
              to the output header, even if the INHERIT=T keyword is not found
              This was the default behavior of FITS_READ prior to April 2007
       EXTEN_NO - extension number to read.  If not set, the next extension
               in the file is read.  Set to 0 to read the primary data unit.
       XTENSION - string name of the xtension to read
       EXTNAME - string name of the extname to read
       EXTVER - integer version number to read
       EXTLEVEL - integer extension level to read
       FIRST - set this keyword to only read a portion of the data.  It gives
               the first word of the data to read
       LAST - set this keyword to only read a portion of the data.  It gives
               the last word number of the data to read
       GROUP - group number to read for GCOUNT>1.  (Default=0, the first group)
       
 OUTPUT KEYWORD PARAMETERS:
       ENUM - Output extension number that was read.  
       MESSAGE = value: Output error message

 NOTES:
       Determination or which extension to read.
               case 1: EXTEN_NO specified. EXTEN_NO will give the number of the
                       extension to read.  The primary data unit is refered
                       to as extension 0. If EXTEN_NO is specified, XTENSION,
                       EXTNAME, EXTVER, and EXTLEVEL parameters are ignored.
               case 2: if EXTEN_NO is not specified, the first extension
                       with the specified XTENSION, EXTNAME, EXTVER, and
                       EXTLEVEL will be read.  If any of the 4 parameters
                       are not specified, they will not be used in the search.
                       Setting EXTLEVEL=0, EXTVER=0, EXTNAME='', or
                       XTENSION='' is the same as not supplying them.
               case 3: if none of the keyword parameters, EXTEN_NO, XTENSION,
                       EXTNAME, EXTVER, or EXTLEVEL are supplied.  FITS_READ
                       will read the next extension in the file.  If the
                       primary data unit (PDU), extension 0, is null, the
                       first call to FITS_READ will read the first extension
                       of the file.

               The only way to read a null PDU is to use EXTEN_NO = 0.

       If FIRST and LAST are specified, the data is returned without applying
       any scale factors (BSCALE and BZERO) and the data is returned in a
       1-D vector.  This will allow you to read any portion of a multiple
       dimension data set.  Once returned, the IDL function REFORM can be
       used to place the correct dimensions on the data.

       IMPLICIT IMAGES: FITS_READ will construct an implicit image
               for cases where NAXIS=0 and the NPIX1, NPIX2, and PIXVALUE
               keywords are present.  The output image will be:
                       image = replicate(PIXVALUE,NPIX1,NPIX2)

      FPACK compressed files are always closed and reopened when exiting 
      FITS_READ so that the pointer is set to the beginning of the file. (Since 
      FPACK files are opened with a bidirectional pipe rather than OPEN, one 
      cannot use POINT_LUN to move to a specified position in the file.)

 EXAMPLES:
       Read the primary data unit of a FITS file, if it is null read the
       first extension:
               FITS_READ, 'myfile.fits', data, header

       Read the first two extensions of a FITS file and the extension with
       EXTNAME = 'FLUX' and EXTVER = 4
               FITS_OPEN, 'myfile.fits', fcb
               FITS_READ, fcb,data1, header2, exten_no = 1
               FITS_READ, fcb,data1, header2, exten_no = 2
               FITS_READ, fcb,data3, header3, extname='flux', extver=4
               FITS_CLOSE, fcb
       
       Read the sixth image in a data cube for the fourth extension.

               FITS_OPEN, 'myfile.fits', fcb
               image_number = 6
               ns = fcb.axis[0,4]
               nl = fcb.axis[1,4]
               i1 = (ns*nl)*(image_number-1)
               i2 = i2 + ns*nl-1
               FITS_READ,fcb,image,header,first=i1,last=i2
               image = reform(image,ns,nl,/overwrite)
               FITS_CLOSE, fcb

 PROCEDURES USED:
       FITS_CLOSE, FITS_OPEN
       SXADDPAR, SXDELPAR, SXPAR()
 WARNINGS:
       In Sep 2006, FITS_OPEN was modified to open FITS files using the
       /SWAP_IF_LITTLE_ENDIAN keyword to OPEN, so that subsequent routines 
       (FITS_READ, FITS_WRITE) did not require any byte swapping.    An error
       may result if an pre-Sep 2006 version of FITS_OPEN is used with a 
       post Sep 2006 version of FITS_READ, FITS_WRITE or MODFITS.
 HISTORY:
       Written by:     D. Lindler, August 1995
       Avoid use of !ERR       W. Landsman   August 1999
       Read unsigned datatypes, added /no_unsigned   W. Landsman December 1999
       Don't call FITS_CLOSE unless fcb is defined   W. Landsman January 2000
       Set BZERO = 0 for unsigned integer data   W. Landsman  January 2000
       Only call IEEE_TO_HOST if needed          W. Landsman February 2000
       Ensure EXTEND keyword in primary header   W. Landsman April 2001
       Don't erase ERROR message when closing file  W. Landsman April 2002
       Assume at least V5.1 remove NANValue keyword  W. Landsman November 2002
       Work with compress files (read file size from fcb),
       requires updated (Jan 2003) version of FITS_OPEN W. Landsman Jan 2003
       Do not modify BSCALE/BZERO for  unsigned integers W. Landsman April 2006
       Assume FITS_OPEN has opened the file with /SWAP_IF_LITTLE_ENDIAN
                         W. Landsman   September 2006
       Fix problem with /DATA_ONLY keyword  M.Buie/W.Landsman  October 2006
       Only append primary header if INHERIT=T  W. Landsman  April 2007
       Make ndata 64bit for very large files E. Hivon/W. Landsman May 2007
       Added /PDU keyword to always append primary header W. Landsman June 2007
       Use PRODUCT to compute # of data points   W. Landsman  May 2009
       Make sure FIRST is long64 when computing position W.L. October 2009
       Read FPACK compressed files, W.L.  December 2010
       Don't assume FCB has a FCOMPRESS tag  W.L./Satori UeNO   September 2012
       Make sure opened pipes are closed if fcb not left open W.L. April 2012
       Fix bug with /data_only introduced Dec 2010      W. L. April 2014

(See external/astron/fits/fits_read.pro)


FITS_TEST_CHECKSUM()

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
    FITS_TEST_CHECKSUM()
 PURPOSE:
    Verify the values of the CHECKSUM and DATASUM keywords in a FITS header 
 EXPLANATION: 
     Follows the 2007 version of the FITS checksum proposal at 
     http://fits.gsfc.nasa.gov/registry/checksum.html
 
 CALLING SEQUENCE:
    result = FITS_TEST_CHECKSUM(HDR, [ DATA, ERRMSG=, /FROM_IEEE ])
 INPUTS:
    HDR - FITS header (vector string)
 OPTIONAL DATA:
    DATA - data array associated with the FITS header.   An IDL structure is 
           not allowed.    If not supplied, or
           set to a scalar, then there is assumed to be no data array 
           associated with the FITS header.
 RESULT:
     An integer -1, 0 or 1 indicating the following conditions:
           1 - CHECKSUM (and DATASUM) keywords are present with correct values
           0 - CHECKSUM keyword is not present
          -1 - CHECKSUM or DATASUM keyword does not have the correct value
               indicating possible data corruption.
 OPTIONAL INPUT KEYWORD:
    /FROM_IEEE - If this keyword is set, then the input is assumed to be in 
             big endian format (e.g. an untranslated FITS array).    This 
             keyword only has an effect on little endian machines (e.g. 
             a Linux box).
    /TRUST_DATASUM - If this keyword is set, then the DATA input
             parameter is ignored and the DATASUM keyword in the HDR
             is assumed to be correct. (If there is no DATASUM
             keyword, /TRUST_DATASUM has no effect.)    Useful if data is too
             large to store entirely in memory at one time.
 OPTIONAL OUTPUT KEYWORD:
     ERRMSG - will contain a scalar string giving the error condition.   If
              RESULT = 1 then ERRMSG will be an empty string.   If this 
              output keyword is not supplied, then the error message will be
              printed at the terminal.
 NOTES:
     The header and data must be *exactly* as originally written in the FITS 
     file.  By default, some FITS readers may alter keyword values (e.g. 
     BSCALE) or append information (e.g. HISTORY or an inherited primary 
     header) and this will alter the checksum value.           
 PROCEDURES USED:
    CHECKSUM32, FITS_ASCII_ENCODE(), SXPAR()
 EXAMPLE:
     Verify the CHECKSUM keywords in the primary header/data unit of a FITS 
     file 'test.fits'

     FITS_READ,'test.fits',data,hdr,/no_PDU,/NoSCALE
     print,FITS_TEST_CHECKSUM(hdr,data)

     Note the use of the /No_PDU and /NoSCALE keywords to avoid any alteration 
     of the FITS header
 REVISION HISTORY:
     W. Landsman  SSAI               December 2002
     Return quietly if CHECKSUM keywords not found W. Landsman May 2003
     Add /NOSAVE to CHECKSUM32 calls when possible W. Landsman Sep 2004
     New option /TRUST_DATASUM. Mats Löfdahl July 2020

(See external/astron/fits/fits_test_checksum.pro)


FITS_WRITE

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
	FITS_WRITE

 PURPOSE:
	To write a FITS primary data unit or extension.

 EXPLANATION:
       ***NOTE** This version of FITS_READ must be used with a post Sep 2006
          version of FITS_OPEN.

 CALLING SEQUENCE:
	FITS_WRITE, filename_or_fcb, data, [header_in]

 INPUTS:
	FILENAME_OR_FCB: name of the output data file or the FITS control
		block returned by FITS_OPEN (called with the /WRITE or
		/APPEND) parameters.

 OPTIONAL INPUTS:
	DATA: data array to write.  If not supplied or set to a scalar, a
		null image is written.
	HEADER_IN: FITS header keyword.  If not supplied, a minimal basic
		header will be created.  Required FITS keywords, SIMPLE,
		BITPIX, XTENSION, NAXIS, ... are added by FITS_WRITE and
		do not need to be supplied with the header.  If supplied,
		their values will be updated as necessary to reflect DATA.

 INPUT KEYWORD PARAMETERS:

	XTENSION: type of extension to write (Default="IMAGE"). If not
		supplied, it will be taken from HEADER_IN.  If not in either
		place, the default is "IMAGE".  This parameter is ignored
		when writing the primary data unit.     Note that binary and
               and ASCII table extensions already have a properly formatted
               header (e.g. with TTYPE* keywords) and byte array data. 
	EXTNAME: EXTNAME for the extension.  If not supplied, it will be taken
		from HEADER_IN.  If not supplied and not in HEADER_IN, no
		EXTNAME will be written into the output extension.
	EXTVER: EXTVER for the extension.  If not supplied, it will be taken
               from HEADER_IN.  If not supplied and not in HEADER_IN, no
               EXTVER will be written into the output extension.
	EXTLEVEL: EXTLEVEL for the extension.  If not supplied, it will be taken
               from HEADER_IN.  If not supplied and not in HEADER_IN, no
               EXTLEVEL will be written into the output extension.
       /NO_ABORT: Set to return to calling program instead of a RETALL
               when an I/O error is encountered.  If set, the routine will
               return  a non-null string (containing the error message) in the
               keyword MESSAGE.   If /NO_ABORT not set, then FITS_WRITE will 
               print the message and issue a RETALL
	/NO_DATA: Set if you only want FITS_WRITE to write a header.  The
		header supplied will be written without modification and
		the user is expected to write the data using WRITEU to unit
		FCB.UNIT. When FITS_WRITE is called with /NO_DATA, the user is
		responsible for the validity of the header, and must write
		the correct amount and format of the data.  When FITS_WRITE
		is used in this fashion, it will pad the data from a previously
		written extension to 2880 blocks before writting the header.

 OUTPUT KEYWORD PARAMETERS:
       MESSAGE: value of the error message for use with /NO_ABORT
	HEADER: actual output header written to the FITS file.

 NOTES:
	If the first call to FITS_WRITE is an extension, FITS_WRITE will
	automatically write a null image as the primary data unit.

	Keywords and history in the input header will be properly separated
	into the primary data unit and extension portions when constructing
	the output header (See FITS_READ for information on the internal
	Header format which separates the extension and PDU header portions).
	
 EXAMPLES:
	Write an IDL variable to a FITS file with the minimal required header.
		FITS_WRITE,'newfile.fits',ARRAY

	Write the same array as an image extension, with a null Primary data
	unit.
		FITS_WRITE,'newfile.fits',ARRAY,xtension='IMAGE'

	Write 4 additional image extensions to the same file.
		FITS_OPEN,'newfile.fits',fcb
		FITS_WRITE,fcb,data1,extname='FLUX',extver=1
		FITS_WRITE,fcb,err1,extname'ERR',extver=1
		FITS_WRITE,fcb,data2,extname='FLUX',extver=2
		FITS_WRITE,fcb,err2,extname='ERR',extver=2
		FITS_CLOSE,FCB
		
 WARNING: 
       FITS_WRITE currently does not completely update the file control block.
       When mixing FITS_READ and FITS_WRITE commands it is safer to use 
       file names, rather than passing the file control block.
 PROCEDURES USED:
	FITS_OPEN, SXADDPAR, SXDELPAR, SXPAR()
 HISTORY:
	Written by:	D. Lindler	August, 1995
	Work for variable length extensions  W. Landsman   August 1997
	Converted to IDL V5.0   W. Landsman   September 1997
	PCOUNT and GCOUNT added for IMAGE extensions   J. Graham  October 1999
       Write unsigned data types      W. Landsman   December 1999
       Pad data area with zeros not blanks  W. McCann/W. Landsman October 2000
       Return Message='' to signal normal operation W. Landsman Nov. 2000
       Ensure that required extension table keywords are in proper order
             W.V. Dixon/W. Landsman          March 2001
       Assume since V5.1, remove NaNValue keyword   W. Landsman Nov. 2002
       Removed obsolete !ERR system variable  W. Landsman Feb 2004
       Check that byte array supplied with table extension W. Landsman Mar 2004
       Make number of bytes 64bit to avoid possible overflow W.L  Apr 2006
       Assume FITS_OPEN has opened the file with /SWAP_IF_LITTLE_ENDIAN
                         W. Landsman   September 2006
       Removes BZERO and BSCALE for floating point output, D. Lindler, Sep 2008

(See external/astron/fits/fits_write.pro)


FXMOVE

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
     FXMOVE
 PURPOSE:
     Skip to a specified extension number or name in a FITS file

 CALLING SEQUENCE:
     STATUS=FXMOVE(UNIT, EXT, /Silent)
     STATUS=FXMOVE(UNIT, EXTNAME, /Silent, EXT_NO=, ERRMSG= )

 INPUT PARAMETERS:
     UNIT     = An open unit descriptor for a FITS data stream.
     EXTEN   = Number of extensions to skip.
                              or
             Scalar string giving extension name (in the EXTNAME keyword)           
 OPTIONAL INPUT PARAMETER:
     /SILENT - If set, then any messages about invalid characters in the 
               FITS file are suppressed.
 OPTIONAL OUTPUT PARAMETER:
       ERRMSG  = If this keyword is present, then any error messages will be
                 returned to the user in this parameter rather than
                 depending on the MESSAGE routine in IDL.  If no errors are
                 encountered, then a null string is returned.
       EXT_NO - Extension number, scalar integer, useful if the user supplied 
                an extension name in the EXTEN parameter
 RETURNS:
     0 if successful.
    -1 if an error is encountered.

 COMMON BLOCKS:
      None.
 SIDE EFFECTS:
      Repositions the file pointer.
 PROCEDURE:
      Each FITS header is read in and parsed, and the file pointer is moved
      to where the next FITS extension header until the desired
      extension is reached.
 PROCEDURE CALLS:
      FXPAR(), MRD_HREAD, MRD_SKIP
 MODIFICATION HISTORY:
      Extracted from FXPOSIT 8-March-2000 by T. McGlynn
      Added /SILENT keyword  14-Dec-2000 by W. Landsman
      Save time by not reading the full header  W. Landsman   Feb. 2003
      Allow extension name to be specified, added EXT_NO, ERRMSG keywords
         W. Landsman  December 2006
      Make search for EXTNAME case-independent  W.Landsman March 2007 
      Avoid round-off error for very large extensions N. Piskunov Dec 2007
      Assume since V6.1 (/INTEGER keyword available to PRODUCT() ) Dec 2007
      Capture error message from MRD_HREAD (must be used with post-June 2009
        version of MRD-HREAD)   W. Landsman  July 2009

(See external/astron/fits/fxmove.pro)


FXPOSIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
     FXPOSIT
 PURPOSE:
     Return the unit number of a FITS file positioned at specified extension
 EXPLANATION:
     The FITS file will be ready to be read at the beginning of the 
     specified extension.    Either an extension number or extension name
     can be specified.   Called by headfits.pro, mrdfits.pro

     Modified in March 2009 to set the /SWAP_IF_LITTLE_ENDIAN keyword
     when opening a file, and **may not be compatible with earlier versions**
 CALLING SEQUENCE:
     unit=FXPOSIT(FILE, EXT_NO_OR_NAME, /READONLY, COMPRESS=program, 
                       UNIXPIPE=, ERRMSG= , EXTNUM= , UNIT=, /SILENT
                        /FPACK, /NO_FPACK

 INPUT PARAMETERS:
     FILE    = FITS file name, scalar string.    If an empty string is supplied
              then the user will be prompted for the file name.   The user
              will also be prompted if a wild card is supplied, and more than 
              one file matches the wildcard.
     EXT_NO_OR_NAME  = Either the extension to be moved to (scalar 
               nonnegative integer) or the name of the extension to read 
               (scalar string)

 RETURNS:
     Unit number of file or -1 if an error is detected.

 OPTIONAL INPUT KEYWORD PARAMETER:
     COMPRESS - If this keyword is set and non-zero, then then treat
                the file as compressed.  If 1 assume a gzipped file.
                and use IDLs internal decompression facility.    For Unix 
                compressed or bzip2 compressed files spawn off a process to 
                decompress and use its output as the FITS stream.  If the 
                keyword is not 1, then use its value as a string giving the 
                command needed for decompression.
     /FPACK - Signal that the file is compressed with the FPACK software. 
               http://heasarc.gsfc.nasa.gov/fitsio/fpack/ ) By default, 
               (FXPOSIT will assume that if the file name extension ends in 
              .fz that it is fpack compressed.)     The FPACK software must
               be installed on the system 
     /NO_FPACK - The unit will only be used to read the FITS header.  In
                 that case FPACK compressed files need not be uncompressed.
      LUNIT -    Integer giving the file unit number.    Use this keyword if
                you want to override the default use of GET_LUN to obtain
                a unit number.
     /READONLY - If this keyword is set and non-zero, then OPENR rather 
                than OPENU will be used to open the FITS file.    Note that
                 compressed files are always set to /READONLY
     /SILENT    If set, then suppress any messages about invalid characters
                in the FITS file.

 OPTIONAL OUTPUT KEYWORDS:
       EXTNUM - Nonnegative integer give the extension number actually read
               Useful only if the extension was specified by name.
       ERRMSG  = If this keyword is present, then any error messages will be
                 returned to the user in this parameter rather than
                 depending on the MESSAGE routine in IDL.  If no errors are
                 encountered, then a null string is returned.
       UNIXPIPE - If set to 1, then the FITS file was opened with a UNIX pipe
                rather than with the OPENR command.    This is only required 
                 when reading a FPACK, bzip or Unix compressed file.   Note 
                 that automatic byteswapping cannnot be set for a Unix pipe, 
                 since the SWAP_IF_LITTLE_ENDIAN keyword is only available for the
                 OPEN command, and it is the responsibility of the calling 
                 routine to perform the byteswapping.
 SIDE EFFECTS:
      Opens and returns a file unit.
 PROCEDURE:
      Open the appropriate file, or spawn a command and intercept
      the output.
      Call FXMOVE to get to the appropriate extension.
 PROCEDURE CALLS:
      FXMOVE()
 MODIFICATION HISTORY:
      Derived from William Thompson's FXFINDEND routine.
      Modified by T.McGlynn, 5-October-1994.
       Modified by T.McGlynn, 25-Feb-1995 to handle compressed
          files.  Pipes cannot be accessed using FXHREAD so
          MRD_HREAD was written.
       W. Landsman 23-Apr-1997    Force the /bin/sh shell when uncompressing 
       T. McGlynn  03-June-1999   Use /noshell option to get rid of processes left by spawn.
                                  Use findfile to retain ability to use wildcards
       W. Landsman 03-Aug-1999    Use EXPAND_TILDE under Unix to find file
       T. McGlynn  04-Apr-2000    Put reading code into FXMOVE,
                                  additional support for compression from D.Palmer.
       W. Landsman/D.Zarro 04-Jul-2000    Added test for !VERSION.OS EQ 'Win32' (WinNT)
       W. Landsman    12-Dec-2000 Added /SILENT keyword
       W. Landsman April 2002     Use FILE_SEARCH for V5.5 or later
       W. Landsman Feb 2004       Assume since V5.3 (OPENR,/COMPRESS available)
       W. Landsman,W. Thompson, 2-Mar-2004, Add support for BZIP2 
       W. Landsman                Don't leave open file if an error occurs
       W. Landsman  Sep 2004      Treat FTZ extension as gzip compressed
       W. Landsman  Feb 2006      Removed leading spaces (prior to V5.5)
       W. Landsman  Nov 2006      Allow specification of extension name
                                  Added EXTNUM, ERRMSG keywords
       W. Landsman/N.Piskunov Dec 2007  Added LUNIT keyword
       W. Landsman     Mar 2009   OPEN with /SWAP_IF_LITTLE_ENDIAN
                                  Added UNIXPIPE output keyword
       N. Rich        May 2009    Check if filename is an empty string
       W. Landsman   May 2009     Support FPACK compressed files
                                  Added /FPACK, /HEADERONLY keywords
       W.Landsman    July 2009    Deprecated /HEADERONLY add /NO_FPACK
       W.Landsman    July 2011    Check for SIMPLE in first 8 chars 
               Use gunzip to decompress Unix. Z file since compress utility 
               often not installed anymore)
       W. Landsman   October 2012 Add .fz extension if /FPACK set
       W. Landsman   July 2013    More diagnostics if file not found

(See external/astron/fits/fxposit.pro)


HEADFITS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       HEADFITS
 PURPOSE:
       Read a FITS (primary or extension) header into a string array.
 EXPLANATION:
       HEADFITS() supports several types of compressed files including 
       gzip (.gz), Unix compressed (.Z), Bzip2 (.bz2) or FPACK (.fz 
       http://heasarc.gsfc.nasa.gov/fitsio/fpack/ )

 CALLING SEQUENCE:
       Result = HEADFITS(Filename/Fileunit ,[ ERRMSG =, EXTEN= , COMPRESS=, 
                                            /SILENT ])

 INPUTS:
       Filename = String containing the name of the FITS file to be read.
                If set to an empty string, then user will be prompted for name.
                File names ending in '.gz' are assumed to be gzip'ed compressed
                and under Unix file names ending in '.Z' are assumed to be
                Unix compressed, and file names ending in .bz2 are assumed to
                be bzip2 compressed.    If this default behaviour is not 
                sufficient then use the COMPRESS keyword.
                            or
       Fileunit - A scalar integer specifying the unit of an already opened
                  FITS file.  The unit will remain open after exiting 
                  HEADFITS().  There are two possible reasons for choosing 
                  to specify a unit number rather than a file name:
          (1) For a FITS file with many extensions, one can move to the 
              desired extensions with FXPOSIT() and then use HEADFITS().  This
              is more efficient that repeatedly starting at the beginning of 
              the file.
          (2) For reading a FITS file across a Web http: address after opening
              the unit with the SOCKET procedure.
 OPTIONAL INPUT KEYWORDS:
      EXTEN  = Either an integer scalar, specifying which FITS extension to 
               read, or a scalar string specifying the extension name (stored
               in the EXTNAME keyword).   For example, to read the header of 
               the first extension set EXTEN = 1.   Default is to read the 
               primary FITS header  (EXTEN = 0).    The EXTEN keyword cannot 
               be used when a unit number is supplied instead of a file name.
     COMPRESS - If this keyword is set and non-zero, then treat the file
              as compressed.  If 1 assume a gzipped file.   Use IDL's
              internal decompression facilities for gzip files, while for 
              Unix or bzip2 compression spawn off a process to decompress and 
              use its output as the FITS stream.  If the keyword is not 1, 
              then use its value as a string giving the command needed for 
              decompression.   See FXPOSIT for more info.
     /SILENT - If set, then suppress any warning messages about invalid 
              characters in the FITS file.
 OPTIONAL KEYWORD OUTPUT:
       ERRMSG	= If this keyword is present, then any error messages will be
                 returned to the user in this parameter rather than
                 depending on the MESSAGE routine in IDL.  If no errors are
                 encountered, then a null string is returned.  

 OUTPUTS:
       Result of function = FITS header, string array

 EXAMPLE:
       Print the main FITS header of a file 'test.fits' into a string 
       variable, h

       IDL>  print, headfits( 'test.fits')

       Print the second extension header of a gzip compressed FITS file
       'test.fits.gz'.  Use HPRINT for pretty format

       IDL> hprint, headfits( 'test.fits.gz', ext=2)

       Read the extension named CALSPEC 

       IDL> hprint,headfits('test.fits.gz',ext='CALSPEC')

 PROCEDURES CALLED
       FXPOSIT(), MRD_HREAD
 MODIFICATION HISTORY:
       Adapted by Frank Varosi from READFITS by Jim Wofford, January, 24 1989
       Option to read a unit number rather than file name W.L    October 2001
       Test output status of MRD_HREAD call October 2003 W. Landsman
       Allow extension to be specified by name Dec 2006 W. Landsman
       No need to uncompress FPACK compressed files  May 2009 W. Landsman
       Use V6.0 notation   W.L.   Feb. 2011
       Do not check for EOF() since MRD_HREAD does this  Nov 2014 W. Landsman  

(See external/astron/fits/headfits.pro)


MKHDR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       MKHDR
 PURPOSE:
       Make a minimal primary (or IMAGE extension) FITS header
 EXPLANATION:
       If an array is supplied,  then the created FITS header will be 
       appropriate to the supplied array.  Otherwise, the user can specify 
       the dimensions and datatype.

       To update an *existing* FITS header with a new image array, instead 
       use check_FITS, /Update 

 CALLING SEQUENCE:
       MKHDR, header                   ;Prompt for image size and type
               or
       MKHDR, header, im, [ /IMAGE, /EXTEND ]
               or
       MKHDR, header, type, naxisx, [/IMAGE, /EXTEND ]         

 OPTIONAL INPUTS:
       IM - If IM is a vector or array then the header will be made
               appropriate to the size and type of IM.  IM does not have
               to be the actual data; it can be a dummy array of the same
               type and size as the data.    Set IM = '' to create a dummy
               header with NAXIS = 0. 
       TYPE - If 2 parameters are supplied, then the second parameter
               is interpreted as an integer giving the IDL datatype e.g. 
               1 - Byte, 2 - 16 bit integer, 4 - float, 3 - Long
       NAXISX - Vector giving the size of each dimension (NAXIS1, NAXIS2, 
               etc.).  

 OUTPUT:
       HEADER - image header, (string array) with required keywords
               BITPIX, NAXIS, NAXIS1, ... Further keywords can be added
               to the header with SXADDPAR. 

 OPTIONAL INPUT KEYWORDS:
       /IMAGE   = If set, then a minimal header for a FITS IMAGE extension
               is created.    An IMAGE extension header is identical to
               a primary FITS header except the first keyword is 
               'XTENSION' = 'IMAGE' instead of 'SIMPLE  ' = 'T'
       /EXTEND  = If set, then the keyword EXTEND is inserted into the file,
               with the value of "T" (true).    The EXTEND keyword can 
               optionally be included in a primary header, if the FITS file 
               contains extensions.

 RESTRICTIONS:
       (1)  MKHDR should not be used to make an STSDAS header or a FITS
               ASCII or Binary Table extension header.   Instead use

               SXHMAKE - to create a minimal STSDAS header
               FXBHMAKE - to create a minimal FITS binary table header
               FTCREATE - to create a minimal FITS ASCII table header

       (2)  Any data already in the header before calling MKHDR
               will be destroyed.
 EXAMPLE:
       Create a minimal FITS header, Hdr, for a 30 x 40 x 50 INTEGER*2 array

             IDL> mkhdr, Hdr, 2, [30,40,50]

       Alternatively, if the array already exists as an IDL variable, Array,

              IDL> mkhdr, Hdr, Array

 PROCEDURES CALLED:
       SXADDPAR, GET_DATE

 REVISION HISTORY:
       Written November, 1988               W. Landsman
       May, 1990, Adapted for IDL Version 2.0, J. Isensee
       Aug, 1997, Use SYSTIME(), new DATE format  W. Landsman
       Allow unsigned data types    W. Landsman   December 1999
       Set BZERO = 0 for unsigned integer data  W. Landsman January 2000
       EXTEND keyword must immediately follow last NAXISi W. Landsman Sep 2000
       Add FITS definition COMMENT to primary headers W. Landsman Oct. 2001
       Allow (nonstandard) 64 bit integers   W. Landsman  Feb. 2003
       Add V6.0 notation W. Landsman July 2012
       Support unsigned 64 bit integers W. Landsman January 2018 

(See external/astron/fits/mkhdr.pro)


MODFITS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
      MODFITS
 PURPOSE:
      Modify a FITS file by updating the header and/or data array.  
 EXPLANATION:
      Update the data and/or header in a specified FITS extension or primary
      HDU.
    
      The size of the supplied FITS header or data array does not
      need to match the size of the existing header or data array.

 CALLING SEQUENCE:
      MODFITS, Filename_or_fcb, Data, [ Header, EXTEN_NO =, EXTNAME= , ERRMSG=]

 INPUTS:
      FILENAME/FCB = Scalar string containing either the name of the FITS file  
                  to be modified, or the IO file control block returned after 
                  opening the file with FITS_OPEN,/UPDATE.   The explicit
                  use of FITS_OPEN can save time if many extensions in a 
                  single file will be updated.

      DATA - data array to be inserted into the FITS file.   Set DATA = 0
               to leave the data portion of the FITS file unmodified.   Data
               can also be an IDL structure (e.g. as returned by MRDFITS). 
               provided that it does not include IDL pointers.

      HEADER - FITS header (string array) to be updated in the FITS file.

 OPTIONAL INPUT KEYWORDS:
      A specific extension can be specified with either the EXTNAME or
      EXTEN_NO keyword
 
      EXTEN_NO - scalar integer specifying the FITS extension to modified.  For
               example, specify EXTEN = 1 or /EXTEN to modify the first 
               FITS extension.
      EXTNAME - string name of the extension to modify.   


 OPTIONAL OUTPUT KEYWORD:
       ERRMSG - If this keyword is supplied, then any error mesasges will be
               returned to the user in this parameter rather than depending on
               on the MESSAGE routine in IDL.   If no errors are encountered
               then a null string is returned.               

 EXAMPLES:
     (1) Modify the value of the DATE keyword in the primary header of a 
             file TEST.FITS.

              IDL> h = headfits('test.fits')      ;Read primary header
              IDL> sxaddpar,h,'DATE','2015-03-23' ;Modify value of DATE 
              IDL> modfits,'test.fits',0,h        ;Update header only

       (2) Replace the values of the primary image array in 'test.fits' with 
               their absolute values

               IDL> im = readfits('test.fits')    ;Read image array
               IDL> im = abs(im)                  ;Take absolute values
               IDL> modfits,'test.fits',im        ;Update image array

       (3) Add some HISTORY records to the FITS header in the first extension
               of a file 'test.fits'
       
               IDL> h = headfits('test.fits',/ext)  ;Read first extension hdr
               IDL> sxaddhist,['Comment 1','Comment 2'],h
               IDL> modfits,'test.fits',0,h,/ext    ;Update extension hdr

       (4) Change 'OBSDATE' keyword to 'OBS-DATE' in every extension in a 
           FITS file.    Explicitly open with FITS_OPEN to save compute time.

               fits_open,'test.fits',io,/update    ;Faster to explicity open
               for i = 1,io.nextend do begin          ;Loop over extensions
                   fits_read,io,0,h,/header_only,exten_no=i,/No_PDU ;Get header     
                   date= sxpar(h,'OBSDATE')         ;Save keyword value
                   sxaddpar,h,'OBS-DATE',date,after='OBSDATE' 
                   sxdelpar,h,'OBSDATE'             ;Delete bad keyword
                   modfits,io,0,h,exten_no=i        ;Update header
               endfor

           Note the use of the /No_PDU keyword in the FITS_READ call -- one 
           does *not* want to append the primary header, if the STScI 
           inheritance convention is adopted.

 NOTES:
       Uses the BLKSHIFT procedure to shift the contents of the FITS file if 
       the new data or header differs in size by more than 2880 bytes from the
       old data or header.    If a file control block (FCB) structure is 
       supplied, then the values of START_HEADER, START_DATA and NBYTES may 
       be modified if the file size changes.

       Also see the procedures FXHMODIFY to add a single FITS keyword to a 
       header in a FITS files, and FXBGROW to enlarge the size of a binary 
       table.
       
 RESTRICTIONS:
       (1) Cannot be used to modify the data in FITS files with random 
           groups or variable length binary tables.   (The headers in such
           files *can* be modified.)     Cannot be used to modify individual
           columns in binary or ASCII tables.

       (2) If a data array but no FITS header is supplied, then MODFITS does 
           not check to make sure that the existing header is consistent with
           the new data.

       (3) Does not work with compressed files

       (4) The Checksum keywords will not be updated if the array to be 
           updated is supplied as a structure (e.g. from MRDFITS). 
 PROCEDURES USED:
       Functions:   N_BYTES(), SXPAR()
       Procedures:  BLKSHIFT, CHECK_FITS, FITS_OPEN, FITS_READ. SETDEFAULTVALUE

 MODIFICATION HISTORY:
       Written,    Wayne Landsman          December, 1994
       Fixed possible problem when using WRITEU after READU   October 1997
       New and old sizes need only be the same within multiple of 2880 bytes
       Added call to IS_IEEE_BIG()     W. Landsman   May 1999
       Added ERRMSG output keyword     W. Landsman   May 2000
       Update tests for incompatible sizes   W. Landsman   December 2000
       Major rewrite to use FITS_OPEN procedures W. Landsman November 2001
       Add /No_PDU call to FITS_READ call  W. Landsman  June 2002
       Update CHECKSUM keywords if already present in header, add padding 
       if new data  size is smaller than old  W.Landsman December 2002
       Only check XTENSION value if EXTEN_NO > 1   W. Landsman Feb. 2003
       Correct for unsigned data on little endian machines W. Landsman Apr 2003
       Major rewrite to allow changing size of data or header W.L. Aug 2003
       Fixed case where updated header exactly fills boundary W.L. Feb 2004
       More robust error reporting W.L. Dec 2004
       Make sure input header ends with a END W.L.  March 2006
       Assume since V5.5, remove VMS support, assume FITS_OPEN will
           perform byte swapping   W.L. Sep 2006 
       Update FCB structure if file size changes W.L. March 2007
       Fix problem when data size must be extended W.L. August 2007
       Don't assume supplied FITS header is 80 bytes W. L. Dec 2007
       Check for new END position after adding CHECKSUM  W.L. July 2008
       Added EXTNAME input keyword  W.L. July 2008
       Allow data to be an IDL structure  A. Conley/W.L. June 2009
       Use V6.0 notation, add /NOZERO to BLKSHIFT W.L. Feb 2011
       Don't try to update Checksums when structure supplied W.L. April 2011
       Allow structure with only 1 element  W.L.  Feb 2012
       Don't require that a FITS header is supplied W.L.  Feb 2016
       Use CATCH rather than ON_IOError, 2  W. L  July 2018
       Fix when no header supplied W.L. June 2022

(See external/astron/fits/modfits.pro)


MRDFITS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
     MRDFITS

 PURPOSE:
     Read all standard FITS data types into arrays or structures.

 EXPLANATION:
      Further information on MRDFITS is available at
      http://idlastro.gsfc.nasa.gov/mrdfits.html 

 CALLING SEQUENCE:
      Result = MRDFITS( Filename/FileUnit,[Exten_no/Exten_name, Header],
                       /FPACK, /NO_FPACK, /FSCALE , /DSCALE , /UNSIGNED,
                       ALIAS=strarr[2,n], /USE_COLNUM,
                       /NO_TDIM, ROWS = [a,b,...], $
                       /POINTER_VAR, /FIXED_VAR, EXTNUM= 
                       RANGE=[a,b], COLUMNS=[a,b,...]), ERROR_ACTION=x,
                       COMPRESS=comp_prog, STATUS=status, /VERSION, 
                       /EMPTYSTRING )

 INPUTS:
      Filename = String containing the name of the file to be read or
                 file number of an open unit.  If an empty string is supplied,
                 then user will be prompted for the file name.    The user
                 will also be prompted if a wild card is given in the file
                 name, and there is more than one file name match.
                 If the file name ends in .gz or .fz (or .Z on Unix systems)
                 the file will be dynamically decompressed.
                                    or
      FiluUnit = An integer file unit which has already been
                 opened for input.  Data will be read from this
                 unit and the unit will be left pointing immediately
                 after the HDU that is read.  Thus to read a compressed
                 file with many HDU's a user might do something like:
                      lun=fxposit(filename, 3)  ; Skip the first three HDU's
                      repeat begin
                          thisHDU = mrdfits(lun, 0, hdr, status=status)
                          ... process the HDU ...
                      endrep until status lt 0

      Exten_no= Extension number to be read, 0 for primary array.
                 Assumed 0 if not specified.
                 If a unit rather than a filename
                 is specified in the first argument, this is
                 the number of HDU's to skip from the current position.
      Exten_name - Name of the extension to read (as stored in the EXTNAME
                 keyword).   This is a slightly slower method then specifying
                 the extension number.
 OUTPUTS:
      Result = FITS data array or structure constructed from
               the designated extension.  The format of result depends
               upon the type of FITS data read.
             Non-group primary array or IMAGE extension:
               A simple multidimensional array is returned with the
               dimensions given in the NAXISn keywords.
             Grouped image data with PCOUNT=0.
               As above but with GCOUNT treated as NAXIS(n+1).
             Grouped image data with PCOUNT>0.
               The data is returned as an array of structures.  Each
               structure has two elements.  The first is a one-dimensional
               array of the group parameters, the second is a multidimensional
               array as given by the NAXIS2-n keywords.
             ASCII and BINARY tables.
               The data is returned as a structure with one column for
               each field in the table.  The names of the columns are
               normally taken from the TTYPE keywords (but see USE_COLNUM).
               Bit field columns
               are stored in byte arrays of the minimum necessary
               length.  Spaces and invalid characters are replaced by 
               underscores, and other invalid tag names are converted using
               the IDL_VALIDNAME(/CONVERT_ALL) function.
               Columns specified as variable length columns are stored
               with a dimension equal to the largest actual dimension
               used.  Extra values in rows are filled with 0's or blanks.
               If the size of the variable length column is not
               a constant, then an additional column is created giving the 
               size used in the current row.  This additional column will 
               have a tag name of the form L#_"colname" where # is the column
               number and colname is the column name of the variable length
               column.   If the length of each element of a variable length 
               column is 0 then the column is deleted.


 OPTIONAL OUTPUT:
       Header = String array containing the header from the FITS extension.

 OPTIONAL INPUT KEYWORDS:
       ALIAS    The keyword allows the user to specify the column names
                to be created when reading FITS data.  The value of
                this keyword should be a 2xn string array.  The first
                value of each pair of strings should be the desired
                tag name for the IDL column.  The second should be
                the FITS TTYPE value.  Note that there are restrictions
                on valid tag names.  The order of the ALIAS keyword
                is compatible with MWRFITS.
       COLUMNS - This keyword allows the user to specify that only a
                subset of columns is to be returned.  The columns
                may be specified either as number 1,... n or by
                name or some combination of these two.
                If /USE_COLNUM is specified names should be C1,...Cn.
                The use of this keyword will not save time or internal
                memory since the extraction of specified columns
                is done after all columns have been retrieved from the
                FITS file.      Structure columns are returned in the order
                supplied in this keyword.
       COMPRESS - This keyword allows the user to specify a
                decompression program to use to decompress a file that
                will not be automatically recognized based upon
                the file name.
       /DSCALE - As with FSCALE except that the resulting data is
                stored in doubles.
       /EMPTYSTRING - There was a bug in memory management for IDL versions 
                 prior to V8.0, causing a memory leak when reading
                 empty strings in a FITS table.   Setting /EMPTYSTRING will
                 avoid this problem by first reading strings into bytes and
                 then converting.   However, there is a performance penalty.                 
       ERROR_ACTION - Set the on_error action to this value (defaults
                to 2).
       /FIXED_VAR- Translate variable length columns into fixed length columns
                and provide a length column for truly varying columns.
                This was the only behavior prior to V2.5 for MRDFITS and remains
                the default (see /POINTER_VAR)
       /FPACK - If set, then assume the FITS file uses FPACK compression 
                (http://heasarc.gsfc.nasa.gov/fitsio/fpack/).     To read
                an FPACK compressed file, either this must be set or the 
                file name must end in ".fz"
       /NO_FPACK - If present, then MRDFITS will not uncompress an extension
                compressed with FPACK (i.e with a .fz extension), but will 
                just read the compressed binary stream. 
       /FSCALE - If present and non-zero then scale data to float
                numbers for arrays and columns which have either
                non-zero offset or non-unity scale.
                If scaling parameters are applied, then the corresponding
                FITS scaling keywords will be modified.
       NO_TDIM  - Disable processing of TDIM keywords.  If NO_TDIM
                is specified MRDFITS will ignore TDIM keywords in
                binary tables.
       /POINTER_VAR- Use pointer arrays for variable length columns.
                The pointer tag must be dereferenced in the output structure
                to access the variable length column.   Prior to IDL V8.0, the user 
                was responsible for memory management when deleting or reassigning 
                the structure (e.g. using HEAP_FREE), but memory management of pointer
                arrays is now automatic.         
       RANGE  - A scalar or two element vector giving the start
                and end rows to be retrieved.  For ASCII and BINARY
                tables this specifies the row number.  For GROUPed data
                this will specify the groups.  For array images, this
                refers to the last non-unity index in the array.  E.g.,
                for a 3 D image with NAXIS* values = [100,100,1], the
                range may be specified as 0:99, since the last axis
                is suppressed.  Note that the range uses IDL indexing
                So that the first row is row 0.
                If only a single value, x, is given in the range,
                the range is assumed to be [0,x-1].
       ROWS -  A scalar or vector specifying a  specific row or rows to read 
               (first row is 0).   For example to read rows 0,
               12 and 23 only, set ROWS=[0,12,23].   Valid for images, ASCII 
               and binary tables, but not GROUPed data.   For images
               the row numbers refer to the last non-unity index in the array.
               Note that the use of the ROWS will not improve the speed of
               MRDFITS since the entire table will be read in, and then subset
               to the specified rows.     Cannot be used at the same time as 
               the RANGE keyword
       /SILENT - Suppress informative messages.
       STRUCTYP - The structyp keyword specifies the name to be used
                for the structure defined when reading ASCII or binary
                tables.  Generally users will not be able to conveniently
                combine data from multiple files unless the STRUCTYP
                parameter is specified.  An error will occur if the
                user specifies the same value for the STRUCTYP keyword
                in calls to MRDFITS in the same IDL session for extensions
                which have different structures.
       /UNSIGNED - For integer image data with appropriate zero points and scales,
                read the data into unsigned integer arrays.     This is the 
                default for binary tables.
       /USE_COLNUM - When creating column names for binary and ASCII tables
                MRDFITS attempts to use the appropriate TTYPE keyword
                values.  If USE_COLNUM is specified and non-zero then
                column names will be generated as 'C1, C2, ... 'Cn'
                for the number of columns in the table.
       /VERSION Print the current version number

 OPTIONAL OUTPUT KEYWORDS:
       EXTNUM - the number of the extension actually read.   Useful if the
                 user specified the extension by name.
       OUTALIAS - This is a 2xn string array where the first column gives the
                actual structure tagname, and the second gives the
                corresponding FITS keyword name (e.g. in the TTYPE keyword).   
                This array can be passed directly to
                the alias keyword of MWRFITS to recreate the file originally
                read by MRDFITS.
       STATUS - A integer status indicating success or failure of
                the request.  A status of >=0 indicates a successful read.
                Currently
                    0 -> successful completion
                   -1 -> error
                   -2 -> end of file

 EXAMPLES:
       (1) Read a FITS primary array:
               a = mrdfits('TEST.FITS')    or
               a = mrdfits('TEST.FITS', 0, header)
       The second example also retrieves header information.

       (2) Read rows 10-100 of the second extension of a FITS file.
               a = mrdfits('TEST.FITS', 2, header, range=[10,100])

       (3) Read a table and ask that any scalings be applied and the
       scaled data be converted to doubles.  Use simple column names,
       suppress outputs.
               a = mrdfits('TEST.FITS', 1, /dscale, /use_colnum, /silent)

       (4) Read rows 3, 34 and 52 of a binary table and request that 
           variable length columns be stored as a pointer variable in the 
           output structure
              a = mrdfits('TEST.FITS',1,rows=[3,34,52],/POINTER)
 
 RESTRICTIONS:
       (1)     Cannot handle data in non-standard FITS formats.
       (2)     Doesn't do anything with BLANK or NULL values or
               NaN's.  They are just read in.  They may be scaled
               if scaling is applied.
       (3)     Does not automatically detect a FPACK compressed file.  Either
               the file name must end in .fz, or the /FPACK keyword must
               be set
 NOTES:
       This multiple format FITS reader is designed to provide a
       single, simple interface to reading all common types of FITS data.
       MRDFITS DOES NOT scale data by default.  The FSCALE or DSCALE
       parameters must be used.

       Null values in an FITS ASCII table are converted to NaN (floating data),
       or -2147483647L (longwords) or '...' (strings).   

 PROCEDURES USED:
       The following procedures are contained in the main MRDFITS program.
           MRD_IMAGE           -- Generate array/structure for images.
           MRD_READ_IMAGE      -- Read image data.
           MRD_ASCII           -- Generate structure for ASCII tables.
           MRD_READ_ASCII      -- Read an ASCII table.
           MRD_TABLE           -- Generate structure for Binary tables.
           MRD_READ_TABLE      -- Read binary table info.
           MRD_READ_HEAP       -- Read variable length record info.
           MRD_SCALE           -- Apply scaling to data.
           MRD_COLUMNS         -- Extract columns.

        Other ASTRON Library routines used
           FXPAR(), FXADDPAR, FXPOSIT, FXMOVE(), MATCH, MRD_STRUCT(), MRD_SKIP 

 MODIfICATION HISTORY:
       V1.0 November 9, 1994 ----  Initial release.
          Creator: Thomas A. McGlynn
       V1.1 January 20, 1995 T.A. McGlynn
          Fixed bug in variable length records.
          Added TDIM support -- new routine mrd_tdim in MRD_TABLE.
       V1.2
          Added support for dynamic decompression of files.
          Fixed further bugs in variable length record handling.
       V1.2a
          Added NO_TDIM keyword to turn off TDIM processing for
          those who don't want it.
          Bug fixes: Handle one row tables correctly, use BZERO rather than
               BOFFSET.     Fix error in scaling of images.  
       V1.2b 
          Changed MRD_HREAD to handle null characters in headers.
       V2.0 April 1, 1996
          -Handles FITS tables with an arbitrary number of columns.
          -Substantial changes to MRD_STRUCT to allow the use of
          substructures when more than 127 columns are desired.
          -All references to table columns are now made through the
          functions MRD_GETC and MRD_PUTC.  See description above.
          -Use of SILENT will now eliminate compilation messages for
          temporary functions.
          -Bugs in handling of variable length columns with either
          a single row in the table or a maximum of a single element
          in the column fixed.
          -Added support for DCOMPLEX numbers in binary tables (M formats) for
          IDL versions above 4.0.  
          -Created regression test procedure to check in new versions.
          -Added error_action parameter to allow user to specify
          on_error action.  This should allow better interaction with
          new CHECK facility.  ON_ERROR statements deleted from
          most called routines.
          - Modified MRDFITS to read in headers containing null characters
          with a warning message printed.
       V2.0a April 16, 1996
          - Added IS_IEEE_BIG() checks (and routine) so that we don't
          worry about IEEE to host conversions if the machine's native
          format is IEEE Big-endian.
       V2.1 August 24, 1996
          - Use resolve_routine for dynamically defined functions
          for versions > 4.0
          - Fix some processing in random groups format.
          - Handle cases where the data segment is--legally--null.
          In this case MRDFITS returns a scalar 0.
          - Fix bugs with the values for BSCALE and BZERO (and PSCAL and
          PZERO) parameters set by MRDFITS.
       V2.1a April 24, 1997  Handle binary tables with zero length columns
       V2.1b May 13,1997 Remove whitespace from replicate structure definition
       V2.1c May 28,1997 Less strict parsing of XTENSION keyword
       V2.1d June 16, 1997 Fixed problem for >32767 entries introduced 24-Apr
       V2.1e Aug 12, 1997 Fixed problem handling double complex arrays
       V2.1f Oct 22, 1997 IDL reserved words can't be structure tag names
       V2.1g Nov 24, 1997 Handle XTENSION keywords with extra blanks.
       V2.1h Jul 26, 1998 More flexible parsing of TFORM characters
       V2.2 Dec 14, 1998 Allow fields with longer names for
                        later versions of IDL.
                        Fix handling of arrays in scaling routines.
                        Allow >128 fields in structures for IDL >4.0
                        Use more efficient structure copying for
                        IDL>5.0
       V2.2b June 17, 1999 Fix bug in handling case where
                           all variable length columns are deleted
                           because they are empty.
       V2.3 March 7, 2000 Allow user to supply file handle rather
                          than file name.
                          Added status field.
                          Now needs FXMOVE routine
       V2.3b April 4, 2000
                          Added compress option (from D. Palmer)
       V2.4  July 4, 2000 Added STATUS=-1 for "File access error" (Zarro/GSFC)
       V2.4a May 2, 2001  Trim binary format string   (W. Landsman)
       V2.5 December 5, 2001 Add unsigned, alias, 64 bit integers. version, $
                           /pointer_val, /fixed_var.
       V2.5a Fix problem when both the first and the last character
            in a TTYPEnn value are invalid structure tag characters
       V2.6 February 15, 2002 Fix error in handling unsigned numbers, $
                           and 64 bit unsigneds. (Thanks to Stephane Beland)
       V2.6a September 2, 2002 Fix possible conflicting data structure for
                          variable length arrays (W. Landsman)
       V2.7 July, 2003  Added Rows keyword (W. Landsman)
       V2.7a September  2003 Convert dimensions to long64 to handle huge files
       V2.8 October 2003 Use IDL_VALIDNAME() function to ensure valid tag names
                         Removed OLD_STRUCT and TEMPDIR keywords W. Landsman
       V2.9 February 2004 Added internal MRD_FXPAR procedure for faster
                     processing of binary table headers E. Sheldon
       V2.9a March 2004 Restore ability to read empty binary table W. Landsman
             Swallow binary tables with more columns than given in TFIELDS
       V2.9b Fix to ensure order of TFORMn doesn't matter
       V2.9c Check if extra degenerate NAXISn keyword are present W.L. Oct 2004 
       V2.9d Propagate /SILENT to MRD_HREAD, more LONG64 casting W. L. Dec 2004
       V2.9e Add typarr[good] to fix a problem reading zero-length columns
             A.Csillaghy, csillag@ssl.berkeley.edu (RHESSI)
       V2.9f Fix problem with string variable binary tables, possible math 
             overflow on non-IEEE machines  WL Feb. 2005 
       V2.9g Fix problem when setting /USE_COLNUM   WL Feb. 2005
       V2.10 Use faster keywords to BYTEORDER  WL May 2006
       V2.11  Add ON_IOERROR, CATCH, and STATUS keyword to MRD_READ_IMAGE to
             trap EOF in compressed files DZ  Also fix handling of unsigned 
             images when BSCALE not present  K Chu/WL   June 2006 
       V2.12 Allow extension to be specified by name, added EXTNUM keyword
                     WL    December 2006
       V2.12a Convert ASCII table column to DOUBLE if single precision is
                 insufficient  
       V2.12b Fixed problem when both /fscale and /unsigned are set 
                  C. Markwardt    Aug 2007
       V2.13  Use SWAP_ENDIAN_INPLACE instead of IEEE_TO_HOST and IS_IEEE_BIG
                W. Landsman Nov 2007
       V2.13a One element vector allowed for file name W.L. Dec 2007
       V2.13b More informative error message when EOF found W.L. Jun 2008
       V2.14  Use vector form of VALID_NUM(), added OUTALIAS keyword
                                       W.L. Aug 2008
       V2.15  Use new FXPOSIT which uses on-the-fly byteswapping W.L. Mar 2009
       V2.15a Small efficiency updates to MRD_SCALE W.L. Apr 2009
       V2.15b Fixed typo introduced Apr 2009
       V2.15c Fix bug introduced Mar 2009  when file unit used W.L. July 2009
       V2.16  Handle FPACK compressed files    W. L. July 2009
       V2.17  Use compile_opt hidden on all routines except mrdfits.pro W.L. July 2009
       V2.18  Added /EMPTYSTRING keyword W. Landsman August 2009
       V2.18a Fix Columns keyword output, A. Kimball/ W. Landsman Feb 2010
       V2.18b Fix bug with /EMPTYSTRING and multidimensional strings
                             S. Baldridge/W.L. August 2010
       V2.18c Fix unsigned bug caused by compile_opt idl2 WL  Nov 2010
       V2.19  Use V6.0 operators WL Nov 2010
       V2.19a Fix complex data conversion in variable length tables WL Dec 2010 
       V2.19b Fix bug with /FSCALE introduced Nov 2010 WL Jan 2011
       V2.19c Fix bug with ROWS keyword introduced Nov 2010 WL Mar 2011
       V2.20  Convert Nulls in ASCII tables, better check of duplicate keywords
                                            WL May 2011
       V2.20a Better error checking for FPACK files  WL October 2012
       V2.20b Fix bug in MRD_SCALE introduced Nov 2010 (Sigh) WL Feb 2013
       V2.21  Create unique structure tags when FITS column names differ 
              only in having a different case   R. McMahon/WL   March 2013
       V2.22  Handle 64 bit variable length binary tables WL   April 2014
       V2.23  Use 64 bit for  very large files  WL  April 2014
       V2.24  Binary table is allowed to have zero columns  WL  September 2018
       V2.25  Use long64 for ASCII table integers longer than I12 WL   October 2020
       V2.26  Use '8000000000000000'xll long64 offset for GDL/FL compatibility WL Aug 2021
       V2.27  Allow different columns to have different datatypes for TSCALn and TZEROn 
              Use ULONG64() when necessary WL Sep 2021

(See external/astron/fits/mrdfits.pro)


MRD_HREAD

[Previous Routine] [Next Routine] [List of Routines]
 NAME: 
     MRD_HREAD

 PURPOSE: 
     Reads a FITS header from an opened disk file or Unix pipe
 EXPLANATION:
     Like FXHREAD but also works with compressed Unix files

 CALLING SEQUENCE: 
     MRD_HREAD, UNIT, HEADER  [, STATUS, /SILENT, ERRMSG =, /FIRSTBLOCK ]
 INPUTS: 
     UNIT    = Logical unit number of an open FITS file
 OUTPUTS: 
     HEADER  = String array containing the FITS header.
 OPT. OUTPUTS: 
     STATUS  = Condition code giving the status of the read.  Normally, this
                 is zero, but is set to -1 if an error occurs, or if the
                 first byte of the header is zero (ASCII null).
 OPTIONAL KEYWORD INPUT:
      /FIRSTBLOCK - If set, then only the first block (36 lines or less) of 
                the FITS header are read into the output variable.   If only
                size information (e.g. BITPIX, NAXIS) is needed from the
                header, then the use of this keyword can save time.  The 
                file pointer is still positioned at the end of the header,
                even if the /FIRSTBLOCK keyword is supplied.
      /SILENT - If set, then warning messages about any invalid characters in
                the header are suppressed.
      /SKIPDATA - If set, then the file point is positioned at the end of the
                HDU after the header is read, i.e. the following data block
                is skipped.   Useful, when one wants to the read the headers
                of multiple extensions.
      /NO_BADHEADER - if set, returns if FITS header has illegal characters
                By default, MRD_HREAD replaces bad characters with blanks,
                issues a warning, and continues.
 OPTIONAL OUTPUT PARAMETER:
       ERRMSG  = If this keyword is present, then any error messages will be
                 returned to the user in this parameter rather than
                 depending on the MESSAGE routine in IDL.  If no errors are
                 encountered, then a null string is returned.
 RESTRICTIONS: 
      The file must already be positioned at the start of the header.  It
      must be a proper FITS file.
 SIDE EFFECTS: 
       The file ends by being positioned at the end of the FITS header, unless
       an error occurs.
 REVISION HISTORY:
      Written,  Thomas McGlynn                     August 1995
      Modified, Thomas McGlynn		     January 1996
         Changed MRD_HREAD to handle Headers which have null characters
          A warning message is printed out but the program continues.
          Previously MRD_HREAD would fail if the null characters were
          not in the last 2880 byte block of the header.  Note that
          such characters are illegal in the header but frequently
          are produced by poor FITS writers.
      Added /SILENT keyword   W. Landsman   December 2000
      Added /FIRSTBLOCK keyword  W. Landsman   February 2003
      Added ERRMSG, SKIPDATA keyword W. Landsman          April 2009
      Close file unit even after error message   W.L.  October 2010
      Added /NO_BADHEADER  Zarro (ADNET), January 2012

(See external/astron/fits/mrd_hread.pro)


MWRFITS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       MWRFITS
 PURPOSE:
       Write all standard FITS data types from input arrays or structures.

 EXPLANATION:
       Must be used with a post-September 2009 version of FXADDPAR.

 CALLING SEQUENCE:
       MWRFITS, Input, Filename, [Header],
                       /LSCALE , /ISCALE, /BSCALE, 
                       /USE_COLNUM, /Silent, /Create, /No_comment, /Version, $
                       Alias=, /ASCII, Separator=, Terminator=, Null=,
                       /Logical_cols, /Bit_cols, /Nbit_cols, 
                       Group=, Pscale=, Pzero=, Status=

 INPUTS:
       Input = Array or structure to be written to FITS file.

               -When writing FITS primary data or image extensions
                input should be an array.
               --If data is to be grouped
                 the Group keyword should be specified to point to
                 a two dimensional array.  The first dimension of the
                 Group array will be PCOUNT while the second dimension
                 should be the same as the last dimension of Input.
               --If Input is undefined, then a dummy primary dataset
                 or Image extension is created [This might be done, e.g.,
                 to put appropriate keywords in a dummy primary
                 HDU].

               -When writing an ASCII table extension, Input should
                be a structure array where no element of the structure
                is a structure or array (except see below).
               --A byte array will *not* be written as A field.  This
                 limitation is because the byte array to string conversion
                 will not work with a FORMAT statement.   Please convert
                 byte arrays to strings before calling MWRFITS
               --Complex numbers are written to two columns with '_R' and
                 '_I' appended to the TTYPE fields (if present).  The
                 complex number is enclosed in square brackets in the output.
               --Strings are written to fields with the length adjusted
                 to accommodate the largest string.  Shorter strings are
                 blank padded to the right.

               -When writing a binary table extension, the input should
                be a structure array with no element of the structure
                being a substructure.

               If a structure is specified on input and the output
               file does not exist or the /CREATE keyword is specified
               a dummy primary HDU is created.

       Filename = String containing the name of the file to be written.
                By default MWRFITS appends a new extension to existing
                files which are assumed to be valid FITS.  The /CREATE
                keyword can be used to ensure that a new FITS file
                is created even if the file already exists.

 OUTPUTS:

 OPTIONAL INPUTS:
       Header = Header should be a string array.  Each element of the
                array is added as a row in the FITS  header.  No
                parsing is done of this data.  MWRFITS will prepend
                required structural (and, if specified, scaling)
                keywords before the rows specified in Header.
                Rows describing columns in the table will be appended
                to the contents of Header.
                Header lines will be extended or truncated to
                80 characters as necessary.
                If Header is specified then on return Header will have
                the header generated for the specified extension.

 OPTIONAL INPUT KEYWORDS:
       ALias=   Set up aliases to convert from the IDL structure
                to the FITS column name.  The value should be
                a STRARR(2,*) value where the first element of
                each pair of values corresponds to a column
                in the structure and the second is the name
                to be used in the FITS file.
                The order of the alias keyword is compatible with
                use in MRDFITS.
       ASCII  - Creates an ASCII table rather than a binary table.
                This keyword may be specified as:
                /ASCII - Use default formats for columns.
                ASCII='format_string' allows the user to specify
                  the format of various data types such using the following
                  syntax 'column_type:format, column_type:format'.  E.g.,
                ASCII='A:A1,I:I6,L:I10,B:I4,F:G15.9,D:G23.17,C:G15.9,M:G23.17'
                gives the default formats used for each type.  The TFORM
                fields for the real and complex types indicate will use corresponding
                E and D formats when a G format is specified.
                Note that the length of the field for ASCII strings and
                byte arrays is automatically determined for each column.
       BIT_COLS=   An array of indices of the bit columns.   The data should
                comprise a byte array with the appropriate dimensions.
                If the number of bits per row (see NBIT_COLS)
                is greater than 8, then the first dimension of the array 
                should match the number of input bytes per row.
       BSCALE   Scale floats, longs, or shorts to unsigned bytes (see LSCALE)
       /CREATE   If this keyword is non-zero, then a new FITS file will
                be created regardless of whether the file currently
                exists.  Otherwise when the file already exists,
                a FITS extension will be appended to the existing file
                which is assumed to be a valid FITS file.
       GROUP=   This keyword indicates that GROUPed FITS data is to
                be generated.
                Group should be a 2-D array of the appropriate output type.
                The first dimension will set the number of group parameters.
                The second dimension must agree with the last dimension
                of the Input array.
       ISCALE   Scale floats or longs to short integer (see LSCALE)
       LOGICAL_COLS=  An array of indices of the logical column numbers.
                These should start with the first column having index *1*.
                The structure element should either be an array of characters
                with the values 'T' or 'F', or an array of bytes having the 
                values byte('T')=84b, byte('F')=70b or 0b.     The use of bytes
                allows the specification of undefined values (0b).
       LSCALE   Scale floating point numbers to long integers.
                This keyword may be specified in three ways.
                /LSCALE (or LSCALE=1) asks for scaling to be automatically
                determined. LSCALE=value divides the input by value.
                I.e., BSCALE=value, BZERO=0.  Numbers out of range are 
                given the value of NULL if specified, otherwise they are given
                the appropriate extremum value.  LSCALE=(value,value)
                uses the first value as BSCALE and the second as BZERO
                (or TSCALE and TZERO for tables).
       NBIT_COLS=  The number of bits actually used in the bit array.
                This argument must point to an array of the same dimension
                as BIT_COLS.
       /NO_COPY = By default, MWRFITS makes a copy of the input variable
                before any modifications necessary to write it to a FITS
                file.    If you have a large array/structure, and don't 
                require it for subsequent processing, then /NO_COPY will
                save memory.
       NO_TYPES  If the NO_TYPES keyword is specified, then no TTYPE
                keywords will be created for ASCII and BINARY tables.
       No_comment Do not write comment keywords in the header
       NULL=    Value to be written for integers/strings which are
                undefined or unwritable.
       PSCALE=  An array giving scaling parameters for the group keywords.
                It should have the same dimension as the first dimension
                of Group.
       PZERO=   An array giving offset parameters for the group keywords.
                It should have the same dimension as the first dimension
                of Group.
       Separator= This keyword can be specified as a string which will
                be used to separate fields in ASCII tables.  By default
                fields are separated by a blank.
       /SILENT   Suppress informative messages.  Errors will still
                be reported.
       Terminator= This keyword can be specified to provide a string which
                will be placed at the end of each row of an ASCII table.
                No terminator is used when not specified.
                If a non-string terminator is specified (including
                when the /terminator form is used), a new line terminator
                is appended.
       USE_COLNUM  When creating column names for binary and ASCII tables
                MWRFITS attempts to use structure field name
                values.  If USE_COLNUM is specified and non-zero then
                column names will be generated as 'C1, C2, ... 'Cn'
                for the number of columns in the table.
       Version   Print the version number of MWRFITS.

 OPTIONAL OUTPUT KEYWORD:
       Status - 0 if FITS file is successfully written, -1 if there is a
                a problem (e.g. nonexistent directory, or no write permission)
 EXAMPLE:
       Write a simple array:
            a=fltarr(20,20)
            mwrfits,a,'test.fits'

       Append a 3 column, 2 row, binary table extension to file just created.
            a={name:'M31', coords:(30., 20.), distance:2}
            a=replicate(a, 2);
            mwrfits,a,'test.fits'

       Now append an image extension:
            a=lonarr(10,10,10)
            mkhdr,hdr,a,/image       ;Create minimal image extension FITS header
            sxaddhist,["This is a comment line to put in the header", $
                 "And another comment"],hdr,/comment
            mwrfits,a,'test.fits',hdr

 RESTRICTIONS:
       (1)     Variable length columns are not supported for anything
               other than simple types (byte, int, long, float, double).
       (2)     Empty strings are converted to 1 element blank strings (because
               IDL refuses to write an empty string (0b) from a structure)
 NOTES:
       This multiple format FITS writer is designed to provide a
       single, simple interface to writing all common types of FITS data.
       Given the number of options within the program and the
       variety of IDL systems available it is likely that a number
       of bugs are yet to be uncovered. 

 PROCEDURES USED:
       FXPAR(), FXADDPAR
 MODIfICATION HISTORY:
       Version 0.9: By T. McGlynn   1997-07-23
              Initial beta release.
       Dec 1, 1997, Lindler, Modified to work under VMS.
       Version 0.91: T. McGlynn  1998-03-09
               Fixed problem in handling null primary arrays.
       Version 0.92: T. McGlynn 1998-09-09
               Add no_comment flag and keep user comments on fields.
               Fix handling of bit fields.
       Version 0.93: T. McGlynn 1999-03-10
               Fix table appends on VMS.
       Version 0.93a  W. Landsman/D. Schlegel
               Update keyword values in chk_and_upd if data type has changed 
       Version 0.94: T. McGlynn 2000-02-02
               Efficient processing of ASCII tables.
               Use G rather than E formats as defaults for ASCII tables
                and make the default precision long enough that transformations
                binary to/from ASCII are invertible.
               Some loop indices made long.
               Fixed some ends to match block beginnings.
       Version 0.95: T. McGlynn 2000-11-06
               Several fixes to scaling.  Thanks to David Sahnow for
               documenting the problems.
               Added PCOUNT,GCOUNT keywords to Image extensions.
               Version numbers shown in SIMPLE/XTENSION comments
       Version 0.96: T. McGlynn 2001-04-06
               Changed how files are opened to handle ~ consistently
       Version 1.0: T. McGlynn 2001-12-04
               Unsigned integers,
               64 bit integers.
               Aliases
               Variable length arrays
               Some code cleanup
       Version 1.1: T. McGlynn 2002-2-18
               Fixed major bug in processing of unsigned integers.
               (Thanks to Stephane Beland)
       Version 1.2: Stephane Beland 2003-03-17
               Fixed problem in creating dummy dataset when passing undefined
               data, caused by an update to FXADDPAR routine.
       Version 1.2.1 Stephane Beland 2003-09-10
               Exit gracefully if write privileges unavailable
       Version 1.3 Wayne Landsman 2003-10-24
               Don't use EXECUTE() statement if on a virtual machine
       Version 1.3a Wayne Landsman 2004-5-21
               Fix for variable type arrays
       Version 1.4 Wayne Landsman 2004-07-16
               Use STRUCT_ASSIGN when modifying structure with pointer tags
       Version 1.4a Wayne Landsman 2005-01-03
               Fix writing of empty strings in binary tables 
       Version 1.4b Wayne Landsman 2006-02-23
               Propagate /SILENT keyword to mwr_tablehdr
       Version 1.5 Wayne Landsman  2006-05-24
               Open file using /SWAP_IF_LITTLE_ENDIAN keyword 
               Convert empty strings to 1 element blank strings before writing            
       Version 1.5a Wayne Landsman 2006-06-29
               Fix problem introduced 2006-05-24 with multidimensional strings
       Version 1.5b K. Tolbert 2006-06-29
               Make V1.5a fix work pre-V6.0
       Version 1.5c I.Evans/W.Landsman 2006-08-08
               Allow logical columns to be specified as bytes 
       Version 1,5d K. Tolbert 2006-08-11 
               Make V1.5a fix work for scalar empty string
       Version 1.6  W. Landsman  2006-09-22
               Assume since V5.5, remove VMS support
       Version 1.6a  W. Landsman  2006-09-22
               Don't right-justify strings 
       Version 1.7  W. Landsman  2009-01-12
               Added STATUS output keyword
       Version 1.7a W. Landsman 2009-04-10
               Since V6.4 strings are no longer limited to 1024
               elements 
       Version 1.8 Pierre Chanial 2009-06-23
               trim alias, implement logical TFORM 'L', don't
               add space after tform key.
       Version 1.9 W. Landsman 2009-07-20
               Suppress compilation messages of supporting routines
       Version 1.10 W. Landsman 2009-09-30
               Allow TTYPE values of 'T' and 'F', fix USE_COLNUM for bin tables
       Version 1.11 W. Landsman 2010-11-18
               Allow LONG64 number of bytes, use V6.0 notation 
       Version 1.11a W. Landsman 2012-08-12
               Better documentation, error checking for logical columns
       Version 1.11b M. Haffner/W.L. 2012-10-12
               Added /No_COPY keyword, fix problem with 32 bit overflow
       Version 1.12 W. Landsman  2014-04-23
       Version 1.12a W.Landsman/M. Fossati 2014-10-14
               Fix LONG overflow for very large files
       Version 1.12b I. Evans 2015-07-27
               Fix value check for byte('T'), byte('F'), or 0b for logical
               columns with null values
       Version 1.13 W. Landsman 2016-02-24
               Abort if a structure supplied with more than 999 tags 
       Version 1.13a W.Landsman  2019-06-03
               Don't pad ASCII tables with 2880 byte blocks, instead set to zero
       Version 1.14 W. Landsman  2019-7-24
               Document that MWRFITS can't handle byte arrays in ASCII tables correctly         

(See external/astron/fits/mwrfits.pro)


RDFITS_STRUCT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
      RDFITS_STRUCT
 PURPOSE:
      Read an entire FITS file (all extensions) into a single IDL structure. 
 EXPLANATION:
      Each header, image or table array is placed in a separate structure 
      tag.

 CALLING SEQUENCE:
      RDFITS_STRUCT, filename, struct, /SILENT, /HEADER_ONLY, EXTEN= ]

 INPUT:
      FILENAME = Scalar string giving the name of the FITS file.  
                 One can also specify a gzip (.gz) compressed file 

 OPTIONAL KEYWORD: 
      /HEADER_ONLY - If set, then only the FITS headers (and not the data)
                are read into the structure.
      /SILENT - Set this keyword to suppress informational displays at the
               terminal.
 OUTPUT:
      struct = structure into which FITS data is read.   The primary header
             and image are placed into tag names HDR0 and IM0.   The ith
             extension is placed into the tag names HDRi, and either TABi
             (if it is a binary or ASCII table) or IMi (if it is an image
             extension)

             If /HEADER_ONLY is set, then struct will contain tags HDR0, HDR1
             ....HDRn containing all the headers of a FITS file with n 
             extensions
 OPTIONAL INPUT KEYWORD:
       EXTEN - positive integer array specifying which extensions to read.
             Default is to read all extensions. 
 PROCEDURES USED:
       FITS_OPEN, FITS_READ, FITS_CLOSE

 METHOD:
       The file is opened with FITS_OPEN which return information on the 
       number and type of each extension.    The CREATE_STRUCT() function
       is used iteratively, with FITS_READ calls to build the final structure.

 EXAMPLE:
       Read the FITS file 'm33.fits' into an IDL structure, st

       IDL> rdfits_struct, 'm33.fits', st
       IDL> help, /str, st                   ;Display info about the structure

       To just read the second and fourth extensions 
       IDL> rdfits_struct, 'm33.fits', st, exten=[2,4]
 RESTRICTIONS:
       Does not handle random groups or variable length binary tables
 MODIFICATION HISTORY:
       Written K. Venkatakrishna, STX April 1992
       Code cleaned up a bit  W. Landsman  STX  October 92
       Modified for MacOS     I.  Freedman  HSTX April 1994
       Work under Windows 95  W. Landsman   HSTX  January 1996
       Use anonymous structures, skip extensions without data WBL April 1998
       Converted to IDL V5.0, W. Landsman, April 1998
       OS-independent deletion of temporary file  W. Landsman  Jan 1999
       Major rewrite to use FITS_OPEN and CREATE_STRUCT() W. Landsman Sep 2002
       Added /HEADER_ONLY keyword   W. Landsman  October 2003
       Do not copy primary header into extension headers W. Landsman Dec 2004
       Do not modify NAXIS when using /HEADER_ONLY W. Landsman Jan 2005
       Added EXTEN keyword  W. Landsman July 2009

(See external/astron/fits/rdfits_struct.pro)


READFITS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       READFITS
 PURPOSE:
       Read a FITS file into IDL data and header variables. 
 EXPLANATION:
       READFITS() can read FITS files compressed with gzip (.gz), Unix (.Z) 
       or BZip (.bz2) compression.  FPACK ( http://heasarc.gsfc.nasa.gov/fitsio/fpack/ )
       compressed FITS files can also be read provided that the FPACK software
       is installed.

       See http://idlastro.gsfc.nasa.gov/fitsio.html for other ways of
       reading FITS files with IDL.   

 CALLING SEQUENCE:
       Result = READFITS( Filename/Fileunit,[ Header, heap, /NOSCALE, EXTEN_NO=,
                     NSLICE=, /SILENT , STARTROW =, NUMROW = , HBUFFER=,
                     /CHECKSUM, /COMPRESS, /FPACK, /No_Unsigned ]

 INPUTS:
       Filename = Scalar string containing the name of the FITS file  
                 (including extension) to be read.   If the filename has
                  a *.gz extension, it will be treated as a gzip compressed
                  file.   If it has a .Z extension, it will be treated as a
                  Unix compressed file.     If Filename is an empty string then
                  the user will be queried for the file name.
                                   OR
       Fileunit - A scalar integer specifying the unit of an already opened
                  FITS file.  The unit will remain open after exiting 
                  READFITS().  There are two possible reasons for choosing 
                  to specify a unit number rather than a file name:
          (1) For a FITS file with many extensions, one can move to the 
              desired extensions with FXPOSIT() and then use READFITS().  This
              is more efficient than repeatedly starting at the beginning of 
              the file.
          (2) For reading a FITS file across a Web http: address after opening
              the unit with the SOCKET procedure 

 OUTPUTS:
       Result = FITS data array constructed from designated record.
                If the specified file was not found, then Result = -1

 OPTIONAL OUTPUT:
       Header = String array containing the header from the FITS file.

       heap = For extensions, the optional heap area following the main
              data array (e.g. for variable length binary extensions).

 OPTIONAL INPUT KEYWORDS:
       /CHECKSUM - If set, then READFITS() will call FITS_TEST_CHECKSUM to 
                verify the data integrity if CHECKSUM keywords are present
                in the FITS header.   Cannot be used with the NSLICE, NUMROW
                or STARTROW keywords, since verifying the checksum requires 
               that all the data be read.  See FITS_TEST_CHECKSUM() for more
               information.

       /COMPRESS - Signal that the file is gzip compressed.  By default, 
               READFITS will assume that if the file name extension ends in 
               '.gz' then the file is gzip compressed.   The /COMPRESS keyword
               is required only if the the gzip compressed file name does not 
               end in '.gz' or .ftz.   BZip compressed files must have a .bz2
               extension.
              
       EXTEN_NO - non-negative scalar integer specifying the FITS extension to
               read.  For example, specify EXTEN = 1 or /EXTEN to read the 
               first FITS extension.   

       /FPACK - Signal that the file is compressed with the FPACK software. 
               http://heasarc.gsfc.nasa.gov/fitsio/fpack/ ) By default, 
               (READFITS will assume that if the file name extension ends in 
               .fz that it is fpack compressed.     The FPACK software must
               be installed on the system 
   
        HBUFFER - Number of lines in the header, set this to slightly larger
                than the expected number of lines in the FITS header, to 
               improve performance when reading very large FITS headers. 
               Should be a multiple of 36 -- otherwise it will be modified
               to the next higher multiple of 36.   Default is 180

       /NOSCALE - If present and non-zero, then the ouput data will not be
                scaled using the optional BSCALE and BZERO keywords in the 
                FITS header.   Default is to scale.

       /NO_UNSIGNED - By default, if the header indicates an unsigned integer 
               (BITPIX = 16, BZERO=2^15, BSCALE=1) then READFITS() will output 
               an IDL unsigned integer data type (UINT).   But if /NO_UNSIGNED
               is set, then the data is converted to type LONG.  

       NSLICE - An integer scalar specifying which N-1 dimensional slice of a 
                N-dimensional array to read.   For example, if the primary 
                image of a file 'wfpc.fits' contains a 800 x 800 x 4 array, 
                then 

                 IDL> im = readfits('wfpc.fits',h, nslice=2)
                           is equivalent to 
                 IDL> im = readfits('wfpc.fits',h)
                 IDL> im = im[*,*,2]
                 but the use of the NSLICE keyword is much more efficient.
                 Note that any degenerate dimensions are ignored, so that the
                 above code would also work with a 800 x 800 x 4 x 1 array.

       NUMROW -  Scalar non-negative integer specifying the number of rows 
                 of the image or table extension to read.   Useful when one 
                 does not want to read the entire image or table.  

       POINT_LUN  -  Position (in bytes) in the FITS file at which to start
                 reading.   Useful if READFITS is called by another procedure
                 which needs to directly read a FITS extension.    Should 
                 always be a multiple of 2880, and not be used with EXTEN_NO
                 keyword.

       /SILENT - Normally, READFITS will display the size the array at the
                 terminal.  The SILENT keyword will suppress this

        STARTROW - Non-negative integer scalar specifying the row
               of the image or extension table at which to begin reading. 
               Useful when one does not want to read the entire table.  

       NaNVALUE - This keyword is included only for backwards compatibility
                  with routines that require IEEE "not a number" values to be
                  converted to a regular value.

       /UNIXPIPE - When a FileUnit is supplied to READFITS(), then /UNIXPIPE
                 indicates that the unit is to a Unix pipe, and that 
                 no automatic byte swapping is performed.

 EXAMPLE:
       Read a FITS file test.fits into an IDL image array, IM and FITS 
       header array, H.   Do not scale the data with BSCALE and BZERO.

              IDL> im = READFITS( 'test.fits', h, /NOSCALE)

       If the file contains a FITS extension, it could be read with

              IDL> tab = READFITS( 'test.fits', htab, /EXTEN )

       The function TBGET() can be used for further processing of a binary 
       table, and FTGET() for an ASCII table.
       To read only rows 100-149 of the FITS extension,

              IDL> tab = READFITS( 'test.fits', htab, /EXTEN, 
                                   STARTR=100, NUMR = 50 )

       To read in a file that has been compressed:

              IDL> tab = READFITS('test.fits.gz',h)

 ERROR HANDLING:
       If an error is encountered reading the FITS file, then 
               (1) the system variable !ERROR_STATE.CODE is set negative 
                   (via the MESSAGE facility)
               (2) the error message is displayed (unless /SILENT is set),
                   and the message is also stored in !ERROR_STATE.MSG
               (3) READFITS returns with a value of -1
 RESTRICTIONS:
       (1) Cannot handle random group FITS

 NOTES:
       (1) If data is stored as integer (BITPIX = 16 or 32), and BSCALE
       and/or BZERO keywords are present, then the output array is scaled to 
       floating point (unless /NOSCALE is present) using the values of BSCALE
       and BZERO.   In the header, the values of BSCALE and BZERO are then 
       reset to 1. and 0., while the original values are written into the 
       new keywords O_BSCALE and O_BZERO.     If the BLANK keyword was
       present (giving the value of undefined elements *prior* to the 
       application of BZERO and BSCALE) then the *keyword* value will be
       updated with the values of BZERO and BSCALE.
       
       (2) The use of the NSLICE keyword is incompatible with the NUMROW
       or STARTROW keywords.

       (3) On some Unix shells, one may get a "Broken pipe" message if reading
        a Unix compressed (.Z) file, and not reading to the end of the file 
       (i.e. the decompression has not gone to completion).     This is an 
        informative message only, and should not affect the output of READFITS.   
 PROCEDURES USED:
       Functions:   SXPAR()
       Procedures:  MRD_SKIP, SXADDPAR, SXDELPAR

 MODIFICATION HISTORY:
       Original Version written in 1988, W.B. Landsman   Raytheon STX
       Revision History prior to October 1998 removed          
       Major rewrite to eliminate recursive calls when reading extensions
                  W.B. Landsman  Raytheon STX                    October 1998
       Add /binary modifier needed for Windows  W. Landsman    April 1999
       Read unsigned datatypes, added /no_unsigned   W. Landsman December 1999
       Output BZERO = 0 for unsigned data types   W. Landsman   January 2000
       Update to V5.3 (see notes)  W. Landsman                  February 2000
       Fixed logic error in use of NSLICE keyword  W. Landsman  March 2000
       Fixed byte swapping for Unix compress files on little endian machines
                                    W. Landsman    April 2000
       Added COMPRESS keyword, catch IO errors W. Landsman September 2000
       Option to read a unit number rather than file name W.L    October 2001
       Fix undefined variable problem if unit number supplied W.L. August 2002
       Don't read entire header unless needed   W. Landsman  Jan. 2003
       Added HBUFFER keyword    W. Landsman   Feb. 2003
       Added CHECKSUM keyword   W. Landsman   May 2003
       Restored NaNVALUE keyword for backwards compatibility,
               William Thompson, 16-Aug-2004, GSFC
       Recognize .ftz extension as compressed  W. Landsman   September 2004
       Fix unsigned integer problem introduced Sep 2004 W. Landsman Feb 2005
       Don't modify header for unsigned integers, preserve double precision
           BSCALE value  W. Landsman March 2006
       Use gzip instead of compress for Unix compress files W.Landsman Sep 2006
       Call MRD_SKIP to skip bytes on different file types W. Landsman Oct 2006
       Make ndata 64bit for very large files E. Hivon/W. Landsman May 2007
       Fixed bug introduced March 2006 in applying Bzero C. Magri/W.L. Aug 2007
       Check possible 32bit overflow when using NSKIP W. Landsman Mar 2008
       Always reset BSCALE, BZERO even for unsigned integers W. Landsman May 2008
       Make ndata 64bit for very large extensions J. Schou/W. Landsman Jan 2009
       Use PRODUCT() to compute # of data points  W. Landsman  May 2009
       Read FPACK compressed file via UNIX pipe. W. Landsman May 2009
       Fix error using NUMROW,STARTROW with non-byte data, allow these 
           keywords to be used with primary array  W. Landsman July 2009
       Ignore degenerate trailing dimensions with NSLICE keyword W.L. Oct 2009
       Add DIALOG_PICKFILE() if filename is an empty string  W.L. Apr 2010
       Set BLANK values *before* applying BSCALE,BZERO, use short-circuit
           operators  W.L. May 2010
      Skip extra SPAWN with FPACK decompress J. Eastman, W.L. July 2010
      Fix possible problem when startrow=0 supplied J. Eastman/W.L. Aug 2010
      First header is not necessarily primary if unit supplied WL Jan 2011
      Fix test for 'SIMPLE' at beginning of header WL November 2012
      Fix problem passing extensions with > 2GB WL, M. Carlson August 2013
      Always read entire header, even if header variable not supplied W. Landsman May 2017
      Support BZip compression   W. Landsman Aug 2017
	Support unsigned long64 data W. Landsman Jan 2018 

(See external/astron/fits/readfits.pro)


SXADDHIST

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       SXADDHIST                           
 PURPOSE:
       Procedure to add HISTORY (or COMMENT) line(s) to a FITS header

 EXPLANATION:
       The advantage of using SXADDHIST instead of SXADDPAR is that with 
       SXADDHIST many HISTORY or COMMENT records can be added in a single call.

 CALLING SEQUENCE
       sxaddhist, history, header, [ /PDU, /COMMENT ]

 INPUTS:
        history - string or string array containing history or comment line(s)
               to add to the FITS header
 INPUT/OUTPUT
       header - FITS header (string array).   Upon output, it will contain the
               specified HISTORY records added to the end

 OPTIONAL KEYWORD INPUTS:
       /BLANK - If specified then blank ('       ') keywords will be written
              rather than 'HISTORY ' keywords.
       /COMMENT - If specified, then 'COMMENT ' keyword will be written rather
              than 'HISTORY ' keywords.    
              Note that according to the FITS definition, any number of 
              'COMMENT' and 'HISTORY' or blank keywords may appear in a header,
              whereas all other keywords may appear only once.   
       LOCATION=key - If present, the history will be added before this
              keyword.  Otherwise put it at the end.
       /PDU - if specified, the history will be added to the primary
              data unit header, (before the line beginning BEGIN EXTENSION...)               
              Otherwise, it will be added to the end of the header.
              This has meaning only for extension headers using the STScI
              inheritance convention. 
 OUTPUTS:
       header - updated FITS header

 EXAMPLES:
       sxaddhist, 'I DID THIS', header      ;Add one history record

       hist = strarr(3)
       hist[0] = 'history line number 1'
       hist[1[ = 'the next history line'
       hist[2] = 'the last history line'
       sxaddhist, hist, header              ;Add three history records

 SIDE EFFECTS:
       Header array is truncated to the final END statement
       LOCATION overrides PDU.
 HISTORY:
       D. Lindler  Feb. 87
       April 90  Converted to new idl  D. Lindler
       Put only a single space after HISTORY   W. Landsman  November 1992
       Aug. 95   Added PDU keyword parameters
       LOCATION added.  M. Greason, 28 September 2004.
       Missing minus sign (1 -> -1) in testing for WHERE output when 
        looking for location to insert a comment  M. Haffner Oct 2012

(See external/astron/fits/sxaddhist.pro)


SXADDPAR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       SXADDPAR
 PURPOSE:
       Add or modify a parameter in a FITS header array.

 CALLING SEQUENCE:
       SXADDPAR, Header, Name, Value, [ Comment,  Location, /SaveComment, 
                               BEFORE =, AFTER = , FORMAT= , /PDU
                               /SAVECOMMENT, Missing=, /Null
 INPUTS:
       Header = String array containing FITS 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 is equal to 'COMMENT'
               or 'HISTORY' or a blank string then the value will be added to 
               the record without replacement.  For these cases, 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 
               '', or /SAVECOMMENT is set, 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.  If not supplied then the default is
               'G19.12' for double precision, and 'G14.7' for floating point.
       /NULL   = If set, then keywords with values which are undefined, or
                 which have non-finite values (such as NaN, Not-a-Number) are
                 stored in the header without a value, such as

                       MYKEYWD =                      /My comment

       MISSING = A value which signals that data with this value should be
                 considered missing.  For example, the statement

                       FXADDPAR, HEADER, 'MYKEYWD', -999, MISSING=-999

                 would result in the valueless line described above for the
                 /NULL keyword.  Setting MISSING to a value implies /NULL.
                 Cannot be used with string or complex values.
       /PDU    = specifies keyword is to be added to the primary data unit
               header. If it already exists, it's current value is updated in
               the current position and it is not moved.
       /SAVECOMMENT = if set, then any existing comment is retained, i.e. the
               COMMENT parameter only has effect if the keyword did not 
               previously exist in the header.
 OUTPUTS:
       Header = updated FITS header array.

 EXAMPLE:
       Add a keyword 'TELESCOP' with the value 'KPNO-4m' and comment 'Name
       of Telescope' to an existing FITS header h.

       IDL> sxaddpar, h, 'TELESCOPE','KPNO-4m','Name of Telescope'
 NOTES:
       The functions SXADDPAR() and FXADDPAR() are nearly identical, with the
       major difference being that FXADDPAR forces required FITS keywords
       BITPIX, NAXISi, EXTEND, PCOUNT, GCOUNT to appear in the required order
       in the header, and FXADDPAR supports the OGIP LongString convention.   
       There is no particular reason for having two nearly identical 
       procedures, but both are too widely used to drop either one.

       All HISTORY records are inserted in order at the end of the header.

       All COMMENT records are also inserted in order at the end of the header
       header, but before the HISTORY records.  The BEFORE and AFTER keywords
       can override this.

       All records with no keyword (blank) are inserted in order at the end of
       the header, but before the COMMENT and HISTORY records.  The BEFORE and
       AFTER keywords can override this.

 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
       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
       Aug 95: added /PDU option and changed routine to update last occurrence
               of an existing keyword (the one SXPAR reads) instead of the
               first occurrence.
       Comment for string data can start after column 32 W. Landsman June 97
       Make sure closing quote supplied with string value  W. Landsman  June 98
       Increase precision of default formatting of double precision floating
               point values.   C. Gehman, JPL  September 1998
       Mar 2000, D. Lindler, Modified to use capital E instead of lower case
               e for exponential formats.
       Apr 2000, Make user-supplied format upper-case  W. Landsman 
       Oct 2001, Treat COMMENT or blank string like HISTORY keyword W. Landsman
       Jan 2002, Allow BEFORE, AFTER to apply to COMMENT keywords W. Landsman
       June 2003, Added SAVECOMMENT keyword    W. Landsman
       Jan 2004, If END is missing, then add it at the end W. Landsman
       May 2005 Fix SAVECOMMENT error with non-string values W. Landsman
       Oct 2005 Jan 2004 change made SXADDPAR fail for empty strings W.L.
       May 2011 Fix problem with slashes in string values W.L. 
       Aug 2013 Only use keyword_set for binary keywords W. L. 
       Sep 2015 Added NULL and MISSING keywords W.L.
       Sep 2016 Allow writing of byte or Boolean variables  W.L.
       Nov 2016 Allow value to be a 1 element scalar  W.L.
       Jun 2018 W. Thompson, for backward compatibility, save non-finite
                values (e.g. NaN) as strings if /NULL not set
       

(See external/astron/fits/sxaddpar.pro)


SXDELPAR

[Previous Routine] [Next Routine] [List of Routines]
 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 FITS header, If all lines are deleted from 
		the header, then h is returned with a value of 0

 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
	Test for case where all keywords are deleted    W. Landsman Aug 1995 
   Allow for headers with more than 32767 lines W. Landsman Jan. 2003
   Use ARRAY_EQUAL, cleaner syntax  W. L.  July 2009

(See external/astron/fits/sxdelpar.pro)


SXPAR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
      SXPAR
 PURPOSE:
      Obtain the value of a parameter in a FITS header

 CALLING SEQUENCE:
      result = SXPAR( Hdr, Name, [ Abort, COUNT=, COMMENT =, /NoCONTINUE, 
                                        DUP=,   /SILENT  ])   

 INPUTS:
      Hdr =  FITS header array, (e.g. as returned by 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 a positive (non-zero) 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.
               The default string is 'FITS Header' if abort is a integer or 
               single character.     If ABORT is not supplied, SXPAR will return
               quietly with COUNT = 0  if a keyword is not found.

 OPTIONAL INPUT KEYWORDS: 
       DUP =  When the FITS keyword exists more than once in a header, set 
                 DUP to a positive integer to specify which value is to be 
                 read.   For example, set DUP = 2 to read the value of the 
                 second appearance of a keyword in the header.    If DUP is not
                 supplied, then by default, SXPAR() reads the *last* appearance and
                 issues a warning.
       MISSING = By default, this routine returns 0 when keyword values are
                 not found.  This can be overridden by using the MISSING
                 keyword, e.g. MISSING=-1.
       /NAN    = If set, then return Not-a-Number (!values.f_nan) for missing
                 values.  Ignored if keyword MISSING is present.
       /NOCONTINUE = If set, then continuation lines will not be read, even
                 if present in the header
       /NULL   = If set, then return !NULL (undefined) for missing values.
                 Ignored if MISSING or /NAN is present, or if earlier than IDL
                 version 8.0.  If multiple values would be returned, then
                 MISSING= or /NAN should be used instead of /NULL, making sure
                 that the datatype is consistent with the non-missing values,
                 e.g. MISSING='' for strings, MISSING=-1 for integers, or
                 MISSING=-1.0 or /NAN for floating point.  /NAN should not be
                 used if the datatype would otherwise be integer.
       /SILENT - Set this keyword to suppress warning messages about duplicate
                 keywords in the FITS header.

 OPTIONAL OUTPUT KEYWORDS:
       COUNT - Optional keyword to return a value equal to the number of 
               parameters found by SXPAR, integer scalar

       COMMENT - Array of comments associated with the returned values
       IFOUND - Array of found keyword indicies when Name is of the form keyword*
              For example, one searches for 'TUNIT*' and the FITS header contains
              TUNIT1, TUNIT2, TUNIT4, and TUNIT6 then IFOUND woud be returned as
              [1,2,4,6].    Set to zero if Name is not of the form keyword*.

 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, 1b is
               returned for T, and 0b is returned for F.
               If Name was of form 'keyword*' then a vector of values
               are returned.

 SIDE EFFECTS:
       !ERR is set to -1 if parameter not found, 0 for a scalar
       value returned.  If a vector is returned !ERR is set to the
       number of keyword matches found.    The use of !ERR is deprecated, and
       instead the COUNT keyword is preferred

       If a keyword (except HISTORY or COMMENT) occurs more than once in a 
       header, and the DUP keyword is not supplied, then a warning is given, 
       and the *last* occurrence 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 has a decimal point, and contains more than 8 numerals, or 
       contains the character 'D', then it is returned as type DOUBLE.  Otherwise
       it is returned as type FLOAT.    Very large integer values, outside
       the range of valid LONG, are returned as LONG64.

       If the value is too long for one line, it may be continued on to the
       the next input card, using the CONTINUE convention.  For more info,
       see http://fits.gsfc.nasa.gov/registry/continue_keyword.html

       Complex numbers are recognized as two numbers separated by one or more
       space characters.

 NOTES:
       The functions SXPAR() and FXPAR() are nearly identical, although
       FXPAR() has slightly more sophisticated parsing, and additional keywords
       to specify positions in the header to search (for speed), and to force
       the output to a specified data type..   There is no
       particular reason for having two nearly identical functions, but
       both are too widely used to drop either one.

 PROCEDURES CALLED:
       cgErrorMsg(), GETTOK(), VALID_NUM()
 MODIFICATION HISTORY:
       DMS, May, 1983, STPAR 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.
       W. Landsman, November 1994, fix case where NAME is an empty string 
       W. Landsman, March 1995,  Added COMMENT keyword, ability to read
               values longer than 20 character
       W. Landsman, July 1995, Removed /NOZERO from MAKE_ARRAY call
       T. Beck May 1998, Return logical as type BYTE
       W. Landsman May 1998, Make sure integer values are within range of LONG
       W. Landsman Feb 1998, Recognize CONTINUE convention 
       W. Landsman Oct 1999, Recognize numbers such as 1E-10 as floating point
       W. Landsman Jan 2000, Only accept integer N values when name = keywordN
       W. Landsman Dec 2001, Optional /SILENT keyword to suppress warnings
       W. Landsman/D. Finkbeiner  Mar 2002  Make sure extracted vectors 
             of mixed data type are returned with the highest type.
       W.Landsman Aug 2008  Use vector form of VALID_NUM()
       W. Landsman Jul 2009  Eliminate internal recursive call
       W. Landsman Apr 2012  Require vector numbers be greater than 0
       W. Landsman Apr 2014  Don't convert Long64 numbers to double
       W. Landsman Nov 2014  Use cgErrorMsg rather than On_error,2
       W. Landsman Dec 2014  Return Logical as IDL Boolean in IDL 8.4 or later
       W. Landsman May 2015  Added IFound output keyword
       J. Slavin Aug 2015 Allow for 72 character par values (fixed from 71)
       W. Landsman Sep 2015  Added Missing, /NULL and /NaN keywords
       W. Landsman Oct 2017   Added DUP keyword,  Needed to support distortion
			table lookup parameters
       W. Landsman Jan 2018 Return ULONG64 integer if LONG64 will overflow
       W. Landsman/Y. Yang May 2018 MISSING keyword was always returning 0
       W. Landsman/M. Knight Aug 2018 Clean up use of Abort parameter

(See external/astron/fits/sxpar.pro)


WRITEFITS

[Previous Routine] [List of Routines]
 NAME:
       WRITEFITS
 PURPOSE:
       Write IDL array and header variables to a disk FITS file.    

 EXPLANATION:
       A minimal FITS header is created if not supplied.
       WRITEFITS works for all types of FITS files except random groups

 CALLING SEQUENCE:
       WRITEFITS, filename, data [, header, /APPEND, /COMPRESS, /CHECKSUM] 

 INPUTS:
       FILENAME = String containing the name of the file to be written.

       DATA = Image array to be written to FITS file.    If DATA is 
              undefined or a scalar, then only the FITS header (which
              must have NAXIS = 0) will be written to disk

 OPTIONAL INPUT:
       HEADER = String array containing the header for the FITS file.
                If variable HEADER is not given, the program will generate
                a minimal FITS header.
       HEAP -   A byte array giving the heap area following, e.g. a variable
                length binary table

 OPTIONAL INPUT KEYWORD:
       /APPEND - If this keyword is set then the supplied header and data
                array are assumed to be an extension and are appended onto
                the end of an existing FITS file.    If the file does not 
                exist, then WRITEFITS will create one with a minimal primary
                header (and /EXTEND keyword) and then append the supplied
                extension header and array.     Note that the primary
                header in an existing file must already have an EXTEND
                keyword to indicate the presence of an FITS extension.
       /COMPRESS - If this keyword is set, then the FITS file is written as
                a gzip compressed file.   An extension '.gz' is appended to
                to the file name if it does not already exist.   The /COMPRESS
                option is incompatible with the /APPEND option.
      /Checksum - If set, then the CHECKSUM keywords to monitor data integrity
                 will be included in the FITS header.    For more info, see
                 http://fits.gsfc.nasa.gov/registry/checksum.html
                 By default, checksum keywords will updated if they are already
                 in the FITS header.
       NaNvalue - Value in the data array which represents missing pixels.
		 This keyword should only used when missing pixels are not
		 represented by NaN values in the input array.
 OUTPUTS:
       None

 RESTRICTIONS:
       (1) It recommended that BSCALE and BZERO not be used (or set equal
           to 1. and 0) except with integer data
       (2) WRITEFITS will remove any group parameters from the FITS header
       (3) As of Feb 2008, WRITEFITS no longer requires the primary header of a
           FITS file with extensions to contain the EXTEND keyword, consistent 
           with Section 4.4.2.1 of the FITS 3.0 standard.    A warning is still 
           given.  See http://fits.gsfc.nasa.gov/fits_standard.html

 EXAMPLE:
       Write a randomn 50 x 50 array as a FITS file creating a minimal header.

       IDL> im = randomn(seed, 50, 50)        ;Create array
       IDL> writefits, 'test', im             ;Write to a FITS file "test"

 PROCEDURES USED:
       CHECK_FITS, FITS_ADD_CHECKSUM, MKHDR, MRD_HREAD, SXDELPAR, SXADDPAR, 
       SXPAR()

 MODIFICATION HISTORY:
       WRITTEN, Jim Wofford, January, 29 1989
       Added call to IS_IEEE_BIG()  W. Landsman  Apr 96
       Make sure SIMPLE is written in first line of header  W. Landsman Jun 97
       Use SYSTIME() instead of !STIME    W. Landsman  July 97
       Create a default image extension header if needed W. Landsman June 98
       Write unsigned data types W. Landsman       December 1999
       Update for IDL V5.3, add /COMPRESS keyword W. Landsman  February 2000
       Correct BZERO value for unsigned data  W. Landsman   July 2000
       Eliminate duplication of input array if possible W. Landsman April 2001
       Use FILE_SEARCH for V5.5 or later     W. Landsman    April 2002
       Create the file if not already present and /APPEND is set
                                             W. Landsman    September 2002
       Proper call to MRD_HREAD if /APPEND is set  W. Landsman December 2002 
       Added /CHECKSUM keyword              W. Landsman     December 2002
	    Restored NANvalue keyword, William Thompson,	     October 2003
       Write BZERO in beginning of header for unsigned integers WL April 2004
       Added ability to write heap array       WL             October 2004
       Correct checksum if writing heap array   WL           November 2004
       Assume since V5.5, no VMS support, use file_search() WL   September 2006
       Set nbytes variable to LONG64 for very large files WL  May 2007
       Update CHECKSUM keywords if already present  WL   Oct 2007
       EXTEND keyword no longer required in FITS files with extensions WL Feb 2008
       Bug fix when filename ends with '.gz' and COMPRESS is used,
            the output file must be compressed          S. Koposov June 2008
       Introduce V6.0 notation                W.L. Nov. 2010 
       Set /APPEND if XTENSION specifies a table   W.L.  July 2012
       Bug fix when /CHECKSUM used with unsigned data  W.L. June 2013
       June 2013 bug fix introduced problem when NAXIS=0  W.L. July 2013
       Added /Silent keyword W.L. April 2016
		Support unsigned 64 bit data type  W.L.  January 2018
       Fix case of header with no data and checksum  W.L.   August 2018

(See external/astron/fits/writefits.pro)