Viewing contents of file '../idllib/astron/contrib/varosi/code/allpro/efficiency.pro'
; NAME:
;	Effic_Event
;
; PURPOSE:
;	Process button events which are user requests to display,
;	analyze, store/Load, etc..., the efficiency data/results acquired,
;	or unmap/destroy the widget if the user has pressed the DONE button.
;	This is the event handler routine that the Xmanager calls when
;	an event occurs for Efficiency widget.
;
; CALLING:
;	Effic_Event, event
;
; INPUT:
;	event = structure variable defining the widget event.
;
; EXTERNAL CALLS:
;	pro Print/Plot/Edit/Save_Eff_Meas
;	pro Restore_Eff_M
;	pro Calc_Effics
;	pro Print/Plot/Save/Restore_Effics
;	pro Plot_Reflect
;	pro Model_Effic
;	pro iconify_windows
; COMMON BLOCKS:
;	common Efficiency, effic_widget
;	common Analyze_Image, analyze_widget
;	common Effic_Data, eff_meas	;the List of measurements.
;	common Effic_Calc, effics	;the computed results
; PROCEDURE:
;	Big CASE breakdown.
; HISTORY:
;	Frank Varosi NASA/GSFC 1994.

pro Effic_Event, event

   common Efficiency, effic_widget
   common Analyze_Image, analyze_widget
   common Effic_Data, eff_meas		;the List of measurements.
   common Effic_Calc, effics		;the computed results
   common Effic_Reflect, ref_mirr, ref_grat
   common Model_Effics, win_ge, win_ae

     effic_widget.dir_io = effic_widget.dir_io_save

     if N_struct( analyze_widget ) EQ 1 then begin
     	if ( analyze_widget.active ) then $
		effic_widget.dir_io = analyze_widget.imspec(1).dir_io
      endif

     WIDGET_CONTROL, event.id, GET_UVALUE=uval

     CASE uval(0) OF

	"DONE": BEGIN
			if (effic_widget.group GT 0) then begin
				WIDGET_CONTROL, event.top, MAP=0
				WIDGET_CONTROL, effic_widget.group, $
						/SHOW,ICON=0,BAD=id
			 endif else begin
				effic_widget.base = 0
				WIDGET_CONTROL, event.top, /DESTROY
			  endelse

			iconify_windows, effic_widget.windows
		  END

	"PRINT":	Print_Eff_Meas, eff_meas

	"PRINT_F":	Print_Eff_Meas, eff_meas,/HARDCOPY, $
					DIR=effic_widget.dir_io

	"PLOT": BEGIN
			win = effic_widget.windows(0)
			Plot_Eff_Meas, eff_meas, WINDOW=win
			effic_widget.windows(0) = win
		END

	"PLOT_F":	Plot_Eff_Meas, eff_meas, /HARDCOPY, $
					DIR=effic_widget.dir_io

	"EDIT":		Edit_Eff_Meas, eff_meas

	"NEW": BEGIN
	    if N_struct( eff_meas ) GT 0 then begin
		if yes_no_menu( "really start a new List",/BIN,/NO ) then begin
			if min( eff_meas.saved ) LE 0 then $
				Save_Eff_Meas, eff_meas, $
				  NAME=strconcat( get_words( systime() ) + "_" )
			eff_meas = 0
		   endif
		endif
	     END

	"SET":		Set_Grat_Parms, effics

	"SAVE_L":	Save_Eff_Meas, eff_meas, DIR=effic_widget.dir_io

	"RESTORE_L": BEGIN
			dir_io = effic_widget.dir_io
			Restore_Eff_M, eff_meas, DIR=dir_io
			effic_widget.dir_io = dir_io
			END
	"READ": BEGIN
			ref_mirr = Read_Reflect( "MIRROR" )
			ref_grat = Read_Reflect( "GRATING" )
		END

	"COMPUTE": BEGIN
			Calc_Effics, eff_meas, effics, REF_MIRROR=ref_mirr, $
							REF_GRATING=ref_grat
			if N_struct( eff_meas ) GT 0 then begin
				win = effic_widget.windows(1)
				Plot_Effics, effics, WINDOW=win
				effic_widget.windows(1) = win
			   endif
		     END

	"PLOTEFF": BEGIN
			win = effic_widget.windows(1)
			Plot_Effics, effics, WINDOW=win
			effic_widget.windows(1) = win
		     END

	"PLOT_PS":	Plot_Effics, effics, /HARDCOPY, $
					DIR=effic_widget.dir_io

	"PLOTREF": BEGIN
			win = effic_widget.windows(2)
			Plot_Reflect, effics, WINDOW=win, REF_MIRR=ref_mirr, $
							REF_GRAT=ref_grat
			effic_widget.windows(2) = win
		     END

	"PLOTR_PS":	Plot_Reflect, effics, /HARD, DIR=effic_widget.dir_io, $
					REF_MIRR=ref_mirr, REF_GRAT=ref_grat

	"PRINT_E":	Print_Effics, effics

	"PRINT_EF":	Print_Effics, effics,/HARDCOPY, $
					DIR=effic_widget.dir_io

	"SAVE_EFF":	Save_Effics, effics, DIR=effic_widget.dir_io

	"RESTORE_EFF": BEGIN
			dir_io = effic_widget.dir_io
			Restore_Effics, effics, DIR=dir_io
			effic_widget.dir_io = dir_io
			END

