EIT Software Listings

 

anal
obsolete
response
util

 

Previous Routine
Next Routine

 

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

 


;+
; 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


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:06 2007- F. Auchère