⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxhmodify.pro

📁 basic median filter simulation
💻 PRO
字号:
PRO FXHMODIFY, FILENAME, NAME, VALUE, COMMENT, BEFORE=BEFORE,   $               AFTER=AFTER, FORMAT=FORMAT, EXTENSION=EXTENSION, ERRMSG=ERRMSG,$               NOGROW=NOGROW;+; NAME: ;       FXHMODIFY; PURPOSE     : ;       Modify a FITS header in a file on disk.; Explanation : ;       Opens a FITS file, and adds or modifies a parameter in the FITS header.;       Can be used for either the main header, or for an extension header. ;       The modification is performed directly on the disk file.; Use         : ;       FXHMODIFY, FILENAME, NAME, VALUE, COMMENT; Inputs      : ;       FILENAME = String containing the name of the file to be read.;;       NAME    = Name of parameter, scalar string  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 either "COMMENT" or "HISTORY" then the value will be ;                 added to the record without replacement.  In this case the ;                 comment parameter is ignored.;;       VALUE   = Value for parameter.  The value expression must be of the;                 correct type, e.g. integer, floating or string.  String;                 values of 'T' or 'F' are considered logical values.;; Opt. Inputs : ;       COMMENT = String field.  The '/' is added by this routine.  Added;                 starting in position 31.  If not supplied, or set equal to '';                 (the null string), then any previous comment field in the;                 header for that keyword is retained (when found).; Outputs     : ;       None.; Opt. Outputs: ;       None.; Keywords    : ;       EXTENSION = Either the number of the FITS extension, starting with the;                   first extension after the primary data unit being one; or a;                   character string containing the value of EXTNAME to search;                   for.  If not passed, then the primary FITS header is;                   modified.           ;;       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.;       ERRMSG  = If defined and passed, 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.  In order to;                 use this feature, ERRMSG must be defined first, e.g.;;                       ERRMSG = '';                       FXHMODIFY, ERRMSG=ERRMSG, ...;                       IF ERRMSG NE '' THEN ...;; Calls       : ;       FXHREAD, FXPAR, FXADDPAR, BLKSHIFT; Restrictions: ;       This routine can not be used to modify any of the keywords that control;       the structure of the FITS file, e.g. BITPIX, NAXIS, PCOUNT, etc.  Doing;       so could corrupt the readability of the FITS file.; Example:;       Modify the name 'OJBECT' keyword in the primary FITS header of a FITS ;       file 'spec98.ccd' to contain the value 'test domeflat';;       IDL> fxhmodify, 'spec98.ccd', 'OBJECT', 'test domeflat';; Side effects: ;       If adding a record to the FITS header would increase the;       number of 2880 byte records stored on disk, then the file is;       enlarged before modification, unless the NOGROW keyword is passed.;  ; Category    : ;       Data Handling, I/O, FITS, Generic.; Prev. Hist. : ;       None.; Written     : ;       William Thompson, GSFC, 3 March 1994.; Modified    : ;       Version 1, William Thompson, GSFC, 3 March 1994.;       Version 2, William Thompson, GSFC, 31 May 1994;               Added ERRMSG keyword.;       Version 3, William Thompson, GSFC, 23 June 1994;               Modified so that ERRMSG is not touched if not defined.;      Version 3.1 Wayne Landsman GSFC   17 March 2006;               Fix problem in BLKSHIFT call if primary header  extended;       Version 3.2 W. Landsman 14 November 204 ;               Allow for need for 64bit number of bytes;; Version     :;       Version 3.2, 14 Nov 2007;-;        COMPILE_OPT IDL2        ON_ERROR, 2;;  Check the number of parameters.;        IF N_PARAMS() LT 3 THEN BEGIN                MESSAGE = $     ;Need at least 3 parameters                    'Syntax:  FXHMODIFY, FILENAME, NAME, VALUE [, COMMENT ]'                IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN                        ERRMSG = MESSAGE                        RETURN                END ELSE MESSAGE, MESSAGE        ENDIF;;  If passed, check the type of the EXTENSION parameter.;        IF N_ELEMENTS(EXTENSION) GT 1 THEN BEGIN                MESSAGE = 'EXTENSION must be a scalar'                IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN                        ERRMSG = MESSAGE                        RETURN                END ELSE MESSAGE, MESSAGE        END ELSE IF N_ELEMENTS(EXTENSION) EQ 1 THEN BEGIN                SZ = SIZE(EXTENSION)                ETYPE = SZ[SZ[0]+1]                IF ETYPE EQ 8 THEN BEGIN                        MESSAGE = 'EXTENSION must not be a structure'                        IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN                                ERRMSG = MESSAGE                                RETURN                        END ELSE MESSAGE, MESSAGE                ENDIF;;  If EXTENSION is of type string, then search for the proper extension by;  name.  Otherwise, search by number.;                IF ETYPE EQ 7 THEN BEGIN                        S_EXTENSION = STRTRIM(STRUPCASE(EXTENSION),2)                END ELSE BEGIN                        I_EXTENSION = FIX(EXTENSION)                        IF I_EXTENSION LT 1 THEN BEGIN                                MESSAGE = 'EXTENSION must be greater than zero'                                IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN                                        ERRMSG = MESSAGE                                        RETURN                                END ELSE MESSAGE, MESSAGE                        ENDIF                ENDELSE        ENDIF;;  Get the UNIT number, and open the file.;        OPENU, UNIT, FILENAME, /BLOCK, /GET_LUN;;  Read in the primary FITS header.;        FXHREAD,UNIT,HEADER,STATUS        IF STATUS NE 0 THEN BEGIN                FREE_LUN,UNIT                MESSAGE = 'Unable to read FITS header'                IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN                        ERRMSG = MESSAGE                        RETURN                END ELSE MESSAGE, MESSAGE        ENDIF        MHEAD0 = 0        I_EXT = 0;;  If the EXTENSION parameter was passed, then look for the requested;  extension.;        IF N_ELEMENTS(EXTENSION) EQ 1 THEN BEGIN;;  Make sure that the file does contain extensions.;                IF NOT FXPAR(HEADER,'EXTEND') THEN BEGIN                        FREE_LUN, UNIT                        MESSAGE = 'File ' + FILENAME +  $                                ' does not contain extensions'                        IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN                                ERRMSG = MESSAGE                                RETURN                        END ELSE MESSAGE, MESSAGE                ENDIF;;  Get the number of bytes taken up by the data.;NEXT_EXT:                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                        NDATA = DIMS[0]                        IF NAXIS GT 1 THEN FOR I=2,NAXIS DO     $                                NDATA = NDATA*DIMS[I-1]                ENDIF ELSE NDATA = 0                NBYTES = LONG64(ABS(BITPIX) / 8) * GCOUNT * (PCOUNT + NDATA);;  Read the next extension header in the file.;                NREC = (NBYTES + 2879) / 2880                POINT_LUN, -UNIT, POINTLUN              ;Current position                MHEAD0 = POINTLUN + NREC*2880L                POINT_LUN, UNIT, MHEAD0                 ;Next FITS extension                FXHREAD,UNIT,HEADER,STATUS                POINT_LUN, -UNIT, END_HEADER                IF STATUS NE 0 THEN BEGIN                        FREE_LUN,UNIT                        MESSAGE = 'Requested extension not found'                        IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN                                ERRMSG = MESSAGE                                RETURN                        END ELSE MESSAGE, MESSAGE                ENDIF                I_EXT = I_EXT + 1;;  Check to see if the current extension is the one desired.;                IF ETYPE EQ 7 THEN BEGIN                        EXTNAME = STRTRIM(STRUPCASE(FXPAR(HEADER,'EXTNAME')),2)                        IF EXTNAME EQ S_EXTENSION THEN GOTO, DONE                END ELSE IF I_EXT EQ I_EXTENSION THEN GOTO, DONE                GOTO, NEXT_EXTDONE:        ENDIF ELSE POINT_LUN, -UNIT, END_HEADER;;  Add or modify the keyword parameter in the header, keeping track of the;  initial size of the header array.;        IEND = WHERE(STRMID(HEADER,0,8) EQ 'END     ')        N_INITIAL = 1 + IEND[0]/36        IF N_PARAMS() EQ 4 THEN BEGIN                FXADDPAR, HEADER, NAME, VALUE , COMMENT, BEFORE=BEFORE, $                        AFTER=AFTER, FORMAT=FORMAT        END ELSE BEGIN                FXADDPAR, HEADER, NAME, VALUE, BEFORE=BEFORE, AFTER=AFTER, $                        FORMAT=FORMAT        ENDELSE;;  If the length of the header has changed, then print an error message.;        IEND = WHERE(STRMID(HEADER,0,8) EQ 'END     ')        N_FINAL = 1 + IEND[0]/36        IF N_FINAL NE N_INITIAL THEN BEGIN            IF KEYWORD_SET(NOGROW) THEN BEGIN                MESSAGE, /CONTINUE, 'Adding parameter would increase ' + $                        'header length, no action taken.'            ENDIF ELSE BEGIN                ;; Increase size of the file by inserting multiples of                ;; 2880 bytes at the end of the current header.  Then                ;; resume normal operations.                BLKSHIFT, UNIT, END_HEADER, (N_FINAL-N_INITIAL)*36L*80L                GOTO, WRITE_HEADER            ENDELSE;;  Otherwise, rewind to the beginning of the header, and write the new header;  over the old header.  Convert to byte and force into 80 character lines.;        ENDIF ELSE BEGIN            WRITE_HEADER:                BHDR = REPLICATE(32B, 80, 36*N_FINAL)                FOR N = 0,IEND[0] DO BHDR[0,N] = BYTE(STRMID(HEADER[N],0,80))                POINT_LUN, UNIT, MHEAD0                WRITEU, UNIT, BHDR        ENDELSE;;  Close the file and return.;        FREE_LUN, UNIT        IF N_ELEMENTS(ERRMSG) NE 0 THEN ERRMSG = ''        RETURN        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -