00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 import getopt, os, re, string, sys
00034
00035 USAGE = "python plot.py file range"
00036
00037 KBYTE = 1024
00038 MBYTE = KBYTE * KBYTE
00039 GBYTE = KBYTE * MBYTE
00040
00041 DEFAULT_BLOCKSIZE = 256 * KBYTE
00042
00043 infile = None
00044 outfile = None
00045 title = None
00046 debug = 0
00047 blocksize = None
00048 xlo = None
00049 xhi = None
00050 exclude = None
00051
00052 def error(msg):
00053 sys.stderr.write(msg + "\n")
00054 sys.exit(1)
00055
00056 def warn(msg):
00057 sys.stderr.write(msg + "\n")
00058
00059 def usage():
00060 sys.stderr.write("Usage: plot-entropy.py <options> infile [lo hi]\n"
00061 + "\t-o <output file>\n"
00062 + "\t-t <title>\n"
00063 + "\t-b <block size>\n"
00064 + "\t-x <exclude file>\n")
00065 sys.exit(1)
00066
00067 def commandLine():
00068 global debug, exclude, infile, outfile, xlo, xhi, blocksize, title
00069
00070 opts, args = getopt.getopt(sys.argv[1:], "b:do:t:x:")
00071 for opt, val in opts:
00072 if opt == "-b":
00073 blocksize = long(val)
00074 if opt == "-d":
00075 debug = 1
00076 elif opt == "-o":
00077 outfile = val
00078 elif opt == "-t":
00079 title = val
00080 elif opt == "-x":
00081 exclude = val
00082
00083 if len(args) == 1:
00084 infile, = args
00085 elif len(args) == 3:
00086 infile, xlo, xhi = args
00087 xlo = long(xlo)
00088 xhi = long(xhi)
00089 else:
00090 usage()
00091
00092 def readExcludeFile(path):
00093 fp = file(path)
00094 xblocks = []
00095 for line in fp:
00096 line = line.strip()
00097 blocknum, nblock = line.split()
00098 xblocks.append((long(blocknum), long(nblock)))
00099 fp.close()
00100 return xblocks
00101
00102 def getFileInfo(infile):
00103 bsize = None
00104 ncol = None
00105 try:
00106 fp = file(infile, "r")
00107 hdrline = fp.readline()
00108 dataline = fp.readline()
00109 cols = dataline.split()
00110 ncol = len(cols)
00111 fp.close()
00112 m = re.match("# blocksize (\d+)", hdrline)
00113 if m != None:
00114 bsize = long(m.group(1))
00115 else:
00116 warn("old-style input file; no block size comment")
00117 except:
00118 raise
00119 pass
00120 return bsize, ncol
00121
00122 def plotRange(fp, path, lo, hi, mult, col):
00123 fp.write(" \"%s\"" % path)
00124
00125 if hi != None:
00126 fp.write(" using (($0 >= %lu) && ($0 < %lu) ? $0* %f : 1/0):%u" % (lo, hi, mult, col))
00127 else:
00128 fp.write(" using ($0 >= %lu ? $0* %f : 1/0):%u" % (lo, mult, col))
00129 fp.write(" with points pointtype 2, \\")
00130 fp.write("\n")
00131
00132 def plot(infile, xlist, outfile, title, xlo, xhi):
00133 if outfile == None:
00134 outfile = "/dev/null"
00135 persist = 1
00136 output = "x11"
00137 else:
00138 persist = 0
00139 output = "png"
00140
00141 if title == None:
00142 title = infile
00143
00144 bs, ncol = getFileInfo(infile)
00145
00146 if bs != None and blocksize != None:
00147 if bs != blocksize:
00148 error("Block size in file differs " +
00149 "from command-line block size")
00150 if bs == None:
00151 bs = blocksize
00152 if bs == None:
00153 warn("Assuming default block size (%u)" % DEFAULT_BLOCKSIZE)
00154 bs = DEFAULT_BLOCKSIZE
00155 gbmult = float(bs) / float(GBYTE)
00156
00157 if ncol == None:
00158 error("Unknown column count in %s" % infile)
00159 entropyCol = ncol
00160
00161 if debug:
00162 fp = sys.stdout
00163 elif persist:
00164 fp = os.popen("gnuplot -persist >%s" % outfile, "w")
00165 else:
00166 fp = os.popen("gnuplot >%s" % outfile, "w")
00167 fp.write("set title \"%s (block size: %u Kbyte)\"\n" \
00168 % (title, float(bs) / KBYTE))
00169 fp.write("set nokey\n")
00170 fp.write("set terminal %s\n" % output)
00171 fp.write("set xzeroaxis\n")
00172 fp.write("set xlabel \"Disk Location (GB)\"\n")
00173 fp.write("set ylabel \"Entropy\"\n")
00174 if xlo == None:
00175 fp.write("set xrange [0:]\n")
00176 else:
00177 print ("set xrange [%d:%d]\n" % (xlo, xhi))
00178 fp.write("set xrange [%d:%d]\n" % (xlo, xhi))
00179
00180
00181
00182 prevnum = 0L
00183 fp.write("plot ")
00184 for blocknum, nblock in xlist:
00185 plotRange(fp, infile, prevnum, blocknum, gbmult, entropyCol)
00186 prevnum = blocknum + nblock
00187 plotRange(fp, infile, prevnum, None, gbmult, entropyCol)
00188 fp.write("0\n")
00189 fp.close()
00190
00191 def main():
00192 commandLine()
00193 if exclude != None:
00194 excludeList = readExcludeFile(exclude)
00195 else:
00196 excludeList = []
00197 plot(infile, excludeList, outfile, title, xlo, xhi)
00198
00199 if __name__ == "__main__": main()