pro read_princeton, file, $
data, $
header=header, $
x_calibration=x_calibration, $
y_calibration=y_calibration
;+
; NAME:
; READ_PRINCETON
;
; PURPOSE:
; This procedure reads data files written by Princeton Instruments'
; WinSPEC and WinVIEW software.
;
; CATEGORY:
; File input.
;
; CALLING SEQUENCE:
; READ_PRINCETON, File, Data, Header
;
; INPUTS:
; File: The name of the data file to read.
;
; OUTPUTS:
; Data[nx, ny, nframes]:
; The output data array. The array will be 1, 2 or 3 dimensions
; (depending upon whether ny and nframes are 1) and can be integer,
; long or float data type.
;
; KEYWORD OUTPUTS:
; Header: The 4100 byte header from the file. This header can be used to
; extract additional information about the file. See the
; Princteon Instruments "PC Interface Library Programming Manual"
; for the description of the header structure, and this procedure
; for examples of how to extract information from the header.
;
; X_calibration[nx]:
; An array of calibrated values for each pixel in the X
; direction.
; Y_calibration[nx]:
; An array of calibrated values for each pixel in the Y
; direction.
;
; RESTRICTIONS:
; This procedure currently only extracts the data size from the header.
; It should be exhanced to extract calibration information, etc.
;
; EXAMPLE:
; Read a data file:
;
; IDL> READ_PRINCETON, 'test.spe', data, header=header, x_cal=x_cal
; IDL> plot, x_cal, data
; IDL> clock_speed = float(header, 1428)
; IDL> print, 'Vertical clock speed (microseconds) = ', clock_speed
;
; MODIFICATION HISTORY:
; Written by: Mark Rivers, 11/4/97
;-
openr, lun, /get, file
header = bytarr(4100)
readu, lun, header
; Get the image size from the header
nx = fix(header, 42)
ny = fix(header, 656)
nframes = long(header, 1446)
type = fix(header, 108)
case type of
0: data = fltarr(nx, ny, nframes)
1: data = lonarr(nx, ny, nframes)
2: data = lonarr(nx, ny, nframes)
3: data = intarr(nx, ny, nframes)
default: message, 'Unknown data type'
endcase
offset = 3000
xcal = { $
offset: double(header, offset), $
factor: double(header, offset+8), $
current_unit: byte(header, offset+16), $
reserved1: byte(header, offset+17), $
string1: byte(header, offset+18, 40), $
reserved2: byte(header, offset+58, 40), $
calib_valid: byte(header, offset+98), $
input_unit: byte(header, offset+99), $
polynom_unit: byte(header, offset+100), $
polynom_order: byte(header, offset+101), $
calib_count: byte(header, offset+102), $
pixel_pos: double(header, offset+103, 10), $
calib_value: double(header, offset+183, 10), $
polynom_coeff: double(header, offset+263, 6), $
laser_position: double(header, offset+311), $
reserved3: byte(header, offset+319), $
new_calib_flag: byte(header, offset+320), $
calib_label: byte(header, offset+321, 81), $
expansion: byte(header, offset+402, 87) $
}
offset = 3489
ycal = { $
offset: double(header, offset), $
factor: double(header, offset+8), $
current_unit: byte(header, offset+16), $
reserved1: byte(header, offset+17), $
string1: byte(header, offset+18, 40), $
reserved2: byte(header, offset+58, 40), $
calib_valid: byte(header, offset+98), $
input_unit: byte(header, offset+99), $
polynom_unit: byte(header, offset+100), $
polynom_order: byte(header, offset+101), $
calib_count: byte(header, offset+102), $
pixel_pos: double(header, offset+103, 10), $
calib_value: double(header, offset+183, 10), $
polynom_coeff: double(header, offset+263, 6), $
laser_position: double(header, offset+311), $
reserved3: byte(header, offset+319), $
new_calib_flag: byte(header, offset+320), $
calib_label: byte(header, offset+321, 81), $
expansion: byte(header, offset+402, 87) $
}
x_calibration = poly(findgen(nx), xcal.polynom_coeff(0:xcal.polynom_order))
y_calibration = poly(findgen(ny), ycal.polynom_coeff(0:ycal.polynom_order))
readu, lun, data
data = reform(data) ; Eliminate trailing dimensions if 1
free_lun, lun
end