
;+
; 
;             NAME : eis_search_rasters
; 
;          PURPOSE : To search the EIS raster database
;
; CALLING SEQUENCE : eis_search_rasters
; 
;           INPUTS : none
; 
;  OPTIONAL INPUTS : none
; 
;         KEYWORDS : input_file - An ascii text file containing a list
;                    of emission lines is read. This keyword can be
;                    used to specify an alternative to the default.
; 
;          OUTPUTS : A list of EIS rasters.
;
; OPTIONAL OUTPUTS : none
;
;    COMMON BLOCKS : none
; 
;          EXAMPLE : eis_search_rasters
;
;    SPECIAL CALLS : eis_search_rasters_driver
;                    eis_find_lineraster (does the real work)
;
;          WRITTEN : HPW: 20-JAN-2008, written
;                    HPW: 11-AUG-2008, modified to search on data
;                         volume, not data rate.
; 
;-

;; **********************************************************************

function compression_index2string,input

  case input of
    0: out = 'NONE'
    1: out = 'DPCM'
    2: out = 'JPEG98'
    3: out = 'JPEG90'
    4: out = 'JPEG75'
    5: out = 'JPEG50'
    6: out = 'JPEG95'
    7: out = 'JPEG92'
    8: out = 'JPEG85'
    9: out = 'JPEG65'
    else: out = 'NONE'
  endcase

return,out
end

function string2compression_index,input

  case input of
      'NONE': out = 0
      'DPCM': out = 1
    'JPEG98': out = 2
    'JPEG90': out = 3
    'JPEG75': out = 4
    'JPEG50': out = 5
    'JPEG95': out = 6
    'JPEG92': out = 7
    'JPEG85': out = 8
    'JPEG65': out = 9
        else: begin
          message,'INPUT NOT FOUND :'+input,/info
          out = 0
        end
  endcase

return,out
end

;; **********************************************************************

