1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#! /usr/bin/env python
2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#
3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat# btt blkno plotting interface
4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#
5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  (C) Copyright 2008 Hewlett-Packard Development Company, L.P.
6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#
7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  This program is free software; you can redistribute it and/or modify
8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  it under the terms of the GNU General Public License as published by
9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  the Free Software Foundation; either version 2 of the License, or
10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  (at your option) any later version.
11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#
12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  This program is distributed in the hope that it will be useful,
13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  but WITHOUT ANY WARRANTY; without even the implied warranty of
14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  GNU General Public License for more details.
16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#
17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  You should have received a copy of the GNU General Public License
18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  along with this program; if not, write to the Free Software
19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#
21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat"""
22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatbno_plot.py
23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	[ -h | --help       ]
24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	[ -K | --keys-below ]
25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	[ -v | --verbose    ]
26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	[ <file...>         ]
27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San MehatUtilizes gnuplot to generate a 3D plot of the block number output
29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatfrom btt.  If no <files> are specified, it will utilize all files
30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatgenerated after btt was run with -B blknos (meaning: all files of the
31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatform blknos*[rw].dat).
32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San MehatThe -K option forces bno_plot.py to put the keys below the graph,
34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehattypically all keys for input files are put in the upper right corner
35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatof the graph. If the number of devices exceed 10, then bno_plot.py will
36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatautomatically push the keys under the graph.
37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San MehatTo exit the plotter, enter 'quit' or ^D at the 'gnuplot> ' prompt.
39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat"""
40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatimport getopt, glob, os, sys, tempfile
42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatverbose	= 0
44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatcmds	= """
45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatset title 'btt Generated Block Accesses'
46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatset xlabel 'Time (secs)'
47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatset ylabel 'Block Number'
48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatset zlabel '# Blocks per IO'
49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatset grid
50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat"""
51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#-----------------------------------------------------------------------------
54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatdef parse_args(in_args):
55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	global verbose
56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	keys_below = False
58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	s_opts = 'hKv'
59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	l_opts = [ 'help', 'keys-below', 'verbose' ]
60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	try:
62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		(opts, args) = getopt.getopt(in_args, s_opts, l_opts)
63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	except getopt.error, msg:
64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		print >>sys.stderr, msg
65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		print >>sys.stderr, __doc__
66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		sys.exit(1)
67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	for (o, a) in opts:
69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		if o in ('-h', '--help'):
70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			print __doc__
71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			sys.exit(0)
72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		elif o in ('-v', '--verbose'):
73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			verbose += 1
74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		elif o in ('-K', '--keys-below'):
75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			keys_below = True
76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if len(args) > 0:	bnos = args
78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	else:			bnos = glob.glob('blknos*[rw].dat')
79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	return (bnos, keys_below)
81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#-----------------------------------------------------------------------------
83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatif __name__ == '__main__':
84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	(bnos, keys_below) = parse_args(sys.argv[1:])
85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if verbose:
87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		print 'Using files:',
88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		for bno in bnos: print bno,
89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		if keys_below:	print '\nKeys are to be placed below graph'
90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		else:		print ''
91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	tmpdir = tempfile.mktemp()
93e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	os.mkdir(tmpdir)
94e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
95e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	plot_cmd = None
96e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	for f in bnos:
97e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		t = '%s/%s' % (tmpdir, f)
98e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
99e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		fo = open(t, 'w')
100e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		for line in open(f, 'r'):
101e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			fld = line.split(None)
102e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat			print >>fo, fld[0], fld[1], int(fld[2])-int(fld[1])
103e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		fo.close()
104e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
105e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		t = t[t.rfind('/')+1:]
106e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		if plot_cmd == None: plot_cmd = "splot '%s'" % t
107e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		else:                plot_cmd = "%s,'%s'" % (plot_cmd, t)
108e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
109e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	fo = open('%s/plot.cmds' % tmpdir, 'w')
110e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	print >>fo, cmds
111e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if len(bnos) > 10 or keys_below: print >>fo, 'set key below'
112e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	print >>fo, plot_cmd
113e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	fo.close()
114e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
115e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	pid = os.fork()
116e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	if pid == 0:
117e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		cmd = '/usr/bin/gnuplot %s/plot.cmds -' % tmpdir
118e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
119e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		if verbose: print 'Executing %s' % cmd
120e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
121e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		cmd = cmd.split(None)
122e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		os.chdir(tmpdir)
123e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		os.execvp(cmd[0], cmd)
124e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat		sys.exit(1)
125e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat
126e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	os.waitpid(pid, 0)
127e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat	os.system('/bin/rm -rf ' + tmpdir)
128