source: examples/stats/ipdist-genplot.py @ a7132cf

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

ipdist-parallel now reports cumulative count of lost packets to standard out, cleanup plotting script

  • Property mode set to 100644
File size: 10.3 KB
Line 
1#!/usr/bin/python
2
3import sys
4import subprocess
5import os
6
7def normalise(min, max, value):
8        return ((value - min) / float((max - min)))
9
10
11# Ensure a data directory was supplied
12if len(sys.argv) != 2:
13        print("Usage: python data-directory")
14        sys.exit()
15
16dir = sys.argv[1]
17dataFiles = []
18
19# Stats
20total_skew_src = [0, 0, 0, 0]
21total_skew_dst = [0, 0, 0, 0]
22
23# Get all data/stats files contained within the directory
24for file in os.listdir(dir):
25        if file.endswith(".data"):
26                dataFiles.append(file)
27
28# sort the datafiles list so they are read in the correct order
29dataFiles.sort()
30
31# Every datafile should have a corresponding stats file
32# Iterate over every dataFile
33for i in range(len(dataFiles)):
34        dataFile = dataFiles[i]
35        filename,extension = dataFiles[i].split(".")
36        statsFile = filename + ".stats"
37        tick = filename.split("-")
38        tick = tick[1]
39
40        # Open the current stats file
41        lines = []
42        with open(dir + "/" + statsFile, "r") as tmp:
43                lines = tmp.readlines()
44        # increment the total skew counters
45        for x in range(4):
46                total_skew_src[x] += float(lines[(4*x)+1].split()[6])
47                total_skew_dst[x] += float(lines[(4*x)+2].split()[6])
48
49        # Create/append to timeseries stats file
50        # the file needs to be created on the first pass
51        if i == 0:
52                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "w")
53                tmp.write("timestamp\tsrc1\t\tdst1\t\tsrc2\t\tdst2\t\tsrc3\t\tdst3\t\tsrc4\t\tdst4\n")
54        else:
55                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "a")
56        tmp.write(tick)
57        for x in range(4):
58                tmp.write("\t" + str(total_skew_src[x]/(i+1)) + "\t" + str(total_skew_dst[x]/(i+1)))
59        tmp.write("\n")
60        tmp.close()
61
62
63
64        # open data file to read from and count all occurances
65        with open(dir + "/" + dataFile, "r") as tmp:
66                lines = tmp.readlines()
67        tmp.close()
68        # Count up all octet count in current data file
69        count_src = [0] * 4
70        count_dst = [0] * 4
71        # initialize the array
72        for x in range(4):
73                count_src[x] = [0] * 256
74                count_dst[x] = [0] * 256
75        # count all occurances
76        for x in range(256):
77                for k in range(4):
78                        count_src[k][int(lines[x+2].split()[(k*4)+2])] = int(lines[x+2].split()[(k*4)+3])
79                        count_dst[k][int(lines[x+2].split()[(k*4)+4])] = int(lines[x+2].split()[(k*4)+5])
80        # output the results to the timeseries files
81        tmp_src = []
82        tmp_dst = []
83        if i == 0:
84                for x in range(4):
85                        tmp_src.append(open(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries", "w"))
86                        tmp_dst.append(open(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries", "w"))
87                        tmp_src[x].write("timestamp")
88                        tmp_dst[x].write("timestamp")
89                        for k in range(256):
90                                tmp_src[x].write("\t" + str(k))
91                                tmp_dst[x].write("\t" + str(k))
92        else:
93                for x in range(4):
94                        tmp_src.append(open(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries", "a"))
95                        tmp_dst.append(open(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries", "a"))
96        # print data into file
97        for x in range(4):
98                tmp_src[x].write("\n" + tick)
99                tmp_dst[x].write("\n" + tick)
100                for k in range(256):
101                        tmp_src[x].write("\t" + str(count_src[x][k]))
102                        tmp_dst[x].write("\t" + str(count_dst[x][k]))
103        # close all files
104        for x in range(4):
105                tmp_src[x].close()
106                tmp_dst[x].close()
107
108        # create tmp file for cdf plots
109        with open(dir + "/ipdist-" + tick + ".tmp", "w") as tmp:
110                for x in range(4):
111                        total_src = 0
112                        total_dst = 0
113                        min_src = 0
114                        min_dst = 0
115                        max_src = 0
116                        max_dst = 0
117
118                        # work out min and max needed to normalise the data for CDF
119                        for i in range(256):
120                                curr_src = count_src[x][i]
121                                curr_dst = count_dst[x][i]
122                                if curr_src < min_src or i == 0:
123                                        min_src = 0
124                                if curr_dst < min_dst or i == 0:
125                                        min_dst = 0
126                                # cumulative count
127                                max_src = max_src + curr_src
128                                max_dst = max_dst + curr_dst
129
130                        for i in range(256):
131                                total_src = total_src + count_src[x][i]
132                                total_dst = total_dst + count_dst[x][i]
133                                tmp.write(str(normalise(min_src, max_src, total_src)) + "\t" + str(i) + "\t" + str(normalise(min_dst, max_dst, total_dst)) + "\t" + str(i) + "\n")
134                        tmp.write("\n\n")
135
136        # create interval plots
137        for x in range(4):
138                plot = subprocess.Popen(['gnuplot -persistent','-p'],
139                                        shell=True,
140                                        stdin=subprocess.PIPE,)
141
142                plot.stdin.write("set term pngcairo enhanced size 1280,960\n")
143                plot.stdin.write("set output '" + dir + "/" + filename + "-octet" + str(x+1) + ".png'\n")
144                plot.stdin.write("set multiplot layout 3,1\n")
145                plot.stdin.write("set title 'IP Distribution - " + tick + "'\n")
146                plot.stdin.write("set xrange[0:255]\n")
147                plot.stdin.write("set y2range[-1:1]\n")
148                plot.stdin.write("set y2tics\n")
149                plot.stdin.write("set xlabel 'Prefix'\n")
150                plot.stdin.write("set ylabel 'Hits'\n")
151                plot.stdin.write("set y2label 'Skewness'\n")
152                plot.stdin.write("set xtics 0,10,255\n")
153                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 2 name 'SOURCEMEAN' nooutput\n")
154                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 2 name 'DESTMEAN' nooutput\n")
155                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 7 name 'SOURCESKEW' nooutput\n")
156                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 7 name 'DESTSKEW' nooutput\n")
157                plot.stdin.write("set arrow from SOURCEMEAN_min, graph 0 to SOURCEMEAN_min, graph 1 nohead lt 1\n")
158                plot.stdin.write("set arrow from DESTMEAN_min, graph 0 to DESTMEAN_min, graph 1 nohead lt 2\n")
159                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,")
160                plot.stdin.write("'' using " + str((x*4)+5) + ":" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "' smooth unique with boxes,")
161                plot.stdin.write("1/0 t 'Source mean' lt 1,")
162                plot.stdin.write("1/0 t 'Destination mean' lt 2,")
163                plot.stdin.write("SOURCESKEW_min title 'Source Skewness' axes x1y2,")
164                plot.stdin.write("DESTSKEW_min title 'Destination Skewness' axes x1y2\n")
165                plot.stdin.write("unset xrange\n")
166                plot.stdin.write("unset y2range\n")
167                plot.stdin.write("unset y2tics\n")
168                plot.stdin.write("unset y2label\n")
169                plot.stdin.write("unset ylabel\n")
170                plot.stdin.write("unset arrow\n")
171                plot.stdin.write("unset label 1\nunset label 2\nunset label 3\nunset label 4\nunset label 5\nunset label 6\n")
172                plot.stdin.write("set title 'CDF distribution'\n")
173                plot.stdin.write("set ylabel 'Cumulative %'\n")
174                plot.stdin.write("set xlabel 'Prefix'\n")
175                plot.stdin.write("set key right bottom\n")
176                plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(x) + " with lines title 'Source octet " + str(x+1) + "',")
177                plot.stdin.write("'" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(x) + " with lines title 'Destination octet " + str(x+1) + "'\n")
178                plot.stdin.write("set title 'Zipf Distribution'\n")
179                plot.stdin.write("set xlabel 'Rank'\n")
180                plot.stdin.write("set xrange [1:255]\n")
181                plot.stdin.write("set ylabel 'Frequency'\n")
182                plot.stdin.write("set logscale xy 10\n")
183                plot.stdin.write("set key top right\n")
184                plot.stdin.write("plot '" + dir + "/" + dataFile + "' using 2:" + str((x*4)+4) + " index 0 title 'Source octet " + str(x+1) + "',")
185                plot.stdin.write("'' using 2:" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "'\n")
186                plot.stdin.flush()
187                plot.communicate()
188
189# Generate plots for the timeseries data captured over the entire trace
190for i in range(4):
191        plot = subprocess.Popen(['gnuplot -persistent','-p'],
192                                shell=True,
193                                stdin=subprocess.PIPE,)
194        plot.stdin.write("set term pngcairo size 1280,960\n")
195        plot.stdin.write("set output '" + dir + "/ipdist-octet" + str(i+1) + ".png'\n")
196        plot.stdin.write("set multiplot layout 3,1\n")
197
198        plot.stdin.write("set title 'CDF source octet " + str(i+1) + "'\n")
199        plot.stdin.write("set xlabel 'Prefix'\n")
200        plot.stdin.write("set ylabel 'Cumulative %'\n")
201        plot.stdin.write("set xrange[0:255]\n")
202        plot.stdin.write("set xtics 0,10,255\n")
203        plot.stdin.write("set key off\n")
204        for x in range(len(dataFiles)):
205                dataFile = dataFiles[x]
206                filename,extension = dataFiles[x].split(".")
207                tick = filename.split("-")
208                tick = tick[1]
209
210                if x == 0:
211                        plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(i) + " title '" + tick + "' with lines,")
212                else:
213                        plot.stdin.write(" '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(i) + " title '" + tick + "' with lines,")
214        plot.stdin.write("\n")
215
216        plot.stdin.write("set title 'CDF destination octet " + str(i+1) + "'\n")
217        plot.stdin.write("set xlabel 'Prefix'\n")
218        plot.stdin.write("set ylabel 'Cumulative %'\n")
219        plot.stdin.write("set xrange[0:255]\n")
220        plot.stdin.write("set xtics 0,10,255\n")
221        plot.stdin.write("set key off\n")
222        for x in range(len(dataFiles)):
223                dataFile = dataFiles[x]
224                filename,extension = dataFiles[x].split(".")
225                tick = filename.split("-")
226                tick = tick[1]
227
228                if x == 0:
229                        plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(i) + " title '" + tick + "' with lines,")
230                else:
231                        plot.stdin.write(" '" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(i) + " title '" + tick + "' with lines,")
232        plot.stdin.write("\n")
233
234        plot.stdin.write("set title 'Skew octet " + str(i+1) + "'\n")
235        plot.stdin.write("set yrange[-1:1]\n")
236        plot.stdin.write("set xlabel 'Time'\n")
237        plot.stdin.write("set ylabel 'Skewness'\n")
238        plot.stdin.write("set autoscale x\n")
239        plot.stdin.write("set key top right\n")
240        plot.stdin.write("unset xtics\n")
241        plot.stdin.write("plot '" + dir + "/ipdist-timeseries-skewness.stats' using " + str((i*2)+2) + ":xtic(1) title 'Source' with lines,")
242        plot.stdin.write("'' using " + str((i*2)+3) + ":xtic(1) title 'Destination' with lines\n")
243        plot.stdin.write("unset multiplot\n")
244        plot.stdin.flush()
245        plot.communicate()
246
247
248# cleanup all tmp files
249# tmp files created for CDF plots
250for x in range(len(dataFiles)):
251        dataFile = dataFiles[x]
252        filename,extension = dataFiles[x].split(".")
253        tick = filename.split("-")
254        tick = tick[1]
255
256        os.remove(dir + "/ipdist-" + tick + ".tmp")
257# skew file
258os.remove(dir + "/ipdist-timeseries-skewness.stats")
259# timeseries files
260for x in range(4):
261        os.remove(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries")
262        os.remove(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries")
Note: See TracBrowser for help on using the repository browser.