FUNCTION movie_images, astruct, vname, $
THUMBSIZE=THUMBSIZE, FRAME=FRAME, $
XSIZE=XSIZE, YSIZE=YSIZE, GIF=GIF, REPORT=REPORT,$
TSTART=TSTART,TSTOP=TSTOP,NONOISE=NONOISE,$
MOVIE_FRAME_RATE=MOVIE_FRAME_RATE, $
MOVIE_LOOP=MOVIE_LOOP, LIMIT=LIMIT,$
CDAWEB=CDAWEB,DEBUG=DEBUG,COLORBAR=COLORBAR
top = 255
bottom = 0
common colors, r_orig, g_orig, b_orig, r_curr, g_curr, b_curr
if n_elements(movie_frame_rate) eq 0 then movie_frame_rate = 3
if n_elements(movie_loop) eq 0 then movie_loop = 1
w = where(tag_names(astruct) eq strupcase(vname),wc)
if (wc eq 0) then begin
print,'ERROR=No variable with the name:',vname,' in param 1!' & return,-1
endif else vnum = w[0]
Zvar = astruct.(vnum)
if keyword_set(COLORBAR) then COLORBAR=1L else COLORBAR=0L
if COLORBAR then xco=80 else xco=0
if keyword_set(REPORT) then reportflag=1L else reportflag=0L
if (n_elements(LIMIT) gt 0) then begin
if keyword_set(LIMIT) then LIMIT = 1L else LIMIT = 0L
endif else LIMIT=1L
a = size(astruct.(vnum))
if (a[n_elements(a)-2] ne 8) then begin
print,'ERROR= 1st parameter to plot_images not a structure' & return,-1
endif else begin
a = tagindex('DAT',tag_names(astruct.(vnum)))
if (a[0] ne -1) then idat = astruct.(vnum).DAT $
else begin
a = tagindex('HANDLE',tag_names(astruct.(vnum)))
if (a[0] ne -1) then handle_value,astruct.(vnum).HANDLE,idat $
else begin
print,'ERROR= 1st parameter does not have DAT or HANDLE tag' & return,-1
endelse
endelse
endelse
b = astruct.(vnum).DEPEND_0 & c = tagindex(b[0],tag_names(astruct))
d = tagindex('DAT',tag_names(astruct.(c)))
if (d[0] ne -1) then edat = astruct.(c).DAT $
else begin
d = tagindex('HANDLE',tag_names(astruct.(c)))
if (d[0] ne -1) then handle_value,astruct.(c).HANDLE,edat $
else begin
print,'ERROR= Time parameter does not have DAT or HANDLE tag' & return,-1
endelse
endelse
a = tagindex('SOURCE_NAME',tag_names(astruct.(vnum)))
if (a[0] ne -1) then b = astruct.(vnum).SOURCE_NAME else b = ''
a = tagindex('DESCRIPTOR',tag_names(astruct.(vnum)))
if (a[0] ne -1) then b = b + ' ' + astruct.(vnum).DESCRIPTOR
window_title = b
if keyword_set(nonoise) then window_title=window_title+'!CConstrained values within >3-sigma from mean of all plotted values'
if(COLORBAR) then begin
a=tagindex('UNITS',tag_names(astruct.(vnum)))
if(a[0] ne -1) then ctitle = astruct.(vnum).UNITS else ctitle=''
endif
if keyword_set(XSIZE) then xs=XSIZE else xs=512
if keyword_set(YSIZE) then ys=YSIZE else ys=512
vkluge=0
tip = tagindex('PLATFORM',tag_names(astruct.(vnum)))
if (tip ne -1) then begin
if (astruct.(vnum).platform eq 'Viking') then vkluge=1
endif
tip = tagindex('DESCRIPTOR',tag_names(astruct.(vnum)))
if (tip ne -1) then begin
descriptor=str_sep(astruct.(vnum).descriptor,'>')
endif
a = tagindex('DATA_TYPE',tag_names(astruct.(vnum)))
if (a[0] ne -1) then begin
b = b + ' ' + astruct.(vnum).DATA_TYPE
d_type = strupcase(str_sep((astruct.(vnum).DATA_TYPE),'>'))
endif
isize = size(idat)
if (isize[0] eq 2) then n_images=1 else n_images=isize[isize[0]]
if (n_images eq 1) then FRAME=1
if keyword_set(FRAME) then begin
if ((FRAME ge 1)AND(FRAME le n_images)) then begin
print, 'ERROR= Single movie frame found'
print, 'STATUS= Single movie frame; select longer time range.'
return, -1
endif
endif else begin
if(n_images gt 200 and LIMIT) then begin
print, 'ERROR= Too many movie frames '
print, 'STATUS= You have requested ',n_images,' frames.'
print, 'STATUS= Movies are limited to 200 frames, select a shorter time range.'
return, -1
endif
isize = size(idat)
if (isize[0] eq 2) then begin
nimages = 1 & npixels = double(isize[1]*isize[2])
endif else begin
nimages = isize[isize[0]] & npixels = double(isize[1]*isize[2]*nimages)
endelse
if NOT keyword_set(TSTART) then start_frame = 0 $
else begin
w = where(edat ge TSTART,wc)
if wc eq 0 then begin
print,'ERROR=No image frames after requested start time.' & return,-1
endif else start_frame = w[0]
endelse
if NOT keyword_set(TSTOP) then stop_frame = nimages $
else begin
w = where(edat le TSTOP,wc)
if wc eq 0 then begin
print,'ERROR=No image frames before requested stop time.' & return,-1
endif else stop_frame = w[wc-1]
endelse
if (start_frame gt stop_frame) then no_data_avail = 1L $
else begin
no_data_avail = 0L
if ((start_frame ne 0)OR(stop_frame ne nimages)) then begin
idat = idat[*,*,start_frame:stop_frame]
isize = size(idat)
if (isize[0] eq 2) then begin
print, 'ERROR= Single movie frame found'
print, 'STATUS= Single movie frame; select longer time range.'
return, -1
endif else nimages = isize[isize[0]]
edat = edat[start_frame:stop_frame]
endif
endelse
label_space = 12
if (no_data_avail eq 0) then begin
a = tagindex('VALIDMIN',tag_names(astruct.(vnum)))
if (a[0] ne -1) then begin & b=size(astruct.(vnum).VALIDMIN)
if (b[0] eq 0) then zvmin = astruct.(vnum).VALIDMIN $
else begin
zvmin = 0
print,'WARNING=Unable to determine validmin for ',vname
endelse
endif
a = tagindex('VALIDMAX',tag_names(astruct.(vnum)))
if (a[0] ne -1) then begin & b=size(astruct.(vnum).VALIDMAX)
if (b[0] eq 0) then zvmax = astruct.(vnum).VALIDMAX $
else begin
zvmax = 2000
print,'WARNING=Unable to determine validmax for ',vname
endelse
endif
a = tagindex('FILLVAL',tag_names(astruct.(vnum)))
if (a[0] ne -1) then begin & b=size(astruct.(vnum).FILLVAL)
if (b[0] eq 0) then zfill = astruct.(vnum).FILLVAL $
else begin
zfill = 2000
print,'WARNING=Unable to determine Image fill value for ',vname
endelse
endif
if keyword_set(DEBUG) then begin
print, 'Image valid min and max: ',zvmin, ' ',zvmax
wmin = min(idat,MAX=wmax)
print, 'Actual min and max of data',wmin,' ', wmax
endif
w = where((idat lt zvmin or idat eq zfill),wc)
if wc gt 0 then begin
print,'WARNING=setting ',wc,' fill values in image data to validmin...'
idat[w] = zvmin
w = 0
if wc eq npixels then print,'WARNING=All data outside min/max!!'
if (zvmin le 0 ) then print, 'WARNING=Z validmin <= zero'
endif
w = where((idat gt zvmax),wc)
if wc gt 0 then begin
if keyword_set(DEBUG) then print,'WARNING=setting ',wc,' fill values in image data to red...'
diff = zvmax - zvmin
coffset = red_offset(GIF=GIF,diff)
print, 'diff = ',diff, ' coffset = ',coffset
idat[w] = zvmax - coffset
w = 0
if wc eq npixels then print,'WARNING=All data outside min/max!!'
endif
if keyword_set(NONOISE) then begin
print, 'before semiminmax min and max = ', zvmin, zvmax
semiMinMax,idat,zvmin,zvmax,/MODIFIED
w = where((idat lt zvmin),wc)
if wc gt 0 then begin
print,'WARNING=filtering values less than 3-sigma from image data...'
idat[w] = zvmin
w = 0
endif
w = where((idat gt zvmax),wc)
if wc gt 0 then begin
print,'WARNING=filtering values greater than 3-sigma from image data...'
diff = zvmax - zvmin
coffset = red_offset(GIF=GIF,diff)
print, 'diff = ',diff, ' coffset = ',coffset
idat[w] = zvmax - coffset
w = 0
endif
endif
idat = congrid(idat,(xs-40),(ys-50),nimages)
idmax=max(idat) & idmin=min(idat)
if keyword_set(DEBUG) then begin
print, '!d.table_size = ',!d.table_size
print, 'min and max after filtering = ',idmin, ' ', idmax
endif
idat = bytscl(idat,min=idmin, max=idmax, top=!d.table_size-8)
if keyword_set(DEBUG) then begin
bytmin = min(idat, max=bytmax)
print, 'min and max after bytscl = ',bytmin, ' ', bytmax
endif
if keyword_set(GIF) then begin
GIF1=GIF+"junk"
deviceopen,6,fileOutput=GIF1,sizeWindow=[xs+xco,ys+40]
if (no_data_avail eq 0) then begin
if(reportflag eq 1) then printf,1,'MGIF=',GIF
print,'MGIF=',GIF
endif else begin
if(reportflag eq 1) then printf,1,'MGIF=',GIF
print,'MGIF=',GIF
endelse
endif else begin
window,/FREE,XSIZE=xs+xco,YSIZE=ys+40,TITLE=window_title
print,'STATUS=Movie X Windows option not available, please select output to GIF.'
return, 0
endelse
xmargin=!x.margin
if COLORBAR then begin
if (!x.omargin[1]+!x.margin[1]) lt 14 then !x.margin[1] = 14
!x.margin[1] = 14
plot,[0,1],[0,1],/noerase,/nodata,xstyle=4,ystyle=4
endif
if (vkluge)then for j=0,nimages-1 do idat[*,*,j] = rotate(idat[*,*,j],7)
irow=0
icol=0
for j=0,nimages-1 do begin
if(descriptor[0] eq 'VIS') then $
idat[*,*,j]=rotate(rotate(idat[*,*,j],5),2)
if(descriptor[0] eq 'UVI') then begin
cdf_epoch, edat[j], yr,mn,dy,hr,min,sec,milli,/break
ical,yr,doy,mn,dy,/idoy
if(fix(yr) eq 1996) then begin
if(doy lt 337) then begin
temp_dat=idat[*,*,j]
temp_dat=rotate(temp_dat,3)
idat[*,*,j]=transpose(temp_dat)
endif
endif
if ((d_type[0] eq 'H2') or (d_type[0] eq 'H3')) then begin
if (j eq 0 ) then begin
dims = size(idat,/dimensions)
idat2 = bytarr(dims[1],dims[0],dims[2])
endif
idat2[*,*,j]=transpose(idat[*,*,j])
endif
endif
xpos=10
ypos=30
if ((d_type[0] eq 'H2') or (d_type[0] eq 'H3')) then begin
tv,idat2[*,*,j],xpos,ypos,/DEVICE
endif else begin
tv,idat[*,*,j],xpos,ypos,/DEVICE
endelse
edate = decode_cdfepoch(edat[j])
xyouts, xpos, ypos-8, edate, color=!d.table_size-1, /DEVICE
icol=icol+1
project_subtitle,astruct.(0),window_title,/IMAGE, $
TIMETAG=[edat[0],edat[nimages-1]]
if COLORBAR then begin
if (n_elements(cCharSize) eq 0) then cCharSize = 0.
cscale = [idmin, idmax]
xwindow = !x.window
offset = 0.01
colorbar, cscale, ctitle, logZ=0, cCharSize=cCharSize, $
position=[!x.window[1]+offset, !y.window[0],$
!x.window[1]+offset+0.03, !y.window[1]],$
fcolor=244, /image
!x.window = xwindow
endif
image = tvrd()
tvlct, r,g,b, /get
write_mgif, GIF, image, r, g, b, delay=(100/movie_frame_rate), loop=movie_loop
if keyword_set(GIF) then device,/close
endfor
write_mgif, GIF, /close
!x.margin=xmargin
if keyword_set(GIF) then deviceclose
endif else begin
print,'STATUS=No data in specified time period.'
if keyword_set(GIF) then begin
xyouts,xs/2,ys/2,/device,alignment=0.5,color=244,$
'NO DATA IN SPECIFIED TIME PERIOD'
deviceclose
endif else begin
xyouts,xs/2,ys/2,/device,alignment=0.5,'NO DATA IN SPECIFIED TIME PERIOD'
endelse
endelse
endelse
if keyword_set(GIF) then device,/close
return,0
end