mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-10 00:41:06 +00:00
239 lines
8.1 KiB
Python
Executable File
239 lines
8.1 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import matplotlib.pyplot as plt
|
|
#from pylab import *
|
|
import cPickle
|
|
import pylab as P
|
|
import numpy as np
|
|
from matplotlib.backends.backend_pdf import PdfPages
|
|
from matplotlib.patches import Polygon
|
|
import itertools
|
|
import os
|
|
|
|
|
|
|
|
def histplot(data,labels, colors, x_label, y_label, title, fig_name, cdf):
|
|
fig, ax = plt.subplots()
|
|
if cdf:
|
|
n, bins, patches = ax.hist(data, 20, weights=None, histtype='step', normed=True, cumulative=True, label= labels, color = colors)
|
|
legend = ax.legend(loc='lower left', shadow=False)
|
|
ax.grid(True)
|
|
|
|
else:
|
|
n, bins, patches = ax.hist( data, 20, weights=None, histtype='bar', label= labels, color = colors)
|
|
legend = ax.legend(loc='upper right', shadow=False)
|
|
|
|
for line in ax.get_lines():
|
|
line.set_linewidth(1.5)
|
|
|
|
ax.set_xlabel(x_label)
|
|
ax.set_ylabel(y_label)
|
|
for label in legend.get_texts():
|
|
label.set_fontsize('small')
|
|
|
|
for label in legend.get_lines():
|
|
label.set_linewidth(1.5) # the legend line width
|
|
|
|
fig.suptitle(title, fontsize=12)
|
|
|
|
#plt.show()
|
|
pp = PdfPages(fig_name)
|
|
pp.savefig(fig)
|
|
pp.close()
|
|
return [n, bins, patches]
|
|
|
|
def accplot(data, labels, colors, x_label, y_label, title, fig_name, annotation):
|
|
mean = np.zeros(len(data))
|
|
for i in range(len(data)):
|
|
if len(data[i]) > 0:
|
|
mean[i] = len(data[i]) /(1.0*max(data[i]))
|
|
|
|
mean = round(mean)
|
|
|
|
fig, ax = plt.subplots()
|
|
for i in range(len(data)):
|
|
if len(data[i]) > 0:
|
|
ax.plot(data[i], range(len(data[i])), colors[i], label= labels[i]+', '+mean[i]+' adv/s, total nr. '+str(len(data[i])))
|
|
|
|
ax.set_xlabel(x_label)
|
|
ax.set_ylabel(y_label)
|
|
for tl in ax.get_yticklabels():
|
|
tl.set_color('k')
|
|
|
|
legend = ax.legend(loc='upper left', shadow=False)
|
|
|
|
for label in legend.get_texts():
|
|
label.set_fontsize('small')
|
|
|
|
for label in legend.get_lines():
|
|
label.set_linewidth(1.5) # the legend line width
|
|
|
|
for line in ax.get_lines():
|
|
line.set_linewidth(1.5)
|
|
|
|
fig.suptitle(title, fontsize=12)
|
|
ax.text(400, 5000, annotation , style='italic',
|
|
bbox={'facecolor':'gray', 'alpha':0.5, 'pad':10})
|
|
|
|
#plt.show()
|
|
pp = PdfPages(fig_name)
|
|
pp.savefig(fig)
|
|
pp.close()
|
|
|
|
return fig
|
|
|
|
def mean_common_len(data):
|
|
mcl = 0
|
|
for i in range(len(data) - 1):
|
|
if len(data[i]) > 0:
|
|
if mcl == 0:
|
|
mcl = len(data[i])
|
|
else:
|
|
mcl = min(mcl, len(data[i]))
|
|
return mcl
|
|
|
|
def mean_common_time(data):
|
|
mct = 0
|
|
for i in range(len(data) - 1):
|
|
if len(data[i]) > 0:
|
|
if mct == 0:
|
|
mct = max(data[i])
|
|
else:
|
|
mct = min(mct, max(data[i]))
|
|
return mct
|
|
|
|
def normalize(s):
|
|
return map(lambda x: (x - s[0]), s)
|
|
|
|
def delta(s):
|
|
rs = list()
|
|
for i in range(len(s)-1):
|
|
rs.append(s[i+1] - s[i])
|
|
return rs
|
|
|
|
def round(s):
|
|
return map(lambda x: "{0:.4f}".format(x), s)
|
|
|
|
def cut(s, V):
|
|
r = list()
|
|
for i in range(len(s)):
|
|
if s[i] <= V:
|
|
r.append(s[i])
|
|
return r
|
|
|
|
def prepare_data(exp_name, sensor_name):
|
|
prefix = '../data/processed/'
|
|
|
|
scanning_type = exp_name+'_continuous'
|
|
mn = cPickle.load(open(prefix+scanning_type+'_mac_'+sensor_name+'.data', 'rb')) # mac nio,
|
|
mm = cPickle.load(open(prefix+scanning_type+'_mac_mac.data', 'rb')) # mac mac,
|
|
rn = cPickle.load(open(prefix+scanning_type+'_rug_'+sensor_name+'.data', 'rb')) # ruggear nio,
|
|
rm = cPickle.load(open(prefix+scanning_type+'_rug_mac.data', 'rb')) # ruggear mac,
|
|
|
|
scanning_type = exp_name+'_normal'
|
|
try:
|
|
normal_rn = cPickle.load(open(prefix + scanning_type+'_rug_'+sensor_name+'.data', 'rb')) # ruggear mac, normal
|
|
except:
|
|
normal_rn = list()
|
|
|
|
try:
|
|
normal_mn = cPickle.load(open(prefix + scanning_type+'_mac_'+sensor_name+'.data', 'rb')) # ruggear mac, normal
|
|
except:
|
|
normal_mn = list()
|
|
|
|
try:
|
|
normal_rm = cPickle.load(open(prefix + scanning_type+'_rug_mac.data', 'rb')) # ruggear mac, normal
|
|
except:
|
|
normal_rm = list()
|
|
|
|
try:
|
|
normal_mm = cPickle.load(open(prefix + scanning_type+'_mac_mac.data', 'rb')) # ruggear mac, normal
|
|
except:
|
|
normal_mm = list()
|
|
|
|
|
|
T = mean_common_time([mm, mn, rm, rn, normal_rm, normal_rn, normal_mm, normal_mn])
|
|
L = mean_common_len([mm, mn, rm, rn, normal_rm, normal_rn, normal_mm, normal_mn])
|
|
Z = 15
|
|
|
|
print "mct %d, mcl %d" % (T,L)
|
|
mac_mac = normalize(mm)
|
|
mac_nio = normalize(mn)
|
|
ruggeer_mac = normalize(rm)
|
|
ruggeer_nio = normalize(rn)
|
|
|
|
ruggeer_nio_normal = normalize(normal_rn)
|
|
ruggeer_mac_normal = normalize(normal_rm)
|
|
mac_mac_normal = normalize(normal_mm)
|
|
mac_nio_normal = normalize(normal_mn)
|
|
|
|
|
|
delta_mn = delta(mac_nio)
|
|
delta_mm = delta(mac_mac)
|
|
delta_rn = delta(ruggeer_nio)
|
|
delta_rm = delta(ruggeer_mac)
|
|
|
|
rn_delays = list()
|
|
for i in range(len(delta_rn)):
|
|
rn_delays.append(range(delta_rn[i]))
|
|
|
|
flattened_rn_delays = list(itertools.chain.from_iterable(rn_delays))
|
|
|
|
plot_data = [cut(mac_mac,T), cut(mac_nio,T), cut(ruggeer_mac,T), cut(ruggeer_nio,T)]
|
|
plot_data_normal = [cut(mac_mac_normal,T), cut(mac_nio_normal,T), cut(ruggeer_mac_normal,T), cut(ruggeer_nio_normal,T)]
|
|
|
|
hist_data = [delta_mm[0:L], delta_mn[0:L], delta_rm[0:L], delta_rn[0:L]]
|
|
|
|
zoomed_hist_data = list()
|
|
if len(hist_data[0]) >= Z and len(hist_data[1]) >= Z and len(hist_data[2]) >= Z and len(hist_data[3]) >= Z :
|
|
zoomed_hist_data = [cut(hist_data[0],Z), cut(hist_data[1],Z), cut(hist_data[2],Z), cut(hist_data[3],Z)]
|
|
|
|
return [plot_data, hist_data, zoomed_hist_data, flattened_rn_delays, plot_data_normal]
|
|
|
|
def plot(exp_name, sensor_name, sensor_title, prefix):
|
|
[plot_data, hist_data, zoomed_hist_data, rn_delays, plot_data_normal] = prepare_data(exp_name, sensor_name)
|
|
labels = ['Scan. BCM, Adv. BCM', 'Scan. BCM, Adv. '+ sensor_title, 'Scan. RugGear, Adv. BCM', 'Scan. RugGear, Adv. '+sensor_title]
|
|
plot_colors = ['r-','k-','b-','g-']
|
|
hist_colors = ['red','black','blue','green']
|
|
|
|
title = 'Continuous scanning over time'
|
|
annotation = 'scan window 30ms, scan interval 30ms'
|
|
|
|
x_label = 'Time [s]'
|
|
y_label = 'Number of advertisements'
|
|
accplot(plot_data, labels, plot_colors, x_label, y_label, title, prefix+sensor_name+'_acc_number_of_advertisements_continuous_scanning.pdf', annotation)
|
|
|
|
x_label = 'Time interval between two advertisements [s]'
|
|
title = 'Continuous scanning - interval distribution'
|
|
histplot(hist_data, labels, hist_colors, x_label, y_label, title, prefix+sensor_name+'_histogram_advertisements_time_delay.pdf', 0)
|
|
|
|
|
|
#if len(zoomed_hist_data) > 0:
|
|
# title = 'Continuous scanning - interval distribution [0-15s]'
|
|
# histplot(zoomed_hist_data, labels, hist_colors, x_label, y_label, title, prefix+sensor_name+'_histogram_advertisements_time_delay_zoomed.pdf', 0)
|
|
|
|
title = 'Continuous scanning - expected waiting time'
|
|
x_label = 'Expected waiting time until first scan [s]'
|
|
[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)
|
|
|
|
title = 'Continuous scanning - expected waiting time probability distribution'
|
|
y_label = 'Advertisement probability'
|
|
x_label = 'Time until first scan [s]'
|
|
[n, bins, patches] = histplot([rn_delays], [labels[3]], [hist_colors[3]], x_label, y_label, title, prefix+sensor_name+'_ruggear_cdf.pdf', 1)
|
|
|
|
|
|
title = 'Normal scanning over time'
|
|
annotation = 'scan window 30ms, scan interval 300ms'
|
|
|
|
x_label = 'Time [s]'
|
|
y_label = 'Number of advertisements'
|
|
accplot(plot_data_normal, labels, plot_colors, x_label, y_label, title, prefix+sensor_name+'_acc_number_of_advertisements_normal_scanning.pdf', annotation)
|
|
|
|
|
|
picts_folder = "../picts_experiments/"
|
|
if not os.access(picts_folder, os.F_OK):
|
|
os.mkdir(picts_folder)
|
|
|
|
plot('exp1','nio', 'Nio', picts_folder)
|
|
plot('exp2','xg2', 'XG', picts_folder)
|