EIT Software Listings

 

anal
obsolete
response
util

 

Previous Routine
Next Routine

 

Listing of $SSW/soho/eit/idl/anal/eit_image.pro

 


; EIT_IMAGE
; EIT_IMAGE uses READFITS from the IDL astronomy library to read a "corrected"
; SOHO EIT image file in FITS format, and to display the
; image, scaled to its own maximum.
; D.M. fecit, 26 September, 1993.
; Added replacement_value, fill_block, and dark_current keywords, 1996 January
; 25. D.M. fecit.
; Changed to custom EIT color tables, 1996 February 3. D.M. fecit.
; XPOS and YPOS keywords added 1996 May 16. D.M. fecit.
; Filename argument broadened, 1996 September 1. D.M. fecit.
;
;+
; NAME:
;	EIT_IMAGE
; PURPOSE:
;	Read a SOHO Extreme ultraviolet Imaging Telescope (EIT) image
;       from a FITS file, and return the byte-scaled image.
;
; CALLING SEQUENCE:
;	scaled_image =	EIT_IMAGE(filename, [original_image =
;			original_image,] [scale_factor = scale_factor,]
;			[top = top], [flat=flat],
;			[image_time = image_time,] [header = header],
;			[show_image = show_image], [replacement_value =
;			replacement_value], [fill_block = fill_block],
;			[surround = surround], [adjust = adjust],
;			[dark_current = dark_current], [v_offset = v_offset],
;			[no_degrid = no_degrid], [half = half],
;			[quarter = quarter], [no_rescale = no_rescale],
;			[xpos = xpos, ypos = ypos], [image_no=image_no])
;
; INPUTS:
;	FILENAME = String containing the name of the FITS file to be read.
;			Optionally, this can instead be the string returned
;			by EIT_CATRD for a file.
;
; OUTPUTS:
;	Result = byte-scaled image array (usually 1024 x 1024)
;;
; KEYWORDS:
;	show_image - if present and non-zero, display the image on the
;			currently selected graphics device
;	original_image - original, floating-point version of contents of file
;	scale_factor = scaling for logarithmic scaling on the current X
;			device
;	top - maximum value to which to scale (useful when scaling a series
;			of images to the same maximum)
;	image_time = string concatenating DATE-OBS and TIME-OBS from the
;			FITS header
;	header = FITS header (string array)
;	replacement_value - DN with which to replace missing data block pixels
;	fill_block - intarr(32, 32) with which to replace missing data blocks
;	surround - if set, replace missing block data with the average of
;			surrounding blocks
;	adjust - multiplicative factor by which to adjust for strange exposure
;			times
;	dark_current - dark current value to be subtracted when image is
;			scaled (Note: if replacement_value is defined and
;			dark_current is not, the dark current is set to the
;			replacement value.)
;	v_offset - if show is set, the vertical offset for display (useful
;			for displays incapable of displaying the full image)
;	no_degrid - if set, do not remove the grid, otherwise remove by
;			the method of F. Clette
;	half - if set, rebin image to half size
;	quarter - if set, rebin to quarter size
;	xpos = x position of image window
;	ypos = y position of image window
;       image_no = selected image from a multiple image LZ file
;       flat - if set flat field the image
;	no_rescale - set if image is not to be rescaled into 0 - 255 range
;
; EXAMPLE:
;	Find the most current EIT image on the EIT image directory,
;	and display it on the current device:
;
;	s = findfile("reformat_dir:ef*.*")
;	n = n_elements(s)
;	a = EIT_IMAGE(s(n - 1), /show_image)
;
; RESTRICTIONS:
;	None.
;
; NOTES:
;	None.
;
; PROCEDURES USED:
;	READFITS (Astronomy library)
;	RAISE_MISSING_BLOCKS
;	EIT_DEGRID
;       EIT_FLAT
;
; MODIFICATION HISTORY:
;
;	D.M. fecit, from SXT_IMAGE, 25 October, 1993.
;
;	Changed to ignore v_offset unless n_y eq 1024. D.M. fecit, 1996/02/25.
;
;	Call EIT_DEGRID instead of reinventing the wheel. D.M. fecit,
;	   1996/03/30.
;
;       1996-Aug-20 JSN added support for 3-D LZ data
;
;	Changed filename argument handling to accept "brief" catalog lines.
;	   D.M. fecit, 1996/09/01.
;
;       1996-Sep-25 J Newmark added flat fielding
;
;	1996/10/20	Changed scaling to use only southernmost 15/16
;			of a full-frame image (to avoid scaling 284 A,
;			clear filter pos. images to the light leak).
;			D.M. fecit.
;       1996/12/04 J. Newmark - removed last traces of find_keyword
;
;	1996/12/23	Added QUARTER keyword.			D.M. fecit.
;
;	1997/02/05	Added NO_RESCALE keyword.		D.M. fecit.
;
;       1998/03/27 J Newmark change code to use NSLICE keyword in
;                      READFITS routine for 3D images
;
;       1998 Jun 3  - D. Zarro (SAC/GSFC) 
;                                -  sprinkled liberally with calls to temporary
;
;       2000 Aug 31 J. Newmark - include flat fielding
;       2001 Jun 4 J. Newmark - only use original grid
;       2003 July 17 - A. Young - compensate for spacecraft roll                
;
;-
function eit_image, filename, original_image = original_image, $
                    scale_factor = scale_factor, top = top, $
                    image_time = image_time, degrid_image = degrid_image, $
                    header = header, show_image = show_image, $
                    replacement_value = replacement_value, $
                    fill_block = fill_block, surround = surround, $
                    n_block = n_block, flat=flat, $
                    dark_current = dark_current, v_offset = v_offset, $
                    no_degrid = no_degrid, half = half, quarter = quarter, $
                    xpos = xpos, ypos = ypos, image_no = image_no, $
		    no_rescale = no_rescale
