source: examples/stats/ipdist-genplot.py @ 7395b09

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

Cleanup timeseries plots

  • Property mode set to 100644
File size: 10.2 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 key off\n")
203        for x in range(len(dataFiles)):
204                dataFile = dataFiles[x]
205                filename,extension = dataFiles[x].split(".")
206                tick = filename.split("-")
207                tick = tick[1]
208
209                if x == 0:
210                        plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(i) + " title '" + tick + "' with lines,")
211                else:
212                        plot.stdin.write(" '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(i) + " title '" + tick + "' with lines,")
213        plot.stdin.write("\n")
214
215        plot.stdin.write("set title 'CDF destination octet " + str(i+1) + "'\n")
216        plot.stdin.write("set xlabel 'Prefix'\n")
217        plot.stdin.write("set ylabel 'Cumulative %'\n")
218        plot.stdin.write("set xrange[0:255]\n")
219        plot.stdin.write("set key off\n")
220        for x in range(len(dataFiles)):
221                dataFile = dataFiles[x]
222                filename,extension = dataFiles[x].split(".")
223                tick = filename.split("-")
224                tick = tick[1]
225
226                if x == 0:
227                        plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(i) + " title '" + tick + "' with lines,")
228                else:
229                        plot.stdin.write(" '" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(i) + " title '" + tick + "' with lines,")
230        plot.stdin.write("\n")
231
232        plot.stdin.write("set title 'Timeseries mean skewness'\n")
233        plot.stdin.write("set yrange[-1:1]\n")
234        plot.stdin.write("set xlabel 'Timestamp'\n")
235        plot.stdin.write("set ylabel 'Skewness'\n")
236        plot.stdin.write("set autoscale x\n")
237        plot.stdin.write("set key top right\n")
238        plot.stdin.write("unset xtics\n")
239        plot.stdin.write("plot '" + dir + "/ipdist-timeseries-skewness.stats' using " + str((i*2)+2) + ":xtic(1) title 'Source' with lines,")
240        plot.stdin.write("'' using " + str((i*2)+3) + ":xtic(1) title 'Destination' with lines\n")
241        plot.stdin.write("unset multiplot\n")
242        plot.stdin.flush()
243        plot.communicate()
244
245
246# cleanup all tmp files
247# tmp files created for CDF plots
248for x in range(len(dataFiles)):
249        dataFile = dataFiles[x]
250        filename,extension = dataFiles[x].split(".")
251        tick = filename.split("-")
252        tick = tick[1]
253
254        os.remove(dir + "/ipdist-" + tick + ".tmp")
255# skew file
256os.remove(dir + "/ipdist-timeseries-skewness.stats")
257# timeseries files
258for x in range(4):
259        os.remove(dir + "/ipdist-dst-octet" + str(x+1) + ".timeseries")
260        os.remove(dir + "/ipdist-src-octet" + str(x+1) + ".timeseries")
Note: See TracBrowser for help on using the repository browser.