pro mk_raster, setup_structure, modal=modal, group_leader=group_leader,$ font=font,fix_desc=fix_desc ; ; common block source ; @tplan_com ; ; define the structures to be used ; tplan_struct ; ; results will be saved in the observation/raster definition structure ; tp_obs = {tp_obs_rec} tp_obs.line_w.x_pos = -1 ; ; initial checks ; if (!d.flags and 65536) eq 0 then message,'Widgets are NOT available.' ; ; check not already in use ; (if not called by a "living" widget then do a reset via XKILL ; if not xalive(group_leader) then xkill,/all else begin if xregistered('mk_raster') then begin print,'CDS mk_raster program is already registered.' return endif endelse ; ; set only possible graphics device and load LUT ; set_plot,'X' tp_coltable ; ; the base widget is all-screen and column-orientated ; if not keyword_set(font) then begin ; font = get_dfont() & font = font(0) font = '-adobe-helvetica-bold-r-normal--0-120-75-75-p-0-iso8859-1' endif font=get_dfont(font) & font=font(0) device, get_screen_size = sz if (sz(0) ge 1280) and (sz(1) ge 1024) then sz(*) = 0 sz = sz < [1280,1024] base = widget_base(title='CDS Technical Planning - raster definition',xoff=100,$ /column,/frame,x_scroll=sz(0),y_scroll=sz(1)) ; ; the TOP widget is where all the user/numerical/text input takes place ; top = widget_base(base,/row,space=1) ; ; the left hand side of the top contains... ; top_left = widget_base(top,/column,space=5) ; ; ...the instrument choice ; inst_base = widget_base(top_left,/row,space=50) 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 previous_inst = '' ; ; ... VDS default extraction switch or GIS default extraction ; vds_bbase = widget_base(inst_base) vds_backbase = lonarr(3) ; ; blank for when no instrument is chosen ; vds_backbase(0) = widget_base(vds_bbase,map=0) ; ; vds_backbase(1) = widget_base(vds_bbase,map=0) ex_ids = lonarr(3) xmenu,['NIS1','NIS2','Full CCD'],buttons=ex_ids,vds_backbase(1),/row,$ title='VDS default extraction.', /nonexclusive,$ uvalue=['NDEFEX_1','NDEFEX_2','NDEFEX_3'], font=font for i=0,2 do widget_control,ex_ids(i),set_button=0 widget_control,ex_ids(1),set_button=1 nis_def_ext=[0,0,0] ; ; Default GIS extraction mode (all or nothing) ; vds_backbase(2) = widget_base(vds_bbase,map=0) gbdefuv = ['GDEFEX_1','GDEFEX_2','GDEFEX_3','GDEFEX_4'] gb_list = ['1','2','3','4'] xmenu,gb_list,vds_backbase(2),buttons=gbdef_ids,title='GIS default extraction.',$ uvalue=gbdefuv,/row,/nonexclusive,font=font for i=0,3 do widget_control,gbdef_ids(i),set_button=1 gis_def_ext = [1,1,1,1] ; ; ...the slit choices ; sb = widget_base(top_left,/row) sb1 = widget_base(sb,/column) xpdmenu,find_with_def('slit_selection.pdm',!PATH),sb1,font=font sb2 = widget_base(sb,/column) slit_info = cw_field(sb2,title='Current slit:',value=' ',$ /row,xsize=15) ; ; choose the range for the exposure time slider ; et = widget_base(top_left,/column) eb1 = widget_base(et,/row) xpdmenu,find_with_def('etime_selection.pdm',!PATH),eb1,font=font ; ; put out the current value separately ; eb2 = widget_base(eb1,/column) et_info = cw_field(eb2,title='Exposure time:',value='50',$ /row,xsize=8,/return,uvalue='ETRANGE') ; ; ...the exposure time slider ; et_slider_id = widget_slider(et,title=' Set exposure time in seconds. ',$ value=500,min=10,max=1000,uvalue='ET_SLIDER',$ /drag,/suppress,font=font) ; ; set up initial range and value ; curr_et_max = 100. curr_etime = '50' tp_obs.raster_v.exptime = 50.0 ; ; choose the range for the window width slider ; wt = widget_base(top_left,/column) ww1 = widget_base(wt,/row) xpdmenu,find_with_def('wwidth_selection.pdm',!PATH),ww1,font=font ; ; put out the current value separately ; ww2 = widget_base(ww1,/column) ww_info = cw_field(ww2,title='Window width:',value='11',$ /row,xsize=5,/return,uvalue='WWRANGE') widget_control,ww_info,all_text=0 ; ; ...the window width slider ; ww_slider_id = widget_slider(wt,title=' Set window width in pixels. ',$ value=110,min=3,max=1000,uvalue='WW_SLIDER',$ /drag,/suppress,font=font) ; ; set up initial range and value ; curr_ww_max = 100. curr_lwidth = '11' ; ; the top middle widget contains... ; top_middle= widget_base(top,/column,space=10) ; ; ...the scan step sizes ; ;ssrow = widget_base(top_middle,/row) ssrow = widget_base(top_left,/row) ss = widget_base(ssrow,/column) wlss = widget_label(ss,value='M/S step size (arcsec).',font=font) sss = widget_base(ss,/row) sssx = widget_text(sss,/edit,xsize=10,ysize=1,uvalue='SSSX',value='0', $ font=font) sssy = widget_text(sss,/edit,xsize=10,ysize=1,uvalue='SSSY',value='0', $ font=font) ; ; ...the number of steps ; ns = widget_base(ssrow,/column) wlns = widget_label(ns,value='Number of M/S scan positions.',font=font) nss = widget_base(ns,/row) nsx = widget_text(nss,/edit,xsize=10,ysize=1,uvalue='NSX',value='1',font=font) nsy = widget_text(nss,/edit,xsize=10,ysize=1,uvalue='NSY',value='1',font=font) ; ; information on line list ; wll = widget_base(top_middle,/column) ; ; and inform of current choice ; dummy = widget_label(wll,value='Current descriptions and database IDs',font=font) fiddle = '' & for i=0,64 do fiddle=fiddle+'a' wrp_info = widget_base(wll,/row) wrp_info_1 = widget_label(wrp_info,value='Raster.....',font=font) wrp_info_2 = widget_text(wrp_info,value=fiddle,font=font,/editable,/all,$ uvalue='FUND',xsize=50) frid = widget_text(wrp_info,value=' ',font=font,xsize=3) widget_control, frid,set_val='' widget_control, wrp_info_2,set_val='' wrv_info = widget_base(wll,/row) wrv_info_1 = widget_label(wrv_info,value='Variation',font=font) wrv_info_2 = widget_text(wrv_info,value=fiddle,font=font,/editable,$ uvalue='VARI',xsize=50) rvid = widget_text(wrv_info,value=' ',font=font,xsize=3) widget_control, rvid,set_val='' widget_control, wrv_info_2,set_val='' wll_info = widget_base(wll,/row) wll_info_1 = widget_label(wll_info,value='Line list...',font=font) wll_info_2 = widget_text(wll_info,value=fiddle,font=font,/editable,$ uvalue='LINE',xsize=50);,/all) llid = widget_text(wll_info,value=' ',font=font,xsize=3) widget_control, llid,set_val='' widget_control, wll_info_2,set_val='' wdw_info = widget_base(wll,/row) wdw_info_1 = widget_label(wdw_info,value='Windows',font=font) wdw_info_2 = widget_text(wdw_info,value=fiddle,font=font,/editable,$ uvalue='DWIN',xsize=50) dwid = widget_text(wdw_info,value=' ',font=font,xsize=3) widget_control, dwid,set_val='' widget_control, wdw_info_2,set_val='' ; ; set up the line_window structure and clear it out ; (necessary because values linger from one incarnation to next) ; line_window = replicate({line_window_rec},max_num_lwindow) line_window.x_pos = -1 ; ; information/selection of compression scheme ; cs = widget_base(top_middle,/row) ; ; ...compression scheme choice ; xpdmenu,find_with_def('compression_scheme.pdm',!PATH),cs,font=font ; ; and inform of current choice ; ccs_info = widget_base(cs,/column) ccs_info_1 = widget_label(ccs_info,value='Current compression',font=font) ccs_info_2 = widget_label(ccs_info,value=strpad(' ',30),/frame,font=font) ; ; selection of telemetry rate ; tmr = widget_base(cs,/row) ; ; ...telemetry rate choice ; xpdmenu,find_with_def('telemetry_rate.pdm',!PATH),tmr,font=font ; ; and inform of current choice ; tmr_info = widget_base(cs,/column) tmr_info_1 = widget_label(tmr_info,value='Current TM rate',font=font) tmr_info_2 = widget_label(tmr_info,value=strpad(' ',30),/frame,font=font) ; ; set up a layered base so VDS specific widgets can come and go ; interleaved with GIS selections ; parm = widget_base(top_middle) ; ; set number of stacking levels ; npb = 7 parmbase = lonarr(npb+1) ; ; first layer is blank ; parmbase(0) = widget_base(parm,map=0) ; ; Set up VDS-specific parameters ; ; ; ...parameter choice ; parmbase(1) = widget_base(parm,/row,map=0) xpdmenu,find_with_def('vds_parameters.pdm',!PATH),parmbase(1),font=font ; ; ...the window height slider ; wh_slider_id = widget_slider(parmbase(1),$ title='VDS window height (arcsec).',$ value=240,uvalue='WH_SLIDER',minimum=4,$ maximum=240,/drag,xsize=300,font=font) curr_lheight = '240' ; ; possible overlay for setting VDS voltage ; parmbase(2) = widget_base(parm,/row,map=0,/frame) vv_done = widget_button(parmbase(2),value='Done',uvalue='VDS_VDONE',/no_rel, $ font=font) vv_slider_id = widget_slider(parmbase(2),title='Set VDS voltage parameter.',$ value=100,uvalue='VV_SLIDER',minimum=0,$ maximum=255,/drag,xsize=450,font=font) ; ; setup of GIS parameters ; parmbase(3) = widget_base(parm,/row,map=0) xpdmenu,find_with_def('gis_parameters.pdm',!PATH),parmbase(3),font=font ; ; set GIS detector voltages ; parmbase(4) = widget_base(parm,/row,map=0,/frame) gv_done = widget_button(parmbase(4),value='Done',uvalue='GIS_VDONE',/no_rel, $ font=font) gv_slider_id = widget_slider(parmbase(4),title='Set GIS voltage parameter.',$ value=100,uvalue='GV_SLIDER',minimum=0,$ maximum=255,/drag,xsize=450,font=font) ; ; parmbase(5) reserved for GIS LUTs when figure out how to handle them ; parmbase(5) = widget_base(parm,map=0) ; ; possible overlay for setting VDS 300A range offset ; parmbase(6) = widget_base(parm,/row,map=0,/frame) o3_done = widget_button(parmbase(6),value='Done',uvalue='VDS_VDON',/no_rel, $ font=font) o3_slider_id = widget_slider(parmbase(6),$ title='Set 300A range offset (pixels).',$ value=0,uvalue='O3_SLIDER',minimum=0,$ maximum=100,/drag,xsize=450,font=font) ; ; possible overlay for setting VDS 300A range offset ; parmbase(7) = widget_base(parm,/row,map=0,/frame) o5_done = widget_button(parmbase(7),value='Done',uvalue='VDS_VDON',/no_rel, $ font=font) o5_slider_id = widget_slider(parmbase(7),$ title='Set 500A range offset (pixels).',$ value=0,uvalue='O5_SLIDER',minimum=0,$ maximum=100,/drag,xsize=450,font=font) ; ; telemetry info space ; tlm_info = widget_base(top_middle,/row,space=15) dummy = widget_label(tlm_info,value='Telemetry time (secs/exposure)', $ font=font) tlm_info_2 = widget_label(tlm_info,value=strpad('0',15),frame=5, $ font=font,xsize=50) widget_control,tlm_info_2,set_val=' 0.0 ' ; ; In depth analysis of raster duration ; tlm_info_3 = widget_button(tlm_info,value='Analyse Raster Duration',$ uvalue='RAS_DUR',font=font,frame=2) ; ; MIDDLE "command" line has the options... ; middle = widget_base(base,/row,space=5,/frame) ; ; ...Quit without any further ado ; m4 = widget_base(middle,/column) xpdmenu,find_with_def('exit_selection.pdm',!PATH),m4,font=font ; ; ...get help on filling out the screen ; m5 = widget_base(middle,/column) cfont = "-adobe-helvetica-bold-r-normal--14-100-100-100-p-82-iso8859-1" xpdmenu,find_with_def('help_selection.pdm',!PATH),m5,font=cfont ; ; ...reset a selection of parameters to start again ; m3 = widget_base(middle,/column) xpdmenu,find_with_def('reset_selection.pdm',!PATH),m3,font=font ; ; write output of line windows, flag windows or raster parameters ; ; ; ...choose type of output ; m6 = widget_base(middle,/column) xpdmenu,find_with_def('db_access.pdm',!PATH),m6,font=font m1 = widget_base(middle) dum = lonarr(2) dum(0) = widget_base(m1,map=1) dum(1) = widget_button(m1,value='Action to the left',$ uvalue='',/no_rel,font=font) widget_control,dum(1),map=0 ; ; ...calculate new data with current instrument settings ; m2 = widget_base(middle,/column) xpdmenu,find_with_def('mk_raster_ndata.pdm',!PATH),m2,font=font ; ; ...allow switch between CDS and USER databases ; db_original = which_zdbase() db_in_use = db_original ; ; check at least one database env. var. exists ; z1 = getenv('ZDBASE_CDS') z2 = getenv('ZDBASE_USER') if z1 eq '' and z2 eq '' then begin bell print,'Must have a definition for one of ZDBASE_USER or ZDBASE_CDS' return end m8 = widget_base(middle,/column) if db_original eq 'CDS' then $ title = 'Using CDS databases' else $ title = 'Using USER databases' db_switch = widget_button(m8,value=title,uvalue='USER_CDS_DB',/no_rel,font=font) m9 = widget_button(middle,value='Adjust LUT',uvalue='XLOADCT',font=font) ; ; make message visible/invisible ; see_mess=0 m10 = widget_button(middle,value='See messages',uvalue='MESS',$ font=cfont,frame=2) ; ; allow editing/listing of current choice ; m11 = widget_base(middle,/column) wll_list_1 = widget_button(m11,value='Edit lines',$ uvalue='EDIT_LINE',/no_rel,font=font) widget_control,wll_list_1,sensitive=0 num_windows = 0 ; ; BOTTOM display area ; bottom = widget_base(base,/frame,/column) ; ; ...plotting area ; image_area = widget_draw(bottom,xsize=1024,ysize=256,/button_events) have_vert = 0 widget_control,image_area,sensitive=0 ; ; LOWER BOTTOM "command" line has the window manipulating options... ; low_bottom = widget_base(base,/row,space=5) window_state = 'N/A' ; ; choose the window manipulation mode ; wmode_list = ['Add','Del','Mov','Id','Flag','Prof'] wmode_uv =['LINE_ADD','LINE_DELETE','LINE_MOVE','LINE_IDENT','LINE_FLAG','LINE_PROF'] wmode_rv = widget_base(low_bottom,/column) wmode_ids = lonarr(6) xmenu,wmode_list,wmode_rv,buttons=wmode_ids,title='Window interaction mode.',$ uvalue=wmode_uv,/row,/exclusive,font=font ; ; choose the display mode ; ;dmode_list = ['All','Win','Flag'] ;dmode_uv = ['DISP_ALL','DISP_WONLY','DISP_FONLY'] ;dmode_rv = widget_base(low_bottom,/column) ;dmode_ids = lonarr(3) ; ;xmenu,dmode_list,dmode_rv,buttons=dmode_ids,title='Display mode.',$ ; uvalue=dmode_uv,/row,/exclusive,space=1,font=font ;widget_control,dmode_ids(0),set_button=1 dm = widget_base(low_bottom,/row) dm1 = widget_base(dm,/column) xpdmenu,find_with_def('display_mode.pdm',!PATH),dm1,font=font fm = widget_base(low_bottom,/row) fm1 = widget_base(fm,/column) xpdmenu,find_with_def('flag_choice.pdm',!PATH),fm1,font=font ; ; choose which GIS band to display ; gis_b = widget_base(low_bottom,/row,space=5) gb_list = ['1','2','3','4','All'] gbuv = ['GISB1','GISB2','GISB3','GISB4','GISB5'] gb_ids = lonarr(5) ; ; make gb_rv base a stackable one ; gis_dispbase = lonarr(4) gb_rv = widget_base(gis_b) ; ; first layer is blank ; gis_dispbase(0) = widget_base(gb_rv,map=0) ; ; put real buttons in next level ; gis_dispbase(1) = widget_base(gb_rv,map=0) xmenu,gb_list,gis_dispbase(1),buttons=gb_ids,title='Display GIS band.',$ uvalue=gbuv,/row,/exclusive,font=font widget_control,gb_ids(4),set_button=1 GIS_band = 5 ; ; ...adjust VDS display in next layer ; gis_dispbase(2) = widget_base(gb_rv,map=0,/row) dummyb = widget_base(gis_dispbase(2),/column) euv = ['EXTE_YES','EXTE_NO','EXTE_RES'] xmenu,['On','Off','Set'],dummyb,buttons=vdsb_ids,title='VDS Background',$ uvalue=euv,/row,/exclusive,font=font widget_control,vdsb_ids(0), set_b=1 vds_extension = 1 ; ; image area for LUT ; image_area2 = widget_draw(gis_dispbase(2),xsize=225,ysize=100) ; ; Slider for VDS background window size ; gis_dispbase(3) = widget_base(gb_rv,map=0,/row) dummy = widget_button(gis_dispbase(3),value='Done',uvalue='VDS_BDONE', $ /no_rel,font=font) vdsb_slider_id = widget_slider(gis_dispbase(3),xsize=300,$ title='VDS background window size',font=font,$ min=3,max=100,uvalue='VB_SLIDER',value=50,/drag) ; ; INFO_LINE line has general user information. ; info_base = widget_base(title='Messages',group_leader=base,yoff=1000,/column) ; xsize=800,ysize=300,y_scroll_size=300,$ ; x_scroll_size=800,/scroll,/column) info_line = widget_text(info_base,ysize=20,xsize=65,$ value='Watch this space for information....',$ font=tp_font,/scroll) ; ; ensure plotting is as needed ; !p.multi=0 ; ; make the whole thing happen ; widget_control,base,/realize widget_control,info_base,/realize ;widget_control, mess_ids(0),set_butt=1 ; ; find out window id for plotting ; widget_control,get_value=window,image_area wset,window tp_colbar ; ; set default mode of displaying all spectrum ; window_mode = 'ALL' display_state = 'ALL' ; ; set default 'flags included' mode ; flag_state = 1 ; ; create arrays for the vertical solid and dashed lines ; vert_line = bytarr(1,128)+255 vert_dash = vert_line for i=0,15,2 do vert_dash(0,i*8:i*8+7) = 0 ; ; load special LUT ; tp_coltable tp_colbar ; ; load the current state database entry, the official db must be in the ; ZDBASE path ; get_utc,utc get_vds_state, utc, s tp_obs.state.date = s.date tp_obs.state.vds_read = fix(s.vds_read) tp_obs.state.vds_pmcp = fix(s.vds_pmcp) tp_obs.state.vds_offset(0) = 0 ; s.vds_offset(0) tp_obs.state.vds_offset(1) = 0 ; s.vds_offset(1) help_mode = 0 ; ; save the current wavecal and load the linear one for GIS and the current NIS ; n_wavecal = save_wavecal('n') g_wavecal = save_wavecal('g') if not load_wavecal('n') then begin bell widget_control, info_line, $ set_val='Error loading NIS wavecal.' endif if not load_wavecal('g',gset=0) then begin bell widget_control, info_line, $ set_val='Error loading GIS wavecal.' endif ; ; load input structure if appropriate ; if datatype(setup_structure) eq 'STC' then begin load_tp_struct, setup_structure tp_colbar tp_recalc_dew,' ' if total(tp_obs.vds_backwin.win_def) eq 0 then begin status = tp_load_vdsback(tp_obs) if not status then begin widget_control, info_line, $ set_val='Error reading VDS background windows file.' endif endif endif else begin status = tp_load_vdsback(tp_obs) if not status then begin widget_control, info_line, $ set_val='Error reading VDS background windows file.' endif endelse ; ; help message ; widget_control,info_line,set_val=' ',/append widget_control,info_line,set_val=' ',/append widget_control,info_line,set_val=' ',/append bl = ' ' widget_control, info_line, /append, $ set_v='Hit the <Messages> button to hide this window' ; ; undocumented feature ; if keyword_set(fix_desc) then begin defsysv,'!desc_update',1 endif else begin defsysv,'!desc_update',0 endelse ; ; if MK_RASTER was called with a GROUP_LEADER, then store it's widget ID ; as a UVALUE of BASE. Later, when MK_RASTER is done, the latest ; TP_OBS stucture will be stored as a UVALUE of GROUP_LEADER and, hence, ; become available to caller (DMZ'99) ; if xalive(group_leader) then widget_control,base,set_uvalue=group_leader ; ; make the boss do some work xmanager,'mk_raster',base, modal=modal, group_leader=group_leader ;-- if MK_RASTER crashed for some reason, then the next MK_RASTER call will ; fall thru the first XMANAGER. The next line will re-activate the event ; handler. if not xalive(group_leader) then xmanager ; ; load the final line setup into the input/output structure ; tp_obs.line_w = line_window ; ; on EXIT, as an internal indicator that flags were either separate or ; common, set the standard flag indicator to '2' if flags are separate. ; if flag_state eq 0 then begin n = where(tp_obs.line_w.flag eq 1,count) if count gt 0 then tp_obs.line_w(n).flag = 2 endif ; ; load the input/output variable with the defined structure ; setup_structure = tp_obs end