pro aboutAutoplot ;AboutUtil= OBJ_NEW('IDLJavaObject$Static$AboutUtil', 'org.das2.util.AboutUtil') ;print, "= Build Information =" ;print, "release tag: ", AboutUtil.getReleaseTag() ;print, "build url: ", AboutUtil.getJenkinsURL() print, "= Runtime Information =" System= OBJ_NEW('IDLJavaObject$Static$System', 'java.lang.System') javaVersion = System.getProperty("java.version"); // applet okay javaVersionWarning= '' ; The java about checks for 1.8.102 arch = System.getProperty("os.arch"); // applet okay Runtime= OBJ_NEW('IDLJavaObject$Static$System', 'java.lang.Runtime') nf= OBJ_NEW( 'IDLJavaObject$System', 'java.text.DecimalFormat' ) mem = nf.format( (Runtime.getRuntime()).maxMemory() / 1000000 ) tmem= nf.format( (Runtime.getRuntime()).totalMemory() / 1000000 ) fmem= nf.format( (Runtime.getRuntime()).freeMemory() / 1000000 ) print, "Java version: " + javaVersion + " " + javaVersionWarning print, "max memory (MB): " + mem + " (memory available to process)" print, "total memory (MB): " + tmem + " (amount allocated to the process)" print, "free memory (MB): " + fmem + " (amount available before more must be allocated)" end ;; for rank 2, ytags must be specified ; ascii, boolean, use ascii transfer types pro das2stream, dataStruct, filename, ytags=ytags, ascii=ascii, xunits=xunits print, 'writing das2stream to ' + filename on_error, 2 streamHeader= [ '[00]xxxxxx', '' ] contentLength= -10 ; don't include the packet tag and content length for i=0,n_elements( streamHeader )-1 do begin contentLength += strlen( streamHeader[i] ) + 1 endfor x= streamHeader[0] strput, x, string( contentLength, format='(i6.6)' ), 4 streamHeader[0]= x ascii= keyword_Set(ascii) ; 1=do ascii stream, 0=binary xdatatype= ascii ? 'ascii24' : 'sun_real8' datatype= ascii ? 'ascii16' : 'sun_real8' packetDescriptor= [ '[01]xxxxxx' ] t= tag_names( dataStruct ) nt= n_elements(t) packetDescriptor= [ packetDescriptor, ' ' ] totalItems=1 format='(f24.12' reclen= 4 + 24 + (nt-1) * 20 for i=1,nt-1 do begin s= size( dataStruct.(i) ) name= i eq 1 ? '' : t[i] ;;; stream reader needs a default plane if ( s[0] eq 1 ) then begin packetDescriptor= [ packetDescriptor, $ ' ' ] format= format + ( ( i lt n_elements(t)-1 ) ? ',e16.4' : ',e15.3)' ) totalItems+=1 endif else begin if n_elements( ytags ) eq 0 then ytags= findgen( s[2] ) sytags= strjoin( strtrim( ytags, 2 ), ',' ) nitems= s[2] packetDescriptor= [ packetDescriptor, $ ' ' ] for i=1,nitems-1 do format= format + ',e16.4' format= format + ( ( i lt n_elements(t)-1 ) ? ','+',e16.4' : ','+'e15.4)' ) totalItems+= nitems endelse endfor packetDescriptor= [ packetDescriptor, '' ] contentLength= -10 ; don't include the packet tag and content length for i=0,n_elements( packetDescriptor )-1 do begin contentLength += strlen( packetDescriptor[i] ) + 1 endfor x= packetDescriptor[0] strput, x, string( contentLength, format='(i6.6)' ), 4 packetDescriptor[0]= x openw, unit, filename, /get_lun for i=0,n_elements(streamHeader)-1 do begin writeu, unit, byte( streamHeader[i] ) writeu, unit, byte(10) endfor for i=0,n_elements(packetDescriptor)-1 do begin writeu, unit, byte( packetDescriptor[i] ) writeu, unit, byte(10) endfor nr= n_elements(dataStruct.(0)) data= make_array( /double, totalItems, nr ) dataCol= 0 ; column within rank2 array for j=0,nt-1 do begin dd= dataStruct.(j) s= size(dd) if ( s[0] eq 2 ) then begin data[dataCol:(dataCol+nitems-1),*]= transpose(dd) dataCol= dataCol+nitems endif else begin data[dataCol,*]= dd dataCol= dataCol+1 endelse endfor if ( ascii eq 0 ) then begin r= where( finite( data ) eq 0 ) swap_endian_inplace, data, /swap_if_little_endian if ( r[0] ne -1 ) then begin data[r]= !values.d_nan endif endif for i=0L, nr-1 do begin writeu, unit, byte(':01:') if ( ascii ) then begin s= string( data[*,i], format=format ) writeu, unit, s writeu, unit, byte(10) endif else begin writeu, unit, data[*,i] endelse endfor close, unit free_lun, unit end ;; for rank 2, ytags must be specified ; ascii, boolean, use ascii transfer types pro qstream, dataStruct, filename, depend_1=ytags, ascii=ascii, xunits=xunits, delta_plus=delta_plus, delta_minus=delta_minus print, 'writing qstream to ' + filename on_error, 2 t= tag_names( dataStruct ) name= t[1] tname= t[0] streamHeader= [ '[00]xxxxxx', '' ] contentLength= -10 ; don't include the packet tag and content length for i=0,n_elements( streamHeader )-1 do begin contentLength += strlen( streamHeader[i] ) + 1 endfor x= streamHeader[0] strput, x, string( contentLength, format='(i6.6)' ), 4 streamHeader[0]= x ascii= keyword_Set(ascii) ; 1=do ascii stream, 0=binary if ( n_elements( xunits ) eq 0 ) then begin xunits="" ; dimensionless end xdatatype= ascii ? 'ascii24' : 'double' datatype= ascii ? 'ascii16' : 'double' if ( n_elements( ytags ) gt 0 ) then begin ny= n_elements(ytags) svals= strtrim(ytags[0],2) for j=1,n_elements(ytags)-1 do begin svals= svals+','+strtrim(ytags[j],2) endfor dep1Descriptor= [ '[99]xxxxxx' ] dep1Descriptor= [ dep1Descriptor, ' ' ] dep1Descriptor= [ dep1Descriptor, ' ' ] dep1Descriptor= [ dep1Descriptor, ' '] dep1Descriptor= [ dep1Descriptor, ' ' ] dep1Descriptor= [ dep1Descriptor, ' ' ] dep1Descriptor= [ dep1Descriptor, ' ' ] dep1Descriptor= [ dep1Descriptor, ' ' ] contentLength= -10 ; don't include the packet tag and content length for i=0,n_elements( dep1Descriptor )-1 do begin contentLength += strlen( dep1Descriptor[i] ) + 1 endfor x= dep1Descriptor[0] strput, x, string( contentLength, format='(i6.6)' ), 4 dep1Descriptor[0]= x endif packetDescriptor= [ '[01]xxxxxx' ] nt= n_elements(t) packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' '] packetDescriptor= [ packetDescriptor, ' '] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] totalItems=1 format='(f24.12' reclen= 4 + 24 + (nt-1) * 20 for i=1,nt-1 do begin s= size( dataStruct.(i) ) name= t[i] ;;; stream reader needs a default plane if ( s[0] eq 1 ) then begin packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' '] packetDescriptor= [ packetDescriptor, ' '] if ( i eq 1 ) then begin if ( keyword_set(delta_plus) ) then begin packetDescriptor= [ packetDescriptor, ' '] endif if ( keyword_set(delta_minus) ) then begin packetDescriptor= [ packetDescriptor, ' '] endif endif packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] format= format + ( ( i lt n_elements(t)-1 ) ? ',e16.4' : ',e15.3)' ) totalItems+=1 endif else begin nitems= s[2] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' '] packetDescriptor= [ packetDescriptor, ' '] packetDescriptor= [ packetDescriptor, ' '] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] packetDescriptor= [ packetDescriptor, ' ' ] for i=1,nitems-1 do format= format + ',e16.4' format= format + ( ( i lt n_elements(t)-1 ) ? ','+',e16.4' : ','+'e15.4)' ) totalItems+= nitems endelse endfor packetDescriptor= [ packetDescriptor, '' ] contentLength= -10 ; don't include the packet tag and content length for i=0,n_elements( packetDescriptor )-1 do begin contentLength += strlen( packetDescriptor[i] ) + 1 endfor x= packetDescriptor[0] strput, x, string( contentLength, format='(i6.6)' ), 4 packetDescriptor[0]= x openw, unit, filename, /get_lun for i=0,n_elements(streamHeader)-1 do begin writeu, unit, byte( streamHeader[i] ) writeu, unit, byte(10) endfor if ( n_elements( ytags ) gt 0 ) then begin for i=0,n_elements(dep1Descriptor)-1 do begin writeu, unit, byte( dep1Descriptor[i] ) writeu, unit, byte(10) endfor endif for i=0,n_elements(packetDescriptor)-1 do begin writeu, unit, byte( packetDescriptor[i] ) writeu, unit, byte(10) endfor nr= n_elements(dataStruct.(0)) data= make_array( /double, totalItems, nr ) dataCol= 0 ; column within rank2 array for j=0,nt-1 do begin dd= dataStruct.(j) s= size(dd) if ( s[0] eq 2 ) then begin data[dataCol:(dataCol+nitems-1),*]= transpose(dd) dataCol= dataCol+nitems endif else begin data[dataCol,*]= dd dataCol= dataCol+1 endelse endfor if ( ascii eq 0 ) then begin r= where( finite( data ) eq 0 ) swap_endian_inplace, data, /swap_if_little_endian if ( r[0] ne -1 ) then begin data[r]= !values.d_nan endif endif for i=0L, nr-1 do begin writeu, unit, byte(':01:') if ( ascii ) then begin s= string( data[*,i], format=format ) writeu, unit, s writeu, unit, byte(10) endif else begin writeu, unit, data[*,i] endelse endfor close, unit free_lun, unit end pro test_dump x= findgen(3000)/3 y= sin( x ) data= { x:x, y:y } das2stream, data, 'my.d2s', /ascii end pro test_dump_rank2 z= dist(15,20) x= findgen(15)+3 y= findgen(20) data= { x:x, z:z } das2stream, data, 'my.d2s', ytags= y, /ascii end pro test_dump_qstream x= findgen(3000)/3 y= sin( x ) data= { x:x, y:y } qstream, data, 'my.qds', /ascii end pro test_dump_rank2_qstream z= dist(15,20) x= findgen(15)+3 y= findgen(20)*10 data= { x:x, z:z } qstream, data, 'my.qds', depend_1= y, /ascii end pro test_dump_delta_plus_qstream z= dist(15,20) x= findgen(20)+3 y= findgen(20)*10 + randomn( s, 20 ) dy= replicate(1,20) data= { x:x, y:y, delta:dy } qstream, data, 'my.qds', /ascii, delta_plus='delta', delta_minus='delta' end function tryPortConnect, host, port, unit=unit socket, unit, 'localhost', port, error=error, /get_lun, write_timeout=1 if ( error eq 0 ) then begin close, unit free_lun, unit endif return, error end function sendCommand, unit, cmd printf, unit, cmd response='' return, 0 ; wait, 0.2 ; ; x= file_poll_input( unit, timeout=0, count=count ) ; while ( count gt 0 ) do begin ; readf, unit, response ; print, response ; x= file_poll_input( unit, timeout=0, count=count ) ; endwhile end function kwToString, keywords kw='' t= tag_names(keywords) for i=0,n_elements(t)-1 do begin kw1= strlowcase( t[i] ) val1= keywords.(i) type= size( val1 ) if ( kw1 eq 'rendertype' ) then kw1='renderType' if ( type[0] eq 0 ) then begin sval= string(val1) if ( type[1] eq 7 ) then sval="'" + sval + "'" endif else if ( type[0] eq 1 ) then begin sval= '[' for j=0, type[3]-1 do begin sval1= strtrim(val1[j],2) if ( type[2] eq 7 ) then sval1="'" + sval1 + "'" sval= sval+sval1 if ( j lt type[3]-1 ) then sval= sval+', ' endfor sval= sval+']' endif else begin message, '2D and up arrays not supported.' endelse kw= kw + ', ' + kw1 + '=' + sval endfor return, strmid( kw, 2 ) end function getStructTag, struct, tag, def t= tag_names(struct) ry = where( strmatch( t, tag, /fold) ) if ( ry[0] eq -1 ) then return, def return, struct.(ry[0]) end ;+ ; NAME: ; APPLOT ; PURPOSE: ; Plot to Autoplot instead of the direct graphics plotting, by creating a temporary file of the data and sending a plot ; command to Autoplot with the server turned on. ; ARGUMENTS: ; X,Y,Z as with plot. If X is an integer, then it is the position in Autoplot, so that multiple plots can be sent to ; one autoplot canvas. ; CALLING SEQUENCE: ; APPLOT, X, Y ; APPLOT, X, Y, Z for a spectrogram ; ; KEYWORDS: ; tmpfile= explicitly set the file used to move data into Autoplot. This can also be used with /noplot ; /noplot just make the tmpfile, don't actually try to plot. ; xunits= units as a string, especially like "seconds since 2010-01-01T00:00" ; delta_plus= array of positive lengths showing the upper limit of the 1-sigma confidence interval. ; delta_minus= array of positive lengths showing the lower limit of the 1-sigma confidence interval. ; index= plot position [0,1,2,3..] 0 is default. (same as integer for first argument.) ;- pro applot, x_in, y_in, z_in, z4_in, xunits=xunits, tmpfile=tmpfile, noplot=noplot, _extra=e, $ respawn=respawn, delta_plus=delta_plus, delta_minus=delta_minus, $ index=index x= x_in if ( n_elements(y_in) gt 0 ) then y= y_in if ( n_elements(z_in) gt 0 ) then z= z_in if ( n_elements(z4_in) gt 0 ) then z4= z4_in common applot_common, appid ; on_error, 2 if n_elements( x ) eq 0 then begin message, 'x is undefined' endif sep= !version.os_family eq 'Windows' ? ';' : ':' port= 12345 if keyword_set(respawn) then begin javahome= getenv( 'JAVA_HOME' ) if javahome eq '' then javahome= 'c:/"program files"/java/jre1.6.0_03/' print, 'spawn autoplot java process' cmd= javahome+'/bin/java -cp '+classpath+ ' org.autoplot.AutoplotUI --port='+strtrim(port,2) print, cmd if !version.os_family eq 'Windows' then begin spawn, cmd, pid=appid, /nowait endif else begin spawn, cmd+' &', pid=appid endelse t0= systime(1) print, 'sleeping until AP wakes up...' while ( ( systime(1)-t0) lt 15 && tryPortConnect( 'localhost', port ) ne 0 ) do begin sleep, 1 print, 'sleeping...' endwhile print, 'survived spawn' endif ext='d2s' if ( keyword_set( delta_plus ) ) then begin ext='qds' endif if n_elements( tmpfile ) eq 0 then begin caldat, systime(1, /julian), Mon, Day, Year, Hour, Min tag= string( Year, Mon, Day, Hour, Min, format='(I04,I02,I02,"T",I02,I02)' ) tmpfile= getenv('IDL_TMPDIR') + 'autoplot.' + tag + '.???.'+ext f= findfile( tmpfile, count=c ) tmpfile= getenv('IDL_TMPDIR') + 'autoplot.' + tag + '.' + string(c,format='(I3.3)') + '.'+ext tmpfile= strjoin( str_sep( tmpfile, '\' ), '/' ) endif else begin if ( strpos( tmpfile, '.'+ext ) ne strlen(tmpfile)-4 ) then begin tmpfile= tmpfile + '.'+ext ; add the extension endif endelse np= n_params(); ; check for papco data structures if ( size( x, /type ) eq 8 ) then begin rank= size( x.data, /n_dimensions ) t= tag_names( x ) vmin= -1e38 r= where( strmatch( t, 'validmin', /fold) ) if ( r[0] ne -1 ) then begin vmin= x.(r) endif vmax= 1e38 r= where( strmatch( t, 'validmax', /fold) ) if ( r[0] ne -1 ) then begin vmax= x.(r) endif if ( rank eq 2 ) then begin z= double(x.data) ry = where( strmatch( t, 'depend_1', /fold) ) if ( ry eq -1 ) then begin y= findgen( (size(x.data))[2] ) endif else begin ry = where( strmatch( t, x.(ry[0]), /fold) ) y= double( (x.(ry[0])).data ) endelse rx = where( strmatch( t, 'depend_0', /fold) ) if ( rx eq -1 ) then begin x= findgen( (size(z))[1] ) endif else begin rx = where( strmatch( t, x.(rx[0]), /fold) ) xds= (x.(rx[0])) x= double( xds.data ) xunits= getStructTag( xds, 'units', '' ) endelse np= 3 r= where( z le vmin or z ge vmax ) ; papco_ds is exclusive of vmin and vmax (for now). if ( r[0] ne -1 ) then begin z[r]= !values.f_nan endif endif else if ( rank eq 1 ) then begin y= double(x.data) rx = where( strmatch( t, 'depend_0', /fold) ) if ( rx eq -1 ) then begin x= findgen( (size(y))[1] ) endif else begin rx = where( strmatch( t, x.(rx[0]), /fold) ) xds= (x.(rx[0])) x= double( xds.data ) xunits= getStructTag( xds, 'units', '' ) endelse np= 2 endif else begin message, 'papco ds rank not supported' endelse if ( xunits eq 'mjd2000' ) then begin xunits= 'days since 2000-001T00:00' ; verified by comparing conversion to cdf epoch in papco_ds_units.pro endif endif ; serialize the data to a das2stream in a temporary file if ( size(x,/n_elements) eq 1 and size( x, /type ) eq 2 or size( x, /type ) eq 3 ) then begin pos= x xx= y if ( n_elements(z) gt 0 ) then yy= z if ( n_elements(z4) gt 0 ) then zz= z4 ; TODO: sloppy, move y to x should clear y np= np-1 endif else begin pos= -1 xx= x if ( n_elements(y) gt 0 ) then yy= y if ( n_elements(z) gt 0 ) then zz= z endelse if ( n_elements( index ) eq 1 ) then begin pos= index endif if ( size(xx,/type) eq 6 ) then begin message, 'complex numbers are not supported' endif if ( size(yy,/type) eq 6 ) then begin message, 'complex numbers are not supported' endif if ( size(zz,/type) eq 6 ) then begin message, 'complex numbers are not supported' endif if n_elements(xunits) eq 0 then xunits='' if ( keyword_set(delta_plus) and keyword_set(delta_minus) ) then begin if ( ext ne 'qds' ) then begin message, 'internal error, ext does not match' endif if np eq 3 then begin data= { x:xx, z:zz } qstream, data, tmpfile, ytags=yy, xunits=xunits, ascii=0 ; TODO: redo with qstreams ; TODO: redo with PAPCO's old version of QDataSet endif else if np eq 2 then begin data= { x:xx, y:yy, delta_plus:delta_plus, delta_minus:delta_minus } qstream, data, tmpfile, ascii=0, xunits=xunits, delta_plus='DELTA_PLUS', delta_minus='DELTA_MINUS' endif else begin s= size( xx ) if s[0] eq 2 then begin data= { x:findgen(s[1]), z:xx } qstream, data, tmpfile, ytags=findgen(s[2]), ascii=0, xunits='' endif else begin data= { x:findgen(s[1]), y:xx, delta_plus:delta_plus, delta_minus:delta_minus } qstream, data, tmpfile, ascii=0, xunits='', delta_plus='DELTA_PLUS', delta_minus='DELTA_MINUS' endelse endelse endif else begin if np eq 3 then begin data= { x:xx, z:zz } das2stream, data, tmpfile, ytags=yy, xunits=xunits, ascii=0 ; TODO: redo with qstreams ; TODO: redo with PAPCO's old version of QDataSet endif else if np eq 2 then begin data= { x:xx, y:yy } das2stream, data, tmpfile, ascii=0, xunits=xunits endif else begin s= size( xx ) if s[0] eq 2 then begin data= { x:findgen(s[1]), z:xx } das2stream, data, tmpfile, ytags=findgen(s[2]), ascii=0, xunits='' endif else begin data= { x:findgen(s[1]), y:xx } das2stream, data, tmpfile, ascii=0, xunits='' endelse endelse endelse if keyword_set( noplot ) then begin return endif ex= '' if ( n_elements( e ) gt 0 ) then begin ex= kwToString( e ) endif catch, err if ( err eq 0 ) then begin socket, unit, 'localhost', port, /get_lun, write_timeout=1 if ( !version.os_family eq 'Windows' ) then tmpfile= '/'+tmpfile if ( pos gt -1 ) then begin if n_elements( e ) gt 0 then begin cmd= 'plot( '+strtrim(pos,2)+', ''file:'+tmpfile+''', '+ex+ ');' ; semicolon means no echo endif else begin cmd= 'plot( '+strtrim(pos,2)+', ''file:'+tmpfile+''' );' ; semicolon means no echo endelse endif else begin if n_elements( e ) gt 0 then begin cmd= 'plot( ''file:'+tmpfile+''', '+ex+ ');' ; semicolon means no echo endif else begin cmd= 'plot( ''file:'+tmpfile+''' );' ; semicolon means no echo endelse endelse foo= sendCommand( unit, cmd ) if n_elements( ytitle ) eq 1 then begin cmd= 'dom.controller.plot.yaxis.label='''+ytitle+''' foo= sendCommand( unit, cmd ) endif close, unit free_lun, unit endif else begin catch, /cancel print, 'error encountered!' print, 'try with /respawn' print, !error_state.msg if n_elements(appid) ne 0 then xxxx= temporary( appid ) retall endelse ; clean up old tmp files more than 10 minutes old. caldat, systime(1, /julian) - 10/1440., Mon, D, Y, H, Min ; ten minutes ago tag= string( Y, Mon, D, H, Min, format='(I04,I02,I02,"T",I02,I02)' ) tmpfile= getenv('IDL_TMPDIR') + 'autoplot.' + tag + '.000.d2s' f= findfile( getenv('IDL_TMPDIR') + 'autoplot.' + '*' + '.???.d2s', count=c ) for i=0,c-1 do begin if ( f[i] lt tmpfile ) then begin ;print, 'deleting ' + f[i] file_delete, f[i] endif endfor end