📄 fxaddpar.pro
字号:
;+; NAME: ; FXADDPAR; Purpose : ; Add or modify a parameter in a FITS header array.; Explanation : ; This version of FXADDPAR will write string values longer than 68 ; characters using the FITS continuation convention described at ; http://heasarc.gsfc.nasa.gov/docs/heasarc/ofwg/docs/ofwg_recomm/r13.html; Use : ; FXADDPAR, HEADER, NAME, VALUE, COMMENT; Inputs : ; HEADER = String array containing FITS header. The maximum string; length must be equal to 80. If not defined, then FXADDPAR; 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; 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. If the value is a string and is "long"; (more than 69 characters), then it may be continued; over more than one line using the OGIP CONTINUE; standard.;; 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 : ; HEADER = Updated header array.; Opt. Outputs: ; None.; Keywords : ; 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 IDL; default formatting is used, except that double precision is; given a format of G19.12.;; /NOCONTINUE = By default, FXADDPAR will break strings longer than 68 ; characters into multiple lines using the continuation; convention. If this keyword is set, then the line will; instead be truncated to 68 characters. This was the default; behaviour of FXADDPAR prior to December 1999. ;; 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, e.g.;; ERRMSG = ''; FXADDPAR, ERRMSG=ERRMSG, ...; IF ERRMSG NE '' THEN ...;; Calls : ; DETABIFY(), FXPAR(), FXPARPOS(); Common : ; None.; Restrictions: ; Warning -- Parameters and names are not checked against valid FITS; parameter names, values and types.;; The required FITS keywords SIMPLE (or XTENSION), BITPIX, NAXIS, NAXIS1,; NAXIS2, etc., must be entered in order. The actual values of these; keywords are not checked for legality and consistency, however.;; Side effects: ; 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, 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.;; All other records are inserted before any of the HISTORY, COMMENT, or; "blank" records. The BEFORE and AFTER keywords can override this.;; String values longer than 68 characters will be split into multiple; lines using the OGIP CONTINUE convention, unless the /NOCONTINUE keyword; is set. For a description of the CONTINUE convention see ; http://heasarc.gsfc.nasa.gov/docs/heasarc/ofwg/docs/ofwg_recomm/r13.htm; Category : ; Data Handling, I/O, FITS, Generic.; Prev. Hist. : ; William Thompson, Jan 1992, from SXADDPAR by D. Lindler and J. Isensee.; Differences include:;; * LOCATION parameter replaced with keywords BEFORE and AFTER.; * Support for COMMENT and "blank" FITS keywords.; * Better support for standard FITS formatting of string and; complex values.; * Built-in knowledge of the proper position of required; keywords in FITS (although not necessarily SDAS/Geis) primary; headers, and in TABLE and BINTABLE extension headers.;; William Thompson, May 1992, fixed bug when extending length of header,; and new record is COMMENT, HISTORY, or blank.; Written : ; William Thompson, GSFC, January 1992.; Modified : ; Version 1, William Thompson, GSFC, 12 April 1993.; Incorporated into CDS library.; Version 2, William Thompson, GSFC, 5 September 1997; Fixed bug replacing strings that contain "/" character--it; interpreted the following characters as a comment.; Version 3, Craig Markwardt, GSFC, December 1997; Allow long values to extend over multiple lines; Version 4, D. Lindler, March 2000, modified to use capital E instead; of a lower case e for exponential format.; Version 4.1 W. Landsman April 2000, make user-supplied format uppercase; Version 4.2 W. Landsman July 2002, positioning of EXTEND keyword; Version 5, 23-April-2007, William Thompson, GSFC; Version 6, 02-Aug-2007, WTT, bug fix for OGIP long lines; Version 6.1, 10-Feb-2009, W. Landsman, increase default format precision; Version : ; Version 5, 10-Feb-2009;-;; This is a utility routine, which splits a parameter into several; continuation bits.PRO FXADDPAR_CONTPAR, VALUE, CONTINUED APOST = "'" BLANK = STRING(REPLICATE(32B,80)) ;BLANK line ;; The value may not need to be CONTINUEd. If it does, then split ;; out the first value now. The first value does not have a ;; CONTINUE keyword, because it will be grafted onto the proper ;; keyword in the calling routine. IF (STRLEN(VALUE) GT 68) THEN BEGIN CONTINUED = [ STRMID(VALUE, 0, 67)+'&' ] VALUE = STRMID(VALUE, 67, STRLEN(VALUE)-67) ENDIF ELSE BEGIN CONTINUED = [ VALUE ] RETURN ENDELSE ;; Split out the remaining values. WHILE( STRLEN(VALUE) GT 0 ) DO BEGIN H = BLANK ;; Add CONTINUE keyword STRPUT, H, 'CONTINUE '+APOST ;; Add the next split IF(STRLEN(VALUE) GT 68) THEN BEGIN STRPUT, H, STRMID(VALUE, 0, 67)+'&'+APOST, 11 VALUE = STRMID(VALUE, 67, STRLEN(VALUE)-67) ENDIF ELSE BEGIN STRPUT, H, VALUE+APOST, 11 VALUE = '' ENDELSE CONTINUED = [ CONTINUED, H ] ENDWHILE RETURNEND; Utility routine to add a warning to the file. The calling routine; must ensure that the header is in a consistent state before calling; FXADDPAR_CONTWARN because the header will be subsequently modified; by calls to FXADDPAR.PRO FXADDPAR_CONTWARN, HEADER, NAME; By OGIP convention, the keyword LONGSTRN is added to the header as; well. It should appear before the first occurrence of a long; string encoded with the CONTINUE convention. CONTKEY = FXPAR(HEADER, 'LONGSTRN', COUNT = N_LONGSTRN); Calling FXADDPAR here is okay since the state of the header is; clean now. IF N_LONGSTRN GT 0 THEN $ RETURN FXADDPAR, HEADER, 'LONGSTRN', 'OGIP 1.0', $ ' The OGIP long string convention may be used.', $ BEFORE=NAME FXADDPAR, HEADER, 'COMMENT', $ ' This FITS file may contain long string keyword values that are', $ BEFORE=NAME FXADDPAR, HEADER, 'COMMENT', $ " continued over multiple keywords. This convention uses the '&'", $ BEFORE=NAME FXADDPAR, HEADER, 'COMMENT', $ ' character at the end of a string which is then continued', $ BEFORE=NAME FXADDPAR, HEADER, 'COMMENT', $ " on subsequent keywords whose name = 'CONTINUE'.", $ BEFORE=NAME RETURNENDPRO FXADDPAR, HEADER, NAME, VALUE, COMMENT, BEFORE=BEFORE, $ AFTER=AFTER, FORMAT=FORMAT, NOCONTINUE = NOCONTINUE, $ ERRMSG=ERRMSG ON_ERROR,2 ;Return to caller;; Check the number of parameters.; IF N_PARAMS() LT 3 THEN BEGIN MESSAGE = 'Syntax: FXADDPAR, HEADER, NAME, VALUE [, COMMENT ]' GOTO, HANDLE_ERROR ENDIF;; Define a blank line and the END line; ENDLINE = 'END' + STRING(REPLICATE(32B,77)) ;END line BLANK = STRING(REPLICATE(32B,80)) ;BLANK line;; If no comment was passed, then use a null string.; IF N_PARAMS() LT 4 THEN COMMENT = '';; Check the HEADER array.; N = N_ELEMENTS(HEADER) ;# of lines in FITS header IF N EQ 0 THEN BEGIN ;header defined? HEADER=STRARR(36) ;no, make it. HEADER[0]=ENDLINE N=36 ENDIF ELSE BEGIN S = SIZE(HEADER) ;check for string type IF (S[0] NE 1) OR (S[2] NE 7) THEN BEGIN MESSAGE = 'FITS Header (first parameter) must be a ' + $ 'string array' GOTO, HANDLE_ERROR ENDIF ENDELSE;; Make sure NAME is 8 characters long; NN = STRING(REPLICATE(32B,8)) ;8 char name STRPUT,NN,STRUPCASE(NAME) ;Insert name;; Check VALUE.; S = SIZE(VALUE) ;get type of value parameter STYPE = S[S[0]+1] IF S[0] NE 0 THEN BEGIN MESSAGE = 'Keyword Value (third parameter) must be scalar' GOTO, HANDLE_ERROR END ELSE IF STYPE EQ 0 THEN BEGIN MESSAGE = 'Keyword Value (third parameter) is not defined' GOTO, HANDLE_ERROR END ELSE IF STYPE EQ 8 THEN BEGIN MESSAGE = 'Keyword Value (third parameter) cannot be structure' GOTO, HANDLE_ERROR ENDIF;; Extract first 8 characters of each line of header, and locate END line; KEYWRD = STRMID(HEADER,0,8) ;Header keywords IEND = WHERE(KEYWRD EQ 'END ',NFOUND);; If no END, then add it. Either put it after the last non-null string, or; append it to the end.; IF NFOUND EQ 0 THEN BEGIN II = WHERE(STRTRIM(HEADER) NE '',NFOUND) II = MAX(II) + 1 IF (NFOUND EQ 0) OR (II EQ N_ELEMENTS(HEADER)) THEN $ HEADER = [HEADER,ENDLINE] ELSE HEADER[II] = ENDLINE KEYWRD = STRMID(HEADER,0,8) IEND = WHERE(KEYWRD EQ 'END ',NFOUND) ENDIF; IEND = IEND[0] > 0 ;Make scalar;; History, comment and "blank" records are treated differently from the; others. They are simply added to the header array whether there are any; already there or not.; IF (NN EQ 'COMMENT ') OR (NN EQ 'HISTORY ') OR $ (NN EQ ' ') THEN BEGIN;; If the header array needs to grow, then expand it in increments of 36 lines.; IF IEND GE (N-1) THEN BEGIN HEADER = [HEADER,REPLICATE(BLANK,36)] N = N_ELEMENTS(HEADER) ENDIF;; Format the record.; NEWLINE = BLANK STRPUT,NEWLINE,NN+STRING(VALUE),0;; If a history record, then append to the record just before the end.; IF NN EQ 'HISTORY ' THEN BEGIN HEADER[IEND] = NEWLINE ;add history rec. HEADER[IEND+1]=ENDLINE ;move end up;; The comment record is placed immediately after the last previous comment; record, or immediately before the first history record, unless overridden by; either the BEFORE or AFTER keywords.; END ELSE IF NN EQ 'COMMENT ' THEN BEGIN I = FXPARPOS(KEYWRD,IEND,AFTER=AFTER,BEFORE=BEFORE) IF I EQ IEND THEN I = $ FXPARPOS(KEYWRD,IEND,AFTER='COMMENT',$ BEFORE='HISTORY') HEADER[I+1] = HEADER[I:N-2] ;move rest up HEADER[I] = NEWLINE ;insert comment;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -