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

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

Add CDF distribution plot

  • Property mode set to 100644
File size: 9.1 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        # cleanup the temp file
190        os.remove(dir + "/ipdist-" + tick + ".tmp")
191
192# Generate plots for the timeseries data captured over the entire trace
193for i in range(4):
194        for x in range(2):
195                plot = subprocess.Popen(['gnuplot -persistent','-p'],
196                                        shell=True,
197                                        stdin=subprocess.PIPE,)
198                plot.stdin.write("set term pngcairo size 1280,960\n")
199                if x == 0:
200                        plot.stdin.write("set output '" + dir + "/ipdist-timeseries-src-octet" + str(i+1) + ".png'\n")
201                        plot.stdin.write("set title 'Timeseries src octet " + str(i+1) + "'\n")
202                else:
203                        plot.stdin.write("set output '" + dir + "/ipdist-timeseries-dst-octet" + str(i+1) + ".png'\n")
204                        plot.stdin.write("set title 'Timeseries dst octet " + str(i+1) + "'\n")
205                plot.stdin.write("set multiplot layout 2,1\n")
206                plot.stdin.write("set xtics rotate\n")
207                plot.stdin.write("set ytics\n")
208                plot.stdin.write("set xlabel 'Timestamp'\n")
209                plot.stdin.write("set key off\n")
210                plot.stdin.write("set autoscale xy\n")
211                if x == 0:
212                        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")
213                else:
214                        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")
215                plot.stdin.write("set title 'Timeseries mean skewness'\n")
216                plot.stdin.write("set yrange[-1:1]\n")
217                plot.stdin.write("set xlabel 'Timestamp'\n")
218                plot.stdin.write("set ylabel 'Skewness'\n")
219                plot.stdin.write("plot '" + dir + "/ipdist-timeseries-skewness.stats' using " + str((i*2)+2+x) + ":xtic(1) with lines\n")
220                plot.stdin.write("unset multiplot\n")
221                plot.stdin.flush()
222                plot.communicate()
Note: See TracBrowser for help on using the repository browser.