; ------------------------------------------------------------------------ ; Setup Widgets for pull-down menus, buttons and sliders PRO MNUSETUP,base,lcol,button2,button3, $ button5,rast_list,lab2,windowl junk={CW_PDMENU_S, flags:0, name:'' } descl=[{CW_PDMENU_S,0,'New File'},$ {CW_PDMENU_S,0,'Blocks'}, $ {CW_PDMENU_S,1,'Colour Plot'}, {CW_PDMENU_S,0,'Cloud Height'}, $ {CW_PDMENU_S,0,'Backscatter Profile'}, {CW_PDMENU_S,0,'Cloud Height and Backscatter Profile'}, $ {CW_PDMENU_S,0,'Backscatter Profile with contour'}, {CW_PDMENU_S,0,'Cloud Height and Backscatter Profile with contour'}, $ {CW_PDMENU_S,2,'Backscatter Profile at Instant'},$ {CW_PDMENU_S,1,'Levels'}, {CW_PDMENU_S,0,'Group1{20,100,200,300,400,3200}'}, $ {CW_PDMENU_S,0,'Group2{20,100,200,300,400,3200}'}, {CW_PDMENU_S,2,'Group3{20,100,200,300,400,3200}'}, $ {CW_PDMENU_S,0,'Save GIF'}, {CW_PDMENU_S,2,'Quit'}] base=widget_base(TITLE = 'CEILOMETER DATA ',/ROW) lcol=widget_base(base,/FRAME,/COLUMN,SPACE=4) menul=cw_pdmenu(lcol,descl,/RETURN_FULL_NAME,FONT = "helvetica*14",uvalue='menu') ;--------------------------- BUTTONS -------------------------- but=widget_base(lcol,/frame,/row,/nonexclusive) button2=widget_button(but,value='CGM ',FONT = "helvetica*14",uvalue='CGM') button3=widget_button(but,value='PS ',FONT = "helvetica*14",uvalue='PS') ;button4=widget_button(but,value='B/W ',FONT = "helvetica*14",uvalue='B/W') button5=widget_button(but,value='Title ',FONT = "helvetica*14",uvalue='Title') ;buttont=widget_button(but,value='HH:MM:SS ',FONT = "helvetica*14",uvalue='HH:MM:SS') ;-------------------------- SLIDERS ---------------------------- slid_lcol=widget_base(lcol,/FRAME,/ROW) slider=widget_slider(slid_lcol,value=8,minimum=1,maximum=15 $ ,FONT = "helvetica*14",title='Height',uvalue='slider') slider1=widget_slider(slid_lcol,value=2500,minimum=1,maximum=5000 $ ,FONT = "helvetica*14",title='(10000*srad*Km)^-1',uvalue='slider1') ;-------------------------- DRAW AREA ------------------------------ drawl=widget_draw(lcol,xsize=900,ysize=450,frame=5) ;---------------------------- LIST ------------------------------------ rast_list=widget_list(lcol,value=' ',ysize=4,frame=0, $ FONT = "Courier*12",uvalue='rast_list') ;---------------------------- LABEL ------------------------------------ lab2=widget_text(lcol,value='No data selected.Choose the "New File" Option',ysize=3,xsize=25, $ FONT = "helvetica*14",frame=5) WIDGET_CONTROL,/REALIZE,base widget_control,get_value=windowl,drawl WIDGET_CONTROL,button5,set_button=1 RETURN END ;---------------------------------------------------------------------------- ;Function to do what the BYTSCL does but not for equally spaced levels ;It returns 0 for values Less than levels(0),1 for values GE levels(0) and LT levels(1) and so on FUNCTION BTSCLSPIROS,array,levels ;array:data array ;levels :vector with the levels sz=SIZE(array) IF sz(0) EQ 1 THEN BEGIN ;one dimension nl=N_ELEMENTS(levels) ;number of levels result=INTARR(sz(1)) rs=WHERE(array LT levels(0),count) IF count NE 0 THEN result(rs)=0 FOR I=0L,nl-2L DO BEGIN rs=WHERE((array GE levels(I)) AND (array LT levels(I+1)),count) IF count NE 0 THEN result(rs)=I+1 ENDFOR rs=WHERE(array GE levels(nl-1L),count) IF count NE 0 THEN result(rs)=nl ENDIF ELSE BEGIN ;two dimensions nl=N_ELEMENTS(levels) ;number of levels result=INTARR(sz(1),sz(2)) FOR J=0L,sz(1)-1L DO BEGIN ;like one dimension (columns) ; vector=array(J,*) ;one column from the array vector=FLTARR(sz(2)) for mm=0L,sz(2)-1L do vector(mm)=array(J,mm) temp1=INTARR(sz(2)) ;temporary result rs=WHERE(vector LT levels(0),count) IF count NE 0 THEN temp1(rs)=0 FOR I=0L,nl-2L DO BEGIN rs=WHERE((vector GE levels(I)) AND (vector LT levels(I+1)),count) IF count NE 0 THEN temp1(rs)=I+1 ENDFOR;i rs=WHERE(vector GE levels(nl-1L),count) IF count NE 0 THEN temp1(rs)=nl FOR k=0L,sz(2)-1L DO result(J,k)=temp1(k) ENDFOR;J ENDELSE RETURN,result END ;-------------------------------------------------------- ; Function to annotate ticks hh:mm:ss along a time axis FUNCTION YTICKS,axis,index,value hour=long(value)/3600 minute=long(value-3600*hour)/60 sec=value mod 60 RETURN,STRING(hour,minute,sec,$ FORMAT="(i2.2,':',i2.2,':',i2.2)") END ;-------------------------------------------------------------------- ;Routine to create the colour bar PRO COL_SCAL,levels,caption strlabel=STRCOMPRESS(levels,/REMOVE_ALL) xratio = !d.x_size yratio = !d.y_size xmin=490.0*xratio/550. & ymin=100.0*yratio/500. & xwidth=20.*xratio/550. & ywidth=20.*yratio/500. nl=N_ELEMENTS(levels) for i=1,nl-1 do begin polyfill,[xmin,xmin+xwidth,xmin+xwidth,xmin],[ymin,ymin,ymin+ywidth,ymin+ywidth],color=i,/device xyouts,xmin+xwidth+2.*xratio/550.,ymin,strlabel(i-1), /device, color=18,charsize=0.6 ymin=ymin+ywidth endfor xyouts,xmin+xwidth+2.*xratio/550.,ymin,strlabel(nl-1), /device, color=18,charsize=0.6 xyouts,xmin,ymin+ywidth,caption,/device,color=18,charsize=0.6 RETURN END ;--------------------------------------------------------------------- ; ------------------------------------------------------------------------ ; Builds radar colour tables, returning values for use in CGM plots PRO COLTAB,redct,greenct,bluect red = fltarr(60) & green = red & blue = red red(0:18)= [1, .8, .7, 1, 0, 0.1, 0, 0, 0, 0, 0.7, 1, 1, 0.7, 1, .9, 1, .8, 0] green(0:18)=[1, .6, .3, .7, 0, 0.1, 0.6, 1, 0.7, 1, 0, 0, .5, 0, 0, .9, 1, .8, 0] blue(0:18)= [1, .8, .3, .7, .8, 1, 0, 0, 0.7, 1, 0, 0, .12, 0.7, 1, 0, 0, .8, 0] ; vlt brown pink dkblue blue dkgr gr dkcyn cyn dkred red oran dkmag mag dkyel yel gry blk red(19:36)= [1, .8, .7, 1, 0, 1, 0.7, 0.1, 0, 0, 0, 0, 0.7, 1, .9, 1, .8, 0] green(19:36)=[1, .6, .3, .7, 0.7, 0, 0, 0.1, 0, 1, 0.6, 1, 0, 0, .9, 1, .8, 0] blue(19:36)= [1, .8, .3, .7, 0.7, 1, 0.7, 1, .8, 1, 0, 0, 0, 0, 0, 0, .8, 0] ; vlt brown pink dkcy mag dkmag blue dkblue cyan dkgr gr dkred red dkyel yel gry blk red(37:51)= [1, 0, 0.1, 0, 0, 0, 0, 0.7, 1, 0.7, 1, .9, 1, 0, .8] green(37:51)=[1, 0, 0.1, 0.6, 1, 0.7, 1, 0, 0, 0, 0, .9, 1, 0, .8] blue(37:51)= [1, .8, 1, 0, 0, 0.7, 1, 0, 0, 0.7, 1, 0, 0, 0, .8] ; dkblue blue dkgr gr dkcyn cyn dkred red dkmag mag dkyel yel blk gry redct=255*red & greenct=255*green & bluect=255*blue tvlct,redct,greenct,bluect return end ;----------------------------------------------------------- ;----------------------------------------------------------- ; Reading of Ceilometer File MAXIMUM 6 HOUR DATA OF 30sec BLOCKS PRO FRFILE,flname,date,tmsec,time,data,cloud1,cloud2,cloud3,range,lab2 ;flname : File name ;tmsec : array containing the start time of each 30sec-block in sec ;date : vector containing the date ;time :vector containing the time in HH:MM:SS ;data :array containing the backscatter profile in (10000*srad*Km)^-1 ; each column corresponds to 30sec block ; each line to height.Space resolution is 100ft=30m ;cloud1,cloud2,cloud3:vectors containing the three cloud base heights ;range :array with the height for data array ;lab2 : Label for the WIDGET_CONTROL datfile=PICKFILE(/read,title='Ceilometer data file',filter='c*.dat',path='/cdrom/cdrom0') OPENR,1,datfile fv=FSTAT(1) flname=fv.name WIDGET_CONTROL,lab2,SET_VALUE='WAIT!!Reading of File: '+flname noumero=1000 tmsec=FLTARR(noumero) & date=STRARR(noumero) & nlayer0=FLTARR(noumero) & data=INTARR(noumero,800) cloud1=FLTARR(noumero) & cloud2=FLTARR(noumero) & cloud3=FLTARR(noumero) & range=FLTARR(800) time=STRARR(noumero) ;The data array is INTARR --> look at page 39 of ceilometer book qqq=' ' READF,1,qqq ;1st line print,qqq READF,1,qqq ;2nd line print,qqq k = -1 ;index for time WHILE NOT EOF(1) DO BEGIN temp1=' ' READF,1,temp1 ;date and time ;print,temp1 IF EOF(1) THEN GOTO,label1 k=k+1 year=' '& month=' ' & day= '' ;READS,temp1,FORMAT='(1X,A4,2(1X,A2),3(1X,I2))',year,month,day,hh,mm,ss ; print,'K=',k ; print,temp1 ; print,'------------------' READS,temp1,FORMAT='(1X,A4,1X,A2,1x,I2,3(1X,I2))',year,month,day1,hh,mm,ss if k EQ 0 then start_day=day1 day=STRCOMPRESS(STRING(FIX(day1)),/REMOVE_ALL) ;print,'k=',k date(k)=day+'/'+month+'/'+year IF start_day NE day1 THEN tmsec(k)=(hh*60.*60.+mm*60.+ss)+86400. ELSE tmsec(k)=(hh*60.*60.+mm*60.+ss) ; tmsec(k)=hh*60.*60.+mm*60.+ss ;print,date(k),' hh=',hh,' mm=',mm,' ss=',ss hours2=STRCOMPRESS(STRING(hh),/REMOVE_ALL) mins2=STRCOMPRESS(STRING(mm),/REMOVE_ALL) sec2=STRCOMPRESS(STRING(ss),/REMOVE_ALL) time(k)=hours2+':'+mins2+':'+sec2 READF,1,temp1 ;range ;print,temp1 READS,temp1,FORMAT='(7X,Z1)',range_flg ;PRINT,'range flag=',range_flg READF,1,temp1 ;cloud heights ;print,temp1 qq1=' ' qq2=' ' qq3=' ' ;print,'k=',k ffg=' ' READS,temp1,FORMAT='(A1,1X,1X,A1,5X,A1,5X,A1)',ffg,qq1,qq2,qq3 if ffg eq '0' or ffg eq '1' or ffg eq '2' or ffg eq '3' or ffg eq '4' or ffg eq '5' then begin ;--------------------------------------------------------------) READS,temp1,FORMAT='(Z1,1X,1X,A1,5X,A1,5X,A1)',detection_status,qq1,qq2,qq3 READS,temp1,FORMAT='(21X,Z8)',ttt ;code to see if the height units are meters or feet ttt=LONG(ttt) ttb=LONG(2^8) units_flg=(ttt AND ttb) ;if units_flg = 256 the units are meters else feet ;print,'units_flg',units_flg IF units_flg NE 256 THEN BEGIN PRINT,'!!! SOMETHING WRONG WITH UNITS' PRINT,'BLOCK=',k,' TIME=',time(k) asda=GET_KBRD(1) ENDIF IF detection_status EQ 1 THEN BEGIN READS,temp1,FORMAT='(3X,I5)',height1 ;print,'height1 hex=',height1 cloud1(k)=height1 ENDIF IF detection_status EQ 2 THEN BEGIN READS,temp1,FORMAT='(3X,I5,1X,I5)',height1,height2 ; print,'height1=',height1,'height2=',height2 cloud1(k)=height1 cloud2(k)=height2 ENDIF IF detection_status EQ 3 THEN BEGIN READS,temp1,FORMAT='(3X,I5,1X,I5,1X,I5)',height1,height2,height3 ; print,'height1=',height1,'height2=',height2,'height3=',height3 cloud1(k)=height1 cloud2(k)=height2 cloud3(k)=height3 ENDIF ; asda=get_kbrd(1) READF,1,temp1 ;useless for us IF range_flg EQ 4 THEN loop=24 ;0 to 11.25 Km IF range_flg EQ 8 THEN loop=47 ;0 to 22.5 Km temp2=FLTARR(16) indheig=-1L ;index for height FOR I=0,loop-1 DO BEGIN READF,1,FORMAT='(F3.0,16Z4)',z,temp2 ;print,z,temp2 FOR J=0,15 DO BEGIN indheig=indheig+1L data(k,indheig)=temp2(J) range(indheig)=(z+J) IF indheig NE z+J THEN BEGIN PRINT,'!!!!!!ERROR WITH THE SPACE RESOLUTION' PRINT,'k=',k asda=GET_KBRD(1) ENDIF ENDFOR;J ENDFOR;loop endif else begin;------------------------------------------------------------------- READF,1,temp1 ;useless for us IF range_flg EQ 4 THEN loop=24 ;0 to 11.25 Km IF range_flg EQ 8 THEN loop=47 ;0 to 22.5 Km temp2=FLTARR(16) indheig=-1L ;index for height FOR I=0,loop-1 DO BEGIN READF,1,FORMAT='(F3.0,16Z4)',z,temp2 ;print,z,temp2 ;FOR J=0,15 DO BEGIN ; indheig=indheig+1L ; data(k,indheig)=temp2(J) ; range(indheig)=(z+J) ; IF indheig NE z+J THEN BEGIN ; PRINT,'!!!!!!ERROR WITH THE SPACE RESOLUTION' ; PRINT,'k=',k ; asda=GET_KBRD(1) ; ENDIF ;ENDFOR;J ENDFOR;loop endelse;------------------------------------------------------------------- READF,1,temp1 ; and READF,1,temp1 ENDWHILE label1:CLOSE,1 tmsec=tmsec(0:k) ; in sec date=date(0:k) time=time(0:k) cloud1=cloud1(0:k)/1000. ; in Km cloud2=cloud2(0:k)/1000. ; in Km cloud3=cloud3(0:k)/1000. ; in Km range=range(0L:indheig)*30./1000. ; in Km data=data(0:k,0L:indheig) ; in (10000*srad*km)^-1 ;FOR I=0,k DO BEGIN ;FOR J=0,indheig DO IF data(I,J) GE 6500 THEN data(I,J)=data(I,J)-65536. ;ENDFOR PRINT,'Number of 30-sec blocks=',k+1,' Number of height cells=',indheig+1 RETURN END ;------------------------------------------------------------------------------------------- ;MAIN PROGRAMME MNUSETUP,base,lcol,button2,button3,button5,rast_list,lab2,windowl COLTAB,redct,greenct,bluect ; initial colour table infoquery = 'y' ; default is print header on contour plots timeflg='n' ;default is to print minutes ;levels=[20,100,200,300,400,3200] ;default levels of backscatter levels=[10,25,50,75,100,125,150,175,200,225,250,300,350,400,450,500,1000,2000,65535] ;default levels of backscatter WSET,windowl PLOT,[0,0],[0,0],/nodata,background=0,xstyle=5,ystyle=5 xyouts,80,200,/device,'Colour Plot Window' SET_PLOT,'X' maxheight = 8 ;default max height maxbsct=2500 ;default max backsctater value for the instant profile quit = 0 ; initial values for end of loop flags ; ----------------Deal with various menu driven events------------ REPEAT BEGIN ev=WIDGET_EVENT(lcol) WIDGET_CONTROL, ev.id, GET_UVALUE=uvalue IF (uvalue eq 'menu') THEN BEGIN IF (ev.value EQ 'New File') THEN BEGIN FRFILE,flname,date,tmsec,time,data,cloud1,cloud2,cloud3,range,lab2 print, data temp2=STRCOMPRESS(STRING(LONG(tmsec)),/REMOVE_ALL)+' sec OR ' temp3=STRARR(N_ELEMENTS(tmsec)) & temp4=temp3 &temp1=temp3 FOR I=0,N_ELEMENTS(tmsec)-1 DO BEGIN temp1(I)=STRCOMPRESS(STRING(FIX(I)),/REMOVE_ALL) hours=LONG(tmsec(I))/3600L mins=LONG(tmsec(I)-hours*3600L)/60L sec=LONG(tmsec(I)-hours*3600L-mins*60L) hours1=STRCOMPRESS(STRING(hours),/REMOVE_ALL) mins1=STRCOMPRESS(STRING(mins),/REMOVE_ALL) sec1=STRCOMPRESS(STRING(sec),/REMOVE_ALL) temp3(I)='Block='+temp1(I)+' '+date(I)+' Starting at '+temp2(I)+hours1+':'+mins1+':'+sec1 ENDFOR WIDGET_CONTROL,rast_list,SET_VALUE=temp3 WIDGET_CONTROL,lab2,SET_VALUE='30sec Block Number,Date and Start Time of each Block of the File '+flname WIDGET_CONTROL,lab2,/APPEND,SET_VALUE='Choose the "Blocks" Option' ENDIF ; New File IF (ev.value EQ 'Blocks') THEN BEGIN WIDGET_CONTROL,lab2,SET_VALUE='Select START Block' ev_list=WIDGET_EVENT(rast_list) index1=ev_list.index WIDGET_CONTROL,lab2,SET_VALUE='Select END Block' ev_list=WIDGET_EVENT(rast_list) index2=ev_list.index print,'index1=',index1,'index2=',index2 WIDGET_CONTROL,lab2,/APPEND,SET_VALUE='Choose the "Colour Plot" Option' ENDIF ; Blocks IF (STRMID(ev.value,0,6) EQ 'Levels') THEN BEGIN strtemp=STRMID(ev.value,0,13) IF strtemp EQ 'Levels.Group1'THEN levels=[20,100,200,300,400,3200] IF strtemp EQ 'Levels.Group2'THEN levels=[20,100,200,300,400,3200] IF strtemp EQ 'Levels.Group3'THEN levels=[20,100,200,300,400,3200] WIDGET_CONTROL,lab2,/APPEND,SET_VALUE='Choose the "Colour Plot" Option' ENDIF ; Levels IF (STRMID(ev.value,0,6) eq 'Colour') THEN BEGIN IF (infoquery eq 'y') THEN BEGIN ; title hours=LONG(tmsec(index1))/3600L mins=LONG(tmsec(index1)-hours*3600L)/60L sec=LONG(tmsec(index1)-hours*3600L-mins*60L) hours1=STRCOMPRESS(STRING(hours),/REMOVE_ALL) mins1=STRCOMPRESS(STRING(mins),/REMOVE_ALL) sec1=STRCOMPRESS(STRING(sec),/REMOVE_ALL) hours=LONG(tmsec(index2))/3600L mins=LONG(tmsec(index2)-hours*3600L)/60L sec=LONG(tmsec(index2)-hours*3600L-mins*60L) hours2=STRCOMPRESS(STRING(hours),/REMOVE_ALL) mins2=STRCOMPRESS(STRING(mins),/REMOVE_ALL) sec2=STRCOMPRESS(STRING(sec),/REMOVE_ALL) title=date(index1)+' From '+hours1+':'+mins1+':'+sec1+' to '+hours2+':'+mins2+':'+sec2 ENDIF ELSE BEGIN title=' ' ENDELSE ;infoquery IF !d.name eq 'WIN' THEN BEGIN WSET,windowl WIDGET_CONTROL,lab2,SET_VALUE='WAIT!! Plotting' ENDIF IF (!d.name EQ 'CGM') OR (!d.name EQ 'PS') THEN WIDGET_CONTROL,lab2,SET_VALUE='WAIT!! Creating the '+save_file+' file' !P.MULTI=0 IF (ev.value eq 'Colour Plot.Cloud Height') THEN ZDorL = 'z' IF (ev.value eq 'Colour Plot.Backscatter Profile') THEN ZDorL = 'd' IF (ev.value eq 'Colour Plot.Cloud Height and Backscatter Profile') THEN ZDorL = 'l' IF (ev.value eq 'Colour Plot.Backscatter Profile with contour') THEN ZDorL = 'dc' IF (ev.value eq 'Colour Plot.Cloud Height and Backscatter Profile with contour') THEN ZDorL = 'lc' IF (ev.value eq 'Colour Plot.Backscatter Profile at Instant') THEN ZDorL = 'l0' ;------------------ Cloud Height ------------------------------------- IF (ZDorL EQ 'z') THEN BEGIN !P.MULTI=0 position=[0.09,0.12,0.87,0.94] tmp1=tmsec(index1:index2)*0.+maxheight PLOT,tmsec(index1:index2)/60.,tmp1,/nodata,color=18,xtitle='MINUTES SINCE MIDNIGHT',YTITLE='HEIGHT , Km',$ pos=position,TITLE=title,XSTYLE=3 ; A=FINDGEN(16)*(!PI*5/16.) ; USERSYM,COS(A),SIN(A),/FILL x=tmsec(index1:index2)/60. y1=cloud1(index1:index2) y2=cloud2(index1:index2) y3=cloud3(index1:index2) rs1=WHERE(y1 NE 0.,count1) rs2=WHERE(y2 NE 0.,count2) rs3=WHERE(y3 NE 0.,count3) IF count1 NE 0 THEN BEGIN OPLOT,x(rs1),y1(rs1),psym=4,symsize=0.5,color=18 ;circules ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[8,8],psym=4,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,8,'Lowest base',/DATA,color=18 ENDIF IF count2 NE 0 THEN BEGIN OPLOT,x(rs2),y2(rs2),psym=6,symsize=0.5,color=18 ;sruares ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[8.5,8.5],psym=6,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,8.5,'Second lowest base',/DATA,color=18 ENDIF IF count3 NE 0 THEN BEGIN OPLOT,x(rs3),y3(rs3),psym=5,symsize=0.5,color=18 ;triangles ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[9,9],psym=6,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,9,'Highest base',/DATA,color=18 ENDIF WIDGET_CONTROL,lab2,/APPEND,set_value='Choose new option' ENDIF ;'z' ;-----------------------------Backscatter Profile------------------------------------- IF (ZDorL EQ 'd') THEN BEGIN !P.MULTI=0 position=[0.09,0.12,0.87,0.94] tmp1=tmsec(index1:index2)*0.+maxheight PLOT,tmsec(index1:index2)/60.,tmp1,/nodata,color=18,xtitle='MINUTES SINCE MIDNIGHT',YTITLE='HEIGHT , Km',$ pos=position,TITLE=title,XSTYLE=3,charsize=0.9 ;levels=[20,100,200,300,400,3200] color=BTSCLSPIROS(data,levels) ; data <10 color=0 ;10<=data<100 color=1 ;3000<=data color=7 heightclip=maxheight-maxheight/100. FOR I=0L,N_ELEMENTS(tmsec(index1:index2))-1L DO BEGIN IF I+index1 NE N_ELEMENTS(tmsec)-1 THEN tt=((tmsec(index1+I+1)-tmsec(index1+I))/60.)<0.5 ELSE tt=0.5 xmin=tmsec(index1+I)/60. & xmax=xmin+tt FOR J=0L,N_ELEMENTS(range)-1L DO BEGIN IF J NE N_ELEMENTS(range)-1 THEN hh=range(J+1)-range(J) ELSE hh=0.03 ymin=range(J) & ymax=ymin+hh IF (abs(ymax) LT heightclip) THEN POLYFILL,[xmin,xmax,xmax,xmin],[ymin,ymin,ymax,ymax],color=color(I+index1,J),/FILL ENDFOR;J ENDFOR;I caption='(10000*srad*Km)^-1' COL_SCAL,levels,caption WIDGET_CONTROL,lab2,/APPEND,set_value='Choose new option' ENDIF ;'d' ;-----------------------------Backscatter Profile and Heights IF (ZDorL EQ 'l') THEN BEGIN !P.MULTI=0 position=[0.09,0.12,0.87,0.94] tmp1=tmsec(index1:index2)*0.+maxheight PLOT,tmsec(index1:index2)/60.,tmp1,/nodata,color=18,xtitle='MINUTES SINCE MIDNIGHT',YTITLE='HEIGHT , Km',$ pos=position,TITLE=title,XSTYLE=3,charsize=0.9 color=BTSCLSPIROS(data,levels) heightclip=maxheight-maxheight/100. FOR I=0L,N_ELEMENTS(tmsec(index1:index2))-1L DO BEGIN IF I+index1 NE N_ELEMENTS(tmsec)-1 THEN tt=((tmsec(index1+I+1)-tmsec(index1+I))/60.)<0.5 ELSE tt=0.5 xmin=tmsec(index1+I)/60. & xmax=xmin+tt FOR J=0L,N_ELEMENTS(range)-1L DO BEGIN IF J NE N_ELEMENTS(range)-1 THEN hh=range(J+1)-range(J) ELSE hh=0.03 ymin=range(J) & ymax=ymin+hh IF (abs(ymax) LT heightclip) THEN POLYFILL,[xmin,xmax,xmax,xmin],[ymin,ymin,ymax,ymax],color=color(I+index1,J),/FILL ENDFOR;J ENDFOR;I caption='10000*srad*Km)^-1' COL_SCAL,levels,caption ;------height x=tmsec(index1:index2)/60. y1=cloud1(index1:index2) y2=cloud2(index1:index2) y3=cloud3(index1:index2) rs1=WHERE(y1 NE 0.,count1) rs2=WHERE(y2 NE 0.,count2) rs3=WHERE(y3 NE 0.,count3) IF count1 NE 0 THEN BEGIN OPLOT,x(rs1),y1(rs1),psym=4,symsize=0.5,color=18 ;circules ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[8,8],psym=4,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,8,'Lowest base',/DATA,color=18 ENDIF IF count2 NE 0 THEN BEGIN OPLOT,x(rs2),y2(rs2),psym=6,symsize=0.5,color=18 ;sruares ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[8.5,8.5],psym=6,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,8.5,'Second lowest base',/DATA,color=18 ENDIF IF count3 NE 0 THEN BEGIN OPLOT,x(rs3),y3(rs3),psym=5,symsize=0.5,color=18 ;triangles ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[9,9],psym=6,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,9,'Highest base',/DATA,color=18 ENDIF WIDGET_CONTROL,lab2,/APPEND,set_value='Choose new option' ENDIF ;'l' ;-----------------------------------CONTOUR IF (ZDorL EQ 'dc') THEN BEGIN !P.MULTI=0 position=[0.09,0.12,0.87,0.94] tmp1=tmsec(index1:index2)*0.+maxheight ; levels=[20,100,200,300,400,3200] PLOT,tmsec(index1:index2)/60.,tmp1,/nodata,color=18,xtitle='MINUTES SINCE MIDNIGHT',YTITLE='HEIGHT , Km',$ pos=position,TITLE=title,XSTYLE=3,charsize=0.9 ,yrange=[0,maxheight],ystyle=3 ; asda=get_kbrd(1) c_colors=INDGEN(N_ELEMENTS(levels)+1) & c_colors=c_colors(1:N_ELEMENTS(c_colors)-1) datatemp=data(index1:index2,*) CONTOUR,datatemp,tmsec(index1:index2)/60.,range,/fill,levels=levels,c_colors=c_colors,$ xstyle=3,yrange=[0,maxheight],ystyle=3,/noerase ,pos=position,color=18,charsize=0.9 ; asda=get_kbrd(1) ; CONTOUR,datatemp,tmsec(index1:index2)/60.,range,/nodata,$ ;xstyle=3,yrange=[0,maxheight],ystyle=3,xtitle='MINUTES SINCE MIDNIGHT',YTITLE='HEIGHT , Km',$ ;TITLE=title,color=18,/overplot ,charsize=0.9 caption='(10000*srad*Km)^-1' COL_SCAL,levels,caption WIDGET_CONTROL,lab2,/APPEND,set_value='Choose new option' ENDIF ;'dc' IF (ZDorL EQ 'lc') THEN BEGIN !P.MULTI=0 position=[0.09,0.12,0.87,0.94] tmp1=tmsec(index1:index2)*0.+maxheight ; levels=[20,100,200,300,400,3200] PLOT,tmsec(index1:index2)/60.,tmp1,/nodata,color=18,xtitle='MINUTES SINCE MIDNIGHT',YTITLE='HEIGHT , Km',$ pos=position,TITLE=title,XSTYLE=3,charsize=0.9 ,yrange=[0,maxheight],ystyle=3 ; asda=get_kbrd(1) c_colors=INDGEN(N_ELEMENTS(levels)+1) & c_colors=c_colors(1:N_ELEMENTS(c_colors)-1) datatemp=data(index1:index2,*) CONTOUR,datatemp,tmsec(index1:index2)/60.,range,/fill,levels=levels,c_colors=c_colors,$ xstyle=3,yrange=[0,maxheight],ystyle=3,/noerase ,pos=position,color=18,charsize=0.9 ; asda=get_kbrd(1) ; CONTOUR,datatemp,tmsec(index1:index2)/60.,range,/nodata,$ ;xstyle=3,yrange=[0,maxheight],ystyle=3,xtitle='MINUTES SINCE MIDNIGHT',YTITLE='HEIGHT , Km',$ ;TITLE=title,color=18,/overplot ,charsize=0.9 caption='(10000*srad*Km)^-1' COL_SCAL,levels,caption ;-------height x=tmsec(index1:index2)/60. y1=cloud1(index1:index2) y2=cloud2(index1:index2) y3=cloud3(index1:index2) rs1=WHERE(y1 NE 0.,count1) rs2=WHERE(y2 NE 0.,count2) rs3=WHERE(y3 NE 0.,count3) IF count1 NE 0 THEN BEGIN OPLOT,x(rs1),y1(rs1),psym=4,symsize=0.5,color=18 ;circules ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[8,8],psym=4,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,8,'Lowest base',/DATA,color=18 ENDIF IF count2 NE 0 THEN BEGIN OPLOT,x(rs2),y2(rs2),psym=6,symsize=0.5,color=18 ;sruares ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[8.5,8.5],psym=6,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,8.5,'Second lowest base',/DATA,color=18 ENDIF IF count3 NE 0 THEN BEGIN OPLOT,x(rs3),y3(rs3),psym=5,symsize=0.5,color=18 ;triangles ; OPLOT,[tmsec(index2-50)/60.,tmsec(index2-50)/60.],[9,9],psym=6,symsize=0.5,color=18 ; XYOUTS,tmsec(index2-48)/60.,9,'Highest base',/DATA,color=18 ENDIF WIDGET_CONTROL,lab2,/APPEND,set_value='Choose new option' ENDIF ;'lc' IF (ZDorL EQ 'l0') THEN BEGIN WIDGET_CONTROL,lab2,SET_VALUE='Select a Block' ev_list=WIDGET_EVENT(rast_list) indexblock=ev_list.index IF (infoquery eq 'y') THEN BEGIN ; title hoursb=LONG(tmsec(indexblock))/3600L minsb=LONG(tmsec(indexblock)-hoursb*3600L)/60L secb=LONG(tmsec(indexblock)-hoursb*3600L-minsb*60L) hours1b=STRCOMPRESS(STRING(hoursb),/REMOVE_ALL) mins1b=STRCOMPRESS(STRING(minsb),/REMOVE_ALL) sec1b=STRCOMPRESS(STRING(secb),/REMOVE_ALL) titleb=date(index1)+'at '+hours1b+':'+mins1b+':'+sec1b ENDIF ELSE BEGIN titleb=' ' ENDELSE ;infoquery !P.MULTI=0 position=[0.09,0.12,0.87,0.94] tmpy=range*0.+maxheight tmpx=tmpy*0. PLOT,tmpx,tmpy,/nodata,color=18,xtitle='(10000*srad*km)^-1',YTITLE='HEIGHT , Km',$ pos=position,TITLE=titleb,xrange=[-maxbsct,maxbsct] tmpx=data(indexblock,*) ; A=FINDGEN(16)*(!PI*5/16.) ; USERSYM,COS(A),SIN(A),/FILL y1=cloud1(indexblock) y2=cloud2(indexblock) y3=cloud3(indexblock) OPLOT,tmpx,range,psym=-3,color=18 IF y1 NE 0. THEN BEGIN OPLOT,[-maxbsct,maxbsct],[y1,y1],psym=-3,color=18 XYOUTS,-1000,y1+0.02,'Lowest base',/DATA,color=18 ENDIF IF y2 NE 0. THEN BEGIN OPLOT,[-maxbsct,maxbsct],[y2,y2],psym=-3,color=18 XYOUTS,-500,y2+0.02,'Second Lowest base',/DATA,color=18 ENDIF IF y3 NE 0. THEN BEGIN OPLOT,[-maxbsct,maxbsct],[y3,y3],psym=-3,color=18 XYOUTS,-1000,y3+0.02,'Highest Lowest base',/DATA,color=18 ENDIF WIDGET_CONTROL,lab2,/APPEND,set_value='Choose new option' ENDIF ;'l0' IF !d.name eq 'PS' or !d.name eq 'CGM' THEN BEGIN device,/close & set_plot,'win' & !p.font=-1 WIDGET_CONTROL,button2,set_button=0 WIDGET_CONTROL,button3,set_button=0 ENDIF ENDIF ;colour IF (ev.value eq 'Quit') THEN quit = 1 IF(ev.value eq 'Save GIF') THEN BEGIN save_file=dialog_pickfile(Title='File to store data') coltab,redct,greenct,bluect wset, windowl IF STRLEN(save_file) gt 0 THEN BEGIN openw,3,save_file WRITE_GIF,save_file,tvrd(),redct,greenct,bluect CLOSE,3 ENDIF WIDGET_CONTROL,lab2,/APPEND,set_value='Choose new option' ENDIF ENDIF ; menu IF (uvalue eq 'CGM') THEN BEGIN IF (ev.select eq 1) THEN BEGIN WIDGET_CONTROL,lab2,set_value='Choose from "Colours Plot" option' save_file=dialog_pickfile(Title='File to store data / default idl.cgm') IF STRLEN(save_file) eq 0 THEN save_file = 'idl.cgm' set_plot,'CGM' device, FILENAME = save_file !p.font=-1 bw='n' IF(bw eq 'n') THEN coltab,redct,greenct,bluect ELSE bwtab,redct,greenct,bluect ENDIF ELSE BEGIN set_plot,'win' !p.font=-1 ENDELSE ENDIF IF (uvalue eq 'PS') THEN BEGIN IF (ev.select eq 1) THEN BEGIN WIDGET_CONTROL,lab2,set_value='Choose from "Colours Plot" option' save_file=dialog_pickfile(Title='File to store data / default idl.ps') IF STRLEN(save_file) eq 0 THEN save_file = 'idl.ps' set_plot,'PS' device, /color , FILENAME = save_file, bits=8,/INCHES,YSIZE=5,YOFFSET=5 !p.font=0 HELP,/DEVICE ENDIF ELSE BEGIN set_plot,'win' !p.font=-1 ENDELSE ENDIF IF (uvalue eq 'Title') THEN BEGIN IF (ev.select eq 1) THEN infoquery = 'y' ELSE infoquery = 'n' ENDIF IF (uvalue eq 'HH:MM:SS') THEN BEGIN IF (ev.select eq 1) THEN timeflg = 'y' ELSE timeflg = 'n' ENDIF IF(uvalue eq 'slider') THEN maxheight = ev.value IF(uvalue eq 'slider1') THEN maxbsct = ev.value ENDREP UNTIL (quit eq 1) CLOSE,1 WIDGET_CONTROL, /DESTROY, base END