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