source: examples/stats/ipdist-genplot.py @ 5dba5e7

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

Remove unneeded code

  • Property mode set to 100644
File size: 9.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
50        # Create/append to timeseries stats file
51        # the file needs to be created on the first pass
52        if i == 0:
53                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "w")
54                tmp.write("timestamp\tsrc1\t\tdst1\t\tsrc2\t\tdst2\t\tsrc3\t\tdst3\t\tsrc4\t\tdst4\n")
55        else:
56                tmp = open(dir + "/ipdist-timeseries-skewness.stats", "a")
57        tmp.write(tick)
58        for x in range(4):
59                tmp.write("\t" + str(total_skew_src[x]/(i+1)) + "\t" + str(total_skew_dst[x]/(i+1)))
60        tmp.write("\n")
61        tmp.close()
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        # create arrays to hold counts
69        count_src = [0] * 4
70        count_dst = [0] * 4
71        # count all octet counts in the current data file
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
81
82        # create tmp file for cdf plots
83        with open(dir + "/ipdist-" + tick + ".tmp", "w") as tmp:
84                for x in range(4):
85                        total_src = 0
86                        total_dst = 0
87                        min_src = 0
88                        min_dst = 0
89                        max_src = 0
90                        max_dst = 0
91
92                        # work out min and max needed to normalise the data for CDF
93                        for i in range(256):
94                                curr_src = count_src[x][i]
95                                curr_dst = count_dst[x][i]
96                                if curr_src < min_src or i == 0:
97                                        min_src = 0
98                                if curr_dst < min_dst or i == 0:
99                                        min_dst = 0
100                                # cumulative count
101                                max_src = max_src + curr_src
102                                max_dst = max_dst + curr_dst
103
104                        for i in range(256):
105                                total_src = total_src + count_src[x][i]
106                                total_dst = total_dst + count_dst[x][i]
107                                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")
108                        tmp.write("\n\n")
109
110
111        # create interval plots
112        for x in range(4):
113                plot = subprocess.Popen(['gnuplot -persistent','-p'],
114                                        shell=True,
115                                        stdin=subprocess.PIPE,)
116
117                plot.stdin.write("set term pngcairo enhanced size 1280,960\n")
118                plot.stdin.write("set output '" + dir + "/" + filename + "-octet" + str(x+1) + ".png'\n")
119                plot.stdin.write("set multiplot layout 3,1\n")
120                plot.stdin.write("set title 'IP Distribution - " + tick + "'\n")
121                plot.stdin.write("set xrange[0:255]\n")
122                plot.stdin.write("set y2range[-1:1]\n")
123                plot.stdin.write("set y2tics\n")
124                plot.stdin.write("set xlabel 'Prefix'\n")
125                plot.stdin.write("set ylabel 'Hits'\n")
126                plot.stdin.write("set y2label 'Skewness'\n")
127                plot.stdin.write("set xtics 0,10,255\n")
128                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 2 name 'SOURCEMEAN' nooutput\n")
129                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 2 name 'DESTMEAN' nooutput\n")
130                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::0::0 using 7 name 'SOURCESKEW' nooutput\n")
131                plot.stdin.write("stats '" + dir + "/" + statsFile + "' index " + str(x) + " every ::1::1 using 7 name 'DESTSKEW' nooutput\n")
132                plot.stdin.write("set arrow from SOURCEMEAN_min, graph 0 to SOURCEMEAN_min, graph 1 nohead lt 1\n")
133                plot.stdin.write("set arrow from DESTMEAN_min, graph 0 to DESTMEAN_min, graph 1 nohead lt 2\n")
134                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,")
135                plot.stdin.write("'' using " + str((x*4)+5) + ":" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "' smooth unique with boxes,")
136                plot.stdin.write("1/0 t 'Source mean' lt 1,")
137                plot.stdin.write("1/0 t 'Destination mean' lt 2,")
138                plot.stdin.write("SOURCESKEW_min title 'Source Skewness' axes x1y2,")
139                plot.stdin.write("DESTSKEW_min title 'Destination Skewness' axes x1y2\n")
140                plot.stdin.write("unset xrange\n")
141                plot.stdin.write("unset y2range\n")
142                plot.stdin.write("unset y2tics\n")
143                plot.stdin.write("unset y2label\n")
144                plot.stdin.write("unset ylabel\n")
145                plot.stdin.write("unset arrow\n")
146                plot.stdin.write("unset label 1\nunset label 2\nunset label 3\nunset label 4\nunset label 5\nunset label 6\n")
147                plot.stdin.write("set title 'CDF distribution'\n")
148                plot.stdin.write("set ylabel 'Cumulative %'\n")
149                plot.stdin.write("set xlabel 'Prefix'\n")
150                plot.stdin.write("set key right bottom\n")
151                plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(x) + " with lines title 'Source octet " + str(x+1) + "',")
152                plot.stdin.write("'" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(x) + " with lines title 'Destination octet " + str(x+1) + "'\n")
153                plot.stdin.write("set title 'Zipf Distribution'\n")
154                plot.stdin.write("set xlabel 'Rank'\n")
155                plot.stdin.write("set xrange [1:255]\n")
156                plot.stdin.write("set ylabel 'Frequency'\n")
157                plot.stdin.write("set logscale xy 10\n")
158                plot.stdin.write("set key top right\n")
159                plot.stdin.write("plot '" + dir + "/" + dataFile + "' using 2:" + str((x*4)+4) + " index 0 title 'Source octet " + str(x+1) + "',")
160                plot.stdin.write("'' using 2:" + str((x*4)+6) + " index 0 title 'Destination octet " + str(x+1) + "'\n")
161                plot.stdin.flush()
162                plot.communicate()
163
164
165# Generate plots for the timeseries data captured over the entire trace
166for i in range(4):
167        plot = subprocess.Popen(['gnuplot -persistent','-p'],
168                                shell=True,
169                                stdin=subprocess.PIPE,)
170        plot.stdin.write("set term pngcairo size 1280,960\n")
171        plot.stdin.write("set output '" + dir + "/ipdist-octet" + str(i+1) + ".png'\n")
172        plot.stdin.write("set multiplot layout 3,1\n")
173
174        plot.stdin.write("set title 'CDF source octet " + str(i+1) + "'\n")
175        plot.stdin.write("set xlabel 'Prefix'\n")
176        plot.stdin.write("set ylabel 'Cumulative %'\n")
177        plot.stdin.write("set xrange[0:255]\n")
178        plot.stdin.write("set xtics 0,10,255\n")
179        plot.stdin.write("set key off\n")
180        for x in range(len(dataFiles)):
181                dataFile = dataFiles[x]
182                filename,extension = dataFiles[x].split(".")
183                tick = filename.split("-")
184                tick = tick[1]
185
186                if x == 0:
187                        plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(i) + " title '" + tick + "' with lines,")
188                else:
189                        plot.stdin.write(" '" + dir + "/ipdist-" + tick + ".tmp' using 2:1 index " + str(i) + " title '" + tick + "' with lines,")
190        plot.stdin.write("\n")
191
192        plot.stdin.write("set title 'CDF destination octet " + str(i+1) + "'\n")
193        plot.stdin.write("set xlabel 'Prefix'\n")
194        plot.stdin.write("set ylabel 'Cumulative %'\n")
195        plot.stdin.write("set xrange[0:255]\n")
196        plot.stdin.write("set xtics 0,10,255\n")
197        plot.stdin.write("set key off\n")
198        for x in range(len(dataFiles)):
199                dataFile = dataFiles[x]
200                filename,extension = dataFiles[x].split(".")
201                tick = filename.split("-")
202                tick = tick[1]
203
204                if x == 0:
205                        plot.stdin.write("plot '" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(i) + " title '" + tick + "' with lines,")
206                else:
207                        plot.stdin.write(" '" + dir + "/ipdist-" + tick + ".tmp' using 4:3 index " + str(i) + " title '" + tick + "' with lines,")
208        plot.stdin.write("\n")
209
210        plot.stdin.write("set title 'Skew octet " + str(i+1) + "'\n")
211        plot.stdin.write("set yrange[-1:1]\n")
212        plot.stdin.write("set xlabel 'Time'\n")
213        plot.stdin.write("set ylabel 'Skewness'\n")
214        plot.stdin.write("set autoscale x\n")
215        plot.stdin.write("set key top right\n")
216        plot.stdin.write("unset xtics\n")
217        plot.stdin.write("plot '" + dir + "/ipdist-timeseries-skewness.stats' using " + str((i*2)+2) + ":xtic(1) title 'Source' with lines,")
218        plot.stdin.write("'' using " + str((i*2)+3) + ":xtic(1) title 'Destination' with lines\n")
219        plot.stdin.write("unset multiplot\n")
220        plot.stdin.flush()
221        plot.communicate()
222
223
224# cleanup all tmp files
225# tmp files created for CDF plots
226for x in range(len(dataFiles)):
227        dataFile = dataFiles[x]
228        filename,extension = dataFiles[x].split(".")
229        tick = filename.split("-")
230        tick = tick[1]
231
232        os.remove(dir + "/ipdist-" + tick + ".tmp")
233# skew file
234os.remove(dir + "/ipdist-timeseries-skewness.stats")
Note: See TracBrowser for help on using the repository browser.