1#!/usr/bin/env python 2 3from __future__ import division 4 5import pylab 6import optparse 7import sys 8 9def parse_data(l, state): 10 state['data'].append([float(x) for x in filter(None, l.split(' '))]) 11 return state 12 13def parse_event(l, state): 14 components = filter(None, l.split(' ')) 15 vals = [float(x) for x in components[1:]] 16 if not components[0] in state: 17 state[components[0]] = [vals] 18 else: 19 state[components[0]].append(vals) 20 return state 21 22def read_line(fd, state): 23 l = fd.readline() 24 if not l: 25 return None 26 l = l.strip() 27 if l[0].isdigit(): 28 return parse_data(l, state) 29 else: 30 return parse_event(l, state) 31 32def read_data(fd): 33 state = {'data':[], 34 'packet-sent':[], 35 'packet-lost':[], 36 'packet-received':[], 37 'packet-observed':[]} 38 newstate = state 39 while newstate: 40 state = newstate 41 newstate = read_line(fd, state) 42 return state 43 44def make_xticks(start, end, numticks): 45 return range(int(start), int(end), int((start-end)/numticks)) 46 47def make_plot(title): 48 l = sys.stdin.readline() 49 labels = l.strip().split(';') 50 state = read_data(sys.stdin) 51 data = state['data'] 52 lost_packets = state['packet-lost'] 53 obsv_packets = state['packet-observed'] 54 sent_packets = state['packet-sent'] 55 recd_packets = state['packet-received'] 56 57 domain = [x[0] for x in data] 58 for i in range(1,len(labels)): 59 pylab.plot(domain, [x[i] for x in data], label=labels[i]) 60 pylab.plot([x[0] for x in lost_packets], [x[1] for x in lost_packets], 61 label='Client sent packet, but dropped', marker='x', linestyle=None, ms=8) 62 pylab.plot([x[0] for x in sent_packets], [x[1] for x in sent_packets], 63 label='Client sent packet', marker='^', linestyle=None, ms=8) 64 pylab.plot([x[0] for x in obsv_packets], [x[1] for x in obsv_packets], 65 label='Remote time observation', marker='D', linestyle=None, ms=8) 66 pylab.plot([x[0] for x in recd_packets], [x[1] for x in recd_packets], 67 label='Client received packet', marker='v', linestyle=None, ms=8) 68 pylab.legend() 69 pylab.ylabel(r'Clock time (s)') 70 pylab.xlabel(r'Real time (s)') 71 pylab.title(title) 72 pylab.grid(True) 73 pylab.show() 74 75def main(args): 76 parser = optparse.OptionParser() 77 78 title = ' '.join(args[1:]) 79 make_plot(title) 80 81main(sys.argv) 82