mrd_hread.pro
3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
pro mrd_hread, unit, header, status, SILENT = silent, FIRSTBLOCK = firstblock
;+
; NAME:
; MRD_HREAD
;
; PURPOSE:
; Reads a FITS header from an opened disk file or Unix pipe
; EXPLANATION:
; Like FXHREAD but also works with compressed Unix files
;
; CALLING SEQUENCE:
; MRD_HREAD, UNIT, HEADER [, STATUS, /SILENT ]
; INPUTS:
; UNIT = Logical unit number of an open FITS file
; OUTPUTS:
; HEADER = String array containing the FITS header.
; OPT. OUTPUTS:
; STATUS = Condition code giving the status of the read. Normally, this
; is zero, but is set to -1 if an error occurs, or if the
; first byte of the header is zero (ASCII null).
; OPTIONAL KEYWORD INPUT:
; /SILENT - If set, then warning messages about any invalid characters in
; the header are suppressed.
; /FIRSTBLOCK - If set, then only the first block (36 lines or less) of
; the FITS header are read into the output variable. If only
; size information (e.g. BITPIX, NAXIS) is needed from the
; header, then the use of this keyword can save time. The
; file pointer is still positioned at the end of the header,
; even if the /FIRSTBLOCK keyword is supplied.
; RESTRICTIONS:
; The file must already be positioned at the start of the header. It
; must be a proper FITS file.
; SIDE EFFECTS:
; The file ends by being positioned at the end of the FITS header, unless
; an error occurs.
; REVISION HISTORY:
; Written, Thomas McGlynn August 1995
; Modified, Thomas McGlynn January 1996
; Changed MRD_HREAD to handle Headers which have null characters
; A warning message is printed out but the program continues.
; Previously MRD_HREAD would fail if the null characters were
; not in the last 2880 byte block of the header. Note that
; such characters are illegal in the header but frequently
; are produced by poor FITS writers.
; Converted to IDL V5.0 W. Landsman September 1997
; Added /SILENT keyword W. Landsman December 2000
; Added /FIRSTBLOCK keyword W. Landsman February 2003
;-
block = string(replicate(32b, 80, 36))
w = [-1]
nblock = 0
while w[0] eq -1 do begin
; Shouldn't get eof in middle of header.
if eof(unit) then begin
free_lun, unit
status = -1
return
endif
on_ioerror, error_return
readu, unit, block
on_ioerror, null
; Check that there aren't improper null characters
; in strings that are causing them to be truncated.
; Issue a warning but continue if problems are found.
w = where(strlen(block) ne 80)
if (w[0] ne -1) then begin
if not keyword_set(SILENT) then message, /INF, $
'Warning-Invalid characters in header'
block[w] = string(replicate(32b, 80))
endif
w = where(strmid(block, 0, 8) eq 'END ')
if nblock EQ 0 then begin
if w[0] eq -1 then header = block $
else header = [block[0:w[0]]]
nblock = nblock + 1
endif else begin
if not keyword_set(firstblock) then begin
if w[0] eq -1 then header = [header, block] $
else header = [header, block[0:w[0]]]
endif
endelse
endwhile
status = 0
return
error_return:
status = -1
return
end