FUNCTION air_read, name, HEADER=t, DATATYPE=datatype, $ FORCE_SWAP=force, UPPER=upp, $ COMPRESS = comp ;+ ; NAME: ; air_read ; ; ; PURPOSE: ; Read AIR data (*.hdr, *.img) ; ; ; CATEGORY: ; I/O ; ; ; CALLING SEQUENCE: ; data=air_read(name) ; ; ; INPUTS: ; name: Filename (without extension or either .hdr or .img) ; (will be stripped off) ; ; ; OPTIONAL INPUTS: ; none ; ; ; KEYWORD PARAMETERS: ; HEADER: variable contains upon return the AIR header structure ; DATATYPE: variable contains upon return the AIR data type 0..3 ; added type 4 (bits 32/dtype=16) ; UPPER: switch File extension is upper ; ; OUTPUTS: ; image data array ; ; ; OPTIONAL OUTPUTS: ; ; ; ; COMMON BLOCKS: ; ; ; ; SIDE EFFECTS: ; ; ; ; RESTRICTIONS: ; -AIR datatype 1 (unsigned 16bit int) are represented as signed ; -int in idl (some conversion work has to be done since idl ; -do not know unsigned short ints) ; No idl knows uint data type... ; ; PROCEDURE: ; ; ; ; EXAMPLE: ; ; ; ; MODIFICATION HISTORY: ; ; 180204 datatype 4 (float added) ; ; Fri Sep 22 10:46:42 2000, Rodenacker ; ; Keyword COMPRESS added ; ; Tue Oct 6 09:28:13 1998, Karsten Rodenacker ; ; ; UINT datatype reading added ; Wed Mar 12 22:21:56 2003 ; ; ;- IF keyword_set(upp) THEN ext = ['.IMG', '.HDR'] ELSE ext = ['.img', '.hdr'] data = -1l datatype = -1l fl=(!version.os_family eq 'Windows') pos = rstrpos(name, ext[1]) IF pos GE 0 THEN name = strmid(name, 0, pos) pos = rstrpos(name, ext[0]) IF pos GE 0 THEN name = strmid(name, 0, pos) IF fexists(name+ext[1]) THEN BEGIN openr, lun, name+ext[1], /get_lun t = {air_hdr} readu, lun, t close, lun ; fl=fl and ((t.x_dim lt 0) or (t.x_dim gt 1024) $ ; or (t.y_dim lt 0) or (t.y_dim gt 1024)) if t.datatype ge 256 then fl=1 else fl=0 if fl or keyword_set(force) then t=swap_endian(t) CASE t.bits of 1:begin datatype = -1 end 8:begin datatype = 0 fl=0 end 16:BEGIN CASE 1 OF (t.glmin GE 0) AND $ (t.glmax GT 0) AND (t.glmax LE 32767): datatype = 2 (t.glmin LT 0) AND $ (t.glmax GT -32768) AND (t.glmax LE 32767): datatype = 3 ELSE: datatype = 1 ENDCASE END 32: begin datatype = 4 end ELSE:message, 'AIR bits per pixel not supported' ENDCASE ENDIF ELSE return, -1l na = name+ext[0] IF keyword_set(comp) THEN na = na+'.gz' IF fexists(na) THEN BEGIN openr, lun, na, COMPRESS=comp case datatype of -1: begin spawn,'binarymask '+name+' '+name+' tmptmp y' data=byte(air_read('tmptmp')) file_delete, ['tmptmp.hdr', 'tmptmp.img'] end 0: begin data=bytarr(t.x_dim, t.y_dim, t.z_dim, t.t_dim) readu, lun, data end 1: begin data=uintarr(t.x_dim, t.y_dim, t.z_dim, t.t_dim) readu, lun, data end 4: begin data=fltarr(t.x_dim, t.y_dim, t.z_dim, t.t_dim) readu, lun, data end ELSE: begin data = intarr(t.x_dim, t.y_dim, t.z_dim, t.t_dim) readu, lun, data end endcase free_lun, lun if fl or keyword_set(force) then data=swap_endian(data) ENDIF IF n_elements(data) GT 1 THEN return, reform(data, /over) ELSE return, -1 END