rustybeans/shots/Shots_csv.py

161 lines
4.6 KiB
Python

import csv
import numpy as np
from numpy import diff
from scipy.interpolate import make_interp_spline
from scipy.signal import savgol_filter
import matplotlib.pyplot as plt
filenames = [
'Laura/06_09-1.csv', # [0]
'Laura/06_09-2.csv', # [1]
'Elisabeth/06_10-1.csv', #[2]
'Elisabeth/06_10-2.csv', #[3]
# 'Elisabeth/06_12-1.csv',
'Elisabeth/06_13-1.csv', #[4]
'Elisabeth/06_13-2.csv', #[5]
'Elisabeth/06_15-1.csv', #[6]
'Elisabeth/06_15-2.csv', #[7]
]
comparison = {
'Laura Shot #1 vs #2': (0, 1), #[0]
'Elisabeth 06/10/22 Shot #2 - #1': (2, 3), #[1]
'Elisabeth 06/13/22 Shot #2 - #1': (4, 5), #[2]
'Elisabeth 06/15/22 Shot #2 - #1': (6, 7), #[3]
'comparison': {
'Elisabeth Shots 06/13/22 - 06/10/22': (1, 2), #[0]
'Elisabeth Shots 06/15/22 - 06/10/22': (1, 3), #[1]
'Elisabeth Shots 06/15/22 - 06/13/22': (2, 3), #[2]
}
}
data = {}
curr_figure = 0
plt.figure(curr_figure)
plt.subplot(2, 1, 1)
# plt.title('Shotweight over time')
# plt.xlabel('Time (s)')
plt.ylabel('Weight (g)')
plt.grid(visible=True, which='both', axis='both', linewidth=0.5)
plt.subplot(2, 1, 2)
# plt.title('Flow-rate over time')
plt.xlabel('Time (s)')
plt.ylabel('Flow-rate (g/s)')
plt.grid(visible=True, which='both', axis='both', linewidth=0.5)
plt.subplot(2, 1, 1)
for filename in filenames:
data[filename] = {
'shot_name': '',
'rows': [],
'time': [],
'weight': []
}
with open(filename, newline='') as file:
reader = csv.DictReader(file, delimiter=',')
for row in reader:
data[filename]['rows'].append(row)
if row['information_type'] == 'meta':
if row['metatype'] == 'Name':
data[filename]['shot_name'] = row['metadata']
elif row['information_type'] == 'moment':
try:
elapsed = float(row['elapsed'])
weight = float(row['current_total_shot_weight'])
data[filename]['time'].append(elapsed)
data[filename]['weight'].append(weight)
except ValueError:
continue
#print("Not a float!")
time = data[filename]['time']
weight = data[filename]['weight']
first_zero = list(x > 0 for x in weight).index(True) - 1
zero_time = time[first_zero]
weight = weight[first_zero:]
time = time[first_zero:]
time = list(map(lambda t: t - zero_time, time))
data[filename]['time'] = time
data[filename]['weight'] = weight
weight_savgol = savgol_filter(weight, 30, 3)
plt.plot(time, weight_savgol, label = data[filename]['shot_name'], linewidth=1)
plt.scatter(time, weight, label = '', s=0.25)
plt.subplot(2, 1, 2)
dweight_dt = diff(weight)/diff(time)
dweight_dt_savgol = savgol_filter(dweight_dt, 60, 3)
plt.plot(time[:-1], dweight_dt_savgol, label = data[filename]['shot_name'], linewidth=1)
plt.scatter(time[1:-1], dweight_dt[1:], label = '', s=0.25)
plt.subplot(2, 1, 1)
#print(filename, "\n", time, "\n", weight)
plt.legend(loc='best')
def comparison_plot(curr_figure, comparison_dict):
curr_figure += 1
plt.figure(curr_figure)
for key in comparison_dict:
if key != 'comparison':
item = comparison_dict[key]
i0 = item[0]
i1 = item[1]
fn0 = filenames[i0]
fn1 = filenames[i1]
plt.xlabel('Time (s)')
plt.ylabel('Weight difference (g)')
plt.grid(visible=True, which='both', axis='both', linewidth=0.5)
t0 = np.array(data[fn0]['time'])
w0 = np.array(data[fn0]['weight'])
t1 = np.array(data[fn1]['time'])
w1 = np.array(data[fn1]['weight'])
time_linspace = np.linspace(max(np.array(t0).min(), np.array(t1).min()), min(np.array(t0).max(), np.array(t1).max()), max(len(t0), len(t1)))
i0 = make_interp_spline(t0, w0, k=3)
wi0 = i0(time_linspace)
i1 = make_interp_spline(t1, w1, k=3)
wi1 = i1(time_linspace)
dw = wi1 - wi0
dw_savgol = savgol_filter(dw, 30, 3)
plt.plot(time_linspace, dw_savgol, label = key, linewidth=1)
plt.scatter(time_linspace, dw, label = '', s=0.25)
plt.legend(loc='best')
else:
curr_figure = comparison_plot(curr_figure, comparison_dict['comparison'])
return curr_figure
curr_figure = comparison_plot(curr_figure, comparison)
plt.show()