;
sector = ['171', '195', '284', '304'] & table = [1, 8, 41, 3]
;
stat = is_fits(filename)
if not stat then filename = eit_file2path(filename)
;
fits_header = headfits(filename)
n_x = EIT_FXPAR(fits_header, 'NAXIS1')  
n_y = EIT_FXPAR(fits_header, 'NAXIS2')
naxis3 = EIT_FXPAR(fits_header, 'NAXIS3')
if strpos(strlowcase(filename), 'efz') ge 0 then final = 1 else final = 0
;
p1_x = EIT_FXPAR(fits_header, 'P1_X') & p2_x = EIT_FXPAR(fits_header, 'P2_X')
p1_y = EIT_FXPAR(fits_header, 'P1_Y') & p2_y = EIT_FXPAR(fits_header, 'P2_Y')
full_frame = (p1_x eq 1) and (p2_x eq 1024) and (p1_y eq 20) and (p2_y eq 1043)
;
; select only 1 subimage
;
three_d=0
if naxis3 ge 1 then begin
   three_d=1
   if n_elements(image_no) eq 0 then read,image_no,prompt=$
     'Enter selected image slice 0-'+strtrim(naxis3-1)+':'
   a = readfits(filename, /silent, nslice = image_no)
endif else begin
   a = readfits(filename, /silent) 
endelse
;
; print, '%EIT_DISPLAY-D-FILE_PROVENANCE, final = ', final
;
original_image = a
;
utc_date_19960327 = anytim2utc('1996/03/27')
;
; Degridding: do by default, get sector and filter wheel position from
; FITS header.
;
if not keyword_set(no_degrid) then degrid = 1 else degrid = 0
;
; Replace missing data blocks if either replacement value or fill_block
; keyword is specified.
;
if keyword_set(dark_current) then begin
   dark = dark_current
