source: examples/stats/ipdist-genplot.py @ 91852de2

develop
Last change on this file since 91852de2 was 91852de2, checked in by Jacob Van Walraven <jcv9@…>, 2 years ago

Move more plotting tasks to python script

  • Property mode set to 100644
File size: 7.5 KB
Line 
1#!/usr/bin/python
2
3import sys
4import subprocess
5import os
6import re
7
8# Ensure a data directory was supplied
9if len(sys.argv) != 2:
10        print("Usage: python3 data-directory")
11        sys.exit()
12
13dir = sys.argv[1]
14dataFiles = []
15
16# Stats
17total_skew_src = [0, 0, 0, 0]
18total_skew_dst = [0, 0, 0, 0]
19
20# Get all data/stats files contained within the directory
21for file in os.listdir(dir):
22        if file.endswith(".data"):
23                dataFiles.append(file)
24
25# sort the datafiles list so they are read in the correct order
26dataFiles.sort()
27
28# Every datafile should have a corresponding stats file
29# Iterate over every dataFile
30for i in range(len(dataFiles)):
31        dataFile = dataFiles[i]
32        filename,extension = dataFiles[i].split(".")
33        statsFile = filename + ".stats"
34        tick = filename.split("-")
35        tick = tick[1]
36
37        # Open the current stats file
38        lines = []
39        with open(dir + "/" + statsFile, "r") as tmp:
40                lines = tmp.readlines()
41        # increment the total skew counters
42        for x in range(4):
43                total_skew_src[x] += float(lines[(4*x)+1].split()[6])
44                total_skew_dst[x] += float(lines[(4*x)+2].split()[6])
45
46        # Create/append to timeseries stats file
47        # the file needs to be created on the first pass
48        if i == 0:
49                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "w")
50                tmp.write("timestamp\tsrc1\t\tdst1\t\tsrc2\t\tdst2\t\tsrc3\t\tdst3\t\tsrc4\t\tdst4\n")
51        else:
52                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "a")
53        tmp.write(tick)
54        for x in range(4):
55                tmp.write("\t" + str(total_skew_src[x]/(i+1)) + "\t" + str(total_skew_dst[x]/(i+1)))
56        tmp.write("\n")
57        tmp.close()
58
59
60
61        # open data file to read from and count all occurances
62        with open(dir + "/" + dataFile, "r") as tmp:
63                lines = tmp.readlines()
64        tmp.close()
65        # Count up all octet count in current data file
66        count_src = [0] * 4
67        count_dst = [0] * 4
68        # initialize the array
69        for x in range(4):
70                count_src[x] = [0] * 256
71                count_dst[x] = [0] * 256
72        # count all occurances
73        for x in range(256):
74                for k in range(4):
75                        count_src[k][int(lines[x+2].split()[(k*4)+2])] = int(lines[x+2].split()[(k*4)+3])
76                        count_dst[k][int(lines[x+2].split()[(k*4)+4])] = int(lines[x+2].split()[(k*4)+5])
77        # output the results to the timeseries file
78        tmp_src = []
79        tmp_dst = []
80        if i == 0:
81                for x in range(4):
82                        tmp_src.append(open(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries", "w"))
83                        tmp_dst.append(open(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries", "w"))
84                        tmp_src[x].write("timestamp")
85                        tmp_dst[x].write("timestamp")
86                        for k in range(256):
87                                tmp_src[x].write("\t" + str(k))
88                                tmp_dst[x].write("\t" + str(k))
89        else:
90                for x in range(4):
91                        tmp_src.append(open(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries", "a"))
92                        tmp_dst.append(open(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries", "a"))
93        # print data into file
94        for x in range(4):
95                tmp_src[x].write("\n" + tick)
96                tmp_dst[x].write("\n" + tick)
97                for k in range(256):
98                        tmp_src[x].write("\t" + str(count_src[x][k]))
99                        tmp_dst[x].write("\t" + str(count_dst[x][k]))
100        # close all files
101        for x in range(4):
102                tmp_src[x].close()
103                tmp_dst[x].close()
104
105
106        # create interval plots
107        for x in range(4):
108                plot = subprocess.Popen(['gnuplot -persistent','-p'],
109                                        shell=True,
110                                        stdin=subprocess.PIPE,)
111
112                plot.stdin.write("set term pngcairo enhanced size 1280,960\n")
113                plot.stdin.write("set output '" + dir + "/" + filename + "-octet" + str(x+1) + ".png'\n")
114                plot.stdin.write("set multiplot layout 2,1\n")
115                plot.stdin.write("set title 'IP Distribution - " + tick + "'\n")
116                plot.stdin.write("set xrange[0:255]\n")
117                plot.stdin.write("set y2range[-1:1]\n")
118                plot.stdin.write("set y2tics\n")
119                plot.stdin.write("set xlabel 'Prefix'\n")
120                plot.stdin.write("set ylabel 'Hits'\n")
121                plot.stdin.write("set y2label 'Skewness'\n")
122                plot.stdin.write("set xtics 0,10,255\n")
123                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 2 name 'SOURCEMEAN' nooutput\n")
124                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 2 name 'DESTMEAN' nooutput\n")
125                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 7 name 'SOURCESKEW' nooutput\n")
126                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 7 name 'DESTSKEW' nooutput\n")
127                plot.stdin.write("set arrow from SOURCEMEAN_min, graph 0 to SOURCEMEAN_min, graph 1 nohead lt 1\n")
128                plot.stdin.write("set arrow from DESTMEAN_min, graph 0 to DESTMEAN_min, graph 1 nohead lt 2\n")
129                plot.stdin.write("plot '" + dir + "/" + dataFile + "' using " + str((x*4)+3) + ":" + str((x*4)+4) + " index 0 title 'Source octet " + str(x+1) + "' smooth unique with boxes,")
130                plot.stdin.write("'' using " + str((x*4)+5) + ":" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "' smooth unique with boxes,")
131                plot.stdin.write("1/0 t 'Source mean' lt 1,")
132                plot.stdin.write("1/0 t 'Destination mean' lt 2,")
133                plot.stdin.write("SOURCESKEW_min title 'Source Skewness' axes x1y2,")
134                plot.stdin.write("DESTSKEW_min title 'Destination Skewness' axes x1y2\n")
135                plot.stdin.write("unset y2tics\n")
136                plot.stdin.write("unset y2label\n")
137                plot.stdin.write("unset arrow\n")
138                plot.stdin.write("unset label 1\nunset label 2\nunset label 3\nunset label 4\nunset label 5\nunset label 6\n")
139                plot.stdin.write("set title 'Zipf Distribution'\n")
140                plot.stdin.write("set xlabel 'Rank'\n")
141                plot.stdin.write("set ylabel 'Frequency'\n")
142                plot.stdin.write("set logscale xy 10\n")
143                plot.stdin.write("set xrange[1:255]\n")
144                plot.stdin.write("set xtics 0,10,255\n")
145                plot.stdin.write("plot '" + dir + "/" + dataFile + "' using 2:" + str((x*4)+4) + " index 0 title 'Source octet " + str(x+1) + "',")
146                plot.stdin.write("'' using 2:" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "'\n")
147                plot.stdin.flush()
148                plot.communicate()
149
150
151# Generate plots for the timeseries data captured over the entire trace
152for i in range(4):
153        for x in range(2):
154                plot = subprocess.Popen(['gnuplot -persistent','-p'],
155                                        shell=True,
156                                        stdin=subprocess.PIPE,)
157                plot.stdin.write("set term pngcairo size 1280,960\n")
158                if x == 0:
159                        plot.stdin.write("set output '" + dir + "/ipdist-timeseries-src-octet" + str(i+1) + ".png'\n")
160                        plot.stdin.write("set title 'Timeseries src octet " + str(i+1) + "'\n")
161                else:
162                        plot.stdin.write("set output '" + dir + "/ipdist-timeseries-dst-octet" + str(i+1) + ".png'\n")
163                        plot.stdin.write("set title 'Timeseries dst octet " + str(i+1) + "'\n")
164                plot.stdin.write("set multiplot layout 2,1\n")
165                plot.stdin.write("set xtics rotate\n")
166                plot.stdin.write("set ytics\n")
167                plot.stdin.write("set xlabel 'Timestamp'\n")
168                plot.stdin.write("set key off\n")
169                plot.stdin.write("set autoscale xy\n")
170                if x == 0:
171                        plot.stdin.write("plot '" + dir + "/ipdist-src-octet" + str(i+1) + ".timeseries' using 2:xtic(1) with lines title columnheader(2) at end smooth cumulative, for[i=3:257] '' using i with lines title columnheader(i) at end smooth cumulative\n")
172                else:
173                        plot.stdin.write("plot '" + dir + "/ipdist-dst-octet" + str(i+1) + ".timeseries' using 2:xtic(1) with lines title columnheader(2) at end smooth cumulative, for[i=3:257] '' using i with lines title columnheader(i) at end smooth cumulative\n")
174                plot.stdin.write("set title 'Timeseries mean skewness'\n")
175                plot.stdin.write("set yrange[-1:1]\n")
176                plot.stdin.write("set xlabel 'Timestamp'\n")
177                plot.stdin.write("set ylabel 'Skewness'\n")
178                plot.stdin.write("plot '" + dir + "/ipdist-timeseries-skewness.stats' using " + str((i*2)+2+x) + ":xtic(1) with lines\n")
179                plot.stdin.write("unset multiplot\n")
180                plot.stdin.flush()
181                plot.communicate()
182
Note: See TracBrowser for help on using the repository browser.