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