endif else dark = 0
if keyword_set(replacement_value) then begin
   a = RAISE_MISSING_BLOCKS(a, replacement_value = replacement_value, $
         n_block = n_block, /no_copy)
   if n_block gt 0 then print, '%EIT_IMAGE-I-N_BLOCKS, ' + $
      strtrim(n_block, 2)  + ' blocks replaced'
   dark = replacement_value
endif else if keyword_set(fill_block) then begin
   a = RAISE_MISSING_BLOCKS(a, fill_block = fill_block, n_block = n_block, $
         /no_copy)
endif else if keyword_set(surround) then begin
   if not degrid then begin
      a = RAISE_MISSING_BLOCKS(a, /surround, n_block = n_block, /no_copy)
   endif else begin
      a = RAISE_MISSING_BLOCKS(a, repl = dark, n_block = n_block, /no_copy)
   end
end
a = a - dark
;
if degrid then begin
;
   if not three_d then a = EIT_DEGRID(a, fits_header, final = final, $
                   /no_copy) else $
       a = EIT_DEGRID(a, fits_header, final = final, image_no = image_no, $
                    /no_copy)
;
   if keyword_set(surround) then begin
      a = RAISE_MISSING_BLOCKS(a, /surround, n_block = n_block, /no_copy)
   end
;
end
;
; flat field not done by default yet
;
if keyword_set(flat) then begin
   if not three_d then a = EIT_FLAT(a, fits_header, /no_copy) else $
       a = EIT_FLAT(a, fits_header, image_no = image_no, /no_copy)
       ww = eit_fxpar(fits_header, 'WAVELNTH')
       dd = eit_fxpar(fits_header, 'DATE_OBS')
       a = temporary(a) /  eit_norm_response(dd,ww,fits_header)
end
;
if keyword_set(half) then begin
   a = rebin(a, n_x/2, n_y/2, /sample)
   n_x = n_x/2 & n_y = n_y/2
   window_scale = 0.5
endif else if keyword_set(quarter) then begin
   a = rebin(a, n_x/4, n_y/4, /sample)
   n_x = n_x/4 & n_y = n_y/4
   window_scale = 0.25
endif else begin
   window_scale = 1.0
   half = 0 & quarter = 0
end
;
if keyword_set('degrid_image') then degrid_image = a
;
max_color = float(min([!d.n_colors, !d.table_size]) - 1)
;
; Get the wavelength from the FITS header.
;
if not three_d then wave = strtrim(eit_fxpar(fits_header, 'WAVELNTH'), 2) $
   else begin
      wave = eit_fxpar(fits_header, 'WAV', image_no = image_no)
         wave = strtrim(wave(0), 2)
end
for j_wave = 0, 3 do if wave eq sector(j_wave) then i_wave = j_wave
;
if keyword_set(top) then begin
   top_value = top
endif else begin
   if full_frame then begin
      max_row = (15*n_y)/16
      top_value = max(a(*, 0:max_row - 1))
   endif else top_value = max(a)
;
; Post-apocalyptic light leak Al +1 kluge, until we do better
;
;  if fix(wave) eq 171 then top_value = 1500.
;  if fix(wave) eq 195 then top_value = 2500.
;  if fix(wave) eq 284 then top_value = 1750.
;  if fix(wave) eq 304 then top_value = 2750.
;
; Post-REAL-pockyclypse values: bakeout of a lifetime
;
   bin = round(p2_x/n_x)^2
   if fix(wave) eq 171 then top_value = 6000.*bin
   if fix(wave) eq 195 then top_value = 7000.*bin
   if fix(wave) eq 284 then top_value = 6000.*bin
   if fix(wave) eq 304 then top_value = 1500.*bin
end
;
; Post 2001 February 8 offpoint: more counts
;
   top_value = 5*top_value
;
if wave ne 304 then begin
   scl = max_color/(alog10(top_value) - 1.)
endif else begin
   scl = max_color/alog10(top_value)
end
scale_factor = scl
if wave ne 304 then begin
   b = byte(scl*(alog10(temporary((a > 10.) < top_value))-1.))
