[AstroPy] Re: HIERARCH

Joe Harrington jh at oobleck.astro.cornell.edu
Wed Mar 30 15:36:45 EST 2005


>It will not be initially as the underlying PyFITS code does not support 
>HIERARCH yet.

It's not hard to support extracting the values of individual HIERARCH
keywords, and it's a very valuable thing to do since there are now a
lot of data that use them.  I just implemented it for IDL's sxpar
using regular expressions in a couple of hours.  I've included a
patch, just for illustrative purposes, so you can see how I cased it
in the regex.  The full routine is here if you care:
http://oobleck.astro.cornell.edu/pub/sxpar.pro

Getting the whole hierarchy in some reasonable structure is more of a
stunt, and less useful.  People care about the individual values.

--jh--

*** sxpar.pro   2005-03-30 15:22:39.436418953 -0500
--- /home/local/share/idlastro-6.0/pro/fits/sxpar.pro   2002-03-12 00:27:25.000000000 -0500
***************
*** 115,121 ****
  ;       W. Landsman Dec 2001, Optional /SILENT keyword to suppress warnings
  ;       W. Landsman/D. Finkbeiner  Mar 2002  Make sure extracted vectors
  ;             of mixed data type are returned with the highest type.
- ;     J. Harrington 30 Mar 2005 Extended to read individual HIERARCH keys.
  ;-
  ;----------------------------------------------------------------------
   if N_params() LT 2 then begin
--- 115,120 ----
***************
*** 151,164 ****
              vector = 1                  ;Flag for vector output
              name_length = strlen(nam)   ;Length of name
              num_length = 8 - name_length        ;Max length of number portion 
!
!             if num_length LE 0 and strmid(nam, 0, 8) NE 'HIERARCH' then  $
                    message, 'Keyword length must be 8 characters or less'

! ;  Otherwise, DO NOT extend NAME with blanks to eight characters.

      endif else begin
!                 ;while strlen(nam) LT 8 do nam = nam + ' ' ;Make 8 chars long
                  vector = 0
      endelse

--- 150,162 ----
              vector = 1                  ;Flag for vector output
              name_length = strlen(nam)   ;Length of name
              num_length = 8 - name_length        ;Max length of number portion 
!             if num_length LE 0 then  $
                    message, 'Keyword length must be 8 characters or less'

! ;  Otherwise, extend NAME with blanks to eight characters.

      endif else begin
!                 while strlen(nam) LT 8 do nam = nam + ' ' ;Make 8 chars long
                  vector = 0
      endelse

***************
*** 167,173 ****
  ;  a number.  Store the positions of the located keywords in NFOUND, and the
  ;  value of the number field in NUMBER.

!         histnam = (nam eq 'HISTORY') or (nam eq 'COMMENT') or (nam eq '')
          if N_elements(start) EQ 0 then start = -1l
          start = long(start[0])
          if (not vector) and (start GE 0) then begin
--- 165,171 ----
  ;  a number.  Store the positions of the located keywords in NFOUND, and the
  ;  value of the number field in NUMBER.

!         histnam = (nam eq 'HISTORY ') or (nam eq 'COMMENT ') or (nam eq '')
          if N_elements(start) EQ 0 then start = -1l
          start = long(start[0])
          if (not vector) and (start GE 0) then begin
***************
*** 176,194 ****
              nheader = N_elements(hdr)
              mn = (start - precheck)  > 0
              mx = (start + postcheck) < nheader-1
!             keyword = stregex(hdr[mn:mx], /extract, /subexpr, $
! '^(........)=|^(HIERARCH[^=]*)|^(COMMENT )|^(HISTORY )|(^        )|(^END     )')
!             keyword = keyword[1:*, *]
!             keyword = keyword[where(keyword ne '')]
          endif else begin
              restart:
              start   = -1l
!             keyword = stregex(hdr, /extract, /subexpr, $
! '^(........)=|^(HIERARCH[^=]*)|^(COMMENT )|^(HISTORY )|(^        )|(^END     )')
!             keyword = keyword[1:*, *]
!             keyword = keyword[where(keyword ne '')]
          endelse
-         keyword = strtrim(keyword)

          if vector then begin
              nfound = where(strpos(keyword,nam) GE 0, matches)
--- 174,185 ----
              nheader = N_elements(hdr)
              mn = (start - precheck)  > 0
              mx = (start + postcheck) < nheader-1
!             keyword = strmid(hdr[mn:mx], 0, 8)
          endif else begin
              restart:
              start   = -1l
!             keyword = strmid( hdr, 0, 8)
          endelse

          if vector then begin
              nfound = where(strpos(keyword,nam) GE 0, matches)
***************
*** 224,230 ****

   if matches GT 0 then begin
    line = hdr[nfound]
!   svalue = strtrim((stregex(line, '[^=]*=(.*)', /extract, /subexpr))[1, *], 2)    if histnam then $
          value = strtrim(strmid(line,8,71),2) else for i = 0,matches-1 do begin        if ( strmid(svalue[i],0,1) EQ "'" ) then begin   ;Is it a string?
--- 215,221 ----

   if matches GT 0 then begin
    line = hdr[nfound]
!   svalue = strtrim( strmid(line,9,71),2)
    if histnam then $
          value = strtrim(strmid(line,8,71),2) else for i = 0,matches-1 do begin        if ( strmid(svalue[i],0,1) EQ "'" ) then begin   ;Is it a string?




More information about the AstroPy mailing list