;+
; Project     : SOHO - CDS     
;                   
; Name        : MK_WAVECAL
;               
; Purpose     : To allow loading of CDS wavelength coefficients to database.
;               
; Explanation : Allows user to type in CDS wavelength coefficients and to
;               enter them into the databases.
;               
; Use         : IDL> mk_wavecal
;    
; Inputs      : None - all done via text widget entry
;               
; Opt. Inputs : 
;               
; Outputs     : None
;                                         
; Opt. Outputs: None
;               
; Keywords    : NC - either structure for NIS calibration or a simple
;                    NIS coefficient array.  The former is as returned by
;                    get_wavecal.  If supplied the values will be loaded
;                    into the displays on startup.
;              
;               GC - same as above only for GIS details.
;
; Calls       : ADD_WAVECAL
;
; Common      : MK_WCAL - internal to routines in this file.
;               
; Restrictions: Needs write access to wavelength calibration databases if
;               entries are to be stored.
;               
; Side effects: None
;               
; Category    : Data analysis, wavelength calibration
;               
; Prev. Hist. : None
;
; Written     : C D Pike, RAL, 8-Mar-96
;               
; Modified    : Make NIS quadratic.  CDP, 23-Jul-96
;		Version 3, 18-Apr-1997, William Thompson, GSFC
;			Include entry for effective date
;
; Version     : Version 3, 18-Apr-1997
;-            

pro mk_wavecal_event, ev

common mk_wcal, detector, c_backbase, bands, sel_band, nb_ids, gb_ids, $
                date_widg, file_widg, gset_widg, gset_info, ncoff, gcoff, $
                mess_widg, not_saved, $
                nis1_0, nis1_1, nis1_2, $
                nis2_0, nis2_1, nis2_2, $
                gis1_0, gis1_1, gis1_2, $
                gis2_0, gis2_1, gis2_2, $
                gis3_0, gis3_1, gis3_2, $
                gis4_0, gis4_1, gis4_2



;
;  get the values, user values and type of widget involved
;
widget_control,ev.id,get_uvalue=uvalue,get_value=value
name = strmid(tag_names(ev,/str),7,1000)
if n_elements(uvalue) eq 0 then uvalue = ''
if n_elements(value)  eq 0 then  value = ''
;print,'name: ',name,' value: ',value,' uvalue: ',uvalue

case name of
;
;  Button will be the type for events selecting the setup
;
;
    'BUTTON': begin
                 case uvalue of
                     'EXIT': begin
                                ans = 1
                                if not_saved then begin
                                   ans = xanswer(['Nothing has been saved',$
                                                 'OK to exit?'])
                                endif
                                if ans eq 1 then begin 
                                   widget_control, /destroy, ev.top
                                endif
                             end

;  load existing NIS entry (by time only)
                  'LOADN':   begin
                                xinput, text, $
                                  ['Give time applicable to wavecal to be loaded',$
                                  '(default = now)'],group=ev.top, /modal, tfont=font
                                if text eq '' then get_utc,text
                                errmsg = ''
                                utc = anytim2utc(text,errmsg=errmsg)
                                if errmsg ne '' then begin
                                   bell,2
                                   widget_control, mess_widg, set_val=errmsg
                                endif else begin
                                   errmsg = ''
                                   get_wavecal,'n',utc,wcal,errmsg = errmsg
                                   if errmsg ne '' then begin
                                      bell,2
                                      widget_control, mess_widg, set_val=errmsg
                                   endif else begin
                                      widget_control, nis1_0, $
                                                      set_value = trim(wcal.coeff(0,0,0))
                                      widget_control, nis1_1, $
                                                      set_value = trim(wcal.coeff(0,1,0))
                                      widget_control, nis1_2, $
                                                      set_value = trim(wcal.coeff(0,2,0))
                                      widget_control, nis2_0, $
                                                      set_value = trim(wcal.coeff(1,0,0))
                                      widget_control, nis2_1, $
                                                      set_value = trim(wcal.coeff(1,1,0))
                                      widget_control, nis2_2, $
                                                      set_value = trim(wcal.coeff(1,2,0))
				      widget_control, date_widg, set_value=tai2utc(wcal.date_eff,/vms)
                                      widget_control, file_widg, set_value=wcal.filename
                                      widget_control, mess_widg,$
                                                      set_val='Loaded NIS entry OK'
                                   endelse
                                endelse
                             end

