# send data over to Autoplot via its server port. This is a port of the applot for IDL that supports NumPy.
#
# Write from python to d2s. This will not work on Windows because of linefeeds. (Ask Chris
# how to write out 0x10 and doubles.)
# Review of how to send data to the Autoplot port:
#import socket
#s = socket.socket()
#s.connect(('localhost',12345))
#cmd='plot(dataset([1,2,3,2,1]))\n'
#s.send( cmd )
### for rank 2, ytags must be specified
## ascii, boolean, use ascii transfer types
def das2stream( dataStruct, filename, ytags=None, ascii=1, xunits='' ):
#filename='/tmp/python.d2s'
#ascii=0
#dataStruct= { 'x':[1,2,3,4,5], 'y':[2,3,4,4,3], 'tags':['x','y'] }
#xunits= ''
#if (True):
print 'writing das2stream to ' + filename
import time
streamHeader= [ '[00]xxxxxx', '' ]
contentLength= -10 # don't include the packet tag and content length
for i in xrange( len( streamHeader ) ):
contentLength += len( streamHeader[i] ) + 1
x= streamHeader[0]
x= '[00]' + '%06d' % contentLength + x[10:]
streamHeader[0]= x
if ascii: xdatatype= 'ascii24'
else: xdatatype= 'sun_real8'
if ascii: datatype= 'ascii16'
else: datatype='sun_real8'
packetDescriptor= [ '[01]xxxxxx' ]
tags= dataStruct['tags']
nt= len(tags)
packetDescriptor.append( ' ' )
totalItems=1
format=['%24.12f']
reclen= 4 + 24 + (nt-1) * 20
i=0
for tag in tags:
d= dataStruct[tag]
if ( i==0 ):
name=''
i=i+1
continue
else:
name= tags[i] ### stream reader needs a default plane
if ( isinstance( d, list ) ):
rank= 1
elif ( hasattr( d, "shape") ): # check for numpy
rank= len(d.shape)
if ( rank==1 ):
packetDescriptor.append( ' ' )
if ( i' )
for i in xrange(1,nitems): format.append('%16.4e')
if ( i' )
contentLength= -10 # don't include the packet tag and content length
for i in xrange(0,len(packetDescriptor)):
contentLength += len( packetDescriptor[i] ) + 1
x= packetDescriptor[0]
x= x[0:4]+'%06d' % contentLength + x[10:]
packetDescriptor[0]= x
unit= open( filename, 'wb' )
for i in xrange(len(streamHeader)):
unit.write( streamHeader[i] )
unit.write( '\n' )
for i in xrange(len(packetDescriptor)):
unit.write( packetDescriptor[i] )
unit.write( '\n' )
nr= len( dataStruct['x'] )
keys= dataStruct.keys()
newline= ascii
for i in xrange(nr):
unit.write( ':01:' )
for j in xrange(nt):
tag= tags[j]
if ( ascii ):
rec= dataStruct[tag][i]
if hasattr(rec, "__len__"):
l= len(rec)
for k in xrange(l):
s= format[j] % rec[k]
unit.write( s )
if ( j==nt-1 ): newline=False
else:
s= format[j] % rec
unit.write( s )
else:
import struct
rec= dataStruct[tag][i]
if hasattr(rec, "__len__"):
l= len(rec)
for j in xrange(l):
unit.write( struct.pack( '>d', rec[j] ) )
else:
unit.write( struct.pack( '>d', rec ) )
if ( newline ): unit.write( '\n' )
unit.close()
def test_dump():
x= range(3000)
y= range(2,3002)
data= { 'x':x, 'y':y, 'tags':['x','y'] }
das2stream( data, '/tmp/my.d2s', ascii=1 )
# for rank 2, ytags must be specified
# ascii, boolean, use ascii transfer types
def qstream( dataStruct, filename, ytags=None, ascii=True, xunits='', delta_plus=None, delta_minus=None ):
tags= dataStruct['tags']
nt= len(tags)
name= tags[-1]
tname= tags[0]
print( 'writing qstream to ' + filename )
print( tags )
import time
streamHeader= [ '', '' ]
contentLength= 0
for i in xrange( len( streamHeader ) ):
contentLength += len( streamHeader[i] ) + 1
x= streamHeader[0]
x= '[00]' + '%06d' % contentLength + x
streamHeader[0]= x
if ( ascii ): xdatatype= 'ascii24'
else: xdatatype='double'
if ( ascii ): datatype= 'ascii16'
else: datatype='double'
if ( ytags!=None ):
ny= len(ytags)
svals= str(ytags[0])
for j in xrange(1,len(ytags)):
svals= svals+','+str(ytags[j]).strip()
dep1Descriptor= [ '' ]
dep1Descriptor.append( ' ' )
dep1Descriptor.append( ' ' )
dep1Descriptor.append( ' ')
dep1Descriptor.append( ' ' )
dep1Descriptor.append( ' ' )
dep1Descriptor.append( ' ' )
dep1Descriptor.append( ' ' )
contentLength= 0 # don't include the packet tag and content length
for i in xrange( len( dep1Descriptor ) ):
contentLength += len( dep1Descriptor[i] ) + 1
x= dep1Descriptor[0]
x= '[02]' + '%06d' % contentLength + x
dep1Descriptor[0]= x
packetDescriptor= [ '[01]xxxxxx' ]
nt= len(tags)
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
totalItems=1
format=['%24.12f']
formats= { 'x':format }
reclen= 4 + 24 + (nt-1) * 20
i=1
for tag in tags[1:]:
formats1= []
d= dataStruct[tag]
if ( isinstance( d, list ) ):
rank= 1
elif ( hasattr( d, "shape") ): # check for numpy
rank= len(d.shape)
name= tag ### stream reader needs a default plane
if ( rank==1 ):
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
if ( i==1 ):
if ( delta_plus!=None ):
packetDescriptor.append( ' ' )
if ( delta_minus!=None ):
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
if ( i' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
packetDescriptor.append( ' ' )
for i in xrange(0,nitems-1):
formats1.append('%16.4e')
if ( i' )
contentLength= -10 # don't include the packet tag and content length
for i in xrange(len(packetDescriptor) ):
contentLength += len( packetDescriptor[i] ) + 1
x= packetDescriptor[0]
x= x[0:4] + '%06d' % contentLength + x[10:]
packetDescriptor[0]= x
unit= open( filename, 'wb' )
for i in xrange(len(streamHeader)):
unit.write( streamHeader[i] )
unit.write( '\n' )
for i in xrange(len(packetDescriptor)):
unit.write( packetDescriptor[i] )
unit.write( '\n' )
nr= len( dataStruct['x'] )
if ( ytags!=None ):
for i in xrange(len(dep1Descriptor)):
unit.write( dep1Descriptor[i] )
unit.write( '\n' )
nr= len(dataStruct['x']) # number of records to output
keys= dataStruct.keys()
newline= False
for i in xrange(nr):
unit.write( ':01:' )
for j in xrange(nt):
tag= tags[j]
format= formats[tag]
if ascii:
rec= dataStruct[tag][i]
if hasattr(rec,'__len__'):
l= len(rec)
for k in xrange(l):
print format[k]
s= format[k] % rec[k]
unit.write(s)
else:
s= format[0] % rec
unit.write(s)
if ( j==nt-1 ): newline=True
else:
import struct
rec= dataStruct[tag][i]
if hasattr(rec,"__len__"):
l= len(rec)
for j in xrange(l):
unit.write( struct.pack('>d',rec[j]) )
else:
unit.write( struct.pack('>d',rec) )
if ( newline ):
unit.write('\n')
unit.close()
#
#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
def tryPortConnect( host, port ):
print 'tryPortConnect'
import socket
s = socket.socket()
s.connect(('localhost',port))
s.close()
def sendCommand( s, cmd ):
print cmd
s.send( cmd )
print 'done'
#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:
# plot( X, Y )
# plot( 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"
# ylabel='' label is currently ignored.
# 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.
#-
def plot( x=None, y=None, z=None, z4=None, xunits='', ylabel='', tmpfile=None, noplot=0, respawn=0, delta_plus=None, delta_minus=None ):
#sep= !version.os_family eq 'Windows' ? ';' : ':'
sep= ':'
port= 12345
ext='qds'
if ( delta_plus!=None ):
ext='qds'
if tmpfile==None:
import datetime
dt= datetime.datetime.today()
tag= dt.strftime("%Y%m%dT%H%M%S")
import glob
ff= glob.glob( '/tmp/' + 'autoplot.' + tag + '.???.'+ext )
seq= '.%03d.' % len(ff)
tmpfile= '/tmp/' + 'autoplot.' + tag + seq +ext # TODO: IDL version handles multiple plots in one second.
else:
if ( tmpfile.index('.'+ext) != len(tmpfile)-4 ):
tmpfile= tmpfile + '.'+ext # add the extension
if (z4!=None ): np=4
elif (z!=None ): np=3
elif( y!=None ): np=2
elif( x!=None ): np=1
else:
raise Exception("no x, bad")
# serialize the data to a das2stream in a temporary file
if ( isinstance( x, ( int, long ) ) ):
pos= x
xx= y
if ( z!=None ): yy= z
if ( z4!=None ): zz= z4
np= np-1
else:
pos= -1
xx= x
if ( y!=None ): yy= y
if ( z!=None ): zz= z
ascii=1
if ( True ):
if ( ext != 'qds' ):
raise Exception('internal error, extension should be qds')
if np==3:
data= { 'x':xx, 'z':zz, 'tags':['x','z'] }
qstream( data, tmpfile, ytags=yy, xunits=xunits, ascii=ascii )
elif np==2:
if ( delta_plus!=None ):
data= { 'x':xx, 'y':yy, 'delta_plus':delta_plus, 'delta_minus':delta_minus, 'tags':['x','y','delta_plus','delta_minus'] }
qstream( data, tmpfile, ascii=ascii, xunits=xunits, delta_plus='delta_plus', delta_minus='delta_minus' )
else:
data= { 'x':xx, 'y':yy, 'tags':['x','y'] }
qstream( data, tmpfile, ascii=ascii, xunits=xunits )
else:
ndim= len( xx.shape )
if ndim==2:
data= { 'x':range(len(xx)), 'z':xx, 'tags':['x','z'] }
qstream( data, tmpfile, ytags=range(xx.shape[1]), ascii=ascii, xunits='' )
else:
if ( delta_plus!=None and delta_minus!=None ):
data= { 'x':range(len(xx)), 'y':xx, 'delta_plus':delta_plus, 'delta_minus':delta_minus, 'tags':['x','y','delta_plus','delta_minus'] }
qstream( data, tmpfile, ascii=ascii, xunits='', delta_plus='delta_plus', delta_minus='delta_minus' )
else:
data= { 'x':range(len(xx)), 'y':xx, 'tags':['x','y'] }
qstream( data, tmpfile, ascii=ascii, xunits='' )
else:
if np==3:
data= { 'x':xx, 'z':zz, 'tags':['x','z'] }
das2stream( data, tmpfile, ytags=yy, xunits=xunits, ascii=ascii )
elif np==2:
data= { 'x':xx, 'y':yy, 'tags':['x','y'] }
das2stream( data, tmpfile, ascii=ascii, xunits=xunits )
else:
rank=1
if ( rank==2 ):
data= { 'x':range(len(xx)), 'z':xx, 'tags':['x','z'] }
das2stream( data, tmpfile, ytags=xrange(s[2]), ascii=ascii, xunits='' )
else:
data= { 'x':range(len(xx)), 'y':xx, 'tags':['x','y'] }
das2stream( data, tmpfile, ascii=ascii, xunits='' )
if noplot==1:
return
err= 0
if ( err==0 ):
import socket
s = socket.socket()
s.connect(('localhost',port))
if ( pos>-1 ):
cmd= 'plot( '+str(pos)+', "file:'+tmpfile+'" );\n' # semicolon means no echo
else:
cmd= 'plot( "file:'+tmpfile+'" );\n' # semicolon means no echo
foo= sendCommand( s, cmd )
s.shutdown(1)
s.close()
else:
raise Exception( 'error encountered!' )
#import pdb; pdb.set_trace()
# # 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
#test_dump()
#applot( [1,2,3,6,3,3] )
#applot( [1,2,3,4,5], [2,4,2,4,2], delta_plus=[.1,.2,.2,.2,.1], delta_minus= [.1,.2,.2,.2,.1],)
#applot( [1,2,3,4,6], [2,4,2,4,2] )
#applot( [[1,2,3,4,6], [2,4,2,4,2] )
#test numpy 2-D array
#import numpy as np
#x,y= np.mgrid[-3:3,-3:3]
#applot( y )