;	"PWIDGET": BEGIN
;		if N_struct( effics ) GT 0 then begin
;			Pwidget, GROUP=event.top, effics.wavelength, $
;				 [[effics.absolute], [effics.groove] ]
;		   endif
;		END

	"FIT_EFF": BEGIN
			Model_Effics, effics
			if N_elements( win_ae ) EQ 1 then $
				effic_widget.windows(3:4) = [ win_ge, win_ae ]
		     END

	  else:	BEGIN
			help,/st,event
			message,uval(0)+" not implemented",/INFO
		  END
     ENDCASE

   if N_struct( analyze_widget ) EQ 1 then begin
	if (NOT analyze_widget.active) then $
		effic_widget.dir_io_save = effic_widget.dir_io
     endif else effic_widget.dir_io_save = effic_widget.dir_io
END

;+
; NAME:
;	Efficiency
;
; PURPOSE:
;	Create a widget to control the analysis of grating efficiency data
;	and then display/hardcopy the computed efficiency curves.
;
; CALLING:
;	Efficiency
;
; KEYWORD INPUTS:
;
;	GROUP = the ID of the widget that calls this procedure,
;		if specified, death of caller results in death of this widget.
;
;	PARENT = the ID of the widget which is to be the top level base of the
;		new widget created by this procedure. If specified,
;		this Efficiency widget is just defined but not realized.
;
;	XPOS, YPOS = desired position on screen of free base (no parent) widget.
;
; EFFECTS:
;	Initiates the Xmanager if it is not already running.
;
; EXTERNAL CALLS:
;	pro Xmanager
;	function widget_Tree_Map
; COMMON BLOCKS:
;	common Efficiency, effic_widget
; PROCEDURE:
;	Create and register the widgets with the Xmanager.
;	Selection events are then processed by pro Effic_Event.
; HISTORY:
;	Frank Varosi NASA/GSFC 1994.
;-

