systematic use of context managers for dealing with files instead of open()/close...
[nepi.git] / examples / omf / vod_exp / demo_plot.py
1 import matplotlib
2 matplotlib.use('GTK') 
3 import matplotlib.pyplot as plt
4 import numpy as np
5 import os
6 import time
7
8 import subprocess
9
10 ##### Parsing Argument to Plot #####
11 from optparse import OptionParser
12
13 usage = ("usage: %prog -p <type-of-plot> -d <type-of-packets> -f <folder-with-stats>")
14
15 parser = OptionParser(usage = usage)
16 parser.add_option("-p", "--plot", dest="plot",
17         help="Type of Plot : vod_broad_cli | vod_broad_wlan | vod_broad_eth | broad_all | vod_all", type="string")
18 parser.add_option("-d", "--packet", dest="packet",
19         help="Packet to use for the plot : frames | bytes", type="string")
20 parser.add_option("-f", "--folder", dest="folder",
21         help="Folder with the statistics ", type="string")
22
23 (options, args) = parser.parse_args()
24 plot = options.plot
25 packet = options.packet
26 folder = options.folder
27
28 ##### Initialize the data #####
29
30 overall_stats_broad = {}
31 overall_stats_vod = {}
32
33 for i in [1, 3, 5]:
34     overall_stats_broad[i] = {}
35     overall_stats_broad[i]['eth'] = []
36     overall_stats_broad[i]['wlan'] = []
37     overall_stats_broad[i]['cli'] = []
38
39     overall_stats_vod[i] = {}
40     overall_stats_vod[i]['eth'] = []
41     overall_stats_vod[i]['wlan'] = []
42     overall_stats_vod[i]['cli'] = []
43
44 all_broad_folders = os.listdir(folder + 'demo_openlab_traces/broadcast')
45 all_vod_folders = os.listdir(folder + 'demo_openlab_traces/vod')
46
47 data_broad_folders = list()
48 data_vod_folders = list()
49
50 # Loop to take only the wanted folder
51 for f in all_broad_folders :
52     if f.startswith('s_'): 
53         data_broad_folders.append(f)
54
55 for f in all_vod_folders :
56     if f.startswith('s_'): 
57         data_vod_folders.append(f)
58
59 ##### For Broadcast #####
60
61 stats_broad_wlan = list()
62 stats_broad_eth = list()
63 stats_broad_cli = list()
64
65 # Write the wanted statistics into a file
66 for exp in data_broad_folders :
67     broad_file = os.listdir(folder + 'demo_openlab_traces/broadcast/'+exp)
68     for f in broad_file :
69         dest = folder + "demo_openlab_traces/broadcast/" + exp + "/stats_" + f + ".txt"
70         command = "tshark -r " + folder + "demo_openlab_traces/broadcast/" + exp + "/" + f + " -z io,phs > " + dest
71         if f.startswith('capwificen_wlan'):
72             p = subprocess.Popen(command , shell=True)
73             p.wait()
74             stats_broad_wlan.append(dest)
75         if f.startswith('capwificen_eth'):
76             p = subprocess.Popen(command , shell=True)
77             p.wait()
78             stats_broad_eth.append(dest)
79         if f.startswith('capcli'):
80             p = subprocess.Popen(command , shell=True)
81             p.wait()
82             stats_broad_cli.append(dest)
83
84 # Numer of client that was used
85 def nb_client(s):
86     elt = s.split('_')
87     if elt[-2] == '1':
88         return 1
89     if elt[-2] == '3':
90         return 3
91     if elt[-2] == '5':
92         return 5
93
94 # Return the value wanted
95 def get_broad_values(list_files, type_file):
96     for s in list_files:
97         nb = nb_client(s)
98         with open(s, 'r') as o:
99             for l in o:
100                 if 'udp' in l:
101                     row = l.split(':')
102                     f = row[1].split(' ')
103                     frame = int(f[0])
104                     byte = int(row[2])
105
106                     res = {}
107                     res['frames'] = frame
108                     res['bytes'] = byte
109                     if frame < 20 :
110                         continue
111                     overall_stats_broad[nb][type_file].append(res)
112
113 get_broad_values(stats_broad_wlan, 'wlan')
114 get_broad_values(stats_broad_eth, 'eth')
115 get_broad_values(stats_broad_cli, 'cli')
116
117 #print overall_stats_broad
118
119 ##### For VOD #####
120
121 stats_vod_wlan = list()
122 stats_vod_eth = list()
123 stats_vod_cli = list()
124
125 # Write the wanted statistics into a file
126 for exp in data_vod_folders :
127     vod_file = os.listdir(folder + 'demo_openlab_traces/vod/'+exp)
128     for f in vod_file :
129         dest = folder + "/demo_openlab_traces/vod/" + exp + "/stats_" + f + ".txt"
130         command = "tshark -r " + folder + "demo_openlab_traces/vod/" + exp + "/" + f + " -z io,phs > " + dest
131         if f.startswith('capwificen_wlan'):
132             p = subprocess.Popen(command , shell=True)
133             p.wait()
134             stats_vod_wlan.append(dest)
135         if f.startswith('capwificen_eth'):
136             p = subprocess.Popen(command , shell=True)
137             p.wait()
138             stats_vod_eth.append(dest)
139         if f.startswith('capcli'):
140             p = subprocess.Popen(command , shell=True)
141             p.wait()
142             stats_vod_cli.append(dest)
143
144 # Return the value wanted
145 def get_vod_values(list_files, type_file):
146     for s in list_files:
147         nb = nb_client(s)
148         with open(s, 'r') as o:
149             for l in o:
150                 if 'udp' in l:
151                     row = l.split(':')
152                     f = row[1].split(' ')
153                     frame = int(f[0])
154                     byte = int(row[2])
155
156                     res = {}
157                     res['frames'] = frame
158                     res['bytes'] = byte
159                     if frame < 100 :
160                         continue
161                     overall_stats_vod[nb][type_file].append(res)
162
163 get_vod_values(stats_vod_wlan, 'wlan')
164 get_vod_values(stats_vod_eth, 'eth')
165 get_vod_values(stats_vod_cli, 'cli')
166
167 #print overall_stats_vod
168
169 ##### For Plotting #####
170
171 if plot != "vod_all":
172     means_broad_cli = list()
173     std_broad_cli = list()
174
175     means_broad_wlan = list()
176     std_broad_wlan = list()
177
178     means_broad_eth = list()
179     std_broad_eth = list()
180
181     for i in [1, 3, 5]:
182         data_cli = list()
183         for elt in overall_stats_broad[i]['cli']:
184             data_cli.append(elt['frames'])
185         samples = np.array(data_cli)
186
187         m = samples.mean()
188         std = np.std(data_cli)
189         means_broad_cli.append(m)
190         std_broad_cli.append(std)
191
192         data_wlan = list()
193         for elt in overall_stats_broad[i]['wlan']:
194             data_wlan.append(elt['frames'])
195         samples = np.array(data_wlan)
196
197         m = samples.mean()
198         std = np.std(data_wlan)
199         means_broad_wlan.append(m)
200         std_broad_wlan.append(std)
201     
202         data_eth = list()
203         for elt in overall_stats_broad[i]['eth']:
204             data_eth.append(elt['frames'])
205         samples = np.array(data_eth)
206
207         m = samples.mean()
208         std = np.std(data_eth)
209         means_broad_eth.append(m)
210         std_broad_eth.append(std)
211
212 if plot != "broad_all":
213     means_vod_cli = list()
214     std_vod_cli = list()
215
216     means_vod_wlan = list()
217     std_vod_wlan = list()
218
219     means_vod_eth = list()
220     std_vod_eth = list()
221
222     for i in [1, 3, 5]:
223         data_cli = list()
224         for elt in overall_stats_vod[i]['cli']:
225             data_cli.append(elt['frames'])
226         samples = np.array(data_cli)
227
228         m = samples.mean()
229         std = np.std(data_cli)
230         means_vod_cli.append(m)
231         std_vod_cli.append(std)
232
233         data_wlan = list()
234         for elt in overall_stats_vod[i]['wlan']:
235             data_wlan.append(elt['frames'])
236         samples = np.array(data_wlan)
237
238         m = samples.mean()
239         std = np.std(data_wlan)
240         means_vod_wlan.append(m)
241         std_vod_wlan.append(std)
242     
243         data_eth = list()
244         for elt in overall_stats_vod[i]['eth']:
245             data_eth.append(elt['frames'])
246         samples = np.array(data_eth)
247
248         m = samples.mean()
249         std = np.std(data_eth)
250         means_vod_eth.append(m)
251         std_vod_eth.append(std)
252
253 ### To plot ###
254 n_groups = 3
255
256 #Put the right numbers
257 if plot == "broad_all":
258     means_bars1 = tuple(means_broad_cli)
259     std_bars1 = tuple(std_broad_cli)
260
261     means_bars2 = tuple(means_broad_wlan)
262     std_bars2 = tuple(std_broad_wlan)
263
264     means_bars3 = tuple(means_broad_eth)
265     std_bars3 = tuple(std_broad_eth)
266
267 if plot == "vod_all":
268     means_bars1 = tuple(means_vod_cli)
269     std_bars1 = tuple(std_vod_cli)
270
271     means_bars2 = tuple(means_vod_wlan)
272     std_bars2 = tuple(std_vod_wlan)
273
274     means_bars3 = tuple(means_vod_eth)
275     std_bars3 = tuple(std_vod_eth)
276
277 if plot == "vod_broad_cli":
278     means_bars1 = tuple(means_broad_cli)
279     std_bars1 = tuple(std_broad_cli)
280
281     means_bars2 = tuple(means_vod_cli)
282     std_bars2 = tuple(std_vod_cli)
283
284 if plot == "vod_broad_wlan":
285     means_bars1 = tuple(means_broad_wlan)
286     std_bars1 = tuple(std_broad_wlan)
287
288     means_bars2 = tuple(means_vod_wlan)
289     std_bars2 = tuple(std_vod_wlan)
290
291 if plot == "vod_broad_eth":
292     means_bars1 = tuple(means_broad_eth)
293     std_bars1 = tuple(std_broad_eth)
294
295     means_bars2 = tuple(means_vod_eth)
296     std_bars2 = tuple(std_vod_eth)
297
298
299 fig, ax = plt.subplots()
300
301 index = np.arange(n_groups)
302 bar_width = 0.3
303
304 opacity = 0.4
305 error_config = {'ecolor': '0.3'}
306
307 if plot == "vod_all" or plot == "broad_all" :
308     rects1 = plt.bar(index, means_bars1, bar_width,
309                  alpha=opacity,
310                  color='y',
311                  yerr=std_bars1,
312                  error_kw=error_config,
313                  label='Client')
314
315     rects2 = plt.bar(index + bar_width, means_bars2, bar_width,
316                  alpha=opacity,
317                  color='g',
318                  yerr=std_bars2,
319                  error_kw=error_config,
320                  label='Wlan')
321
322     rects3 = plt.bar(index + 2*bar_width, means_bars3, bar_width,
323                  alpha=opacity,
324                  color='r',
325                  yerr=std_bars3,
326                  error_kw=error_config,
327                  label='Eth')
328
329 else :
330     rects1 = plt.bar(index, means_bars1, bar_width,
331                  alpha=opacity,
332                  color='y',
333                  yerr=std_bars1,
334                  error_kw=error_config,
335                  label='Broadcast')
336
337     rects2 = plt.bar(index + bar_width, means_bars2, bar_width,
338                  alpha=opacity,
339                  color='g',
340                  yerr=std_bars2,
341                  error_kw=error_config,
342                  label='VOD')    
343
344 plt.xlabel('Number of Client')
345
346 if packet == "frames" :
347     plt.ylabel('Frames sent over UDP')
348 if packet == "bytes" :
349     plt.ylabel('Bytes sent over UDP')
350
351 if plot == "broad_all":
352     plt.title('Packet sent by number of client in broadcast mode')
353 if plot == "vod_all":
354     plt.title('Packet sent by number of client in VOD mode')
355 if plot == "vod_broad_cli":
356     plt.title('Packet received in average by client in broadcast and vod mode')
357 if plot == "vod_broad_wlan":
358     plt.title('Packet sent in average to the clients in broadcast and vod mode')
359 if plot == "vod_broad_eth":
360     plt.title('Packet received in average by the wifi center in broadcast and vod mode')
361
362 plt.xticks(index + bar_width, ('1', '3', '5'))
363 plt.legend()
364
365 #plt.tight_layout()
366 plt.show()
367