Compare commits

..

No commits in common. "b56bb302811c9553321fce7a35e7fd68826590fc" and "fb12f978db04dad2b7cd2a09ef74afd89b241e77" have entirely different histories.

2 changed files with 1 additions and 203 deletions

View file

@ -9,7 +9,7 @@ import re
def layout(fig):
plt.title("Flightpath with unified starting point")
plt.title("STRATO3 Altitude Plot")
plt.locator_params(axis='x', nbins=10)
fig.legend()
plt.grid()

View file

@ -1,202 +0,0 @@
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
import scipy.optimize as opt
from numpy import random as rd
import scipy.optimize as opt
import datetime
import argparse
import math
def layout(fig):
plt.title("Mean Speed")
plt.locator_params(axis='x', nbins=10)
fig.legend()
plt.grid()
#Reads Time and Altitude columns from log files from Strato3 (.LOG) and Strato4 (.csv) files. Returns List of numpy arrays for time and List of lists of numpy arrays for altitude and speed
def read_data_strato(files):
t = []
data = []
for i in range(len(files)):
if files[i][-3:] == 'csv':
t.append(np.loadtxt(files[i], usecols=(0),unpack=True,skiprows=7,dtype='str',delimiter=';'))
data.append([])
data[i].append(np.loadtxt(files[i], usecols=(7),unpack=True,skiprows=7,dtype='str',delimiter=';'))
data[i].append(np.loadtxt(files[i], usecols=(14),unpack=True,skiprows=7,dtype='str',delimiter=';'))
elif files[i][-3:] == 'LOG':
t.append(np.loadtxt(files[i], usecols=(1),unpack=True,skiprows=7,dtype='str',delimiter=';'))
data.append([])
data[i].append(np.loadtxt(files[i], usecols=(11),unpack=True,skiprows=7,dtype='str',delimiter=';'))
data[i].append(np.loadtxt(files[i], usecols=(15),unpack=True,skiprows=7,dtype='str',delimiter=';'))
return t, data
def clear_data(t, data):
#Data preparation: cut-off everything before long time differences (before initialization of STRATO3/4) and remove lines with Invalid entries
for i in range(len(t)):
for j in range(len(t[i])):
try:
t[i][j] = time_to_seconds(t[i][j])
except:
t[i][j] = float(t[i][j])
for string in data[i][0]:
if string == "Inval.":
t[i] = t[i][1:]
for j in range(len(data[i])):
data[i][j] = data[i][j][1:]
for j in range(len(data[i])):
k = 0
while k < len(data[i][j]):
if data[i][j][k] == "Err" or data[i][j][k] == 'NA':
for m in range(len(data[i])):
data[i][m] = np.delete(data[i][m], k)
t[i] = np.delete(t[i], k)
else:
k+=1
for j in range(len(data[i])):
data[i][j] = data[i][j].astype(float)
t[i] = t[i].astype(float)
return t, data
def time_to_seconds(time_str):
hh, mm, ss = map(int, time_str.split(':'))
return hh * 3600 + mm * 60 + ss
#Legacy plot function (currently not in use in this script)
def plot_data(t, data, altitude, speed, temperature, ax):
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
cmap = plt.get_cmap("viridis")
if altitude:
for i in range(len(t)):
ax.plot(t[i][::50],data[i][0][::50], '--', color=cmap(i/len(t)),label="Altitude "+str(i))
ax.set_xlabel("Time/s")
ax.set_ylabel("Altitude/m", color='r')
ax.tick_params(axis='y', labelcolor='r')
ax2 = ax.twinx()
if speed:
for i in range(len(t)):
ax2.plot(t[i],data[i][1], color=cmap(i/len(t)),label="Speed "+str(i))
ax2.set_ylabel("Speed/km/h", color='b')
ax2.tick_params(axis='y', labelcolor='b')
elif temperature:
for i in range(len(t)):
ax2.plot(t[i],data[i][2], color=cmap(i/len(t)),label="Temperature "+str(i))
ax2.set_ylabel("Temperature/(°C)", color='b')
ax2.tick_params(axis='y', labelcolor='b')
def f(x,a,b):
return a*x+b
#function to correct time to set release time to 0s
def onset_correction(t, data, thresh):
for i in range(len(t)):
start=0
start_found = False
while not start_found and start<len(data[i][0]):
if data[i][0][start] > thresh:
start_found = True
else:
start+=1
end = np.argmax(data[i][0])
end = min(start+500,end)
popt,pcov=opt.curve_fit(f,t[i][start:end],data[i][0][start:end])
a,b=popt
t0 = -b/a
t[i] = t[i].astype(float)
for j in range(len(t[i])):
t[i][j]-=t0
def find_max_altitude(data):
max_val = 0
for altitude_set in [data_set[0] for data_set in data]:
if max(altitude_set) > max_val:
max_val = max(altitude_set)
return max_val
def find_min_altitude(data):
min_val = 0
for altitude_set in [data_set[0] for data_set in data]:
if min(altitude_set) < min_val:
min_val = min(altitude_set)
return min_val
#computes mean speeds for each histogram bin and finds respective maximum and minimum speeds
def mean_speed_alt(data, bin_width):
begin = find_min_altitude(data)
end = find_max_altitude(data)
bin_val = np.zeros((len(data), math.ceil((end-begin)/bin_width)))
max_arr = np.zeros(math.ceil((end-begin)/bin_width))
min_arr = np.zeros(math.ceil((end-begin)/bin_width))
max_arr = np.full(math.ceil((end-begin)/bin_width), -np.inf)
min_arr = np.full(math.ceil((end-begin)/bin_width), np.inf)
alti_arr = np.zeros(math.ceil((end-begin)/bin_width))
for i in range(len(alti_arr)):
alti_arr[i] = i*bin_width
for i in range(len(data)):
begin_loc = min(data[i][0])
bin_sum = np.zeros(math.ceil((end-begin)/bin_width))
count_arr = np.zeros(math.ceil((end-begin)/bin_width), dtype=int)
for j in range(len(data[i][0])):
bin_sum[int((data[i][0][j]-begin_loc)//bin_width)] += data[i][1][j]
if data[i][1][j]>max_arr[int((data[i][0][j]-begin_loc)//bin_width)]:
max_arr[int((data[i][0][j]-begin_loc)//bin_width)] = data[i][1][j]
if data[i][1][j]<min_arr[int((data[i][0][j]-begin_loc)//bin_width)]:
min_arr[int((data[i][0][j]-begin_loc)//bin_width)] = data[i][1][j]
count_arr[int((data[i][0][j]-begin_loc)//bin_width)] += 1
for j in range(len(bin_val[i])):
if count_arr[j] != 0:
bin_val[i][j] = bin_sum[j]/count_arr[j]
nonzeros = np.count_nonzero(bin_val, axis=0)
mean_arr = np.zeros(math.ceil((end-begin)/bin_width))
sum_arr = np.sum(bin_val, axis=0)
for i in range(len(mean_arr)):
if not nonzeros[i]<0.5:
mean_arr[i] = sum_arr[i]/nonzeros[i]
return alti_arr, mean_arr, max_arr, min_arr
def main():
parser = argparse.ArgumentParser(description="Plot Data from STRATO4-Datalogger")
parser.add_argument("files", nargs="+", help="Dateipfade, die eingelesen werden sollen")
args = parser.parse_args()
t, altitude = read_data_strato(args.files)
#Data_preparation for altitude plot
t, data = clear_data(t, altitude)
onset_correction(t, data, 300)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_ylabel("Speed/km/h", fontsize=16)
ax.set_xlabel("Altitude/m", fontsize=16)
cmap = cm.get_cmap("viridis")
alti_arr, mean_arr, max_arr, min_arr = mean_speed_alt(data, 200)
plt.plot(alti_arr, mean_arr, label="mean", color=cmap(0.5))
plt.plot(alti_arr, max_arr, color=cmap(0.5), linestyle='--')
plt.plot(alti_arr, min_arr, color=cmap(0.5), linestyle='--')
plt.fill_between(alti_arr, max_arr, min_arr, color=cmap(0.5), alpha=0.5)
layout(fig)
plt.show()
plt.close
main()