;  load existing GIS entry (by GSET_ID only)
                  'LOADG':   begin
                                loaded_ok = 0
                                widget_control, gset_widg, sens=1
                                widget_control, gset_info, sens=1
                                widget_control, gset_widg, get_val=text
                                text = text(0)
                                if not valid_num(text,/integer) then begin
                                   bell
                                   widget_control, mess_widg, $
                                      set_val='No valid GSET_ID specified'
                                endif else begin
                                   text = fix(text)
                                   errmsg = ''
                                   get_utc,utc
                                   get_wavecal,'g',utc,wcal,$
                                                gset=text,errmsg=errmsg
                                   if errmsg ne '' then begin
                                      bell,2
                                      widget_control, mess_widg, set_val=errmsg
                                   endif else begin
                                      widget_control, gis1_0, $
                                                      set_value = trim(wcal.coeff(0,0,0))
                                      widget_control, gis1_1, $
                                                      set_value = trim(wcal.coeff(0,1,0))
                                      widget_control, gis1_2, $
                                                      set_value = trim(wcal.coeff(0,2,0))
                                      widget_control, gis2_0, $
                                                      set_value = trim(wcal.coeff(1,0,0))
                                      widget_control, gis2_1, $
                                                      set_value = trim(wcal.coeff(1,1,0))
                                      widget_control, gis2_2, $
                                                      set_value = trim(wcal.coeff(1,2,0))
                                      widget_control, gis3_0, $
                                                      set_value = trim(wcal.coeff(2,0,0))
                                      widget_control, gis3_1, $
                                                      set_value = trim(wcal.coeff(2,1,0))
                                      widget_control, gis3_2, $
                                                      set_value = trim(wcal.coeff(2,2,0))
                                      widget_control, gis4_0, $
                                                      set_value = trim(wcal.coeff(3,0,0))
                                      widget_control, gis4_1, $
                                                      set_value = trim(wcal.coeff(3,1,0))
                                      widget_control, gis4_2, $
                                                      set_value = trim(wcal.coeff(3,2,0))
				      widget_control, date_widg, set_value=tai2utc(wcal.date_eff,/vms)
                                      widget_control, file_widg, $
                                                      set_value = wcal.filename
                                      widget_control, mess_widg,$
                                                      set_val='Loaded GIS entry OK'
                                      loaded_ok = 1
                                   endelse
                                endelse
                                if loaded_ok and (detector eq 1) then begin
                                   widget_control, gset_widg, sens=0
                                   widget_control, gset_info, sens=0
                                endif
                             end

                    'SAVEN': begin
;  effective date
			       widget_control, date_widg, get_val=date_eff
			       message = ''
			       date_eff = anytim2tai(date_eff,errmsg=message)
			       if message ne '' then begin
				  bell,2
				  widget_control, mess_widg, set_val=message
				  return
			       endif

;  filename
                               widget_control, file_widg, get_val=wcal_file
                               wcal_file = wcal_file(0)
                               if wcal_file eq ' ' or wcal_file eq '' then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                       set_val=' No file name given'
                                  return
                               endif else begin
                                  break_file, wcal_file, disk, dir, ff, ext
                                  wcal_file = ff
                               endelse


;  NIS1 - constant     
                               widget_control, nis1_0, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'NIS1 constant term not a valid number.'
                                  return
                               endif else begin
                                  ncoff(0,0,0) = double(text)
                               endelse
                       
;  NIS1 - linear       
                               widget_control, nis1_1, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'NIS1 linear term not a valid number.'
                                  return
                               endif else begin
                                  ncoff(0,1,0) = double(text)
                               endelse
                       
