function eit_flat, image, fits_header, image_no = image_no, $
verbose = verbose, no_copy = no_copy
;+
; NAME:
; eit_flat
;
; PURPOSE:
;
;
; CALLING SEQUENCE:
; flat_fielded_img = eit_flat(img, fits_header, image_no=image_no)
;
; INPUTS:
; img = Raw image, detector offset subtracted and missing pixels raised
; to baseline level
; fits_header = index structure/fits header for img
;
; OPTIONAL INPUTS:
; None
;
; KEYWORDS
; image_no = image number in LZ file
; verbose = set if messages discriminating new read or pre-read wanted
; no_copy = don't make dual copies of input image
; (only use if output image replaces input image)
;
; EXAMPLE:
; flat_img = eit_flat(img, fits_header) ; 2-D version
; flat_img = eit_flat(img, fits_header, image_no) ; 3-D version
;
; MODIFICATION HISTORY
; The epoch - (JSN) - Written
; 17-Oct-96 - (BNH) - Now sports a document header
; - Also sports a common block
; 1997/04/11 - D.M. - Added VERBOSE keyword.
; 1998/04/13 - D.M. - Added /VAX_FLOAT keyword in OpenVMS OPENR statement
; for IDL 5.1 compatibility.
; 3-Jun-1998 - Zarro (SAC/GSFC)
; - Added calls to temporary for improved
; memory management.
; 28-Sep-1999 - N.Rich - adapt for LASCO fits header: object, wave, DATE-OBS
; 18-May-2000 - J.S.Newmark - online LASCO compatibility
;
; COMMON BLOCKS:
; eit_flat_blk = filename and flat field for last image flat-fielded (to
; speed up operation)
;-
;
; Do this so we read the flatfield only once during an IDL session
;
common eit_flat_blk, wavelength, flat_array
;
if not keyword_set(verbose) then verbose = 0
;
if n_elements(wavelength) eq 0 then wavelength = 'UNDEFINED'
;
nrlhdr=0
object = eit_fxpar(fits_header, 'OBJECT')
IF datatype(object) NE 'STR' THEN BEGIN
print,'Using NRL generated EIT header'
object=EIT_FXPAR(fits_header,'LP_NUM')
nrlhdr=1
ENDIF
if (object eq 'Cal lamp') or $
(strmid(object, 0, 4) eq 'Dark') then return, image
;
if keyword_set(no_copy) then a = temporary(image) else a=image & sz_a = size(a)
;
corner_offset = [-1, -1, -20, -20]
;
utc_date_19960307 = anytim2utc('1996/03/07')
utc_date_19960321 = anytim2utc('1996/03/21')
;
n_x = sz_a(1) & n_y = sz_a(2)
;
if ((n_x + n_y) lt 2048) then begin
;
corner = intarr(4)
corner(0) = EIT_FXPAR(fits_header, 'P1_X')
corner(1) = EIT_FXPAR(fits_header, 'P2_X')
corner(2) = EIT_FXPAR(fits_header, 'P1_Y')
corner(3) = EIT_FXPAR(fits_header, 'P2_Y')
IF nrlhdr THEN BEGIN
corner(0) = EIT_FXPAR(fits_header, 'P1ROW')
corner(1) = EIT_FXPAR(fits_header, 'P2ROW')
corner(2) = EIT_FXPAR(fits_header, 'P1COL')
corner(3) = EIT_FXPAR(fits_header, 'P2COL')
ENDIF
;
if corner(0) eq 0 then begin
date_obs = EIT_FXPAR(fits_header, 'DATE_OBS', image_no = image_no)
IF nrlhdr THEN date_obs = eit_fxpar(fits_header,'DATE-OBS',$
image_no=image_no)
utc_date_obs = anytim2utc(date_obs)
case utc_date_obs.mjd of
utc_date_19960307.mjd: corner = [256, 767, 481, 800]
utc_date_19960321.mjd: corner = [256, 767, 800, 1023]
else: begin
message,/info,'Early partial FOV images can not be flat fielded'
return,a
end
endcase
endif else begin
if (corner(0) mod 2) and (corner(1) mod 2) then $
corner_offset = [-1,-2,-20,-20]
corner = corner + corner_offset
if verbose then print, '%EIT_FLAT-I-CORNERS, subfield corners = ', corner
end
;
; First case: full FOV, pixel summing
;
endif else corner = [0, 1023, 0, 1023]
;
x_bin = 1 & y_bin = 1
nx_grid = corner(1) - corner(0) + 1
ny_grid = corner(3) - corner(2) + 1
if nx_grid gt n_x then x_bin = nx_grid/n_x
if ny_grid gt n_y then y_bin = ny_grid/n_y
; print, '%EIT_FLAT-D-BIN, x_bin, y_bin = ' + $
; strtrim(x_bin, 2) + ', ' + strtrim(y_bin, 2) + '.'
wave = strtrim(eit_fxpar(fits_header,'WAVELNTH',image_no=image_no),2)
if nrlhdr then wave = STRMID(eit_fxpar(fits_header,'SECTOR'),0,3)
; use only short wavelegnth (195) and long (284) wavelength flats
; as there is only ~1% difference between these and 171, 304 respectively
if wave eq '171' then wave='195'
if wave eq '304' then wave='284'
if (wave ne wavelength) then begin
if verbose then message, /info, 'Reading in flat...'
wavelength = wave
;
; definitions of GSFC vms cluster
;
if is_gsfcvms() then begin
flat_file = 'eit_disk:[eit.reform.flat]flat_'+wave+'.dat'
release = !version.release
version_release = 100*strmid(release, 0, 1) + $
10*strmid(release, 2, 1) + strmid(release, 4, 1)
if version_release le 503 then begin
openr, flat_unit, flat_file, /get_lun, /block
endif else begin
openr, flat_unit, flat_file, /get_lun, /block, /vax_float
end
endif else begin
flat_file = concat_dir(getenv('SSW_EIT_RESPONSE'),'flat_'+wave+'.dat')
openr,flat_unit,flat_file,/get_lun,/xdr
endelse
;
flat_array = fltarr(1024, 1024)
readu, flat_unit, flat_array
close, flat_unit & free_lun, flat_unit
endif else begin
if verbose then message, /info, 'Using pre-read flat'
end
fl_mult = flat_array(corner(0):corner(1), corner(2):corner(3))
if (x_bin eq 1) and (y_bin eq 1) then begin
a = temporary(a)*temporary(fl_mult)
endif else begin
a = temporary(a)*rebin(temporary(fl_mult), n_x, n_y)
end
return, a
end
Last revised: - Wed May 9 21:45:00 2007- F. Auchère