📄 fxaddpar.pro
字号:
; The "blank" record is placed immediately after the last previous "blank"; record, or immediately before the first comment or history record, unless; overridden by either the BEFORE or AFTER keywords.; END ELSE BEGIN I = FXPARPOS(KEYWRD,IEND,AFTER=AFTER,BEFORE=BEFORE) IF I EQ IEND THEN I = $ FXPARPOS(KEYWRD,IEND,AFTER='',BEFORE='COMMENT')<$ FXPARPOS(KEYWRD,IEND,AFTER='',BEFORE='HISTORY') HEADER[I+1] = HEADER[I:N-2] ;move rest up HEADER[I] = NEWLINE ;insert "blank" ENDELSE RETURN ENDIF ;history/comment/blank;; Find location to insert keyword. If the keyword is already in the header,; then simply replace it. If no new comment is passed, then retain the old; one.; IPOS = WHERE(KEYWRD EQ NN,NFOUND) IF NFOUND GT 0 THEN BEGIN I = IPOS[0] IF COMMENT EQ '' THEN BEGIN SLASH = STRPOS(HEADER[I],'/') QUOTE = STRPOS(HEADER[I],"'") IF (QUOTE GT 0) AND (QUOTE LT SLASH) THEN BEGIN QUOTE = STRPOS(HEADER[I],"'",QUOTE+1) IF QUOTE LT 0 THEN SLASH = -1 ELSE $ SLASH = STRPOS(HEADER[I],'/',QUOTE+1) ENDIF IF SLASH NE -1 THEN $ COMMENT = STRMID(HEADER[I],SLASH+1,80) ELSE $ COMMENT = STRING(REPLICATE(32B,80)) ENDIF GOTO, REPLACE ENDIF;; Start of section dealing with the positioning of required FITS keywords. If; the keyword is SIMPLE, then it must be at the beginning.; IF NN EQ 'SIMPLE ' THEN BEGIN I = 0 GOTO, INSERT ENDIF;; In conforming extensions, if the keyword is XTENSION, then it must be at the; beginning. ; IF NN EQ 'XTENSION' THEN BEGIN I = 0 GOTO, INSERT ENDIF;; If the keyword is BITPIX, then it must follow the either SIMPLE or XTENSION; keyword.; IF NN EQ 'BITPIX ' THEN BEGIN IF (KEYWRD[0] NE 'SIMPLE ') AND $ (KEYWRD[0] NE 'XTENSION') THEN BEGIN MESSAGE = 'Header must start with either SIMPLE or XTENSION' GOTO, HANDLE_ERROR ENDIF I = 1 GOTO, INSERT ENDIF;; If the keyword is NAXIS, then it must follow the BITPIX keyword.; IF NN EQ 'NAXIS ' THEN BEGIN IF KEYWRD[1] NE 'BITPIX ' THEN BEGIN MESSAGE = 'Required BITPIX keyword not found' GOTO, HANDLE_ERROR ENDIF I = 2 GOTO, INSERT ENDIF;; If the keyword is NAXIS1, then it must follow the NAXIS keyword.; IF NN EQ 'NAXIS1 ' THEN BEGIN IF KEYWRD[2] NE 'NAXIS ' THEN BEGIN MESSAGE = 'Required NAXIS keyword not found' GOTO, HANDLE_ERROR ENDIF I = 3 GOTO, INSERT ENDIF;; If the keyword is NAXIS<n>, then it must follow the NAXIS<n-1> keyword.; IF STRMID(NN,0,5) EQ 'NAXIS' THEN BEGIN NUM_AXIS = FIX(STRMID(NN,5,3)) PREV = STRING(REPLICATE(32B,8)) ;Format NAXIS<n-1> STRPUT,PREV,'NAXIS',0 ;Insert NAXIS STRPUT,PREV,STRTRIM(NUM_AXIS-1,2),5 ;Insert <n-1> IF KEYWRD[NUM_AXIS+1] NE PREV THEN BEGIN MESSAGE = 'Required '+PREV+' keyword not found' GOTO, HANDLE_ERROR ENDIF I = NUM_AXIS + 2 GOTO, INSERT ENDIF;; If the keyword is EXTEND, then it must follow the last NAXIS* keyword.; IF NN EQ 'EXTEND ' THEN BEGIN IF KEYWRD[2] NE 'NAXIS ' THEN BEGIN MESSAGE = 'Required NAXIS keyword not found' GOTO, HANDLE_ERROR ENDIF FOR I = 3, N-2 DO $ IF STRMID(KEYWRD[I],0,5) NE 'NAXIS' THEN GOTO, INSERT ENDIF ;; If the first keyword is XTENSION, and has the value of either 'TABLE' or; 'BINTABLE', then there are some additional required keywords.; IF KEYWRD[0] EQ 'XTENSION' THEN BEGIN XTEN = FXPAR(HEADER,'XTENSION') IF (XTEN EQ 'TABLE ') OR (XTEN EQ 'BINTABLE') THEN BEGIN;; If the keyword is PCOUNT, then it must follow the NAXIS2 keyword.; IF NN EQ 'PCOUNT ' THEN BEGIN IF KEYWRD[4] NE 'NAXIS2 ' THEN BEGIN MESSAGE = 'Required NAXIS2 keyword not found' GOTO, HANDLE_ERROR ENDIF I = 5 GOTO, INSERT ENDIF;; If the keyword is GCOUNT, then it must follow the PCOUNT keyword.; IF NN EQ 'GCOUNT ' THEN BEGIN IF KEYWRD[5] NE 'PCOUNT ' THEN BEGIN MESSAGE = 'Required PCOUNT keyword not found' GOTO, HANDLE_ERROR ENDIF I = 6 GOTO, INSERT ENDIF;; If the keyword is TFIELDS, then it must follow the GCOUNT keyword.; IF NN EQ 'TFIELDS ' THEN BEGIN IF KEYWRD[6] NE 'GCOUNT ' THEN BEGIN MESSAGE = 'Required GCOUNT keyword not found' GOTO, HANDLE_ERROR ENDIF I = 7 GOTO, INSERT ENDIF ENDIF ENDIF;; At this point the location has not been determined, so a new line is added; at the end of the FITS header, but before any blank, COMMENT, or HISTORY; keywords, unless overridden by the BEFORE or AFTER keywords.; I = FXPARPOS(KEYWRD,IEND,AFTER=AFTER,BEFORE=BEFORE) IF I EQ IEND THEN I = $ FXPARPOS(KEYWRD,IEND,AFTER=AFTER,BEFORE='') < $ FXPARPOS(KEYWRD,IEND,AFTER=AFTER,BEFORE='COMMENT') < $ FXPARPOS(KEYWRD,IEND,AFTER=AFTER,BEFORE='HISTORY');; A new line needs to be added. First check to see if the length of the; header array needs to be extended. Then insert a blank record at the proper; place.;INSERT: IF IEND EQ (N-1) THEN BEGIN HEADER = [HEADER,REPLICATE(BLANK,36)] N = N_ELEMENTS(HEADER) ENDIF HEADER[I+1] = HEADER[I:N-2] HEADER[I] = BLANK IEND = IEND + 1 ; CM 24 Sep 1997;; Now put value into keyword at line I.;REPLACE: H=BLANK ;80 blanks STRPUT,H,NN+'= ' ;insert name and =. APOST = "'" ;quote (apostrophe) character TYPE = SIZE(VALUE) ;get type of value parameter;; Store the value depending on the data type. If a character string, first; check to see if it is one of the logical values "T" (true) or "F" (false).; IF TYPE[1] EQ 7 THEN BEGIN ;which type? UPVAL = STRUPCASE(VALUE) ;force upper case. IF (UPVAL EQ 'T') OR (UPVAL EQ 'F') THEN BEGIN STRPUT,H,UPVAL,29 ;insert logical value.;; Otherwise, remove any tabs, and check for any apostrophes in the string.; END ELSE BEGIN VAL = DETABIFY(VALUE) NEXT_CHAR = 0 REPEAT BEGIN AP = STRPOS(VAL,"'",NEXT_CHAR) IF AP GE 66 THEN BEGIN VAL = STRMID(VAL,0,66) END ELSE IF AP GE 0 THEN BEGIN VAL = STRMID(VAL,0,AP+1) + APOST + $ STRMID(VAL,AP+1,80) NEXT_CHAR = AP + 2 ENDIF ENDREP UNTIL AP LT 0;; If a long string, then add the comment as soon as possible.;; CM 24 Sep 1997; Separate parameter if it needs to be CONTINUEd.; IF NOT KEYWORD_SET(NOCONTINUE) THEN $ FXADDPAR_CONTPAR, VAL, CVAL ELSE $ CVAL = STRMID(VAL,0,68) K = I + 1 ;; See how many CONTINUE lines there already are WHILE K LT IEND DO BEGIN IF STRMID(HEADER[K],0,8) NE 'CONTINUE' THEN $ GOTO, DONE_CHECK_CONT K = K + 1 ENDWHILE DONE_CHECK_CONT: NOLDCONT = K - I - 1 NNEWCONT = N_ELEMENTS(CVAL) - 1 ;; Insert new lines if needed IF NNEWCONT GT NOLDCONT THEN BEGIN INS = NNEWCONT - NOLDCONT WHILE IEND+INS GE N DO BEGIN HEADER = [HEADER, REPLICATE(BLANK,36)] N = N_ELEMENTS(HEADER) ENDWHILE ENDIF ;; Shift the old lines properly IF NNEWCONT NE NOLDCONT THEN $ HEADER[I+NNEWCONT+1] = HEADER[I+NOLDCONT+1:IEND] IEND = IEND + NNEWCONT - NOLDCONT ;; Blank out any lines at the end if needed IF NNEWCONT LT NOLDCONT THEN BEGIN DEL = NOLDCONT - NNEWCONT HEADER[IEND+1:IEND+DEL] = REPLICATE('', DEL) ENDIF IF STRLEN(CVAL[0]) GT 18 THEN BEGIN STRPUT,H,APOST+STRMID(CVAL[0],0,68)+APOST+ $ ' /'+COMMENT,10 HEADER[I]=H ; There might be a continuation of this string. CVAL would contain; more than one element if that is so. ;; Add new continuation lines IF N_ELEMENTS(CVAL) GT 1 THEN BEGIN HEADER[I+1] = CVAL[1:*] ;; Header state is now clean, so add ;; warning to header FXADDPAR_CONTWARN, HEADER, NAME ENDIF DONE_CONT: RETURN;; If a short string, then pad out to at least eight characters.; END ELSE BEGIN STRPUT,H,APOST+CVAL[0],10 STRPUT,H,APOST,11+(STRLEN(CVAL[0])>8) ENDELSE ENDELSE;; If complex, then format the real and imaginary parts, and add the comment; beginning in column 51.; END ELSE IF TYPE[1] EQ 6 THEN BEGIN IF N_ELEMENTS(FORMAT) EQ 1 THEN BEGIN ;use format keyword VR = STRING(FLOAT(VALUE), '('+STRUPCASE(FORMAT)+')') VI = STRING(IMAGINARY(VALUE),'('+STRUPCASE(FORMAT)+')') END ELSE BEGIN VR = STRTRIM(FLOAT(VALUE),2) VI = STRTRIM(IMAGINARY(VALUE),2) ENDELSE SR = STRLEN(VR) & STRPUT,H,VR,(30-SR)>10 SI = STRLEN(VI) & STRPUT,H,VI,(50-SI)>30 STRPUT,H,' /'+COMMENT,50 HEADER[I] = H RETURN;; If not complex or a string, then format according to either the FORMAT; keyword, or the default for that datatype.; END ELSE BEGIN IF (N_ELEMENTS(FORMAT) EQ 1) THEN $ ;use format keyword V = STRING(VALUE,'('+STRUPCASE(FORMAT)+')' ) ELSE BEGIN IF TYPE[1] EQ 5 THEN $ V = STRING(VALUE,FORMAT='(G19.12)') ELSE $ V = STRTRIM(strupcase(VALUE),2) ;default format ENDELSE S = STRLEN(V) ;right justify STRPUT,H,V,(30-S)>10 ;insert ENDELSE;; Add the comment, and store the completed line in the header.; STRPUT,H,' /',30 ;add ' /' STRPUT,H,COMMENT,32 ;add comment HEADER[I]=H ;save line; ERRMSG = '' RETURN;; Error handling point.;HANDLE_ERROR: IF ARG_PRESENT(ERRMSG) THEN ERRMSG = 'FXADDPAR: ' + MESSAGE $ ELSE MESSAGE, MESSAGE RETURN END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -