#!/usr/bin/env python

from __future__ import division

import pylab
import optparse
import sys

def parse_data(l, state):
    state['data'].append([float(x) for x in filter(None, l.split(' '))])
    return state

def parse_event(l, state):
    components = filter(None, l.split(' '))
    vals = [float(x) for x in components[1:]]
    if not components[0] in state:
        state[components[0]] = [vals]
    else:
        state[components[0]].append(vals)
    return state

def read_line(fd, state):
    l = fd.readline()
    if not l:
        return None
    l = l.strip()
    if l[0].isdigit():
        return parse_data(l, state)
    else:
        return parse_event(l, state)

def read_data(fd):
    state = {'data':[],
             'packet-sent':[],
             'packet-lost':[],
             'packet-received':[],
             'packet-observed':[]}
    newstate = state
    while newstate:
        state = newstate
        newstate = read_line(fd, state)
    return state

def make_xticks(start, end, numticks):
    return range(int(start), int(end), int((start-end)/numticks))

def make_plot(title):
    l = sys.stdin.readline()
    labels = l.strip().split(';')
    state = read_data(sys.stdin)
    data = state['data']
    lost_packets = state['packet-lost']
    obsv_packets = state['packet-observed']
    sent_packets = state['packet-sent']
    recd_packets = state['packet-received']

    domain = [x[0] for x in data]
    for i in range(1,len(labels)):
        pylab.plot(domain, [x[i] for x in data], label=labels[i])
    pylab.plot([x[0] for x in lost_packets], [x[1] for x in lost_packets],
               label='Client sent packet, but dropped', marker='x', linestyle=None, ms=8)
    pylab.plot([x[0] for x in sent_packets], [x[1] for x in sent_packets],
               label='Client sent packet', marker='^', linestyle=None, ms=8)
    pylab.plot([x[0] for x in obsv_packets], [x[1] for x in obsv_packets],
               label='Remote time observation', marker='D', linestyle=None, ms=8)
    pylab.plot([x[0] for x in recd_packets], [x[1] for x in recd_packets],
               label='Client received packet', marker='v', linestyle=None, ms=8)
    pylab.legend()
    pylab.ylabel(r'Clock time (s)')
    pylab.xlabel(r'Real time (s)')
    pylab.title(title)
    pylab.grid(True)
    pylab.show()
    
def main(args):
    parser = optparse.OptionParser()

    title = ' '.join(args[1:])
    make_plot(title)

main(sys.argv)
