📄 fxmove.pro
字号:
FUNCTION FXMOVE, UNIT, EXTEN, SILENT = Silent, EXT_NO = ext_no, ERRMSG=errmsg;+; 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.;; 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;- DO_NAME = SIZE( EXTEN,/TNAME) EQ 'STRING' PRINT_ERROR = NOT ARG_PRESENT(ERRMSG) ERRMSG = '' IF DO_NAME THEN BEGIN FIRSTBLOCK = 0 EXT_NO = 9999 ENAME = STRTRIM( STRUPCASE(EXTEN), 2 ) ON_IOERROR, ALLOW_PLUN POINT_LUN, -UNIT, DUM ON_IOERROR, NULL ENDIF ELSE BEGIN FIRSTBLOCK = 1 EXT_NO = EXTEN ENDELSE FOR I = 1, EXT_NO DO BEGIN ;; Read the next header, and get the number of bytes taken up by the data.; IF EOF(UNIT) THEN BEGIN IF DO_NAME THEN ERRMSG = $ 'Extension name ' + ename + ' not found in FITS file' ELSE ERRMSG = $ 'EOF encountered while moving to specified extension' if PRINT_ERROR then message,errmsg RETURN, -1 ENDIF ; Can't use FXHREAD to read from pipe, since it uses ; POINT_LUN. So we read this in ourselves using mrd_hread MRD_HREAD, UNIT, HEADER, STATUS, SILENT = Silent, FIRSTBLOCK=FIRSTBLOCK IF STATUS LT 0 THEN RETURN, -1 ; Get parameters that determine size of data ; region. IF DO_NAME THEN IF I GT 1 THEN BEGIN EXTNAME = STRTRIM(SXPAR(HEADER,'EXTNAME',COUNT=N_name),2) if N_NAME GT 0 THEN $ IF ENAME EQ STRUPCASE(EXTNAME) THEN BEGIN EXT_NO= I-1 BLOCK = 1 + ((N_ELEMENTS(HEADER)-1)/36) POINT_LUN, -UNIT, CURR_POSS POINT_LUN, UNIT, CURR_POSS - BLOCK*2880 BREAK ENDIF ENDIF BITPIX = FXPAR(HEADER,'BITPIX') NAXIS = FXPAR(HEADER,'NAXIS') GCOUNT = FXPAR(HEADER,'GCOUNT') IF GCOUNT EQ 0 THEN GCOUNT = 1 PCOUNT = FXPAR(HEADER,'PCOUNT') IF NAXIS GT 0 THEN BEGIN DIMS = FXPAR(HEADER,'NAXIS*') ;Read dimensions IF !VERSION.RELEASE GE '6.1' THEN $ NDATA = PRODUCT(DIMS,/INTEGER) ELSE $ NDATA = LONG64( PRODUCT(DIMS) ) ENDIF ELSE NDATA = 0 NBYTES = LONG64(ABS(BITPIX) / 8) * GCOUNT * (PCOUNT + NDATA);; Move to the next extension header in the file.; NREC = (NBYTES + 2879) / 2880 MRD_SKIP, UNIT, NREC*2880L ENDFOR RETURN, 0ALLOW_PLUN: ERRMSG = $ 'Extension name cannot be specified unless POINT_LUN access is available' if PRINT_ERROR then message,errmsg RETURN, -1 END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -