;+
; NAME:
; MOVIE_MAKER
;
; PURPOSE:
; This procedure will create EIT movies (IDL Save Sets).
; The user interactively selects a series of FITS images,
; scales them, and saves them.
;
; CATEGORY:
; WIDGET interface
;
; CALLING SEQUENCE:
; MOVIE_MAKER
;
; INPUTS: None. The default is to list files from todays QKL catalog.
; User can select date and/or LZ catalog as well as other
; selection criteria.
;
; KEYWORD PARAMETERS: None
;
; OUTPUTS:
; This routine creates an IDL save set in MOVIE_DIR or current
; directory.
;
; COMMON BLOCKS:
; common filestuff1,dirspec,flist,index,list7,save_file
; common parms,dateit,dateend,nxit,nyit,waveit,outfit,halfres,sclit,rbin,qres,
; reproducible_top_value
; common parms2,fresit,fmark,use_qkl,use_lz,new_flist,save_index,numfiles
; common params,date_start,date_end,n_x,n_y,wavel,top_val
; common ratio_par,ratioit,save_195,save_171,s195,s171,mk_ratio,$
; title_start,title_end,stamp_time,mk_diff
;
; SIDE EFFECTS:
; unsure if common block must be re-initialized after each run.
;
; RESTRICTIONS:
; Serious memory hog, especially if display movies
;
; PROCEDURE:
; A widget is displayed. The user uses the various text widgets
; to input selection criterion. The user can display or delete
; any of the selected images. The user selects the scaling procedure,
; setting a minimum value and maximum value, the movie is then
; saved to an IDL save set in movie_dir or current directory.
;
; MODIFICATION HISTORY:
; Written by: J. Newmark Date. Apr. 1996
; Ratio movie change: D.M. fecit 1996 July 12
; Scaling changes J. Newmark 1996 Jul 17
; Changed RESCALE calls to EIT_RESCALE. D.M. fecit 1996 Sept. 13
; Significant changes:
; Changed date format in title, added hourglass. J. Newmark 1996 Sept 27
; Add flat fielding, allow inclusion of 1024x1024 images in
; sequences of 512x512. J. Newmark 1996 Sept. 27
; Add Histogram Scaling, changed scaling algorithm to account
; for total exptime, added comments. J. Newmark 1996 Sep 30
; v2.0 1996 October 01
; Cleaned up code, combined scaleit, roiit J. Newmark 1996 Oct 2
; Handle Level-Zero Data - Substantial changes to work with
; files which contain 3D data. J Newmark 1996 Oct 7
; Allow input of image size in blocks if lt 32, list number of
; selected files. J. Newmark 1996 Oct 08
; v3.0 1996 October 08
; Desensitize SAVE MOVIE button until after images are scaled.
; J. Newmark 1996 December 04
; Change scaling 284 images, too faint for alog10. J. Newmark 1996 Dec 08
; USe fake_missing_blocks,/high for ratio movies J. Newmark 1996 Dec 09
; Change rebin from 512x512 to 2 times. J Newmark 1996 10 Dec
; Add Quarter resolution output. J Newmark 1996 Dec 23
; Remove darks, cal lamps from movies J Newmark 1997 Jan 16
; Add inclusion of 4x4 binned with full field J. Newmark 1997 Jan 28
; Changed/fixed scaling for image totals J. Newmark 1997 Jan 30
; Don't use images with many missing blocks in histogram scale.
; J. Newmark 1997 Apr 14
; Add ability to make CRUDE difference movies. J. Newmark 1997 Apr 21
; Made default for rebin /SAMPLE. D.M. fecit 1997 May 23
; Save time stamp in STRARR in save set. J. Newmark 1997 OCt. 30
;-
;------------------------------------------------------------------------------
; subprocedure to kill the help window
;------------------------------------------------------------------------------
PRO killhelp1
COMMON helpshare,helpbase
WIDGET_CONTROL, helpbase, /DESTROY
END
;------------------------------------------------------------------------------
; subwidget to display a help window with text output
;------------------------------------------------------------------------------
PRO helpout1
COMMON helpshare,helpbase
helparray = strarr(32)
helparray(0)=' This is the EIT Movie Maker.'
helparray(1)=' '
helparray(2)=' A widget is displayed. The user uses the various text widgets'
helparray(3)=' to input selection criterion. The user can display or delete'
helparray(4)=' any of the selected images. The images are then scaled and'
helparray(5)=' saved to an IDL save set in movie_dir.'
helparray(6)=' '
helparray(7)=' Quick tutorial: '
helparray(8)=' a) Select start date, end date'
helparray(9)=' b) Select X,Y sizes of input images, pixels or blocks lt 32'
helparray(10)=' c) Select wavelength '
helparray(11)=' d) Enter output file name'
helparray(12)=' Extras:
helparray(13)=' e) toggle default scaling or scale so min=0'
helparray(14)=' f) toggle output array size for full resolution, half'
helparray(15)=' resolution, 512x512(useful for magnifying small fields'
helparray(16)=' or Include full Res (1024) images with binned (512) ones'
helparray(17)=' g) toggle Save 171 or Save 195 or No Save - this is necessary'
helparray(18)=' if a ratio of 195/171 movie will be created'
helparray(19)=' '
helparray(20)=' Running: '
helparray(21)=' h) Click Update Listing to generate file list - scan through'
helparray(22)=' list, can display or delete selected images '
helparray(23)=' i) Set scaling - Auto Scale - will display a histogram of '
helparray(24)=' values from the central 100x100 of each image, select a'
helparray(25)=' minimum value to get rid of images with many dropouts'
helparray(26)=' ROI scale - user defined Region Of Interest for scaling'
helparray(27)=' Hist scale - interactively set max using histogram'
helparray(28)=' j) Click Save Movie - can also View most recently saved Movie'
helparray(29)=' k) Making Ratio movies - First create both 171 and 195 '
helparray(30)=' with the appropriate Save 171,195 selection made'
helparray(31)=' after both are made simply Click Make Ratio'
helpbase = WIDGET_BASE(TITLE = 'Movie Maker Help', /FRAME, /COLUMN, $
XOFFSET = 350, YOFFSET = 150)
finishbutton = WIDGET_BUTTON(helpbase, VALUE = 'Click here when done', $
UVALUE = 'donehelp')
helptext = WIDGET_TEXT(helpbase,VALUE= helparray,XSIZE= 55,YSIZE= 20,/SCROLL)
WIDGET_CONTROL, helpbase, /REALIZE
XMANAGER, 'helpout', helpbase, EVENT_HANDLER='MOVMK_event',MODAL = helpbase
END
;------------------------------------------------------------------------------
; procedure to display selected image - uses eit_image
;------------------------------------------------------------------------------
pro showeit1
common filestuff1,dirspec,flist,index,list7,save_file
common parms2,fresit,fmark,use_qkl,use_lz,new_flist,save_index,numfiles,ids
;
if n_elements(index) eq 0 then index = 0
if use_lz then f_template = 'efz' else f_template = 'efr'
filename = strmid(flist(index),strpos(strlowcase(flist(index)),f_template),18)
if !version.os eq 'vms' then filename = eit_file2path(filename,/gavroc) $
else filename = eit_file2path(strlowcase(filename))
if is_fits(filename) then begin
hdr = headfits(filename)
naxis = eit_fxpar(hdr,'NAXIS')
;
; for LZ data with multiple images select 1 from list or ALL
if naxis eq 3 then begin
nimgs = eit_fxpar(hdr,'NAXIS3')
comms = eit_fxpar(hdr,'COMMENT')
start = where(strpos(comms,'BEGIN MULTIPLE') ne -1)
out = strarr(nimgs+7)
out(0) = 'Please select from the list of images below or ALL'
out(1) = ' Image numbers range from 0-'+strtrim(nimgs-1,2)
out(3:nimgs+6) = comms(start(0):start(0)+3+nimgs)
answer = 'ALL'
xin, answer,out,status=status
if strupcase(answer(0)) eq 'ALL' and status then begin
window, /free,xs=1024,ys=1024
orig = readfits(filename)
orig = alog10((orig-848)>1)
wv = eit_fxpar(hdr,'WAV',image=0)
sector = ['171', '195', '284', '304']
for j_wave = 0, 3 do if strtrim(wv(0),2) eq sector(j_wave) then $
i_wave = j_wave
loadct,42 + i_wave,file=getenv('coloreit')
times = eit_fxpar(hdr,'START_TIME',image_no='all')
times = strmid(times,11,8)
for i = 0,nimgs-1 do begin
put, orig(*,*,i),i+1,nimgs,/noexact,relat=0.85
label_image, times(i)
endfor
endif else begin
while not status do xin, answer,out,status=status
if strupcase(answer(0)) eq 'ALL' then answer(0) = '0'
image_no = fix(answer(0))
img = eit_image(filename, repl = eit_dark(), dark = eit_dark(), $
/show, v_off=46, image_no=image_no, /flat)
endelse
endif else img = eit_image(filename, dark = eit_dark(), /show, $
v_off=46, /flat)
endif else message, /continue, 'File is not FITS.'
end
;------------------------------------------------------------------------------
; procedure to auto-scale images - uses central 100x100 pixels or if
; roiit is set then a mouse defined region of interest - user
; defined maximum can be set with histogram of first image in sequence
;------------------------------------------------------------------------------
pro scaleit, hist=hist, roiit=roiit
common filestuff1,dirspec,flist,index,list7,save_file
common parms,dateit,dateend,nxit,nyit,waveit,outfit,halfres,sclit,rbin,qres, $
reproducible_top_value
common parms2,fresit,fmark,use_qkl,use_lz,new_flist,save_index,numfiles,ids
common params,date_start,date_end,n_x,n_y,wavel,top_val
utc_obe_good = anytim2utc('1996/07/18')
t_obe = utc_obe_good.mjd + 1.d-3*utc_obe_good.time/86400
if use_lz then f_template = 'efz' else f_template = 'efr'
if n_elements(n_x) eq 0 then widget_control, nxit,get_value=n_x
if n_elements(n_y) eq 0 then widget_control, nyit,get_value=n_y
n_x = fix(n_x(0))
n_y = fix(n_y(0))
if n_x lt 32 then n_x = n_x*32
if n_y lt 32 then n_y = n_y*32
new_flist = flist
sz = n_elements(flist)
save_index = intarr(sz)
tots = fltarr(sz)
tvals = fltarr(sz)
fmark = intarr(sz)
if keyword_set(roiit) then begin ; obtain indices from mouse input
showeit1
indices = defroi(n_x(0),n_y(0))
wdelete, !d.window
endif
widget_control, /hourglass
;
; for each file, read image, sum central 100x100 pixels, set top scale
; to mean+5*sdev or user selected point on histogram
; changed to sum top 15/16 of image
;
new_i = -1
for i = 0, sz -1 do begin
print, '%MOVIE_MAKER-I-FRAME, processing frame ' + strtrim(i, 2) + '.'
fname = strmid(flist(i),strpos(strlowcase(flist(i)),f_template),18)
if !version.os eq 'vms' then fname = eit_file2path(fname,/gavroc)$
else fname = eit_file2path(strlowcase(fname))
;
; 1996 July 17 - JSN changed readfits to eit_image and got top scale
; dum_image=readfits(strlowcase(fname),hdr)
;
; add stuff for 3d LZ stuff
index = 0
n_3d = 1
hdr = headfits(strlowcase(fname))
naxis = eit_fxpar(hdr,'NAXIS')
;
; handle multiple images per file, do not a priori know how many images
if naxis eq 3 then begin
if n_elements(wavel) eq 0 then widget_control,waveit,get_value=wavel
if n_elements(wavel) eq 0 then wavel = 'all'
if strlowcase(wavel(0)) eq 'all' then $
index = intarr(eit_fxpar(hdr,'naxis3')) else begin
wave = fix(wavel(0))
index = eit_lzsort(strlowcase(fname),wave)
endelse
index = reverse(index)
n_3d = n_elements(index)
if n_3d gt 1 then begin
tx = new_i +1
num_flist = n_elements(new_flist)
if tx + 1 eq num_flist then $
new_flist = [new_flist(0:tx),replicate(new_flist(tx),n_3d-1)] else $
new_flist = [new_flist(0:tx),replicate(new_flist(tx),n_3d-1),$
new_flist(tx+1:n_elements(new_flist)-1)]
tots = [tots,fltarr(n_3d-1)]
tvals = [tvals,fltarr(n_3d-1)]
fmark = [fmark,intarr(n_3d-1)]
save_index = [save_index,intarr(n_3d-1)]
endif
endif
object = eit_fxpar(hdr,'OBJECT')
if n_x eq 1024 or object eq 'full FOV' then $
xcen = eit_fxpar(hdr,'CRPIX1') else xcen = n_x/2
if xcen eq 0 then xcen = n_x/2
if n_y eq 1024 or object eq 'full FOV' then $
ycen = eit_fxpar(hdr,'CRPIX2') else ycen = n_y/2
if ycen eq 0 then ycen = n_y/2
;
; loop over number of images in each file
for loop = 0, n_3d -1 do begin
new_i = new_i + 1
bimage = eit_image(strlowcase(fname),degrid=dum_image,dark=$
eit_dark(), repl=eit_dark(), image_no = index(loop), /flat)
if naxis eq 2 then exp_time = eit_fxpar(hdr,'exptime') else $
exp_time = eit_fxpar(hdr,'exp_time',image_no=index(loop))
;
; Modified for new definition of EXPTIME in V2.0 and later FITS headers.
;
version = float(strmid(eit_fxpar(hdr,'history'),8,3))
if version(0) ge 2.0 then shut_time = 0 else begin
utc_date_obs = anytim2utc(eit_fxpar(hdr,'date_obs',$
image_no=index(loop)))
t_obs = utc_date_obs.mjd + 1.d-3*utc_date_obs.time/86400
shut_time = eit_fxpar(hdr,'SHUTTER CLOSE TIME')
if shut_time le 0 or t_obs lt t_obe then shut_time = 2.1
endelse
exptime = exp_time + shut_time
;
dum_image = temporary(dum_image)/float(exptime(0))
; if fresit and eit_fxpar(hdr,'naxis1') eq 1024 then fmark(new_i) = 1
if fresit then begin
case eit_fxpar(hdr,'naxis1') of
1024 : fmark(new_i) = 1
256 : fmark(new_i) = 2
else:
endcase
endif
if keyword_set(roiit) then tots(new_i) = total(dum_image(indices)) $
else begin
max_row = (15*eit_fxpar(hdr,'naxis2'))/16
tots(new_i) = total(dum_image(*,0:max_row-1))
; if eit_fxpar(hdr,'naxis1') lt 101 or eit_fxpar(hdr,'naxis2') lt 101 then $
; tots(new_i) = total(dum_image) else $
; tots(new_i) = total(dum_image(xcen-50:xcen+49,ycen-50:ycen+49))
endelse
sv = stdev(dum_image,moms)
; tvals(new_i) = min([moms+5*sv,max(dum_image)])
tvals(new_i) = max(dum_image)
; remove darks, cal lamps- set to zero
;
if strupcase(object) eq 'DARK' or strupcase(object) eq $
'CALIBRATION LAMP' then tots(new_i) = 0
save_index(new_i) = index(loop)
dum_image = 0
bimage = 0
endfor
;
endfor
; if fresit then begin ;scale full-res to binned
; fffr = where(fmark eq 1)
; ffhr = where(fmark eq 0)
; ffqr = where(fmark eq 2)
; if ffqr(0) ne -1 then begin
; if fffr(0) ne -1 then begin
; tots(fffr) = tots(fffr)*16
; tvals(fffr) = tvals(fffr)*16
; endif
; if ffhr(0) ne -1 then begin
; tots(ffhr) = tots(ffhr)*4
; tvals(ffhr) = tvals(ffhr)*4
; endif
; endif else if fffr(0) ne -1 then begin
; tots(fffr) = tots(fffr)*4
; tvals(fffr) = tvals(fffr)*4
; endif
; endif
dum = widget_event(/nowait)
widget_control, hourglass=0
window, /free,xs=512,ys=512
yrp=minmax(tots)
plot, psym=10,indgen(n_elements(tots)),tots,yr=[(yrp(0)-0.2*yrp(0))>0,yrp(1)+0.2*yrp(1)]
xyouts, 100,340,'Select a min level',/device,charsiz=1.5
cursor, x_val,bot_val, wait = 4, /data & wait, 0.25
xyouts, 100, 400, 'Select a max level.', /dev, charsize = 1.5
cursor, x_val, my_top_val, wait = 4, /data
wdelete, !d.window
keep = where((tots gt bot_val) * (tots lt my_top_val))
new_flist = new_flist(keep)
save_index = save_index(keep)
fmark = fmark(keep)
sdev = stdev(tvals(keep),mean)
; top_val = min([max(tvals(keep)),mean+3*sdev])
top_val = max(tvals(keep))
if fresit then top_val = top_val*4.
if qres then top_val = top_val*16.
; user selected maximum from histogram
if keyword_set(hist) then begin
ibad = -1
repeat begin
ibad = ibad + 1
fname = strmid(new_flist(ibad),strpos(strlowcase(new_flist(ibad)),f_template),18)
if !version.os eq 'vms' then fname = eit_file2path(fname,/gavroc)$
else fname = eit_file2path(strlowcase(fname))
;
; check for too many missing blocks
hdr = headfits(strlowcase(fname))
naxis = eit_fxpar(hdr,'NAXIS')
if naxis eq 2 then nmb = eit_fxpar(hdr,'n_missing_blocks') else $
nmb = eit_fxpar(hdr,'n_missing_blocks',image_no=save_index(ibad))
bad = nmb / (eit_fxpar(hdr,'BLOCKS_HORZ') * eit_fxpar(hdr,'BLOCKS_VERT'))
endrep until bad lt 0.1
;
dum_image = eit_image(strlowcase(fname), degrid = d_image, $
dark = eit_dark(), repl = eit_dark(), header = hdr, $
image_no=save_index(ibad), /flat)
naxis = eit_fxpar(hdr,'NAXIS')
if naxis eq 2 then exp_time = eit_fxpar(hdr,'exptime') else $
exp_time = eit_fxpar(hdr,'exp_time',image_no=save_index(ibad))
;
; Modified for new definition of EXPTIME in V2.0 and later FITS headers.
;
version = float(strmid(eit_fxpar(hdr,'history'),8,3))
if version(0) ge 2.0 then shut_time = 0 else begin
utc_date_obs = anytim2utc(eit_fxpar(hdr,'date_obs',$
image_no=save_index(ibad)))
t_obs = utc_date_obs.mjd + 1.d-3*utc_date_obs.time/86400
shut_time = eit_fxpar(hdr,'SHUTTER CLOSE TIME')
if shut_time le 0 or t_obs lt t_obe then shut_time = 2.1
endelse
exptime = exp_time + shut_time
;
sdev = stdev(d_image,mean)
window, /free,xs=512,ys=512
plot_io, histogram(d_image,bin=5,omin=omin,omax=omax),$
psym=10,xtitle='BIN',yrange=[1,max(d_image)],/ystyle
axis, xaxis=1,xtitle='Flux',xra=[omin,omax], /xstyle
tmax = strtrim(mean+5*sdev)
xyouts, 100,400,'Select a max level, suggest='+tmax,/device,charsiz=1.5
if reproducible_top_value then begin
read, 'Max value? ', top_val
top_val = top_val/exptime(0)
if fresit then top_val = top_val*4.
if qres then top_val = top_val*16.
endif else begin
cursor, top_val,y_val,/data
top_val = (top_val*5+omin)/exptime(0)
if fresit then top_val = top_val*4.
if qres then top_val = top_val*16.
end
wdelete, !d.window
endif
widget_control,ids(6),/sensitive
widget_control,ids(7),/sensitive
end
;------------------------------------------------------------------------------
; procedure to save movie
;------------------------------------------------------------------------------
pro mysave_movie
common filestuff1,dirspec,flist,index,list7,save_file
common parms,dateit,dateend,nxit,nyit,waveit,outfit,halfres,sclit,rbin,qres, $
reproducible_top_value
common parms2,fresit,fmark,use_qkl,use_lz,new_flist,save_index,numfiles,ids
common params,date_start,date_end,n_x,n_y,wavel,top_val
common ratio_par,ratioit,save_195,save_171,s195,s171,mk_ratio,$
title_start,title_end,stamp_time,mk_diff
utc_obe_good = anytim2utc('1996/07/18')
t_obe = utc_obe_good.mjd + 1.d-3*utc_obe_good.time/86400
if use_lz then f_template = 'efz' else f_template = 'efr'
outdir = getenv('movie_dir')
widget_control,outfit,get_value=tsave
save_file = outdir(0)+tsave(0)
;
; create ratio movie from previously saved movies
if mk_ratio then begin
sz1 = size(s195)
sz2 = size(s171)
if sz1(0) eq 0 or sz2(0) eq 0 then begin
print,'You must first create a 171 and a 195 movie'
mk_ratio = 0
return
endif
num = min([sz1(3),sz2(3)])
; replace missing blocks
for i = 1, num - 1 do fake_missing_blocks, s171, i, /before, $
block = 16
fake_missing_blocks, s171, 0, /after, block = 16
for i = 1, num - 1 do fake_missing_blocks, s195, i, /before, $
block = 16
fake_missing_blocks, s195, 0, /after, block = 16
;
ratio = s195(*,*,0:num-1)/float(s171(*,*,0:num-1))
s195 = 0
s171 = 0
; scl = 235.
; b0 = byte(scl*(ratio < 1))
;
; D.M. fecit, 1996 July 12, to make the ratio a little more viewable.
;
b0 = bytscl(((ratio > 0.20) < 2.25), top = !d.n_colors - 1)
;
ratio = 0
wave = 3
dtstart = anytim2utc(title_start(0))
dtend = anytim2utc(title_end(0))
if dtend.mjd-dtstart.mjd gt 2 then begin
title_start = anytim2utc(title_start(0),/ecs,/date)
title_end = anytim2utc(title_end(0),/ecs,/date)
endif
title = 'SOHO-EIT '+'195/171 A '+strtrim(title_start(0),2)+$
' - '+strtrim(title_end(0),2)
sz_b = size(b0)
n_x_actual = sz_b(1) & n_y_actual = sz_b(2)
if n_x_actual le 128 then x0 = 0 else x0 = 5
if n_y_actual eq 1024 then y0 = 60 else if n_y_actual le 128 then $
y0 = 2 else y0 = 5
sz_b = size(b0) & n_y_actual = sz_b(2)
if n_y_actual eq 1024 then y0 = 60 else y0 = 5
; minb0 = min(b0(where(b0 gt 0)))
b0 = EIT_RESCALE(temporary(b0),min=0)
; change rebin from 512x512 to *2
nx=sz_b(1)
if rbin then b0 = rebin(temporary(b0),nx*2,n_y_actual*2,num, /sample)
;
b0 = time_stamp(b0, wave, stamp_time, x0, y0)
save, /xdr, file = save_file(0), wave, title, b0, stamp_time
b0 = 0
mk_ratio = 0
print, '%MOVIE_MAKER-S-SAVED, wrote movie ', save_file(0)
return
endif
if n_elements(wavel) eq 0 then widget_control, waveit,get_value=wavel
if n_elements(wavel) eq 0 then wavel = 'all'
if strlowcase(wavel(0)) eq 'all' then wave = 0 else wave = fix(wavel(0))
;
; added for difference movie
sz = n_elements(new_flist) - mk_diff
if fresit then halfres = 0
case 1 of
halfres: b0 = bytarr(n_x/2,n_y/2,sz)
qres: b0 = bytarr(n_x/4,n_y/4,sz)
fresit: begin
ffqr = where(fmark eq 2,qcnt)
if qcnt ne 0 then b0 = bytarr(256,256,sz) $
else b0 = bytarr(512,512,sz)
end
else: b0 = bytarr(n_x,n_y,sz)
endcase
nblock = intarr(sz)
if save_171 then s171 = fix(b0)
if save_195 then s195 = fix(b0)
stamp_time = strarr(sz)
if n_elements(fmark) eq 0 then fmark = intarr(sz)
widget_control, /hourglass
max_color = float(min([!d.n_colors, !d.table_size]) - 1)
;
; read and scale each image in movie
;
; add for difference movie
sz =sz + mk_diff
for i = 0, sz -1 do begin
print, '%MOVIE_MAKER-I-FRAME, processing frame ' + strtrim(i, 2) + '.'
fname = strmid(new_flist(i),strpos(strlowcase(new_flist(i)),f_template),18)
if !version.os eq 'vms' then fname = eit_file2path(fname,/gavroc)$
else fname = eit_file2path(strlowcase(fname))
if halfres then fmark(i) = 1
if fresit then if qcnt ne 0 then begin
case fmark(i) of
1: begin
fmark(i) = 0
qres = 1
end
0: begin
fmark(i) = 1
qres = 0
end
2: begin
fmark(i) = 0
qres = 0
end
endcase
endif
image = eit_image(strlowcase(fname),repl=eit_dark(),dark=eit_dark(),$
n_block=dum,degrid_image=iarr,header=hdr,/flat,$
image_time=dum_time,top=top_val,half=fmark(i),$
image_no=save_index(i),quarter=qres)
naxis = eit_fxpar(hdr,'NAXIS')
if naxis eq 2 then exp_time = eit_fxpar(hdr,'exptime') else begin
exp_time = eit_fxpar(hdr,'exp_time',image_no=save_index(i))
dum_time = eit_fxpar(hdr,'start_time',image_no=save_index(i))
endelse
;
; Modified for new definition of EXPTIME in V2.0 and later FITS headers.
;
version = float(strmid(eit_fxpar(hdr,'history'),8,3))
if version(0) ge 2.0 then shut_time = 0 else begin
utc_date_obs = anytim2utc(eit_fxpar(hdr,'date_obs',$
image_no=save_index(i)))
t_obs = utc_date_obs.mjd + 1.d-3*utc_date_obs.time/86400
shut_time = eit_fxpar(hdr,'SHUTTER CLOSE TIME')
if shut_time le 0 or t_obs lt t_obe then shut_time = 2.1
endelse
exptime = exp_time + shut_time
iarr = temporary(iarr)/float(exptime(0))
if fresit and fmark(i) then iarr = temporary(iarr)*4.
if fresit and qres then iarr = temporary(iarr)*16.
if n_elements(top_val) eq 0 then top_val = max(iarr)
if wave(0) eq 284 then begin
iarr = temporary(iarr)*10
top_val2 = top_val*10
endif else top_val2 = top_val
;
; add in difference movie
if mk_diff then begin
if i ne 0 then begin
sz_a = size(iarr) & bx = fltarr(sz_a(1), sz_a(2), 2)
bx(0,0,0) = iarr_plus1
bx(0,0,1) = iarr < top_val2
fake_missing_blocks, bx ,0, /after, block = 8
fake_missing_blocks, bx ,1, /before, block = 8
iarr_plus1 = bx(*,*,0) - bx(*,*,1)
b0(*,*,sz-1-i) = bytscl(iarr_plus1,min=-5,max=5)
endif
iarr_plus1 = iarr < top_val2
if i ne sz -1 then begin
stamp_time(sz-2-i) = anytim2utc(dum_time,/ecs,/trunc)
endif
endif else begin
scl = max_color/alog10(top_val2)
; if wave(0) eq 304 or wave(0) eq 284 then low = 0.03 else low = 1
case wave(0) of
304: low = 0.2
284: low = 0.15
else: low = 1
endcase
if low lt 1 then begin
b0(*,*,sz-1-i) = bytscl(scl*alog10(temporary((iarr > low) < top_val2)))
endif else begin
b0(*,*,sz-1-i) = byte(scl*alog10(temporary((iarr > low) < top_val2)))
endelse
stamp_time(sz-1-i) = anytim2utc(dum_time,/ecs,/trunc)
nblock(sz-1-i) = dum
endelse
if save_171 then s171(*,*,sz-1-i) = iarr
if save_195 then s195(*,*,sz-1-i) = iarr
iarr= 0
image = 0
if i eq 0 then title_end = anytim2utc(sxpar(hdr,'DATE_OBS'),/ecs,/trunc)
if i eq sz -1 then title_start = anytim2utc(sxpar(hdr,'DATE_OBS'),$
/ecs,/trunc)
endfor
numrep = where(nblock gt 0,cnt)
;
; fill in any missing blocks
; if halfres then block_size = 16 else block_size = 32
block_size = 16
if cnt gt 0 then for i = 0,cnt-1 do begin
if numrep(i) eq 0 then $
fake_missing_blocks,b0, numrep(i), /after, block_size = block_size $
else fake_missing_blocks,b0,numrep(i), /before, block_size=block_size
endfor
if save_171 then $
if cnt gt 0 then for i = 0,cnt-1 do begin
if numrep(i) eq 0 then $
fake_missing_blocks,s171,numrep(i), /after, block_size=block_size $
else fake_missing_blocks,s171,numrep(i), /before, $
block_size = block_size
endfor
if save_195 then $
if cnt gt 0 then for i = 0,cnt-1 do begin
if numrep(i) eq 0 then $
fake_missing_blocks, s195,numrep(i),/after,block_size=block_size $
else fake_missing_blocks, s195,numrep(i),/before,block_size=block_size
endfor
dtstart = anytim2utc(title_start(0))
dtend = anytim2utc(title_end(0))
if dtend.mjd-dtstart.mjd gt 2 then begin
title_start = anytim2utc(title_start(0),/ecs,/date)
title_end = anytim2utc(title_end(0),/ecs,/date)
endif else if dtend.mjd-dtstart.mjd eq 0 then $
title_end = strmid(anytim2utc(title_end(0),/ecs,/time,/trunc),0,5)
;
case wave(0) of
171: lines = ' Fe IX/X '
195: lines = ' Fe XII '
284: lines = ' Fe XV '
304: lines = ' He II/Si XI '
else: lines = ''
endcase
;
start_len = strlen(title_start(0)) & end_len = strlen(title_end(0))
if start_len eq 19 then begin
title_start(0) = strmid(title_start(0), 0, 16)
end
if end_len eq 19 then begin
title_end(0) = strmid(title_end(0), 0, 16)
end
title = 'SOHO-EIT '+ lines + strtrim(wavel(0), 2) + 'A '+ $
strtrim(title_start(0),2) + ' - ' + strtrim(title_end(0),2) + ' UT'
sz_b = size(b0)
n_x_actual = sz_b(1) & n_y_actual = sz_b(2)
if n_x_actual le 128 then x0 = 0 else x0 = 5
if n_y_actual eq 1024 then y0 = 60 else if n_y_actual le 128 then $
y0 = 2 else y0 = 5
; if n_y eq 1024 then y0 = 60 else y0 = 5
;
; rescale from movie min to movie max if set
if sclit then begin
; minb0 = min(b0(where(b0 gt 0)))
b0 = EIT_RESCALE(temporary(b0),min=0)
endif
; change rebin from 512x512 to *2
nx = sz_b(1)
if rbin then b0 = rebin(temporary(b0), nx*2, n_y_actual*2, sz, /sample)
;
b0 = time_stamp(b0,wave,stamp_time, x0, y0)
;
; Greyscale replaced by wavelength-appropriate color table, 1997 August
; D.M. fecit.
;
; if mk_diff then wave = 0
;
save, /xdr,file=save_file(0), wave, title, b0, stamp_time
b0 = 0
widget_control, hourglass=0
print, '%MOVIE_MAKER-S-SAVED, wrote movie ', save_file(0)
widget_control,ids(6),sensitive=0
widget_control,ids(7),sensitive=0
end
;------------------------------------------------------------------------------
; event handler
;------------------------------------------------------------------------------
PRO MOVMK_Event, Event
common filestuff1,dirspec,flist,index,list7,save_file
common parms,dateit,dateend,nxit,nyit,waveit,outfit,halfres,sclit,rbin,qres, $
reproducible_top_value
common parms2,fresit,fmark,use_qkl,use_lz,new_flist,save_index,numfiles,ids
common params,date_start,date_end,n_x,n_y,wavel,top_val
common ratio_par,ratioit,save_195,save_171,s195,s171,mk_ratio,$
title_start,title_end,stamp_time,mk_diff
;
;
WIDGET_CONTROL,Event.Id,GET_UVALUE=Ev
CASE Ev OF
'donehelp': killhelp1 ;kill help widget
'halfit': BEGIN ;select out size
halfres = 0
rbin = 0
fresit = 0
qres = 0
CASE Event.Value OF
0: halfres = 0
1: halfres = 1 ;select half resolution output
2: qres = 1 ;select quarter resolution output
3: rbin = 1 ;rebin to 512x512
4: fresit = 1 ;select inclusion of full res & binned
ENDCASE
END
'scls': BEGIN ;select rescaling from 0-max
CASE Event.Value OF
0: sclit = 0
1: sclit = 1
ENDCASE
END
'ratioit': BEGIN ;save either 171 or 195 images for
CASE Event.Value OF ;making ratio movie
0: begin
save_171 = 1
save_195 = 0
end
1: begin
save_171 = 0
save_195 = 1
end
2: begin
save_171 = 0
save_195 = 0
end
ENDCASE
END
'BGROUP3': BEGIN
CASE Event.Value OF
0: BEGIN ;get image list
widget_control, dateit, get_value=date_start
widget_control, dateend, get_value=date_end
widget_control, nxit, get_value=n_x
widget_control, nyit, get_value=n_y
widget_control, waveit, get_value=wavel
widget_control, /hourglass
n_x = fix(n_x(0))
n_y = fix(n_y(0))
if n_x lt 32 then n_x = n_x*32
if n_y lt 32 then n_y = n_y*32
if fresit then begin
flist = eit_catrd(timerange=[date_start,date_end],wave=wavel(0),$
object='full fov',lz=use_lz)
null = where(flist ne '',found)
if found ne 0 then flist = flist(null)
; f1 = ''
; f2 = ''
; flist = eit_catrd(timerange=[date_start,date_end],wave=wavel(0),$
; nx=1024,ny=1024,file=f1,lz=use_lz)
; null = where(flist ne '')
; flist = flist(null)
; f1 = f1(null)
; flist2 = eit_catrd(timerange=[date_start,date_end],wave=wavel(0),$
; nx=512,ny=512,xbin=2,ybin=2,file=f2)
; null = where(flist2 ne '')
; flist2 = flist2(null)
; f2 = f2(null)
; if flist(0) ne '' and flist2(0) ne '' then begin
; flist = [flist2,flist]
; flist = flist(sort([f2,f1]))
; endif
endif else begin
flist = eit_catrd(timerange=[date_start,date_end],wave=wavel(0),$
nx=n_x,ny=n_y,lz=use_lz)
good = where(flist ne '',found)
if found ne 0 then flist = flist(good)
endelse
;
flist = flist(where(strpos(flist, 'D:') lt 0))
;
if flist(0) ne '' then flist = reverse(flist)
widget_control, hourglass=0
widget_control, numfiles,set_value=n_elements(flist)
widget_control, list7,set_value=flist
END
1: showeit1 ;display selected image
2: begin ;delete selected image
sz = n_elements(flist)
newlist = strarr(sz-1)
case index of
0: newlist = flist(1:sz-1)
sz-1: newlist = flist(0:sz-2)
else: begin
newlist(0:index-1) = flist(0:index-1)
newlist(index:sz-2) = flist(index+1:sz-1)
end
endcase
flist = newlist
widget_control, numfiles,set_value=n_elements(flist)
widget_control, list7,set_value=flist
end
3: scaleit ;auto-scale images(central 100x100)
4: scaleit,/roiit ;use region of interest scaling
5: scaleit,/hist ;histogram defined max
6: mysave_movie ;save movie
7: begin
save_171 = 0
save_195 = 0
mk_diff = 1
mysave_movie
mk_diff = 0
end
8: begin ;save ratio movie
mk_ratio = 1
widget_control, /hourglass
mysave_movie
widget_control, hourglass = 0
end
ELSE: Message, /continue,'Unknown button pressed'
ENDCASE
END
'BGROUP4': BEGIN
CASE Event.Value OF
0: eit_movie, save_file(0) ;view last made movie
1: XLOADCT, file=getenv('coloreit') ;xloadct
2: WIDGET_CONTROL, /DESTROY, event.top ;exit
3: helpout1 ;help
ELSE: Message, /continue,'Unknown button pressed'
ENDCASE
END
'LIST7': begin
index = event.index ;get index for file choice
if event.clicks eq 2 then showeit1
end
ENDCASE
END
;------------------------------------------------------------------------------
; top level routine - set up main widget interface as well as initial values
;------------------------------------------------------------------------------
PRO movie_maker, GROUP = Group, rtv = rtv
common filestuff1,dirspec,flist,index,list7,save_file
common parms,dateit,dateend,nxit,nyit,waveit,outfit,halfres,sclit,rbin,qres, $
reproducible_top_value
common parms2,fresit,fmark,use_qkl,use_lz,new_flist,save_index,numfiles,ids
common ratio_par,ratioit,save_195,save_171,s195,s171,mk_ratio,$
title_start,title_end,stamp_time,mk_diff
;
IF N_ELEMENTS(Group) EQ 0 THEN GROUP = 0
reproducible_top_value = keyword_set(rtv)
MOVMK = WIDGET_BASE(GROUP_LEADER=Group, COLUMN=1, MAP=1, $
TITLE='EIT Movie Maker', UVALUE='MOVMK')
mk_ratio = 0
mk_diff = 0
Btns459 = [ 'Update Listing','Display Image','Delete Image','Auto Scale',$
'ROI Scale','Hist Scale','Save Movie','Save Diff','Make Ratio']
BGROUP3 = CW_BGROUP( MOVMK, Btns459, ROW=1, UVALUE='BGROUP3', ids=ids)
widget_control,ids(6),sensitive=0
widget_control,ids(7),sensitive=0
BTNS460 = ['View Movie','XLOADCT','Done','Help' ]
BGROUP4 = CW_BGROUP( MOVMK, Btns460, ROW=1, UVALUE='BGROUP4')
child = WIDGET_BASE(MOVMK, /row)
dateit = cw_field(child,VALUE=strmid(!stime,0,11),title='Select Start Date:',$
UVALUE='dateit',YSIZE=1,xsize=20)
dateend = cw_field(child,VALUE=strmid(!stime,0,11),title='Select End Date:',$
UVALUE='dateend',YSIZE=1,xsize=20)
use_qkl = 1 & use_lz = 0
child = WIDGET_BASE(MOVMK, /row)
nxit = cw_field(child,VALUE=1024,title='Select X size:',$
UVALUE='nx',YSIZE=1,xsize=5)
nyit = cw_field(child,VALUE=1024,title='Select Y size:',$
UVALUE='ny',YSIZE=1,xsize=5)
waveit = cw_field(child,VALUE=' ',title='Select Wavelength:',$
UVALUE='waveit',YSIZE=1,xsize=5)
sclit = 0
scls = cw_bgroup(child, ['Std. Scale','Rescale min-to-max'],/exclusive,$
/frame,/row,uvalue='scls',set_value=0)
child = WIDGET_BASE(MOVMK, /row)
halfres = 0
rbin = 0
fresit = 0
qres = 0
halfit = cw_bgroup(child, ['Full Res','Half Res','Quarter Res',$
'Rebin Twice Size','Include Full+Binned'],/exclusive,/frame,$
/row,uvalue='halfit',set_value=0)
save_171 = 0
save_195 = 0
ratioit = cw_bgroup(child, ['Save 171','Save 195','No save'],/exclusive,$
/frame,/row,uvalue='ratioit',set_value=2)
child = WIDGET_BASE(MOVMK, /row)
dum = anytim2utc(!stime,/ecs)
tdum = strmid(dum,0,4)+strmid(dum,5,2)+strmid(dum,8,2)
save_file = 'ems'+tdum+'_xxx.save'
outfit = cw_field(child,VALUE=save_file,title='Movie File Name:',$
UVALUE='outfit',YSIZE=1,xsize=30)
LABEL16 = WIDGET_LABEL( MOVMK, UVALUE='LABEL16', $
VALUE='List of Files for Movie')
;list widget - displays todays QKL files by default
flist = eit_catrd()
if flist(0) ne '' then flist = reverse(flist)
ys = n_elements(flist)
numfiles = cw_field(movmk,value=ys,uvalue='numfiles',ysize=1,xsize=5,$
title='Number Selected Files:',/noedit)
LIST7 = WIDGET_LIST( MOVMK,VALUE=flist, UVALUE='LIST7', YSIZE=min([10,ys]))
WIDGET_CONTROL, MOVMK, /REALIZE
XMANAGER, 'MOVMK', MOVMK
END
Last revised: - Wed May 9 21:45:06 2007- F. Auchère