endif else begin
   b = byte(scl*alog10(temporary((a > 1.) < top_value)))
end
sz_b = size(b) & n_x = sz_b(1) & n_y = sz_b(2)
;
; Get time and date from FITS header.
;
time = EIT_FXPAR(fits_header, 'TIME-OBS')
;
date = EIT_FXPAR(fits_header, 'DATE-OBS')
;
; Set possible output keyword values.
;
date_string = anytim2utc(strmid(date + ' ' + time, 0, 19), /ecs)
date_string = strmid(date_string, 0, 19)
image_time = date_string
header = fits_header
;
;                                                                               
; Added 180 degree roll handling, 2003/07/17. D.M. fecit.                       
;                                                                               
sc_roll = eit_fxpar(fits_header, 'SC_ROLL')                                     
if abs(fix(sc_roll)) eq 180 then b = rotate(b, 2)                               
;
;moved from bottom so displayed image is also correct,CAY 03/07/17              
;                                                                               
if keyword_set(show_image) then begin
;
   title = 'SOHO EIT ' + wave + ' A image, ' + date_string
   if !d.name eq 'X' then begin
;
      nx = eit_fxpar(fits_header, 'NAXIS1')
      ny = eit_fxpar(fits_header, 'NAXIS2')
;
; changed window index from !d.window +1 to /free
; changed file name for loadct from logical coloreit to
; getenv('coloreit') for UNIX compatibility
;   1996 February 9 - J. Newmark
;
      window_position = 0
      if keyword_set(xpos) then window_position = window_position + 1
      if keyword_set(ypos) then window_position = window_position + 2
      case window_position of
         0: window, /free , xsize = window_scale*nx, ysize = window_scale*ny, $
               title = title
         1: window, /free , xsize = window_scale*nx, ysize = window_scale*ny, $
               xpos = xpos - 1, title = title
         2: window, /free , xsize = window_scale*nx, ysize = window_scale*ny, $
               ypos = ypos - 1, title = title
         3: window, /free , xsize = window_scale*nx, ysize = window_scale*ny, $
               xpos = xpos - 1, ypos = ypos - 1, title = title
      endcase
      loadct, 42 + i_wave, file = getenv('coloreit')
   end
;
   if (keyword_set(v_offset) and n_y eq 1024) then begin
;
      utc_repoint = anytim2utc('1996/04/16 23:30')
      t_repoint = utc_repoint.mjd + 1.d-3*utc_repoint.time/86400.
      date_obs = eit_fxpar(fits_header, 'DATE_OBS', image_no = image_no)
      utc_obs = anytim2utc(date_obs)
      t_obs = utc_obs.mjd + 1.d-3*utc_obs.time/86400.
;
;     print, '%EIT_IMAGE-D-TIMES, t_obs, t_repoint = ', t_obs, t_repoint
;
      if t_obs lt t_repoint then begin
         vertical_offset = v_offset
      endif else begin
         vertical_offset = min([v_offset, 23])
      end
   endif else begin
      vertical_offset = 0
   end
;
; output vertical offset if asked - JSN 6/12/96
;
   v_offset = vertical_offset
;  print, '%EIT_IMAGE-D-V_OFF, v_off = ' + strtrim(vertical_offset, 2)
;
; Rescale to get the maximum possible dynamic range.
;
   if not keyword_set(no_rescale) then no_rescale = 0
   if not no_rescale then b = EIT_RESCALE(b)
;
; Corrected sign of vertical_offset, 2004/01/26. D.M. fecit, deep in snow.
;

   tv, b, 0, vertical_offset
end
;
return, b & end


Web curator: Frédéric Auchère
Responsible NASA official: Joseph B. Gurman, Facility Scientist, Solar Data Analysis Center
joseph.b.gurman@gsfc.nasa.gov
+1 301 286-4767
NASA Goddard Space Flight Center
Solar Physics Branch / Code 682

Last revised: - Wed May 9 21:45:01 2007- F. Auchère