xref: /btstack/port/mtk/docs/scripts/plot_scan.py (revision 690999b0e56bbf6361211ab420f80bc01aa9aa03)
1#!/usr/bin/env python3
2
3import matplotlib.pyplot as plt
4#from pylab import *
5import pickle
6import pylab as P
7import numpy as np
8from matplotlib.backends.backend_pdf import PdfPages
9from matplotlib.patches import Polygon
10import itertools
11import os
12
13
14
15def histplot(data,labels, colors, x_label, y_label, title, fig_name, cdf):
16    fig, ax = plt.subplots()
17    if cdf:
18        n, bins, patches = ax.hist(data, 20, weights=None, histtype='step', normed=True, cumulative=True, label= labels, color = colors)
19        legend = ax.legend(loc='lower left', shadow=False)
20        ax.grid(True)
21
22    else:
23        n, bins, patches = ax.hist( data, 20, weights=None, histtype='bar', label= labels, color = colors)
24        legend = ax.legend(loc='upper right', shadow=False)
25
26    for line in ax.get_lines():
27        line.set_linewidth(1.5)
28
29    ax.set_xlabel(x_label)
30    ax.set_ylabel(y_label)
31    for label in legend.get_texts():
32        label.set_fontsize('small')
33
34    for label in legend.get_lines():
35        label.set_linewidth(1.5)  # the legend line width
36
37    fig.suptitle(title, fontsize=12)
38
39    #plt.show()
40    pp = PdfPages(fig_name)
41    pp.savefig(fig)
42    pp.close()
43    return [n, bins, patches]
44
45def accplot(data, labels, colors, x_label, y_label, title, fig_name, annotation):
46    mean = np.zeros(len(data))
47    for i in range(len(data)):
48        if len(data[i]) > 0:
49            mean[i] = len(data[i]) /(1.0*max(data[i]))
50
51    mean = round(mean)
52
53    fig, ax = plt.subplots()
54    for i in range(len(data)):
55        if len(data[i]) > 0:
56            ax.plot(data[i], range(len(data[i])), colors[i], label= labels[i]+', '+mean[i]+' adv/s, total nr. '+str(len(data[i])))
57
58    ax.set_xlabel(x_label)
59    ax.set_ylabel(y_label)
60    for tl in ax.get_yticklabels():
61        tl.set_color('k')
62
63    legend = ax.legend(loc='upper left', shadow=False)
64
65    for label in legend.get_texts():
66        label.set_fontsize('small')
67
68    for label in legend.get_lines():
69        label.set_linewidth(1.5)  # the legend line width
70
71    for line in ax.get_lines():
72        line.set_linewidth(1.5)
73
74    fig.suptitle(title, fontsize=12)
75    ax.text(400, 5000, annotation , style='italic',
76        bbox={'facecolor':'gray', 'alpha':0.5, 'pad':10})
77
78    #plt.show()
79    pp = PdfPages(fig_name)
80    pp.savefig(fig)
81    pp.close()
82
83    return fig
84
85def mean_common_len(data):
86    mcl = 0
87    for i in range(len(data) - 1):
88        if len(data[i]) > 0:
89            if mcl == 0:
90                mcl = len(data[i])
91            else:
92                mcl = min(mcl, len(data[i]))
93    return mcl
94
95def mean_common_time(data):
96    mct = 0
97    for i in range(len(data) - 1):
98        if len(data[i]) > 0:
99            if mct == 0:
100                mct = max(data[i])
101            else:
102                mct = min(mct, max(data[i]))
103    return mct
104
105def normalize(s):
106    return map(lambda x: (x - s[0]), s)
107
108def delta(s):
109    rs = list()
110    for i in range(len(s)-1):
111        rs.append(s[i+1] - s[i])
112    return rs
113
114def round(s):
115    return map(lambda x: "{0:.4f}".format(x), s)
116
117def cut(s, V):
118    r = list()
119    for i in range(len(s)):
120        if s[i] <= V:
121            r.append(s[i])
122    return r
123
124def prepare_data(exp_name, sensor_name):
125    prefix = '../data/processed/'
126
127    scanning_type = exp_name+'_continuous'
128    mn = pickle.load(open(prefix+scanning_type+'_mac_'+sensor_name+'.data', 'rb')) # mac nio,
129    mm = pickle.load(open(prefix+scanning_type+'_mac_mac.data', 'rb')) # mac mac,
130    rn = pickle.load(open(prefix+scanning_type+'_rug_'+sensor_name+'.data', 'rb')) # ruggear nio,
131    rm = pickle.load(open(prefix+scanning_type+'_rug_mac.data', 'rb')) # ruggear mac,
132
133    scanning_type = exp_name+'_normal'
134    try:
135        normal_rn = pickle.load(open(prefix + scanning_type+'_rug_'+sensor_name+'.data', 'rb')) # ruggear mac, normal
136    except:
137        normal_rn = list()
138
139    try:
140        normal_mn = pickle.load(open(prefix + scanning_type+'_mac_'+sensor_name+'.data', 'rb')) # ruggear mac, normal
141    except:
142        normal_mn = list()
143
144    try:
145        normal_rm = pickle.load(open(prefix + scanning_type+'_rug_mac.data', 'rb')) # ruggear mac, normal
146    except:
147        normal_rm = list()
148
149    try:
150        normal_mm = pickle.load(open(prefix + scanning_type+'_mac_mac.data', 'rb')) # ruggear mac, normal
151    except:
152        normal_mm = list()
153
154
155    T  = mean_common_time([mm, mn, rm, rn, normal_rm, normal_rn, normal_mm, normal_mn])
156    L  = mean_common_len([mm, mn, rm, rn, normal_rm, normal_rn, normal_mm, normal_mn])
157    Z  = 15
158
159    print("mct %d, mcl %d" % (T,L))
160    mac_mac = normalize(mm)
161    mac_nio = normalize(mn)
162    ruggeer_mac = normalize(rm)
163    ruggeer_nio = normalize(rn)
164
165    ruggeer_nio_normal = normalize(normal_rn)
166    ruggeer_mac_normal = normalize(normal_rm)
167    mac_mac_normal = normalize(normal_mm)
168    mac_nio_normal = normalize(normal_mn)
169
170
171    delta_mn = delta(mac_nio)
172    delta_mm = delta(mac_mac)
173    delta_rn = delta(ruggeer_nio)
174    delta_rm = delta(ruggeer_mac)
175
176    rn_delays = list()
177    for i in range(len(delta_rn)):
178        rn_delays.append(range(delta_rn[i]))
179
180    flattened_rn_delays = list(itertools.chain.from_iterable(rn_delays))
181
182    plot_data = [cut(mac_mac,T), cut(mac_nio,T), cut(ruggeer_mac,T), cut(ruggeer_nio,T)]
183    plot_data_normal = [cut(mac_mac_normal,T), cut(mac_nio_normal,T), cut(ruggeer_mac_normal,T), cut(ruggeer_nio_normal,T)]
184
185    hist_data = [delta_mm[0:L], delta_mn[0:L], delta_rm[0:L], delta_rn[0:L]]
186
187    zoomed_hist_data = list()
188    if len(hist_data[0]) >= Z and len(hist_data[1]) >= Z and len(hist_data[2]) >= Z  and len(hist_data[3]) >= Z :
189        zoomed_hist_data = [cut(hist_data[0],Z), cut(hist_data[1],Z), cut(hist_data[2],Z), cut(hist_data[3],Z)]
190
191    return [plot_data, hist_data, zoomed_hist_data, flattened_rn_delays, plot_data_normal]
192
193def plot(exp_name, sensor_name, sensor_title, prefix):
194    [plot_data, hist_data, zoomed_hist_data, rn_delays, plot_data_normal] = prepare_data(exp_name, sensor_name)
195    labels = ['Scan. BCM, Adv. BCM', 'Scan. BCM, Adv. '+ sensor_title, 'Scan. RugGear, Adv. BCM', 'Scan. RugGear, Adv. '+sensor_title]
196    plot_colors = ['r-','k-','b-','g-']
197    hist_colors = ['red','black','blue','green']
198
199    title = 'Continuous scanning over time'
200    annotation = 'scan window 30ms, scan interval 30ms'
201
202    x_label = 'Time [s]'
203    y_label = 'Number of advertisements'
204    accplot(plot_data, labels, plot_colors, x_label, y_label, title, prefix+sensor_name+'_acc_number_of_advertisements_continuous_scanning.pdf', annotation)
205
206    x_label = 'Time interval between two advertisements [s]'
207    title = 'Continuous scanning - interval distribution'
208    histplot(hist_data, labels, hist_colors, x_label, y_label, title, prefix+sensor_name+'_histogram_advertisements_time_delay.pdf', 0)
209
210
211    #if len(zoomed_hist_data) > 0:
212    #    title = 'Continuous scanning - interval distribution [0-15s]'
213    #    histplot(zoomed_hist_data, labels, hist_colors, x_label, y_label, title, prefix+sensor_name+'_histogram_advertisements_time_delay_zoomed.pdf', 0)
214
215    title = 'Continuous scanning - expected waiting time'
216    x_label = 'Expected waiting time until first scan [s]'
217    [n, bins, patches] = histplot([rn_delays], [labels[3]], [hist_colors[3]], x_label, y_label, title, prefix+sensor_name+'_ruggear_expected_scan_response.pdf', 0)
218
219    title = 'Continuous scanning - expected waiting time probability distribution'
220    y_label = 'Advertisement probability'
221    x_label = 'Time until first scan [s]'
222    [n, bins, patches] = histplot([rn_delays], [labels[3]], [hist_colors[3]], x_label, y_label, title, prefix+sensor_name+'_ruggear_cdf.pdf', 1)
223
224
225    title = 'Normal scanning over time'
226    annotation = 'scan window 30ms, scan interval 300ms'
227
228    x_label = 'Time [s]'
229    y_label = 'Number of advertisements'
230    accplot(plot_data_normal, labels, plot_colors, x_label, y_label, title, prefix+sensor_name+'_acc_number_of_advertisements_normal_scanning.pdf', annotation)
231
232
233picts_folder = "../picts_experiments/"
234if not os.access(picts_folder, os.F_OK):
235    os.mkdir(picts_folder)
236
237plot('exp1','nio', 'Nio', picts_folder)
238plot('exp2','xg2', 'XG', picts_folder)
239