;  NIS1 - quadratic       
                               widget_control, nis1_2, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'NIS1 quadratic term not a valid number.'
                                  return
                               endif else begin
                                  ncoff(0,2,0) = double(text)
                               endelse
                       
;                      
;  now we have the forward (pix to wave) coefficients calculate the backwards
;  ones (actually set them to be same and do the conversion on the fly
;  in pix2wave               
;                      
                               ncoff(0,0,1) = ncoff(0,0,0)
                               ncoff(0,1,1) = ncoff(0,1,0)
                               ncoff(0,2,1) = ncoff(0,2,0)

                       
                       
;  NIS2 - constant
                               widget_control, nis2_0, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'NIS2 constant term not a valid number.'
                                  return
                               endif else begin
                                  ncoff(1,0,0) = double(text)
                               endelse
                       
;  NIS2 - linear       
                               widget_control, nis2_1, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'NIS2 linear term not a valid number.'
                                  return
                               endif else begin
                                  ncoff(1,1,0) = double(text)
                               endelse
                       
;  NIS2 - quadratic       
                               widget_control, nis2_2, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'NIS2 quadratic term not a valid number.'
                                  return
                               endif else begin
                                  ncoff(1,2,0) = double(text)
                               endelse
                       
;                      
;  now we have the forward (pix to wave) coefficients calculate the backwards
;  ones (actually set them to be same and do the conversion on the fly
;  in pix2wave               
;                      
                               ncoff(1,0,1) = ncoff(1,0,0)
                               ncoff(1,1,1) = ncoff(1,1,0)
                               ncoff(1,2,1) = ncoff(1,2,0)


;
;  check all entries are non-zero
;
                               bad = 0
                               for i=0,11 do begin
                                  if ncoff(i) eq 0.0 then bad = bad + 1
                               endfor
;
; allow linear
;
                               if ncoff(0,2,0) eq 0.0 then bad = bad - 1
                               if ncoff(0,2,1) eq 0.0 then bad = bad - 1
                               if ncoff(1,2,0) eq 0.0 then bad = bad - 1
                               if ncoff(1,2,1) eq 0.0 then bad = bad - 1

                               if bad gt 0 then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val='NIS coefficients incomplete'
                                  return
                               endif else begin
                                  priv=!priv
                                  !priv=2
                                  stat = add_wavecal(date_eff,'N',ncoff,$
                                                     filename=wcal_file)
                                  !priv=priv
                                  if not stat then begin
                                     bell,3
                                     widget_control, mess_widg, $
                                        set_val='Failed to store NIS entry.'
                                     return
                                  endif else begin
                                     widget_control, mess_widg, $
                                        set_val='Stored NIS entry OK.'
                                        not_saved = 0
                                  endelse
                               endelse
                             end


                    'SAVEG': begin
                                    
;  effective date
			       widget_control, date_widg, get_val=date_eff
			       message = ''
			       date_eff = anytim2tai(date_eff,errmsg=message)
			       if message ne '' then begin
				  bell,2
				  widget_control, mess_widg, set_val=message
				  return
			       endif

;  filename
                               widget_control, file_widg, get_val=wcal_file
                               wcal_file = wcal_file(0)
                               if wcal_file eq ' ' or wcal_file eq '' then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                       set_val=' No file name given'
                                  return
                               endif else begin
                                  break_file, wcal_file, disk, dir, ff, ext
                                  wcal_file = ff
                               endelse

;  GSET ID
                               widget_control, gset_widg, get_val=gset_id
                               gset_id = gset_id(0)
                               if not valid_num(gset_id,/integer) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                       set_val='GSET_ID not a valid integer.'
                                  return
                               endif else begin
                                  gset_id = fix(gset_id)
                                  if gset_id lt 0 then begin
                                     bell,2
                                     widget_control, mess_widg, $
                                          set_val='GSET_ID not a valid integer.'
                                     return
                                  endif
                               endelse
                           
;  GIS1 - constant     
                               widget_control, gis1_0, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS1 constant term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(0,0,0) = double(text)
                               endelse
                       
;  GIS1 - linear       
                               widget_control, gis1_1, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS1 linear term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(0,1,0) = double(text)
                               endelse
                       
;  GIS1 - quadratic    
                               widget_control, gis1_2, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS1 quadratic term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(0,2,0) = double(text)
                               endelse
                       
;                      
;  now we have the forward (pix to wave) coefficients calculate the backwards
;  ones  (for the time being these are the same as the forward direction
;  as wave2pix will do the inversion.
;                      
                               gcoff(0,0,1) = gcoff(0,0,0)
                               gcoff(0,1,1) = gcoff(0,1,0)
                               gcoff(0,2,1) = gcoff(0,2,0)
                       
                               
;  GIS2 - constant     
                               widget_control, gis2_0, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS2 constant term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(1,0,0) = double(text)
                               endelse
                       
;  GIS2 - linear       
                               widget_control, gis2_1, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS2 linear term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(1,1,0) = double(text)
                               endelse
                       
;  GIS2 - quadratic    
                               widget_control, gis2_2, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS2 quadratic term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(1,2,0) = double(text)
                               endelse
                       
                       
                       
;                      
;  now we have the forward (pix to wave) coefficients calculate the backwards
;  ones                
;                      
                               gcoff(1,0,1) = gcoff(1,0,0)
                               gcoff(1,1,1) = gcoff(1,1,0)
                               gcoff(1,2,1) = gcoff(1,2,0)
                       
                       
                       
                               
;  GIS3 - constant     
                               widget_control, gis3_0, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS3 constant term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(2,0,0) = double(text)
                               endelse
                       
;  GIS3 - linear       
                               widget_control, gis3_1, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS3 linear term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(2,1,0) = double(text)
                               endelse
                       
;  GIS3 - quadratic    
                               widget_control, gis3_2, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS3 quadratic term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(2,2,0) = double(text)
                               endelse
                       
;                      
;  now we have the forward (pix to wave) coefficients calculate the backwards
;  ones                
;                      
                               gcoff(2,0,1) = gcoff(2,0,0)
                               gcoff(2,1,1) = gcoff(2,1,0)
                               gcoff(2,2,1) = gcoff(2,2,0)
                               


;  GIS4 - constant     
                               widget_control, gis4_0, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS4 constant term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(3,0,0) = double(text)
                               endelse
                       
;  GIS4 - linear       
                               widget_control, gis4_1, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS4 linear term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(3,1,0) = double(text)
                               endelse
                       
;  GIS4 - quadratic    
                               widget_control, gis4_2, get_val=text
                               text = text(0)
                               if not valid_num(text) then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val=$
                                      'GIS4 quadratic term not a valid number.'
                                  return
                               endif else begin
                                  gcoff(3,2,0) = double(text)
                               endelse
                       
;                      
;  now we have the forward (pix to wave) coefficients calculate the backwards
;  ones
;
                               gcoff(3,0,1) = gcoff(3,0,0)
                               gcoff(3,1,1) = gcoff(3,1,0)
                               gcoff(3,2,1) = gcoff(3,2,0)

;
;  check all constant values are non-zero as a rough check that have
;  all data needed.
;
                               bad = 0
                               for i=0,3 do begin
                                  if gcoff(i) eq 0.0 then bad = 1
                               endfor
                               if bad then begin
                                  bell,2
                                  widget_control, mess_widg, $
                                     set_val='GIS coefficients incomplete'
                                  return
                               endif else begin
                                  priv = !priv
                                  !priv=2
                                  stat = add_wavecal(date_eff,'G',gcoff,$
                                                      gset_id=gset_id,$
                                                      filename=wcal_file)
                                  !priv = priv
                                  if not stat then begin
                                     bell,3
                                     widget_control, mess_widg, $
                                        set_val='Failed to store GIS entry.'
                                     return
                                  endif else begin
                                     widget_control, mess_widg, $
                                        set_val='Stored GIS entry OK.'
                                        not_saved = 0
                                  endelse
                               endelse
                             end


                    'INST1': begin
                                detector = 1
                                sel_band = 0
                                for i=0,3 do widget_control, gb_ids(i),set_b=0
                                for i=0,2 do widget_control, bands(i),map=0
                                widget_control, bands(1),map=1
                                widget_control, gset_info, sens=0
                                widget_control, gset_widg, sens=0
                             end
                    'INST2': begin
                                detector = 10
                                sel_band = 0
                                for i=0,1 do widget_control, nb_ids(i),set_b=0
                                for i=0,2 do widget_control, bands(i),map=0
                                widget_control, bands(2),map=1
                                widget_control, gset_info, sens=1
                                widget_control, gset_widg, sens=1
     
                             end
                      'NB1': sel_band = 1
                      'NB2': sel_band = 2
                      'GB1': sel_band = 1
                      'GB2': sel_band = 2
                      'GB3': sel_band = 3
                      'GB4': sel_band = 4
                       else:
                 endcase
                 if uvalue ne 'EXIT' then begin
                    show = detector * sel_band
                    for i=0,6 do widget_control, c_backbase(i), map=0 
                    case show of
                        1:  widget_control, c_backbase(1), map=1
                        2:  widget_control, c_backbase(2), map=1
                       10:  widget_control, c_backbase(3), map=1
                       20:  widget_control, c_backbase(4), map=1
                       30:  widget_control, c_backbase(5), map=1
                       40:  widget_control, c_backbase(6), map=1
                     else:  widget_control, c_backbase(0), map=1
                    endcase
                 endif
              end
;



;
;   TEXT controls the entry of data to the text windows.
;                    
 'TEXT_CH'  : begin
                 case strmid(uvalue,0,4) of
                    else:
                 endcase
              end
endcase
end
;
; --------------------------------
;  The main routine
; --------------------------------
;

pro mk_wavecal, gc=gc, nc=nc

common mk_wcal, detector, c_backbase, bands, sel_band, nb_ids, gb_ids, $
                date_widg, file_widg, gset_widg, gset_info, ncoff, gcoff, $
                mess_widg, not_saved, $
                nis1_0, nis1_1, nis1_2, $
                nis2_0, nis2_1, nis2_2, $
                gis1_0, gis1_1, gis1_2, $
                gis2_0, gis2_1, gis2_2, $
                gis3_0, gis3_1, gis3_2, $
                gis4_0, gis4_1, gis4_2



;
;  the base widget is all-screen and column-orientated
;
font = '-adobe-helvetica-bold-r-normal--0-120-75-75-p-0-iso8859-1'

base = widget_base(title='CDS Wavelength calibration',xoff=100,$
                   /column,/frame)


;
;  QUIT and store to database buttons
;
store = widget_base(base,/row,space=25)
done = widget_button(store,value='QUIT',uvalue='EXIT',/no_rel, font=font)
sav_nis = widget_button(store,value='SAVE NIS ENTRY',uvalue='SAVEN',$
                        /no_rel, font=font)
sav_gis = widget_button(store,value='SAVE GIS ENTRY',uvalue='SAVEG',$
                        /no_rel, font=font)
temp = widget_base(store)
dummy = widget_label(temp,value='Dummy',font=font)
widget_control, dummy, map=0
load_nis = widget_button(store,value='LOAD Existing NIS entry',uvalue='LOADN',$
                        /no_rel, font=font)
load_gis = widget_button(store,value='LOAD Existing GIS entry',uvalue='LOADG',$
                        /no_rel, font=font)


;
;  the TOP widget is where all the user/numerical/text input takes place
;
top1 = widget_base(base,/column,space=1)
top = widget_base(top1,/row,space=1)



;
;  ...the instrument choice
;
left = widget_base(top,/row)
inst_base = widget_base(left)
inst_list = ['NIS','GIS']
instr_ids = lonarr(2)
xmenu,inst_list,inst_base,/row,/exclusive,title='Instrument',$
                     buttons=instr_ids,uvalue=['INST1','INST2'],/no_release, $
		     font=font


;
;  ...the band choice (3 layers, visibility depending on instrument chosen)
;
right = widget_base(top,/row)
band_base = widget_base(right)
bands = lonarr(3)
bands(0) = widget_base(band_base,map=0)

nb_ids = lonarr(2)
nb_list = ['NIS1','NIS2']
bands(1) = widget_base(band_base,map=0)
xmenu,nb_list,bands(1),/row,/exclusive,title='NIS wavelength band',$
                     buttons=nb_ids,uvalue=['NB1','NB2'],/no_release, $
		     font=font

gb_ids = lonarr(4)
gb_list = ['GIS1','GIS2','GIS3','GIS4']
bands(2) = widget_base(band_base,map=0)
xmenu,gb_list,bands(2),/row,/exclusive,title='GIS wavelength band',$
                     buttons=gb_ids,uvalue=['GB1','GB2','GB3','GB4'],$
                     /no_release,  font=font



;
;  the effective date, typically, the date of launch
;
ccs_info   = widget_base(top,/column)
ccs_info_1 = widget_label(ccs_info,value='Effective date (e.g. launch)', $
			font=font)
date_widg  = widget_text(ccs_info,/edit,xsize=50,ysize=1,uvalue='DATE',$
			value='2-Dec-1995',font=font)

;
;  and inform of FILE NAME from which calibration is derived
;
ccs_info_2 = widget_label(ccs_info,value='Source file name/comments',font=font)
file_widg  = widget_text(ccs_info,/edit,xsize=50,ysize=1,uvalue='FILE',$
                         value=' ',font=font)

;
;  GSET ID (only sensitive for GIS calibrations)
;
gset_info  = widget_label(ccs_info,value='GSET_ID',font=font)
gset_widg  = widget_text(ccs_info,/edit,xsize=5,ysize=1,uvalue='GSET',$
                         value='-1',font=font)
widget_control, gset_info, sens=0
widget_control, gset_widg, sens=0
     

;
;  ... coefficient input (layered for visibility depending on instrument and
;      wavelength band chosen)
;
bot = widget_base(top1,/row,space=1)
c_base = widget_base(bot)
c_backbase = lonarr(7)

;
;  blank for when no instrument is chosen
;
c_backbase(0) = widget_base(c_base,map=0)


;
;  ...NIS1 (300A)  coefficients wave --> pixel
;
c_backbase(1) = widget_base(c_base,map=0)
a = widget_base(c_backbase(1),/column)
a1   = widget_base(a,/column)
a2   = widget_label(a,value='NIS1 (300A) Pix --> Wave  coefficents.',font=font)
a3   = widget_label(a,value=$
      '  wavelength = const + linear*pix + quad*pix*pix ',font=font)
a4   = widget_label(a,value=$
      'Constant               Linear               Quad',font=font)
a5   = widget_base(a,/row,space=50)
nis1_0  = widget_text(a5,/edit,xsize=10,ysize=1,uvalue='NIS1_0',value='0',$
                     font=font)
nis1_1  = widget_text(a5,/edit,xsize=10,ysize=1,uvalue='NIS1_1',value='0', $
                     font=font)
nis1_2  = widget_text(a5,/edit,xsize=15,ysize=1,uvalue='NIS1_2',value='0', $
                     font=font)

;
;  ...NIS2 (500A) coefficients wave --> pixel
;
c_backbase(2) = widget_base(c_base,map=0)
b = widget_base(c_backbase(2),/column)
b1   = widget_base(b,/column)
b2   = widget_label(b,value='NIS2 (500A) Pix --> Wave  coefficents.',font=font)
b3   = widget_label(b,value=$
      '  wavelength = const + linear*pix  *quad*pix*pix',font=font)
b4   = widget_label(b,value=$
      'Constant               Linear               Quad ',font=font)
b5   = widget_base(b,/row,space=50)
nis2_0  = widget_text(b5,/edit,xsize=10,ysize=1,uvalue='NIS2_0',value='0',$
                     font=font)
nis2_1  = widget_text(b5,/edit,xsize=10,ysize=1,uvalue='NIS2_1',value='0', $
                     font=font)
nis2_2  = widget_text(b5,/edit,xsize=15,ysize=1,uvalue='NIS2_2',value='0', $
                     font=font)

;
;  ...GIS1 coefficients wave --> pixel
;
c_backbase(3) = widget_base(c_base,map=0)
c = widget_base(c_backbase(3),/column)
c1   = widget_base(c,/column)
c2   = widget_label(c,value='GIS1 Pix --> Wave  coefficents.',font=font)
c3   = widget_label(c,value=$
      '  wavelength = const + linear*pix + quad*pix*pix',font=font)
c4   = widget_label(c,value=$
      'Constant               Linear               Quad',font=font)
c5   = widget_base(c,/row)
gis1_0  = widget_text(c5,/edit,xsize=10,ysize=1,uvalue='GIS1_0',value='0',$
                     font=font)
gis1_1  = widget_text(c5,/edit,xsize=10,ysize=1,uvalue='GIS1_1',value='0', $
                     font=font)
gis1_2  = widget_text(c5,/edit,xsize=13,ysize=1,uvalue='GIS1_2',value='0', $
                     font=font)
;
;  ...GIS2 coefficients wave --> pixel
;
c_backbase(4) = widget_base(c_base,map=0)
d = widget_base(c_backbase(4),/column)
d1   = widget_base(d,/column)
d2   = widget_label(d,value='GIS2 Pix --> Wave  coefficents.',font=font)
d3   = widget_label(d,value=$
      '  wavelength = const + linear*pix + quad*pix*pix',font=font)
d4   = widget_label(d,value=$
      'Constant               Linear               Quad',font=font)
d5   = widget_base(d,/row)
gis2_0  = widget_text(d5,/edit,xsize=10,ysize=1,uvalue='GIS2_0',value='0',$
                     font=font)
gis2_1  = widget_text(d5,/edit,xsize=10,ysize=1,uvalue='GIS2_1',value='0', $
                     font=font)
gis2_2  = widget_text(d5,/edit,xsize=13,ysize=1,uvalue='GIS2_2',value='0', $
                     font=font)

;
;  ...GIS3 coefficients wave --> pixel
;
c_backbase(5) = widget_base(c_base,map=0)
e = widget_base(c_backbase(5),/column)
e1   = widget_base(e,/column)
e2   = widget_label(e,value='GIS3 Pix --> Wave  coefficents.',font=font)
e3   = widget_label(e,value=$
      '  wavelength = const + linear*pix + quad*pix*pix',font=font)
e4   = widget_label(e,value=$
      'Constant               Linear               Quad',font=font)
e5   = widget_base(e,/row)
gis3_0  = widget_text(e5,/edit,xsize=10,ysize=1,uvalue='GIS3_0',value='0',$
                     font=font)
gis3_1  = widget_text(e5,/edit,xsize=10,ysize=1,uvalue='GIS3_1',value='0', $
                     font=font)
gis3_2  = widget_text(e5,/edit,xsize=13,ysize=1,uvalue='GIS3_2',value='0', $
                     font=font)

;
;  ...GIS1 coefficients wave --> pixel
;
c_backbase(6) = widget_base(c_base,map=0)
f = widget_base(c_backbase(6),/column)
f1   = widget_base(f,/column)
f2   = widget_label(f,value='GIS4 Pix --> Wave  coefficents.',font=font)
f3   = widget_label(f,value=$
      '  wavelength = const + linear*pix + quad*pix*pix',font=font)
f4   = widget_label(f,value=$
      'Constant               Linear               Quad',font=font)
f5   = widget_base(f,/row)
gis4_0  = widget_text(f5,/edit,xsize=10,ysize=1,uvalue='GIS4_0',value='0',$
                     font=font)
gis4_1  = widget_text(f5,/edit,xsize=10,ysize=1,uvalue='GIS4_1',value='0', $
                     font=font)
gis4_2  = widget_text(f5,/edit,xsize=13,ysize=1,uvalue='GIS4_2',value='0', $
                     font=font)


;
;  message window
;
mess_widg = widget_text(base,/edit,xsize=50,ysize=1,value='',font=font)


;
;  Initialise
;
detector = 0
sel_band = 0
gset_id = 0
not_saved = 1
wcal_file = ''
ncoff = dblarr(2,3,2)
gcoff = dblarr(4,3,2)

;
;  if user gave some coefficients already, then load them
;
if keyword_set(nc) then begin
   in_ok = 1
   case datatype(nc,1) of
      'Double': begin
                   if n_elements(nc) eq 8 then begin
                      ncoff = nc
                   endif else begin
                      widget_control, mess_widg,$
                        set_val='Input parameter has wrong dimensions'
                      in_ok = 0
                   endelse
                end
   'Structure': begin
                   if tag_exist(nc,'coeff') then begin
                      if n_elements(nc.coeff) eq 8 then begin
                         ncoff = nc.coeff
                         wcal_file = nc.filename
                      endif else begin
                         widget_control, mess_widg, $
                           set_val='Wrong type of input structure'
                         in_ok = 0
                      endelse
                   endif else begin
                      widget_control, mess_widg,$
                        set_val='Cannot interpret input parameter'
                      in_ok = 0
                   endelse
                end
          else: begin
                   widget_control, mess_widg,$
                        set_val='Cannot interpret input parameter'
                   in_ok = 0
                end
   endcase
   if in_ok then begin
      widget_control, nis1_0, set_value = trim(ncoff(0,0,0))
      widget_control, nis1_1, set_value = trim(ncoff(0,1,0))
      widget_control, nis2_0, set_value = trim(ncoff(1,0,0))
      widget_control, nis2_1, set_value = trim(ncoff(1,1,0))
      widget_control, file_widg, set_value = wcal_file
      widget_control, mess_widg,set_val='Using input coefficients OK'
   endif
endif

if keyword_set(gc) then begin
   in_ok = 1
   case datatype(gc,1) of
      'Double': begin
                   if n_elements(gc) eq 24 then begin
                      gcoff = gc
                      widget_control, mess_widg,$
                        set_val='Using input coefficients OK'
                   endif else begin
                      widget_control, mess_widg,$
                        set_val='Input parameter has wrong dimensions'
                      in_ok = 0
                   endelse
                end
   'Structure': begin
                   if tag_exist(gc,'coeff') then begin
                      if n_elements(gc.coeff) eq 24 then begin
                         gcoff = gc.coeff
                         wcal_file = gc.filename
                         gset_id = gc.gset_id
                      endif else begin
                         widget_control, mess_widg, $
                           set_val='Wrong type of input structure'
                         in_ok = 0
                      endelse
                   endif else begin
                      widget_control, mess_widg,$
                        set_val='Cannot interpret input parameter'
                      in_ok = 0
                   endelse
                end
          else: begin
                   widget_control, mess_widg,$
                           set_val='Cannot interpret input parameter'
                   in_ok = 0
                end
   endcase
   if in_ok then begin
      widget_control, gis1_0, set_value = trim(gcoff(0,0,0))
      widget_control, gis1_1, set_value = trim(gcoff(0,1,0))
      widget_control, gis1_2, set_value = trim(gcoff(0,2,0))
      widget_control, gis2_0, set_value = trim(gcoff(1,0,0))
      widget_control, gis2_1, set_value = trim(gcoff(1,1,0))
      widget_control, gis2_2, set_value = trim(gcoff(1,2,0))
      widget_control, gis3_0, set_value = trim(gcoff(2,0,0))
      widget_control, gis3_1, set_value = trim(gcoff(2,1,0))
      widget_control, gis3_2, set_value = trim(gcoff(2,2,0))
      widget_control, gis4_0, set_value = trim(gcoff(3,0,0))
      widget_control, gis4_1, set_value = trim(gcoff(3,1,0))
      widget_control, gis4_2, set_value = trim(gcoff(3,2,0))
      widget_control, file_widg, set_value = wcal_file
   endif
endif


;
; make the boss do some work
;
widget_control, base, /realize
xmanager,'mk_wavecal',base, modal=modal, group_leader=group_leader

end
