FUNCTION FXPOSIT, XFILE, EXT_NO, readonly=readonly, COMPRESS=COMPRESS, $
SILENT = Silent
;+
; 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.
;
; CALLING SEQUENCE:
; unit=FXPOSIT(FILE, EXT_NO, /READONLY, COMPRESS=program, /SILENT)
;
; INPUT PARAMETERS:
; FILE = FITS file name, scalar string
; EXT_NO = Extension to be moved to, scalar nonnegative integer
;
; RETURNS:
; Unit number of file or -1 if an error is detected.
;
; OPTIONAL KEYWORD PARAMETER:
; /READONLY - If this keyword is set and non-zero, then OPENR rather
; than OPENU will be used to open the FITS file.
; 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.
; /SILENT If set, then suppress any messages about invalid characters
; in the FITS file.
;
; COMMON BLOCKS:
; None.
; SIDE EFFECTS:
; Opens and returns the descriptor of a file.
; PROCEDURE:
; Open the appropriate file, or spawn a command and intercept
; the output.
; Call FXMOVE to get to the appropriate extension.
; PROCEDURE CALLS:
; EXPAND_TILDE() (pre V5.5 Unix only), FXPAR(), FXMOVE(), REPSTR()
; 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
; W. Landsman 26-May-1997 Non-unix is not just VMS
; T. McGlynn 22-Apr-1999 Add /binary modifier needed for Windows
; 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
;-
;
ON_ERROR,2
compile_opt idl2 ;For pre-V5.5 compatibility
;
; Check the number of parameters.
;
IF N_PARAMS() LT 2 THEN BEGIN
PRINT,'SYNTAX: UNIT = FXPOSIT(FILE, EXT_NO, /Readonly, compress=prog)'
RETURN,-1
ENDIF
IF !VERSION.RELEASE GE '5.5' THEN $
FILE = FILE_SEARCH(XFILE, COUNT=COUNT) ELSE BEGIN
; Expand wildcards in name. Compensate that FINDFILE doesn't recognize
; the meaning of the Unix tilde.
IF !VERSION.OS_FAMILY EQ 'unix' THEN BEGIN
IF STRPOS(XFILE,'~') NE -1 THEN XFILE = EXPAND_TILDE(XFILE)
FILE = FINDFILE(REPSTR(XFILE," ","\ "), COUNT=COUNT)
ENDIF ELSE FILE = FINDFILE(XFILE, COUNT=COUNT)
ENDELSE
IF COUNT EQ 0 THEN BEGIN
RETURN, -1 ; Don't print anything out, just report an error
ENDIF
FILE = FILE[0]
;
; Check if this is a compressed file.
;
UNIT = -1
UCMPRS = ' '
IF KEYWORD_SET(compress) THEN BEGIN
IF strcompress(string(compress),/remo) eq '1' THEN BEGIN
compress = 'gunzip'
ENDIF
UCMPRS = compress;
ENDIF ELSE BEGIN
LEN = STRLEN(FILE)
IF LEN GT 3 THEN $
TAIL = STRLOWCASE(STRMID(FILE, LEN-3, 3)) $
ELSE TAIL = ' '
IF STRMID(TAIL,1,2) EQ '.z' THEN $
UCMPRS = 'uncompress' $
ELSE IF TAIL EQ '.gz' THEN $
UCMPRS = 'gunzip' $
ELSE IF TAIL EQ 'bz2' THEN $
UCMPRS = 'bunzip2'
ENDELSE
; Handle compressed files.
IF UCMPRS EQ 'gunzip' THEN BEGIN
IF KEYWORD_SET(READONLY) THEN BEGIN
OPENR, UNIT, FILE, /COMPRESS, /GET_LUN, /BLOCK, /BINARY, ERROR = ERROR
ENDIF ELSE BEGIN
OPENU, UNIT, FILE, /COMPRESS, /GET_LUN, /BLOCK, /BINARY, ERROR = ERROR
ENDELSE
ENDIF ELSE IF UCMPRS NE ' ' THEN BEGIN
IF (!VERSION.OS_FAMILY EQ 'unix') THEN BEGIN
SPAWN, [UCMPRS,'-c',FILE], UNIT=UNIT, /NOSHELL
ENDIF ELSE BEGIN
PRINT, 'MRDFITS: Only Unix IDL supports piped spawns'
PRINT, ' File must be uncompressed manually'
RETURN, -1
ENDELSE
ENDIF ELSE BEGIN
;
; Go to the start of the file.
;
IF KEYWORD_SET(READONLY) THEN BEGIN
OPENR, UNIT, FILE, /GET_LUN, /BLOCK, /BINARY, ERROR = ERROR
ENDIF ELSE BEGIN
OPENU, UNIT, FILE, /GET_LUN, /BLOCK, /BINARY, ERROR = ERROR
ENDELSE
IF ERROR NE 0 THEN BEGIN
PRINT,!ERROR_STATE.MSG
RETURN,-1
ENDIF
ENDELSE
IF EXT_NO LE 0 THEN RETURN, UNIT
STAT = FXMOVE(UNIT, EXT_NO, SILENT = Silent)
IF STAT LT 0 THEN BEGIN
FREE_LUN, UNIT
RETURN, STAT
ENDIF ELSE BEGIN
RETURN, UNIT
ENDELSE
END
Return to the shapelets web page or the code help menu.
| Last modified on 2nd Mar 2009 by Richard Massey. |