#Python Port of http://users.softlab.ntua.gr/~ttsiod/gnuplotStreaming.html
import os, sys, time
from subprocess import Popen, PIPE
def get_args():
params = {"NumberOfStreams" : 0,
"NumberOfWindows" : 0,
"Window_Sample_Sizes" : [],
"Window_Y_Ranges" : [],
"Window_Geometries" : [],
"Stream_Titles" : [],
"Stream_Window_Number" : [],
"Stream_Buffers" : []}
usage = '''\nUsage: NumberOfStreams ( M ) NumberOfWindows ( N )
Window_0_WindowSampleSize < ... Window_N_WindowSampleSize >
Window_0_YRangeMin Window_0_YRangeMax < ... Window_N_YRangeMin Window_N_YRangeMax >
Window_0_Geometry < ... Window_N_Geometry > ( WidthxHeight+XOFF+YOFF )
Stream_0_Title < ... Stream_M_Title >
Stream_0_Window_Number < ... Stream_M_Window_Number >\n'''
try:
_filename = sys.argv.pop(0)
params["NumberOfStreams"] = int(sys.argv.pop(0))
params["NumberOfWindows"] = int(sys.argv.pop(0))
for i in range(params["NumberOfWindows"]):
params["Window_Sample_Sizes"].append(int(sys.argv.pop(0)))
for i in range(params["NumberOfWindows"]):
params["Window_Y_Ranges"].append((int(sys.argv.pop(0)), int(sys.argv.pop(0))))
for i in range(params["NumberOfWindows"]):
params["Window_Geometries"].append(sys.argv.pop(0))
for i in range(params["NumberOfStreams"]):
params["Stream_Titles"].append(sys.argv.pop(0))
params["Stream_Buffers"].append([])
for i in range(params["NumberOfStreams"]):
params["Stream_Window_Number"].append(int(sys.argv.pop(0)))
except Exception:
print usage
sys.exit(1)
return params
def main():
params = get_args()
numberOfStreams = params["NumberOfStreams"]
numberOfWindows = params["NumberOfWindows"]
sampleSizes = params["Window_Sample_Sizes"]
ranges = params["Window_Y_Ranges"]
geometries = params["Window_Geometries"]
titles = params["Stream_Titles"]
windows = [params["Stream_Window_Number"][i] for i in range(numberOfStreams)]
streams = dict([(i, []) for i in range(numberOfWindows)])
print params["Stream_Window_Number"]
for i, item in enumerate(params["Stream_Window_Number"]): streams[item].append(i)
gnuplots = []
buffers = [[]] * numberOfStreams
xcounters = [0] * numberOfStreams
for window in range(params["NumberOfWindows"]):
print geometries
fd = Popen(("gnuplot -geometry %s" % geometries[window]), shell=True, stdin=PIPE).stdin
gnuplots.append(fd)
print >>fd, "set xtics"
print >>fd, "set ytics"
yrange = params["Window_Y_Ranges"][window]
print >>fd, "set yrange [%d:%d]" % (yrange[0], yrange[1])
print >>fd, "set style data linespoints"
print >>fd, "set grid"
print >>fd, "set term x11"
while True:
inp = raw_input()
_stream, _value = inp.split(":")
streamIdx = int(_stream)
windowIdx = windows[streamIdx]
pip = gnuplots[windowIdx]
xcounter = xcounters[streamIdx]
buffers[streamIdx] = buffers[streamIdx] + [str(xcounter) + " " + str(_value)]
xcounters[streamIdx] += 1
max_xcounter = xcounter
for stream in streams[windowIdx]:
if(xcounters[stream] > max_xcounter):
max_xcounter = xcounters[stream]
print >>pip, " set xrange [" + str(max_xcounter-sampleSizes[windowIdx]) + ":" + str(max_xcounter) + "]"
plots = []
for stream in streams[windowIdx]:
if(len(buffers[stream]) > 0):
plots.append("\"-\" title '%s'" % titles[stream])
print >>pip, "plot " + (", ".join(plots))
for stream in streams[windowIdx]:
if(len(buffers[stream]) > 0):
for elem in buffers[stream][::-1]:
print >>pip, ("%s" % elem)
print >>pip, "e"
if(len(buffers[streamIdx]) > sampleSizes[windowIdx]):
buffers[streamIdx] = buffers[streamIdx][1:]
pip.flush()
for i in range(numberOfWindows):
pip = gnuplots[i]
print >>pip, "exit;"
pip.flush()
# Let's assuming we are streaming from stdin
if __name__ == "__main__": main()