pro eis_search_rasters_event,event

  ;; --- get information on the event
  WIDGET_CONTROL,event.id,GET_UVALUE=event_type

  ;; --- get WidgetData
  BaseWidget = event.handler
  WIDGET_CONTROL,BaseWidget,GET_UVALUE=unseen
  WidgetData = *unseen
  
  case event_type of 
    
    "QUIT": begin
      WIDGET_CONTROL,/DESTROY,event.top
    end

    "SELECTALL": begin
      n_line_ids = n_elements(WidgetData.line_ids) 
      list = indgen(n_line_ids)
      WIDGET_CONTROL,WidgetData.listIDs[0],set_list_select=list
    end

    "SEARCH": begin

      WIDGET_CONTROL,WidgetData.listIDs[4],set_value=''

      m = WIDGET_INFO(WidgetData.listIDs[0],/LIST_SELECT)
      if m[0] eq -1 then nwave = 0 else nwave = n_elements(m) 
      if nwave gt 0 then begin

        wavelengths = WidgetData.wavelengths[m]
        WIDGET_CONTROL,WidgetData.listIDs[1],get_value=raster_type
        WIDGET_CONTROL,WidgetData.listIDs[2],get_value=slit_index

        WIDGET_CONTROL,WidgetData.listIDs[3],get_value=compression_input
        if compression_input gt 0 then begin
          compression_string = WidgetData.compression_list[compression_input]
          compression = string2compression_index(compression_string)
        endif

        WIDGET_CONTROL,WidgetData.fieldIDs[0],get_value=input
        if input ne '' then exposure_time_min = float(input)
        WIDGET_CONTROL,WidgetData.fieldIDs[1],get_value=input
        if input ne '' then exposure_time_max = float(input)
        WIDGET_CONTROL,WidgetData.fieldIDs[2],get_value=input
        if input ne '' then data_volume_min = float(input)
        WIDGET_CONTROL,WidgetData.fieldIDs[3],get_value=input
        if input ne '' then data_volume_max = float(input)
        WIDGET_CONTROL,WidgetData.fieldIDs[4],get_value=input
        if input ne '' then raster_height_min = float(input)
        WIDGET_CONTROL,WidgetData.fieldIDs[5],get_value=input
        if input ne '' then raster_height_max = float(input)
        WIDGET_CONTROL,WidgetData.fieldIDs[6],get_value=input
        if input ne '' then raster_width_min = float(input)
        WIDGET_CONTROL,WidgetData.fieldIDs[7],get_value=input
        if input ne '' then raster_width_max = float(input)

        nfound = eis_search_rasters_driver(wavelengths,slit_index,raster_type,$
                                    exposure_time_min=exposure_time_min,$
                                    exposure_time_max=exposure_time_max,$
                                    data_volume_min=data_volume_min,$
                                    data_volume_max=data_volume_max,$
                                    compression=compression,$
                                    raster_height_min=raster_height_min,$
                                    raster_height_max=raster_height_max,$
                                    raster_width_min=raster_width_min,$
                                    raster_width_max=raster_width_max,$
                                    rasters=rasters,lines=lines,struct=struct,$
                                    test_array=test_array)

        if nfound gt 0 then begin
          raster_listing = strarr(nfound)
          for i=0,nfound-1 do begin
            id_str = trim(rasters[i].id,'(i6.6)')
            acronym_str = rasters[i].acronym
            data_volume_str = string(struct[i].data_volume,format='(f10.1)')
            compression_str = strpad(compression_index2string(struct[i].compression),8)
            title_str = str_cut(rasters[i].title,90)
            raster_listing[i] = $
                strpad(id_str,8,/after)+$
                strpad(acronym_str,22,/after)+$
                strpad(data_volume_str,11,/after)+$
                strpad(compression_str,11,/after)+$
                title_str
          endfor
          ;; --- update widget
          WIDGET_CONTROL,WidgetData.listIDs[4],set_value=raster_listing
          ;; --- save info
          WidgetData.nfound = nfound
          WidgetData.raster_listing = ptr_new(raster_listing)
          WidgetData.test_array = ptr_new(test_array)
          WidgetData.wavelength_array = ptr_new(wavelengths)
          WidgetData.rasters = ptr_new(rasters)
          WidgetData.lines = ptr_new(lines)
        endif

      endif
    end

    "DETAILS": begin
      m = WIDGET_INFO(WidgetData.listIDs[4],/LIST_SELECT)
      if m[0] ge 0 then begin
        ra = (*WidgetData.rasters)[m[0]]
        ll = (*WidgetData.lines)[m[0]]

        o_rasterDetails = OBJ_NEW("eis_raster_details_gui" , ra , ll , $
          group_leader = WidgetData.base)
        o_rasterDetails->Realize 
        o_rasterDetails->XMANAGER

      endif
    end

    "SAVE": begin
      file = dialog_pickfile(/WRITE)
      if file ne '' and WidgetData.nfound gt 0 then begin
        raster_listing = *WidgetData.raster_listing
        test_array = *WidgetData.test_array
        wavelengths = *WidgetData.wavelength_array
        openw,unit,file,/get
        printf,unit,'# TIME STAMP '+systim(0)
        printf,unit,'# Search Wavelengths : '+arr2str(wavelengths,/trim,/compress)
        for i=0,n_elements(test_array)-1 do printf,unit,'# '+test_array[i]
        printf,unit,'# '
        for i=0,WidgetData.nfound-1 do printf,unit,raster_listing[i]
        free_lun,unit
      endif
    end

    ELSE: begin
      (*unseen) = WidgetData
      return
    end
    
  endcase
  
  (*unseen) = WidgetData
  
return
end

;; **********************************************************************