pro Efficiency, GROUP=group, PARENT=parent, XPOS=xpos, YPOS=ypos

   common Efficiency, effic_widget

	if N_struct( effic_widget ) NE 1 then begin

		effic_widget ={	base:0L			,$
				parent:0L		,$
				group:0L		,$
				dir_io:"~/opt/"		,$
				dir_io_save:""		,$
				windows:replicate(-1,5)	,$
				wmap: replicate( widget_Tree_Map(), 50 ) }

		effic_widget.dir_io_save = effic_widget.dir_io
	   endif

	if WIDGET_INFO( effic_widget.base, /VALID ) then begin
		message,"widget exists...now showing",/INFO
		WIDGET_CONTROL, effic_widget.base, /SHOW, ICON=0
		return
	   endif

	if N_elements( parent ) EQ 1 then begin

		base = WIDGET_BASE( parent, /FRAME, /COLUMN, SPACE=12 )
		label = WIDGET_LABEL( base, VALUE = "Efficiency Analysis" )
		effic_widget.base = -base
		effic_widget.parent = parent

	  endif else begin

		base = WIDGET_BASE( TIT="Efficiency Analysis",/COLUMN, $
							YPAD=16, SPACE=16 )
		effic_widget.base = base
		effic_widget.parent = 0
		if N_elements( group ) EQ 1 then effic_widget.group = group $
					    else effic_widget.group = 0
	   endelse

	basem = WIDGET_BASE( base,/COLUMN,/FRAME )
	Lid = WIDGET_LABEL( basem, VAL="Efficiency Measurement List options:" )
	b = WIDGET_BUTTON( basem, UVAL="EDIT", VALUE="EDIT the List" )
	b = WIDGET_BUTTON( basem, UVAL="NEW", VALUE="NEW List" )

	basepr = WIDGET_BASE( basem,/ROW )
	b1 = WIDGET_BUTTON( basepr, UVAL="PRINT", VALUE="PRINT the List" )
	b = WIDGET_BUTTON( basepr, UVAL="PRINT_F", VALUE="to a File" )

	basepl = WIDGET_BASE( basem,/ROW )
	b = WIDGET_BUTTON( basepl, UVAL="PLOT", VALUE="PLOT the List" )
	b = WIDGET_BUTTON( basepl, UVAL="PLOT_F", VALUE="to PostScript" )

	basesr = WIDGET_BASE( basem,/ROW )
	b = WIDGET_BUTTON( basesr, UVAL="SAVE_L", VALUE="SAVE the List" )
	b = WIDGET_BUTTON( basesr, UVAL="RESTORE_L", VALUE="RESTORE" )

	b = WIDGET_BUTTON( base, UVAL="READ", VALUE="READ reflectance files" )
	b = WIDGET_BUTTON( base, UVAL="SET", VALUE="SET grating parameters" )
	b = WIDGET_BUTTON( base, UVAL="COMPUTE", VALUE="COMPUTE efficiencies" )

	baser = WIDGET_BASE( base,/COLUMN,/FRAME )

	basepr = WIDGET_BASE( baser,/ROW )
	b1 = WIDGET_BUTTON( basepr, UVAL="PRINT_E", VALUE="PRINT efficiencies" )
	b = WIDGET_BUTTON( basepr, UVAL="PRINT_EF", VALUE="to a File" )

	basepl = WIDGET_BASE( baser,/ROW )
	b = WIDGET_BUTTON( basepl, UVAL="PLOTEFF", VALUE="PLOT efficiencies" )
	b = WIDGET_BUTTON( basepl, UVAL="PLOT_PS", VALUE="to PostScript" )

	basepl = WIDGET_BASE( baser,/ROW )
	b = WIDGET_BUTTON( basepl, UVAL="PLOTREF", VALUE="PLOT reflectances" )
	b = WIDGET_BUTTON( basepl, UVAL="PLOTR_PS", VALUE="to PostScript" )

	basesr = WIDGET_BASE( baser,/ROW )
	b = WIDGET_BUTTON( basesr, UVAL="SAVE_EFF", VALUE="SAVE the Results" )
	b = WIDGET_BUTTON( basesr, UVAL="RESTORE_EFF", VALUE="RESTORE" )

;	b = WIDGET_BUTTON( base, UVAL="PWIDGET", VALUE="Plot Widget" )

	b = WIDGET_BUTTON( base, UVAL="FIT_EFF", VALUE="FIT Effic. with MODEL" )

	if N_elements( parent ) NE 1 then begin
		b = WIDGET_BUTTON( base, VALUE="DONE", UVALUE="DONE" )
		WIDGET_CONTROL, base, /REALIZE
		widget_Location, base, XPOS=xpos, YPOS=ypos
		WIDGET_CONTROL, b1, /INPUT_FOCUS
	   endif

	effic_widget.wmap = widget_Tree_Map( base )

	Xmanager, "effic", base, GROUP=group
END