NAME:
fixsnap
PURPOSE:
Munge a SNAPSHOT format ``FITS'' header and make it legal FITS
DESCRIPTION:
This fixes a known epoch of SNAPSHOT headers to valid FITS. The keyword
list and what to do with them is hardcoded here. If you get no printed
messages to the screen, then the header was successfully processed.
CATEGORY:
CCD data processing
CALLING SEQUENCE:
fixsnap,badhdr,goodhdr
INPUTS:
badhdr - string array containing what should be a FITS header
OPTIONAL INPUT PARAMETERS:
KEYWORD INPUT PARAMETERS:
OUTPUTS:
goodhdr - Modified version of badhdr that fixes up the illegal stuff.
KEYWORD OUTPUT PARAMETERS:
COMMON BLOCKS:
SIDE EFFECTS:
RESTRICTIONS:
PROCEDURE:
MODIFICATION HISTORY:
96/07/02 - Written by Marc W. Buie, Lowell Observatory
ro fixsnap,in_badhdr,goodhdr
ro fixsnap,in_badhdr,goodhdr
if badpar(in_badhdr,7,1,CALLER='FIXSNAP: (badhdr) ') then return
if badpar(in_badhdr,7,1,CALLER='FIXSNAP: (badhdr) ') then return
badhdr = in_badhdr
badhdr = in_badhdr
if strmid(badhdr[0],0,8) ne 'SIMPLE ' then $
message,'Header does not start with SIMPLE'
message,'Header does not start with SIMPLE'
instrument = sxpar(badhdr,'INSTRUME')
if instrument ne 'SNAPSHOT' then $
message,'Instrument is not SNAPSHOT, header not processed'
message,'Instrument is not SNAPSHOT, header not processed'
badhdr=repchar(badhdr,'"',"'")
badhdr=repchar(badhdr,'= 36''','= 36"')
badhdr=repchar(badhdr,'= 72''','= 72"')
badhdr=repchar(badhdr,'= 72''','= 72"')
goodhdr = strarr(n_elements(badhdr))
fixed = intarr(n_elements(badhdr))
fixed = intarr(n_elements(badhdr))
blanks=' '
goodhdr[0]='SIMPLE = T / SNAPSHOT header converted by FIXSNAP(IDL)'
goodhdr[0]=strmid(goodhdr[0]+blanks,0,80)
fixed[0] = 1
fixed[0] = 1
type1=['BITPIX','NAXIS','NAXIS1','NAXIS2','NAXIS3','NUMSUBF','SUBFNUM', $
'BZERO','BSCALE','O_BSCALE','CRPIX1','CFINT1','CRPIX2','CFINT2', $
'DETAXIS1','DETAXIS2']
'DETAXIS1','DETAXIS2']
type2=['CTYPE','CCD','FILETYPE','FLTPVERS','VERSAUTH','BUNIT','CUNIT1', $
'CUNIT2','CUNIT3','CLABL3','STRTTIME','PARMTIME','OBSERVAT', $
'TELESCOP','INSTRUME','OBSERVER']
'TELESCOP','INSTRUME','OBSERVER']
type3=['VERSDATE','CLABL1','ORIGFILE','OPTICSL','OPTICSR','OBJECT', $
'ORIGIN','ZONE-OBS','DATE-OBS','CDSCR1','CLABL2','CDSCR2', $
'CDSCR3']
'CDSCR3']
type4=['SEQUENCE','SHUTTER','SETHEAT','NUMDOTS','NSHIFT','SFBIN', $
'CDELT2','CRVAL2','CDELT3','CRVAL3','CFINT3','TEMP','SETTEMP', $
'PFBIN','SEQ-PRGM','HEATER','FOCUSR','FOCUSL','FILTERR','FILTERL', $
'CDELT1','CRVAL1','AUTOGUID']
'CDELT1','CRVAL1','AUTOGUID']
type5=['OBJ-RA','OBJ-DEC','LAT-TEL','LAT-TYPE','LONG-TEL','LOGIN1', $
'COMP1','PTHNM1','PRGRM1','TIME1','DATE1','LICK']
'COMP1','PTHNM1','PRGRM1','TIME1','DATE1','LICK']
type6=['CRPIX3','ALT-TEL','TAPENUM']
type6=['CRPIX3','ALT-TEL','TAPENUM']
type7=['COMMENT','REMARK']
type7=['COMMENT','REMARK']
blanks=' '
blanks=' '
for i=1,n_elements(badhdr)-1 do begin
key = strtrim(strmid(badhdr[i],0,8),2)
if key eq '' then begin
goodhdr[i]=strmid(blanks,0,80)
fixed[i]=1
endif else if key eq 'END' then begin
goodhdr[i]=strmid('END'+blanks,0,80)
fixed[i]=1
endif else begin
endif else begin
; Look for TYPE1 keywords, numeric values that are left justified.
; To fix this type, look for the / character. Look backward to
; the first non-blank character. Save that character back to the
; next blank, this is the value. Output this value right justified
; in column 30
keyloc = where(key eq type1)
if keyloc[0] ne -1 then begin
slashpos = rstrpos(badhdr[i],'/')
tag = strtrim(strmid(badhdr[i],slashpos,49),2)
value = strtrim(strmid(badhdr[i],9,slashpos-9),2)
goodhdr[i]=string(strmid(key+' ',0,8),value,tag, $
format='(a,"=",a21,1x,a)')
fixed[i]=1
endif
endif
; Look for TYPE2 keywords. These are actually string values that
; have no ' delimiters. These must be added and left in the
; header left justified.
keyloc = where(key eq type2)
if keyloc[0] ne -1 then begin
slashpos = rstrpos(badhdr[i],'/')
tag = strtrim(strmid(badhdr[i],slashpos,49),2)
value = strtrim(strmid(badhdr[i],9,slashpos-9),2)
if strlen(value) lt 8 then value=strmid(value+blanks,0,8)
goodhdr[i]=string(strmid(key+blanks,0,8), $
strmid("'"+value+"'"+blanks,0,20),tag, $
format='(a,"=",a21,1x,a)')
fixed[i]=1
endif
endif
; Look for TYPE3 keywords. These are string values that are quote
; delimited but may not be long enough and the tag needs to be
; repositioned with possible truncation.
keyloc = where(key eq type3)
if keyloc[0] ne -1 then begin
slashpos = rstrpos(badhdr[i],'/')
tag = strtrim(strmid(badhdr[i],slashpos,49),2)
value = strtrim(strmid(badhdr[i],9,slashpos-9),2)
value = strtrim(strmid(value,1,strlen(value)-2),2)
if strlen(value) lt 8 then value=strmid(value+blanks,0,8)
if strlen(value) lt 18 then $
goodhdr[i]=string(strmid(key+blanks,0,8), $
strmid("'"+value+"'"+blanks,0,20),tag, $
format='(a,"=",a21,1x,a)') $
else $
goodhdr[i]=string(strmid(key+blanks,0,8), $
" '"+value+"'",strmid(tag,0,49-strlen(value)+21), $
format='(a,"=",a,1x,a)')
format='(a,"=",a,1x,a)')
fixed[i]=1
endif
endif
; Look for TYPE4 keywords. These are string values that are quote
; delimited but are really numeric values. The tag needs to be
; repositioned with possible truncation.
keyloc = where(key eq type4)
if keyloc[0] ne -1 then begin
slashpos = rstrpos(badhdr[i],'/')
tag = strtrim(strmid(badhdr[i],slashpos,49),2)
value = strtrim(strmid(badhdr[i],9,slashpos-9),2)
value = strtrim(strmid(value,1,strlen(value)-2),2)
goodhdr[i]=string(strmid(key+' ',0,8),value,tag, $
format='(a,"=",a21,1x,a)')
format='(a,"=",a21,1x,a)')
fixed[i]=1
endif
endif
; Look for TYPE5 keywords. These are values that might be strings
; but have no value. Add an empty string and repositioned the tag.
keyloc = where(key eq type5)
if keyloc[0] ne -1 then begin
slashpos = rstrpos(badhdr[i],'/')
tag = strtrim(strmid(badhdr[i],slashpos,49),2)
value = ' '
goodhdr[i]=string(strmid(key+' ',0,8), $
strmid("'"+value+"'"+blanks,0,20),tag, $
format='(a,"=",a21,1x,a)')
format='(a,"=",a21,1x,a)')
fixed[i]=1
endif
endif
; Look for TYPE6 keywords, might be numeric values but are left
; empty. Set to 0 and modify tag.
keyloc = where(key eq type6)
if keyloc[0] ne -1 then begin
slashpos = rstrpos(badhdr[i],'/')
tag = strtrim(strmid(badhdr[i],slashpos,49),2)
value = '0'
goodhdr[i]=string(strmid(key+' ',0,8),value,tag, $
format='(a,"=",a21,1x,a)')
fixed[i]=1
endif
endif
; Look for TYPE7 keywords, no chnage.
keyloc = where(key eq type7)
if keyloc[0] ne -1 then begin
goodhdr[i]=badhdr[i]
fixed[i]=1
endif
endif
if not fixed[i] then begin
goodhdr[i]='HISTORY bad header line, keyword '+key
print,'bad ',strtrim(badhdr[i],2)
endif else begin
if strlen(goodhdr[i]) gt 80 then $
print,'Long line! key=',key,' length=',strlen(goodhdr[i]) $
else $
goodhdr[i]=strmid(goodhdr[i]+blanks,0,80)
endelse
endelse
endfor
endfor
if n_elements(badhdr) ne fix(total(fixed)) then $
print,'Header length ',n_elements(badhdr),' ', $
n_elements(badhdr)-fix(total(fixed)),' not fixed'
n_elements(badhdr)-fix(total(fixed)),' not fixed'
nd