pro eis_search_rasters,input_file=input_file

  ;; ----------------------------------------------------------------------
  ;; --- read the line list

  if not(keyword_set(input_file)) then begin
    pro_file = find_with_def('eis_search_rasters.pro',!path)
    break_file,pro_file,disk,dir,name,ext
    input_file = concat_dir(dir,'eis_search_rasters.txt')
  endif
  
  line_ids    = rd_tfile(input_file,1,/compress)
  nline_ids   = n_elements(line_ids) 
  if nline_ids eq 0 then begin
    message,'NO LINES FOUND IN '+input_file,/info
    return
  endif
  wavelengths = fltarr(nline_ids)
  for i=0,nline_ids-1 do wavelengths[i] = float((str2arr(line_ids[i],' '))[2])

  ;; ----------------------------------------------------------------------

  BASE   = WIDGET_BASE(/COLUMN,TITLE='EIS Search Rasters',/FRAME)
  BUTTON = WIDGET_BUTTON(BASE,VALUE='Quit',UVALUE='QUIT')

  BASET = WIDGET_BASE(BASE,/ROW,/FRAME,XSIZE=900)

    BASETa = WIDGET_BASE(BASET,/COLUMN,/FRAME)
    LIST1  = WIDGET_LIST(BASETa,value=line_ids,UVALUE='NULL',YSIZE=18,$
                         XSIZE=27,/MULTIPLE)
    BUTTON = WIDGET_BUTTON(BASETa,VALUE='Select All',UVALUE='SELECTALL')
    
    BASETb = WIDGET_BASE(BASET,/COLUMN,/FRAME)
    XSIZE  = 127
    values = ['Scan','Sit and Stare']
    LIST2  = CW_BGROUP(BASETb,values,UVALUE='NULL',/EXCLUSIVE,$
                       XSIZE=XSIZE,SET_VALUE=0)

    BASETc = WIDGET_BASE(BASET,/COLUMN,/FRAME)
    values = ['1" Slit','266" Slot','2" Slit','40" Slot']
    LIST3  = CW_BGROUP(BASETc,values,UVALUE='NULL',/EXCLUSIVE,$
                       XSIZE=XSIZE,SET_VALUE=0)

    BASETd = WIDGET_BASE(BASET,/COLUMN,/FRAME)
    compression_list = ['Any','DPCM','JPEG98','JPEG95','JPEG92','JPEG90',$
                        'JPEG85','JPEG75','JPEG65','JPEG50']
    LIST4  = CW_BGROUP(BASETd,compression_list,UVALUE='NULL',/EXCLUSIVE,$
                       XSIZE=XSIZE,SET_VALUE=0)

    BASETe = WIDGET_BASE(BASET,/COLUMN,/FRAME)
    FIELD1 = CW_FIELD(BASETe,TITLE='Exposure Time Min (s)     ',UVALUE='NULL',xsize=10)
    FIELD2 = CW_FIELD(BASETe,TITLE='Exposure Time Max (s)     ',UVALUE='NULL',xsize=10)
    FIELD3 = CW_FIELD(BASETe,TITLE='Data Volume Min (Mbits)   ',UVALUE='NULL',xsize=10)
    FIELD4 = CW_FIELD(BASETe,TITLE='Data Volume Max (Mbits)   ',UVALUE='NULL',xsize=10)
    FIELD5 = CW_FIELD(BASETe,TITLE='Raster Height Min (arcsec)',UVALUE='NULL',xsize=10)
    FIELD6 = CW_FIELD(BASETe,TITLE='Raster Height Max (arcsec)',UVALUE='NULL',xsize=10)
    FIELD7 = CW_FIELD(BASETe,TITLE='Raster Width Min (arcsec) ',UVALUE='NULL',xsize=10)
    FIELD8 = CW_FIELD(BASETe,TITLE='Raster Width Max (arcsec) ',UVALUE='NULL',xsize=10)

  BUTTON = WIDGET_BUTTON(BASE,VALUE='Search',UVALUE='SEARCH')

  label=strpad('IDs:',8,/after)+strpad('Acronym:',22,/after)+$
      strpad('Mbits:',11)+strpad('Comp:',9)+'   Title:'
  LABEL = WIDGET_LABEL(BASE,VALUE=label,/ALIGN_LEFT)
  LIST5 = WIDGET_LIST(BASE,YSIZE=15,UVALUE='NULL')

  BUTTON = WIDGET_BUTTON(BASE,VALUE='Display Raster Details',UVALUE='DETAILS')
  BUTTON = WIDGET_BUTTON(BASE,VALUE='Save',UVALUE='SAVE')

  WIDGET_CONTROL,BASE,/REALIZE

;; ----------------------------------------------------------------------
;; --- WidgetData -------------------------------------------------------
;; ----------------------------------------------------------------------

  listIDs  = [LIST1,LIST2,LIST3,LIST4,LIST5]
  fieldIDs = [FIELD1,FIELD2,FIELD3,FIELD4,FIELD5,FIELD6,FIELD7,FIELD8]
  
  ;; --- structure to hold program info 
  WidgetData = {base:               BASE, $
                listIDs:            listIDs,$
                fieldIDs:           fieldIDs,$
                line_ids:           line_ids,$
                compression_list:   compression_list,$
                wavelengths:        wavelengths,$
                nfound:             0,$
                raster_listing:     ptr_new(),$
                wavelength_array:   ptr_new(),$
                test_array:         ptr_new(),$
                rasters:            ptr_new(),$
                lines:              ptr_new()}
 
  
  ;; --- store WidgetData as pointer
  unseen = ptr_new(WidgetData)
  WIDGET_CONTROL,BASE,SET_UVALUE=unseen

;; ----------------------------------------------------------------------
;; --- Register widget with XMANAGER ------------------------------------
;; ----------------------------------------------------------------------

  XMANAGER,'eis_search_rasters',BASE
  
  WidgetData = *unseen

return
end
