plot_flight_borders: add flags for flexibility. tm_wheel_parser.py: plot data distribution
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
*.csv
|
*.csv
|
||||||
|
*.xml
|
||||||
*.png
|
*.png
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
|
@@ -28,6 +28,8 @@ This project contains tools for decoding, converting, and visualizing telemetry
|
|||||||
-> `/plots/` — folder where output plots are saved.
|
-> `/plots/` — folder where output plots are saved.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
- git
|
||||||
|
|
||||||
- Python version 3.10 or upper. For checking type:
|
- Python version 3.10 or upper. For checking type:
|
||||||
```bash
|
```bash
|
||||||
python3 --version
|
python3 --version
|
||||||
|
14
bin/asotr.py
14
bin/asotr.py
@@ -445,7 +445,7 @@ def cut_norm_data(data, time_begin, duration_sec, channel='ch1',
|
|||||||
|
|
||||||
orig_data = pd.DataFrame({ 'timestamp': time_l, 'temp': temp_l })
|
orig_data = pd.DataFrame({ 'timestamp': time_l, 'temp': temp_l })
|
||||||
interp_data = orig_data.set_index('timestamp')
|
interp_data = orig_data.set_index('timestamp')
|
||||||
interp_data = interp_data.resample('S').mean().interpolate(method=interp["method"],
|
interp_data = interp_data.resample('s').mean().interpolate(method=interp["method"],
|
||||||
order=interp["order"])
|
order=interp["order"])
|
||||||
interp_data = interp_data.reset_index(names=['timestamp'])
|
interp_data = interp_data.reset_index(names=['timestamp'])
|
||||||
|
|
||||||
@@ -498,7 +498,7 @@ def plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
|
|||||||
data_info['data'], thermocycle_info, channel=data_info['channel'],
|
data_info['data'], thermocycle_info, channel=data_info['channel'],
|
||||||
interp=interp, accuracy=data_info['find_accuracy'])
|
interp=interp, accuracy=data_info['find_accuracy'])
|
||||||
|
|
||||||
fig = plt.figure(figsize=(9, 6), dpi=200)
|
fig = plt.figure(figsize=(8, 7), dpi=200)
|
||||||
fig.suptitle(title, fontsize=plot_info['font'])
|
fig.suptitle(title, fontsize=plot_info['font'])
|
||||||
ax1 = fig.add_subplot(2,1,1)
|
ax1 = fig.add_subplot(2,1,1)
|
||||||
ax2 = fig.add_subplot(2,1,2)
|
ax2 = fig.add_subplot(2,1,2)
|
||||||
@@ -510,6 +510,10 @@ def plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
|
|||||||
|
|
||||||
idx = find_best_time_idx(step_interp_cycle.timestamp, step_begin,
|
idx = find_best_time_idx(step_interp_cycle.timestamp, step_begin,
|
||||||
accuracy=data_info['find_accuracy'])
|
accuracy=data_info['find_accuracy'])
|
||||||
|
if idx == -1:
|
||||||
|
print(f'index corresponding to time {step_begin} in times array not found!')
|
||||||
|
return
|
||||||
|
|
||||||
ax1.axvline(x = step_interp_cycle.timestamp[idx], color='r', linestyle='-.',
|
ax1.axvline(x = step_interp_cycle.timestamp[idx], color='r', linestyle='-.',
|
||||||
label= thermocycle_info['type_ru'] + ' воздействие, начало')
|
label= thermocycle_info['type_ru'] + ' воздействие, начало')
|
||||||
|
|
||||||
@@ -531,8 +535,8 @@ def plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
|
|||||||
fancybox=True, framealpha=0.4)
|
fancybox=True, framealpha=0.4)
|
||||||
ax2.grid(True)
|
ax2.grid(True)
|
||||||
ax2.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
ax2.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
||||||
ax2.set_xlabel('Время, ЧЧ:MM:CC', fontsize=plot_info['font'])
|
ax2.set_xlabel('Время, ЧЧ:MM', fontsize=plot_info['font'])
|
||||||
ax2.set_ylabel(r'$T_{norm}$, $^\circ$C', fontsize=plot_info['font'])
|
ax2.set_ylabel(r'$T_{норм}$, $^\circ$C', fontsize=plot_info['font'])
|
||||||
|
|
||||||
fig.suptitle(title, fontsize=plot_info['font'])
|
fig.suptitle(title, fontsize=plot_info['font'])
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
@@ -555,7 +559,7 @@ def plot_imp_response(data, data_info, plot_info, thermocycle_info):
|
|||||||
ax1.grid(True)
|
ax1.grid(True)
|
||||||
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
||||||
ax1.set_xlabel('время', fontsize=plot_info['font'])
|
ax1.set_xlabel('время', fontsize=plot_info['font'])
|
||||||
ax1.set_ylabel(r'$t_{norm}$, $^\circ$C', fontsize=plot_info['font'])
|
ax1.set_ylabel(r'$t_{норм}$, $^\circ$C', fontsize=plot_info['font'])
|
||||||
|
|
||||||
fig.suptitle(title, fontsize=plot_info['font'])
|
fig.suptitle(title, fontsize=plot_info['font'])
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
|
207
bin/asotr_kdi.py
Normal file
207
bin/asotr_kdi.py
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
import sys
|
||||||
|
from importlib import reload
|
||||||
|
sys.path.append('./')
|
||||||
|
import asotr
|
||||||
|
reload(asotr)
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from matplotlib import dates
|
||||||
|
import pandas as pd
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
|
def cmd_parse(asotr_data):
|
||||||
|
decode_list = []
|
||||||
|
|
||||||
|
for elem in asotr_data.itertuples():
|
||||||
|
elem_msg = asotr.cmd_decode(elem.cmd.strip())
|
||||||
|
if elem_msg != '':
|
||||||
|
str_ = f'{elem.timestamp};{elem_msg}'
|
||||||
|
decode_list.append(str_)
|
||||||
|
|
||||||
|
return decode_list
|
||||||
|
|
||||||
|
def pow_temp_parse(elem, tstamp_format='%d.%m.%Y %H:%M:%S.%f'):
|
||||||
|
timestamp = pd.to_datetime(elem.timestamp, format=tstamp_format)
|
||||||
|
if "*1" not in elem.data:
|
||||||
|
return ('none', [])
|
||||||
|
l = []
|
||||||
|
|
||||||
|
data = elem.data[2:]
|
||||||
|
l = []
|
||||||
|
l.append(asotr.get_utc_seconds(elem.timestamp, tstamp_format))
|
||||||
|
l.append(timestamp)
|
||||||
|
|
||||||
|
if "status 3" in elem.cmd:
|
||||||
|
l.extend(list(map(float, data.split())))
|
||||||
|
return ('t', l)
|
||||||
|
elif "status 4" in elem.cmd:
|
||||||
|
l.extend(list(map(int, data.split())))
|
||||||
|
return ('p', l)
|
||||||
|
else:
|
||||||
|
return ('none', [])
|
||||||
|
|
||||||
|
def get_cmd_data(fname, tstamp_format='%d.%m.%Y %H:%M:%S.%f'):
|
||||||
|
t = []
|
||||||
|
p = []
|
||||||
|
asotr_data = pd.read_csv(fname, delimiter=';', names=['timestamp', 'cmd', 'data'])
|
||||||
|
|
||||||
|
cmd_list = cmd_parse(asotr_data)
|
||||||
|
|
||||||
|
for elem in asotr_data.itertuples():
|
||||||
|
data = pow_temp_parse(elem, tstamp_format)
|
||||||
|
if data[0] == 't':
|
||||||
|
t.append(data[1])
|
||||||
|
elif data[0] == 'p':
|
||||||
|
p.append(data[1])
|
||||||
|
temp = pd.DataFrame(t,
|
||||||
|
columns=['timestamp_sec', 'timestamp', 'ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6'])
|
||||||
|
power = pd.DataFrame(p,
|
||||||
|
columns=['timestamp_sec', 'timestamp', 'ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6'])
|
||||||
|
return (cmd_list, temp, power)
|
||||||
|
|
||||||
|
|
||||||
|
def decode_collect_data(uart_server_log_path, asotr_kit):
|
||||||
|
files = os.listdir(uart_server_log_path)
|
||||||
|
files1 = [file for file in files if 'cmd_data' in file]
|
||||||
|
files1 = sorted(files1)
|
||||||
|
|
||||||
|
cmd_list_itog = []
|
||||||
|
temp_itog = []
|
||||||
|
pow_itog = []
|
||||||
|
|
||||||
|
cmd_list, temp, power = get_cmd_data(uart_server_log_path + files1[0])
|
||||||
|
cmd_list_itog.extend(cmd_list)
|
||||||
|
temp_itog = temp
|
||||||
|
pow_itog = power
|
||||||
|
print(files1[0])
|
||||||
|
|
||||||
|
for i, file in enumerate(files1):
|
||||||
|
if i > 0:
|
||||||
|
print(file)
|
||||||
|
cmd_list, temp, power = get_cmd_data(uart_server_log_path + file)
|
||||||
|
cmd_list_itog.extend(cmd_list)
|
||||||
|
temp_itog = pd.concat([temp_itog, temp], ignore_index=True)
|
||||||
|
pow_itog = pd.concat([pow_itog, power], ignore_index=True)
|
||||||
|
|
||||||
|
temp_itog = temp_itog.sort_values(by='timestamp_sec')
|
||||||
|
pow_itog = pow_itog.sort_values(by='timestamp_sec')
|
||||||
|
|
||||||
|
temp_itog['timestamp'] = temp_itog['timestamp'].dt.strftime('%d.%m.%Y %H:%M:%S.%f')
|
||||||
|
pow_itog['timestamp'] = pow_itog['timestamp'].dt.strftime('%d.%m.%Y %H:%M:%S.%f')
|
||||||
|
|
||||||
|
temp_itog.to_csv(f'./data/asotr0{asotr_kit}_data_T.csv', index=False, sep=';',
|
||||||
|
encoding='utf-8-sig', decimal='.')
|
||||||
|
pow_itog.to_csv(f'./data/asotr0{asotr_kit}_data_P.csv', index=False, sep=';',
|
||||||
|
encoding='utf-8-sig', decimal='.')
|
||||||
|
|
||||||
|
with open('./data/cmd_human.csv', 'w') as file:
|
||||||
|
for elem in cmd_list_itog:
|
||||||
|
file.write(f'{elem}\n')
|
||||||
|
|
||||||
|
|
||||||
|
def load_ps_cmd_decode(fname):
|
||||||
|
with open(fname, 'r') as file:
|
||||||
|
ps_cmd_decode = json.load(file)
|
||||||
|
return ps_cmd_decode
|
||||||
|
|
||||||
|
def get_ps_cmd_data(fname, ps_model):
|
||||||
|
decode = load_ps_cmd_decode('./decode_ps_cmd.json')
|
||||||
|
ps_data = pd.read_csv(fname, sep=';', names=['timestamp', 'cmd', 'cmd_answer'])
|
||||||
|
out = {'cmd_write': [], 'cmd_read': [], 'cmd_read_desc': []}
|
||||||
|
|
||||||
|
if ps_model == 'PSH-3630A':
|
||||||
|
for elem in decode:
|
||||||
|
if elem['ps_model'] == ps_model:
|
||||||
|
decode_cmd_write = elem['cmd_write']
|
||||||
|
decode_cmd_read = elem['cmd_read']
|
||||||
|
decode_cmd_read_desc = elem['cmd_read_desc']
|
||||||
|
break
|
||||||
|
|
||||||
|
cmd_write = []
|
||||||
|
cmd_read_desc = []
|
||||||
|
cmd_read = []
|
||||||
|
for row in ps_data.itertuples():
|
||||||
|
# check if current row is cmd_write:
|
||||||
|
cmd_str = row.cmd.split(' ')
|
||||||
|
|
||||||
|
timestamp_sec = asotr.get_utc_seconds(row.timestamp, '%d.%m.%Y %H:%M:%S.%f')
|
||||||
|
if (len(cmd_str) > 1):
|
||||||
|
elem = [timestamp_sec, row.timestamp,
|
||||||
|
decode_cmd_write[cmd_str[0]], cmd_str[1]]
|
||||||
|
cmd_write.append(elem)
|
||||||
|
elif (len(cmd_str) == 1):
|
||||||
|
elem = [timestamp_sec, row.timestamp,
|
||||||
|
decode_cmd_read[cmd_str[0]], row.cmd_answer.strip()]
|
||||||
|
cmd_read.append(elem)
|
||||||
|
elem = [timestamp_sec, row.timestamp,
|
||||||
|
decode_cmd_read_desc[cmd_str[0]], row.cmd_answer.strip()]
|
||||||
|
cmd_read_desc.append(elem)
|
||||||
|
|
||||||
|
out['cmd_write'] = cmd_write
|
||||||
|
out['cmd_read'] = cmd_read
|
||||||
|
out['cmd_read_desc'] = cmd_read_desc
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
def convert_data_date_format(directory, fname_pattern, column_names,
|
||||||
|
old_date_fmt = "%Y.%m.%d %H:%M:%S.%f",
|
||||||
|
new_date_fmt = '%d.%m.%Y %H:%M:%S.%f'):
|
||||||
|
|
||||||
|
files = os.listdir(directory)
|
||||||
|
dateparse = lambda x: datetime.strptime(x, old_date_fmt)
|
||||||
|
|
||||||
|
for file in files:
|
||||||
|
fname = directory + file
|
||||||
|
if 'cmd_data' in fname:
|
||||||
|
print(fname)
|
||||||
|
df = pd.read_csv(fname, sep=';', decimal='.',
|
||||||
|
names=column_names,
|
||||||
|
parse_dates=['timestamp'], date_parser=dateparse)
|
||||||
|
|
||||||
|
df['timestamp'] = df['timestamp'].dt.strftime(new_date_fmt)
|
||||||
|
|
||||||
|
df.to_csv(fname, header=False, index=False, sep=';',
|
||||||
|
decimal='.', encoding='utf-8-sig')
|
||||||
|
|
||||||
|
|
||||||
|
def plot_data(fname, title, ox_dtime_format, events={}, hlines={}, ch='ch1'):
|
||||||
|
cmd_list, temp, power = get_cmd_data(fname)
|
||||||
|
|
||||||
|
fig = plt.figure(figsize=(10, 8), dpi=150)
|
||||||
|
ax1 = fig.add_subplot(2,1,1)
|
||||||
|
ax2 = fig.add_subplot(2,1,2, sharex=ax1)
|
||||||
|
|
||||||
|
ax1.plot(temp.timestamp, temp[ch])
|
||||||
|
|
||||||
|
if len(hlines) > 0:
|
||||||
|
for label, value in hlines.items():
|
||||||
|
ax1.axhline(y = value, color='b', linestyle='--')
|
||||||
|
ax1.text(temp.timestamp[len(temp.timestamp) - 1], value, label, va='bottom')
|
||||||
|
|
||||||
|
if len(events) > 0:
|
||||||
|
for time, event in events.items():
|
||||||
|
idx = asotr.find_best_time_idx(temp.timestamp, time, accuracy='seconds')
|
||||||
|
ax1.axvline(x = temp.timestamp[idx], color='r', linestyle='-.')
|
||||||
|
ax1.text(temp.timestamp[idx], max(temp[ch]) + 1, event, rotation=45, va='bottom')
|
||||||
|
|
||||||
|
ax2.plot(power.timestamp, power[ch])
|
||||||
|
|
||||||
|
date_formatter = dates.DateFormatter(ox_dtime_format)
|
||||||
|
|
||||||
|
ax1.xaxis.set_major_formatter(date_formatter)
|
||||||
|
ax1.set_xlabel('время')
|
||||||
|
ax1.set_ylabel('Температура, $^\circ$C')
|
||||||
|
ax1.grid(True)
|
||||||
|
|
||||||
|
ax2.xaxis.set_major_formatter(date_formatter)
|
||||||
|
ax2.set_ylabel('Мощность, %')
|
||||||
|
ax2.grid(True)
|
||||||
|
|
||||||
|
fig.suptitle(title)
|
||||||
|
plt.legend()
|
||||||
|
plt.tight_layout()
|
||||||
|
fig.savefig('plot_experim_data.png')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
32
bin/kdi_noize.py
Normal file
32
bin/kdi_noize.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import sys
|
||||||
|
from importlib import reload
|
||||||
|
sys.path.append('./')
|
||||||
|
import asotr_kdi
|
||||||
|
import asotr
|
||||||
|
reload(asotr_kdi)
|
||||||
|
reload(asotr)
|
||||||
|
|
||||||
|
fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250314_asotr.log'
|
||||||
|
|
||||||
|
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250324_asotr_step_var_cond.log'
|
||||||
|
|
||||||
|
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250325_asotrPD_thermostat.log'
|
||||||
|
|
||||||
|
# fname_save = '../data/experiments/noize_20250325_12.csv'
|
||||||
|
# begin_time = '25.03.2025 11:55:00'
|
||||||
|
# end_time = '25.03.2025 12:10:00'
|
||||||
|
|
||||||
|
fname_save = '../data/experiments/noize_20250314_14.csv'
|
||||||
|
begin_time = '14.03.2025 14:20:00'
|
||||||
|
end_time = '14.03.2025 14:35:00'
|
||||||
|
|
||||||
|
cmd_list, temp, power = asotr_kdi.get_cmd_data(fname)
|
||||||
|
|
||||||
|
begin = asotr.find_best_time_idx(temp.timestamp, begin_time, accuracy='seconds')
|
||||||
|
end = asotr.find_best_time_idx(temp.timestamp, end_time, accuracy='seconds')
|
||||||
|
|
||||||
|
temp1 = temp[begin:end]
|
||||||
|
|
||||||
|
print(temp1)
|
||||||
|
temp1.to_csv(fname_save, date_format='%d.%m.%Y %H:%M:%S.%f', index=False, sep=';', columns=['timestamp', 'ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6'])
|
||||||
|
|
180
bin/plot_asotr_flight_all_for_Mikhail.py
Normal file
180
bin/plot_asotr_flight_all_for_Mikhail.py
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from matplotlib import dates
|
||||||
|
import pandas as pd
|
||||||
|
from datetime import datetime
|
||||||
|
import sys
|
||||||
|
|
||||||
|
font = 14
|
||||||
|
print_width = 15
|
||||||
|
print_height = 8
|
||||||
|
plot_windows = 2
|
||||||
|
channels = [1, 0, 0, 0, 0, 0]
|
||||||
|
asotr_kit = '01'
|
||||||
|
|
||||||
|
xborders=False
|
||||||
|
begin=0;
|
||||||
|
end=0;
|
||||||
|
|
||||||
|
path = '../data/asotr/'
|
||||||
|
fname_B = f'{path}beta_2025.xlsx'
|
||||||
|
|
||||||
|
fname = 'asotr' + asotr_kit + '_data_T.csv'
|
||||||
|
fname_pow = 'asotr' + asotr_kit + '_data_P.csv'
|
||||||
|
|
||||||
|
pict_name = '../plots/' + 'ASOTR' + asotr_kit + '_flight_T_P_all'
|
||||||
|
ox_dtime_format = '%Y.%m.%d'
|
||||||
|
|
||||||
|
legend=['БРД1', 'БРД2', 'БРД3', 'БРД4', 'плита МУП МВН, датчик1', 'плита МУП МВН, датчик 2']
|
||||||
|
width=[1, 2, 1, 1, 1, 1]
|
||||||
|
|
||||||
|
marker = ['-', '--', '-', '-', '-.', '-'];
|
||||||
|
width_arr = [1, 0.5, 0.2, 0.1, 1, 1]
|
||||||
|
|
||||||
|
data_b = pd.read_excel(fname_B,
|
||||||
|
sheet_name=0,
|
||||||
|
usecols=[0,1,2],
|
||||||
|
header=4,
|
||||||
|
names=['turn_num', 'beta_angle', 'timestamp'],
|
||||||
|
parse_dates=['timestamp'],
|
||||||
|
date_format='%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
|
||||||
|
fname = [path + fname, path + fname_pow]
|
||||||
|
data = [pd.read_csv(fname[0], sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f"),
|
||||||
|
pd.read_csv(fname[1], sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f")]
|
||||||
|
|
||||||
|
ch= [[], [], [], [], [], []]
|
||||||
|
ch_signs = ["temp", "pow"]
|
||||||
|
data_dict = {"temp": ch, "pow": ch, "time": []}
|
||||||
|
data_dict["time"] = data[0]['timestamp']
|
||||||
|
col=['ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6', 'ch7']
|
||||||
|
|
||||||
|
for j in range(2):
|
||||||
|
for index, row, in data[j].iterrows():
|
||||||
|
for i in range(6):
|
||||||
|
ch[i].append(float(row[col[i]]))
|
||||||
|
data_dict[ch_signs[j]] = ch
|
||||||
|
ch= [[], [], [], [], [], []]
|
||||||
|
|
||||||
|
len_data = [len(data_dict['temp'][0]), len(data_dict['pow'][0])]
|
||||||
|
len_ = min(len_data)
|
||||||
|
|
||||||
|
if xborders == False:
|
||||||
|
begin = 0
|
||||||
|
end = len_ - 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if plot_windows == 1:
|
||||||
|
fig, ax = plt.subplots(figsize=(print_width, print_height), dpi=300)
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for elem in data_dict['temp']:
|
||||||
|
if channels[i] == 1:
|
||||||
|
ax.plot(data_dict['time'][begin:end], elem[begin:end], marker[i], linewidth=width[i], label=legend[i])
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
ax.tick_params(axis="both", width=1, labelsize=font)
|
||||||
|
ax.grid(visible=True, linestyle = 'dotted')
|
||||||
|
ax.set_ylabel(r"Температура, $^\circ$C", fontsize=font)
|
||||||
|
ax.set_xlabel('Время', fontsize=font)
|
||||||
|
ax.legend(fontsize=font)
|
||||||
|
|
||||||
|
date_formatter = dates.DateFormatter(ox_dtime_format)
|
||||||
|
ax.xaxis.set_major_formatter(date_formatter)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
fig.savefig(pict_name)
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
elif plot_windows == 2:
|
||||||
|
|
||||||
|
fig = plt.figure(figsize=(print_width, print_height), dpi=600)
|
||||||
|
ax1 = fig.add_subplot(1, 1, 1)
|
||||||
|
# ax2 = fig.add_subplot(2, 1, 2, sharex=ax1)
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for elem in data_dict['temp']:
|
||||||
|
if channels[i] == 1:
|
||||||
|
ax1.plot(data_dict['time'][begin:end], elem[begin:end], marker[i], linewidth=width[i], label=legend[i])
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
ax3 = ax1.twinx()
|
||||||
|
ax3.plot(data_b['timestamp'][0:3400], data_b['beta_angle'][0:3400], marker[1], color='r', linewidth=width[1], label='угол Бета')
|
||||||
|
ax3.set_ylabel('Угол Бета', fontsize=font)
|
||||||
|
ax3.tick_params(axis="y", width=1, labelsize=font)
|
||||||
|
ax3.legend(fontsize=font, loc='upper right')
|
||||||
|
|
||||||
|
# i = 0
|
||||||
|
# for elem in data_dict['pow']:
|
||||||
|
# if channels[i] == 1:
|
||||||
|
# ax2.plot(data_dict['time'][begin:end], elem[begin:end], marker[i], linewidth=width[i], label=legend[i])
|
||||||
|
# i += 1
|
||||||
|
|
||||||
|
ax1.tick_params(axis="both", width=1, labelsize=font)
|
||||||
|
ax1.grid(visible=True, linestyle = 'dotted')
|
||||||
|
ax1.set_ylabel(r"Температура, $^\circ$C", fontsize=font)
|
||||||
|
ax1.set_xlabel('Время', fontsize=font)
|
||||||
|
ax1.legend(fontsize=font, loc='lower right')
|
||||||
|
|
||||||
|
date_formatter = dates.DateFormatter(ox_dtime_format)
|
||||||
|
ax1.xaxis.set_major_formatter(date_formatter)
|
||||||
|
|
||||||
|
# ax2.tick_params(axis="both", width=1, labelsize=font)
|
||||||
|
# ax2.grid(visible=True, linestyle = 'dotted')
|
||||||
|
# ax2.set_ylabel('Мощность, %', fontsize=font)
|
||||||
|
# ax2.set_xlabel('Время', fontsize=font)
|
||||||
|
# ax2.legend(fontsize=font, loc='lower right')
|
||||||
|
|
||||||
|
# date_formatter = dates.DateFormatter(ox_dtime_format)
|
||||||
|
# ax2.xaxis.set_major_formatter(date_formatter)
|
||||||
|
|
||||||
|
plt.title('АСОТР ' + asotr_kit, fontsize=font)
|
||||||
|
plt.tight_layout()
|
||||||
|
fig.savefig(pict_name)
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# asotr_kit2 = '02'
|
||||||
|
# fname2 = 'asotr' + asotr_kit2 + '_data_T.csv'
|
||||||
|
# fname_pow2 = 'asotr' + asotr_kit2 + '_data_P.csv'
|
||||||
|
# legend2=['2 БРД1', '2 БРД2', '2 БРД3', '2 БРД4', '2 плита МУП МВН, датчик1', '2 плита МУП МВН, датчик 2']
|
||||||
|
|
||||||
|
# fname2 = [path + fname2, path + fname_pow2]
|
||||||
|
# data2 = [pd.read_csv(fname2[0], sep=';', parse_dates=['timestamp'], date_parser=dateparse),
|
||||||
|
# pd.read_csv(fname2[1], sep=';', parse_dates=['timestamp'], date_parser=dateparse)]
|
||||||
|
|
||||||
|
# ch= [[], [], [], [], [], []]
|
||||||
|
# ch_signs = ["temp", "pow"]
|
||||||
|
# data_dict2 = {"temp": ch, "pow": ch, "time": []}
|
||||||
|
# data_dict2["time"] = data2[0]['timestamp']
|
||||||
|
# col=['ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6', 'ch7']
|
||||||
|
|
||||||
|
# for j in range(2):
|
||||||
|
# for index, row, in data2[j].iterrows():
|
||||||
|
# for i in range(6):
|
||||||
|
# ch[i].append(float(row[col[i]]))
|
||||||
|
# data_dict2[ch_signs[j]] = ch
|
||||||
|
# ch= [[], [], [], [], [], []]
|
||||||
|
|
||||||
|
# len_data2 = [len(data_dict2['temp'][0]), len(data_dict2['pow'][0])]
|
||||||
|
# len_2 = min(len_data2)
|
||||||
|
|
||||||
|
# if xborders == False:
|
||||||
|
# begin2 = 0
|
||||||
|
# end2 = len_2 - 1
|
||||||
|
|
||||||
|
|
||||||
|
# i = 0
|
||||||
|
# for elem in data_dict2['temp']:
|
||||||
|
# if channels[i] == 1:
|
||||||
|
# print('legend2: ' + legend2[i])
|
||||||
|
# ax1.plot(data_dict2['time'][begin2:end2], elem[begin2:end2], marker[i], linewidth=width[i], label=legend2[i])
|
||||||
|
# i += 1
|
||||||
|
|
||||||
|
# ax2.plot(pd.Series(data_dict2['temp'][0]) - pd.Series(data_dict['temp'][0]))
|
||||||
|
|
||||||
|
|
115
bin/plot_data.py
Normal file
115
bin/plot_data.py
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
import sys
|
||||||
|
from importlib import reload
|
||||||
|
sys.path.append('./')
|
||||||
|
import asotr_kdi
|
||||||
|
reload(asotr_kdi)
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import pandas as pd
|
||||||
|
import re
|
||||||
|
|
||||||
|
ox_dtime_format = "%H:%M:%S"
|
||||||
|
ch = 'ch4'
|
||||||
|
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log/cmd_data_20250311.log'
|
||||||
|
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log/cmd_data_20250311.log'
|
||||||
|
|
||||||
|
# events = []
|
||||||
|
# hlines = []
|
||||||
|
# date = '17.03.2025'
|
||||||
|
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250317_asotrD_thermostat.log'
|
||||||
|
# title = f'Эксперименты по настройке ПД-регулятора на канале {ch[2]} АСОТР КДИ СПИН-X ({date})'
|
||||||
|
|
||||||
|
# hlines = {
|
||||||
|
# 'Туст. = 27': 27,
|
||||||
|
# 'Туст. = 29': 29,
|
||||||
|
# 'Туст. = 31': 31,
|
||||||
|
# }
|
||||||
|
|
||||||
|
# events = {
|
||||||
|
# '17.03.2025 12:50:14': 'Kp=0, Kd=2000, Ki=0, Туст.=29',
|
||||||
|
# '17.03.2025 13:20:18': 'запрет работы ПИД',
|
||||||
|
# '17.03.2025 14:15:14': 'Kp=0, Kd=2000, Ki=0, Туст.=31',
|
||||||
|
# '17.03.2025 14:45:18': 'запрет работы ПИД',
|
||||||
|
# '17.03.2025 15:41:14': 'Kp=50, Kd=2000, Ki=0, Туст.=31',
|
||||||
|
# '17.03.2025 16:11:17': 'запрет работы ПИД',
|
||||||
|
# '17.03.2025 17:05:13': 'Kp=50, Kd=2000, Ki=0, Туст.=27',
|
||||||
|
# '17.03.2025 17:50:17': 'запрет работы ПИД',
|
||||||
|
# '17.03.2025 19:30:10': 'Kp=100, Kd=2000, Ki=0, Туст.=27',
|
||||||
|
# '17.03.2025 20:15:13': 'запрет работы ПИД',
|
||||||
|
# }
|
||||||
|
|
||||||
|
# date = '16.04.2025'
|
||||||
|
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_20250416_asotrPID_thermostat.log'
|
||||||
|
# title = f'Проверка работы ПИД-регулятора (Kp=615, Ki=0.000115, Kd=1300), канал {ch[2]} АСОТР КДИ СПИН-X ({date})'
|
||||||
|
|
||||||
|
# hlines = {
|
||||||
|
# '27': 27,
|
||||||
|
# '27.5': 27.5,
|
||||||
|
# '28': 28,
|
||||||
|
# '29': 29
|
||||||
|
# }
|
||||||
|
|
||||||
|
# events = {
|
||||||
|
# '16.04.2025 15:45:11': 'Туст=27',
|
||||||
|
# '16.04.2025 16:15:15': 'Туст=27.5',
|
||||||
|
# '16.04.2025 16:45:18': 'Туст=28',
|
||||||
|
# '16.04.2025 17:15:22': 'Туст=29',
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
events = []
|
||||||
|
hlines = []
|
||||||
|
|
||||||
|
date = '14.03.2025'
|
||||||
|
title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
|
||||||
|
fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250314_asotr.log'
|
||||||
|
|
||||||
|
|
||||||
|
# date = '20.03.2025'
|
||||||
|
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
|
||||||
|
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250320_asotr_step_var_cond.log'
|
||||||
|
|
||||||
|
# date = '21.03.2025'
|
||||||
|
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
|
||||||
|
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250321_asotr_step_var_cond.log'
|
||||||
|
|
||||||
|
# date = '24.03.2025'
|
||||||
|
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
|
||||||
|
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250324_asotr_step_var_cond.log'
|
||||||
|
|
||||||
|
# date = '01.04.2025'
|
||||||
|
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
|
||||||
|
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250401_asotr_step_var_cond.log'
|
||||||
|
# title = f'эксперимент по подаче ступенчатого воздействия на канал {ch[2]} АСОТР КДИ СПИН-X в различных условиях ({date})'
|
||||||
|
|
||||||
|
# hlines = {
|
||||||
|
# 'Туст. = 27': 27,
|
||||||
|
# 'Туст. = 26': 26
|
||||||
|
# }
|
||||||
|
|
||||||
|
# events = {
|
||||||
|
# '25.03.2025 11:25:00': 'Kp=200, Kd=2000, Ki=0, Туст.=27',
|
||||||
|
# '25.03.2025 12:10:14': 'запрет работы ПИД',
|
||||||
|
# '25.03.2025 12:30:00': 'Kp=200, Kd=2000, Ki=0, Туст.=26',
|
||||||
|
# '25.03.2025 13:15:14': 'запрет работы ПИД',
|
||||||
|
# }
|
||||||
|
|
||||||
|
# date = '25.03.2025'
|
||||||
|
# title = f'Эксперименты по настройке ПД-регулятора на канале {ch[2]} АСОТР КДИ СПИН-X ({date})'
|
||||||
|
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250325_asotrPD_thermostat.log'
|
||||||
|
|
||||||
|
# hlines = {
|
||||||
|
# 'Туст. = 26': 26
|
||||||
|
# }
|
||||||
|
|
||||||
|
# events = {
|
||||||
|
# # '26.03.2025 16:15:11': 'Kp=200, Kd=2000, Ki=0, Туст.=26',
|
||||||
|
# # '26.03.2025 18:45:30': 'запрет работы ПИД',
|
||||||
|
# }
|
||||||
|
|
||||||
|
# date = '26.03.2025'
|
||||||
|
# title = f'Эксперименты по настройке ПД-регулятора на канале {ch[2]} АСОТР КДИ СПИН-X ({date})'
|
||||||
|
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250326_asotrPD_thermostat.log'
|
||||||
|
|
||||||
|
asotr_kdi.plot_data(fname, title, ox_dtime_format, events, hlines, ch)
|
||||||
|
|
||||||
|
|
@@ -8,17 +8,17 @@ import asotr
|
|||||||
reload(asotr)
|
reload(asotr)
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
||||||
def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0, show_flag=True):
|
def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=12, cmd=0,
|
||||||
|
show_flag=False, plot_windows=2, width_=1, time_format='%d.%m.%Y'):
|
||||||
print_width = 20
|
print_width = 20
|
||||||
print_height = 12
|
print_height = 12
|
||||||
width = 1
|
|
||||||
plot_windows = 2
|
|
||||||
|
|
||||||
channels = list(map(int, ch))
|
channels = list(map(int, ch))
|
||||||
pict_name = (f'../plots/reports/ASOTR{asotr_kit}_flight_T_P_{asotr.convert_to_str(channels)}_{begin[0:5].replace(".", "")}_{end[0:5].replace(".", "")}.png')
|
pict_name = (f'../plots/reports/ASOTR{asotr_kit}_flight_T_P_{asotr.convert_to_str(channels)}_{begin[0:5].replace(".", "")}_{end[0:5].replace(".", "")}.png')
|
||||||
|
|
||||||
plot_task = {"temp": 1, "temp_set": 1, "pow": 1}
|
plot_task = {"temp": 1, "temp_set": 1, "pow": 1}
|
||||||
ox_dtime_format = "%d.%m.%Y"
|
# ox_dtime_format = "%d.%m.%Y"
|
||||||
|
ox_dtime_format = time_format
|
||||||
|
|
||||||
legend = [
|
legend = [
|
||||||
"канал 1 (БРД1)",
|
"канал 1 (БРД1)",
|
||||||
@@ -29,10 +29,10 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
|
|||||||
"канал 6 (плита МУП МВН)",
|
"канал 6 (плита МУП МВН)",
|
||||||
]
|
]
|
||||||
legend_set = list(map(lambda x: x + " уставка", legend))
|
legend_set = list(map(lambda x: x + " уставка", legend))
|
||||||
width = [1, 1, 1, 1, 1, 1]
|
width = [width_, width_, width_, width_, width_, width_]
|
||||||
width_set = [3, 3, 3, 3, 3, 3]
|
width_set = [3, 3, 3, 3, 3, 3]
|
||||||
|
|
||||||
marker = ["-", "--", "-.", "-", "-", "--"]
|
marker = ["-", "-", "-.", "-", "-", "--"]
|
||||||
width_arr = [1, 0.5, 0.2, 0.1, 1, 1]
|
width_arr = [1, 0.5, 0.2, 0.1, 1, 1]
|
||||||
|
|
||||||
# get from files and prepare data
|
# get from files and prepare data
|
||||||
@@ -44,7 +44,7 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
|
|||||||
return
|
return
|
||||||
|
|
||||||
if plot_windows == 1:
|
if plot_windows == 1:
|
||||||
fig, ax = plt.subplots(figsize=(print_width, print_height), dpi=200)
|
fig, ax = plt.subplots(figsize=(print_width, print_height), dpi=300)
|
||||||
|
|
||||||
if plot_task["temp"] == 1:
|
if plot_task["temp"] == 1:
|
||||||
for i in range(len(channels)):
|
for i in range(len(channels)):
|
||||||
@@ -72,7 +72,7 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
|
|||||||
|
|
||||||
elif plot_windows == 2:
|
elif plot_windows == 2:
|
||||||
|
|
||||||
fig = plt.figure(figsize=(print_width, print_height), dpi=200)
|
fig = plt.figure(figsize=(print_width, print_height), dpi=300)
|
||||||
ax1 = fig.add_subplot(2, 1, 1)
|
ax1 = fig.add_subplot(2, 1, 1)
|
||||||
ax2 = fig.add_subplot(2, 1, 2, sharex=ax1)
|
ax2 = fig.add_subplot(2, 1, 2, sharex=ax1)
|
||||||
|
|
||||||
@@ -173,10 +173,20 @@ if __name__ == '__main__':
|
|||||||
argparser.add_argument('-f', '--font', required=False,
|
argparser.add_argument('-f', '--font', required=False,
|
||||||
help='type font size (from 1 to 30)')
|
help='type font size (from 1 to 30)')
|
||||||
argparser.add_argument('-d', '--cmd', required=False,
|
argparser.add_argument('-d', '--cmd', required=False,
|
||||||
help='type display commands flag (0/1)')
|
help='type display commands flag (0 or 1)')
|
||||||
argparser.add_argument('-p', '--plot', required=False,
|
argparser.add_argument('-p', '--plot', required=False,
|
||||||
help='display data in plot flag (0/1)')
|
help='display data in plot flag (0 or 1)')
|
||||||
|
argparser.add_argument('-w', '--plotwindows', required=False,
|
||||||
|
help='plot counts in window (1 or 2)')
|
||||||
|
argparser.add_argument('-l', '--linewidth', required=False,
|
||||||
|
help='line width in plot (1, 2, ...)')
|
||||||
|
argparser.add_argument('-t', '--timeformat', required=False,
|
||||||
|
help='specify the time format, for example: %d.%m.%Y')
|
||||||
|
|
||||||
args = argparser.parse_args()
|
args = argparser.parse_args()
|
||||||
|
|
||||||
plot_asotr_borders(args.source, args.channel, args.asotr, args.begin, args.end,
|
# plot_asotr_borders(args.source, args.channel, args.asotr, args.begin, args.end,
|
||||||
args.font, args.cmd, show_flag=args.plot)
|
# args.font, args.cmd, show_flag=args.plot, plot_windows=int(args.plotwindows),
|
||||||
|
# width_=int(args.linewidth), time_format = args.timeformat)
|
||||||
|
|
||||||
|
plot_asotr_borders(args.source, args.channel, args.asotr, args.begin, args.end)
|
||||||
|
@@ -11,11 +11,8 @@ import pandas as pd
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
asotr_kit = 1
|
asotr_kit = 1
|
||||||
# fname = f'../python_cyclo/data/asotr0{asotr_kit}_data_T.csv'
|
|
||||||
fname = f'../data/asotr/asotr0{asotr_kit}_data_T.csv'
|
fname = f'../data/asotr/asotr0{asotr_kit}_data_T.csv'
|
||||||
|
data = pd.read_csv(fname, sep=';', parse_dates=["timestamp"], date_format="%d.%m.%Y %H:%M:%S.%f")
|
||||||
dateparse = lambda x: datetime.strptime(x, "%d.%m.%Y %H:%M:%S.%f")
|
|
||||||
data = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_parser=dateparse)
|
|
||||||
|
|
||||||
# date = '20.03.2025'
|
# date = '20.03.2025'
|
||||||
# period = '1 мин'
|
# period = '1 мин'
|
||||||
@@ -48,7 +45,6 @@ data = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_parser=datepa
|
|||||||
# name_fig = 'step_response_KDI_20242403.png'
|
# name_fig = 'step_response_KDI_20242403.png'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# interp = {'method': 'polynomial', 'order': 1}
|
# interp = {'method': 'polynomial', 'order': 1}
|
||||||
# thermocycle_info = {'date': '01.04.2025',
|
# thermocycle_info = {'date': '01.04.2025',
|
||||||
# 'time_begin': ['01.04.2025 16:27:00', '01.04.2025 18:00:00'],
|
# 'time_begin': ['01.04.2025 16:27:00', '01.04.2025 18:00:00'],
|
||||||
@@ -62,6 +58,8 @@ data = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_parser=datepa
|
|||||||
# 'name_fig': f'{name}.png', 'font': 10}
|
# 'name_fig': f'{name}.png', 'font': 10}
|
||||||
|
|
||||||
|
|
||||||
|
fname = f'../../python_cyclo/data/asotr0{asotr_kit}_data_T.csv'
|
||||||
|
data = pd.read_csv(fname, sep=';', parse_dates=["timestamp"], date_format="%d.%m.%Y %H:%M:%S.%f")
|
||||||
|
|
||||||
interp = {'method': 'polynomial', 'order': 1}
|
interp = {'method': 'polynomial', 'order': 1}
|
||||||
|
|
||||||
@@ -69,46 +67,12 @@ data_info_list = []
|
|||||||
thermocycle_info_list = []
|
thermocycle_info_list = []
|
||||||
cut_step_resp_list = []
|
cut_step_resp_list = []
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
data_info = {'data': data, 'device': 'КДИ', 'channel': 'ch1', 'period': '1 мин',
|
||||||
'find_accuracy': 'seconds'}
|
'find_accuracy': 'seconds'}
|
||||||
thermocycle_info = {'date': '25.04.2025',
|
thermocycle_info = {'date': '01.04.2025',
|
||||||
'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'],
|
'time_begin': ['01.04.2025 16:27:13', '01.04.2025 18:00:18'],
|
||||||
'duration_sec': 92*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
'duration_sec': 92*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
||||||
cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60}
|
cut_step_resp = {'time_step_begin': '01.04.2025 18:53:20', 'step_duration': 25*60}
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '25.04.2025',
|
|
||||||
'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'],
|
|
||||||
'duration_sec': 92*60, 'type': 'step1_to2', 'type_ru': 'ступенчатое'}
|
|
||||||
cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '25.04.2025',
|
|
||||||
'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
|
|
||||||
'duration_sec': 92*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
|
||||||
cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 15*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '25.04.2025',
|
|
||||||
'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
|
|
||||||
'duration_sec': 92*60, 'type': 'impulse1_to2', 'type_ru': 'импульсное'}
|
|
||||||
cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 20*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
data_info_list.append(data_info)
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
thermocycle_info_list.append(thermocycle_info)
|
||||||
@@ -116,144 +80,199 @@ cut_step_resp_list.append(cut_step_resp)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '30.04.2025',
|
|
||||||
'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
|
|
||||||
'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
|
||||||
cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '30.04.2025',
|
|
||||||
'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
|
|
||||||
'duration_sec': 93*60, 'type': 'step2_to1', 'type_ru': 'ступенчатое'}
|
|
||||||
cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '30.04.2025',
|
|
||||||
'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
|
|
||||||
'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
|
||||||
cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 15*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '30.04.2025',
|
|
||||||
'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
|
|
||||||
'duration_sec': 93*60, 'type': 'impulse2_to1', 'type_ru': 'импульсное'}
|
|
||||||
cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 20*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '02.05.2025',
|
|
||||||
'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
|
|
||||||
'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
|
||||||
cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '02.05.2025',
|
|
||||||
'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
|
|
||||||
'duration_sec': 93*60, 'type': 'step4_to3', 'type_ru': 'ступенчатое'}
|
|
||||||
cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '02.05.2025',
|
|
||||||
'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
|
|
||||||
'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
|
||||||
cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 15*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '02.05.2025',
|
|
||||||
'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
|
|
||||||
'duration_sec': 93*60, 'type': 'impulse4_to3', 'type_ru': 'импульсное'}
|
|
||||||
cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 20*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
|
||||||
|
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
# interp = {'method': 'polynomial', 'order': 1}
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '04.05.2025',
|
|
||||||
'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'],
|
|
||||||
'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
|
||||||
cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 26*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
# data_info_list = []
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
# thermocycle_info_list = []
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
# cut_step_resp_list = []
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
||||||
'find_accuracy': 'seconds'}
|
# 'find_accuracy': 'seconds'}
|
||||||
thermocycle_info = {'date': '04.05.2025',
|
# thermocycle_info = {'date': '25.04.2025',
|
||||||
'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'],
|
# 'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'],
|
||||||
'duration_sec': 93*60, 'type': 'step3_to4', 'type_ru': 'ступенчатое'}
|
# 'duration_sec': 92*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
||||||
cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 30*60}
|
# cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60}
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
# data_info_list.append(data_info)
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
||||||
'find_accuracy': 'seconds'}
|
# 'find_accuracy': 'seconds'}
|
||||||
thermocycle_info = {'date': '04.05.2025',
|
# thermocycle_info = {'date': '25.04.2025',
|
||||||
'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'],
|
# 'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'],
|
||||||
'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
# 'duration_sec': 92*60, 'type': 'step1_to2', 'type_ru': 'ступенчатое'}
|
||||||
cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 15*60}
|
# cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60}
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
# data_info_list.append(data_info)
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
|
||||||
'find_accuracy': 'seconds'}
|
|
||||||
thermocycle_info = {'date': '04.05.2025',
|
|
||||||
'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'],
|
|
||||||
'duration_sec': 93*60, 'type': 'impulse3_to4', 'type_ru': 'импульсное'}
|
|
||||||
cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 20*60}
|
|
||||||
|
|
||||||
data_info_list.append(data_info)
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
||||||
thermocycle_info_list.append(thermocycle_info)
|
# 'find_accuracy': 'seconds'}
|
||||||
cut_step_resp_list.append(cut_step_resp)
|
# thermocycle_info = {'date': '25.04.2025',
|
||||||
|
# 'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
|
||||||
|
# 'duration_sec': 92*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 15*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
||||||
|
# 'find_accuracy2: 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '25.04.2025',
|
||||||
|
# 'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
|
||||||
|
# 'duration_sec': 92*60, 'type': 'impulse1_to2', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 20*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '30.04.2025',
|
||||||
|
# 'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '30.04.2025',
|
||||||
|
# 'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'step2_to1', 'type_ru': 'ступенчатое'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '30.04.2025',
|
||||||
|
# 'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 15*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '30.04.2025',
|
||||||
|
# 'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'impulse2_to1', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 20*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '02.05.2025',
|
||||||
|
# 'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '02.05.2025',
|
||||||
|
# 'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'step4_to3', 'type_ru': 'ступенчатое'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '02.05.2025',
|
||||||
|
# 'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 15*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '02.05.2025',
|
||||||
|
# 'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'impulse4_to3', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 20*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '04.05.2025',
|
||||||
|
# 'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 26*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '04.05.2025',
|
||||||
|
# 'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'step3_to4', 'type_ru': 'ступенчатое'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 30*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '04.05.2025',
|
||||||
|
# 'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 15*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
|
||||||
|
# 'find_accuracy': 'seconds'}
|
||||||
|
# thermocycle_info = {'date': '04.05.2025',
|
||||||
|
# 'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'],
|
||||||
|
# 'duration_sec': 93*60, 'type': 'impulse3_to4', 'type_ru': 'импульсное'}
|
||||||
|
# cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 20*60}
|
||||||
|
|
||||||
|
# data_info_list.append(data_info)
|
||||||
|
# thermocycle_info_list.append(thermocycle_info)
|
||||||
|
# cut_step_resp_list.append(cut_step_resp)
|
||||||
|
|
||||||
|
|
||||||
def get_step_response(data_info, thermocycle_info, cut_step_resp):
|
def get_step_response(data_info, thermocycle_info, cut_step_resp):
|
||||||
name = f'{data_info["channel"]}_{thermocycle_info["type"]}_response_{data_info["device"]}_{thermocycle_info["date"].replace(".","")}'
|
name = f'{data_info["channel"]}_{thermocycle_info["type"]}_response_{data_info["device"]}_{thermocycle_info["date"].replace(".","")}'
|
||||||
plot_info = {'title': 'Реакция на ' + thermocycle_info['type_ru'] + ' воздействие',
|
plot_info = {'title': 'Реакция на ' + thermocycle_info['type_ru'] + ' воздействие',
|
||||||
'ox_dtime_format': "%H:%M:%S", 'legend_pos': ['upper left', 'lower left'],
|
'ox_dtime_format': "%H:%M", 'legend_pos': ['upper left', 'lower left'],
|
||||||
'name_fig': f'../plots/response/{name}.png', 'font': 10}
|
'name_fig': f'../plots/response/{name}.png', 'font': 10}
|
||||||
|
|
||||||
asotr.plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
|
asotr.plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
|
||||||
@@ -270,7 +289,7 @@ def get_step_response(data_info, thermocycle_info, cut_step_resp):
|
|||||||
|
|
||||||
title = f'{plot_info["title"]}, канал {data_info["channel"][2]} АСОТР, {data_info["device"]} СПИН-X1-МВН, период опроса {data_info["period"]} ({thermocycle_info["date"]})'
|
title = f'{plot_info["title"]}, канал {data_info["channel"][2]} АСОТР, {data_info["device"]} СПИН-X1-МВН, период опроса {data_info["period"]} ({thermocycle_info["date"]})'
|
||||||
|
|
||||||
fig = plt.figure(figsize=(10, 6), dpi=200)
|
fig = plt.figure(figsize=(6, 10), dpi=200)
|
||||||
fig.suptitle(title, fontsize=plot_info['font'])
|
fig.suptitle(title, fontsize=plot_info['font'])
|
||||||
ax1 = fig.add_subplot(1,1,1)
|
ax1 = fig.add_subplot(1,1,1)
|
||||||
|
|
||||||
@@ -282,8 +301,8 @@ def get_step_response(data_info, thermocycle_info, cut_step_resp):
|
|||||||
ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font'])
|
ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font'])
|
||||||
ax1.grid(True)
|
ax1.grid(True)
|
||||||
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
||||||
ax1.set_ylabel(r'$T_{norm}$, $^\circ$C', fontsize=plot_info['font'])
|
ax1.set_ylabel(r'$T_{норм}$, $^\circ$C', fontsize=plot_info['font'])
|
||||||
ax1.set_xlabel('Время, ЧЧ:MM:CC', fontsize=plot_info['font'])
|
ax1.set_xlabel('Время, ЧЧ:MM', fontsize=plot_info['font'])
|
||||||
|
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
fig.savefig(plot_info["name_fig"])
|
fig.savefig(plot_info["name_fig"])
|
||||||
|
@@ -102,7 +102,7 @@ ax1.xaxis.set_major_formatter(date_formatter)
|
|||||||
ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font'])
|
ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font'])
|
||||||
ax1.grid(True)
|
ax1.grid(True)
|
||||||
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
|
||||||
ax1.set_ylabel(r'$T_{norm}$, $^\circ$C', fontsize=plot_info['font'])
|
ax1.set_ylabel(r'$T_{норм}$, $^\circ$C', fontsize=plot_info['font'])
|
||||||
ax1.set_xlabel('Время', fontsize=plot_info['font'])
|
ax1.set_xlabel('Время', fontsize=plot_info['font'])
|
||||||
|
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
|
@@ -15,7 +15,7 @@ path_itog_brd_data = '../data/brd_data/'
|
|||||||
class PathFileNotFound(Exception):
|
class PathFileNotFound(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# recursive search files by pattern in specified directory
|
||||||
def find_required_files(root_dir, pattern):
|
def find_required_files(root_dir, pattern):
|
||||||
result = []
|
result = []
|
||||||
for dirpath, _, filenames in os.walk(root_dir):
|
for dirpath, _, filenames in os.walk(root_dir):
|
||||||
@@ -30,7 +30,7 @@ def find_required_files(root_dir, pattern):
|
|||||||
|
|
||||||
return sorted(result)
|
return sorted(result)
|
||||||
|
|
||||||
|
# read all finded files into pandas dataFrame
|
||||||
def read_files_into_df(fname_list, column_list, dtype_columns={}):
|
def read_files_into_df(fname_list, column_list, dtype_columns={}):
|
||||||
data_itog = pd.DataFrame()
|
data_itog = pd.DataFrame()
|
||||||
epoch_start = pd.Timestamp('2000-01-01')
|
epoch_start = pd.Timestamp('2000-01-01')
|
||||||
@@ -89,7 +89,7 @@ if __name__ == "__main__":
|
|||||||
column_list = ['TIME', 'PER_1Hz', 'ST_HV']
|
column_list = ['TIME', 'PER_1Hz', 'ST_HV']
|
||||||
column_list_itog = ['TIME', 'timestamp', 'PER_1Hz', 'ST_HV']
|
column_list_itog = ['TIME', 'timestamp', 'PER_1Hz', 'ST_HV']
|
||||||
|
|
||||||
collect_tm_brd_files(root_dir_tm_data, column_list, column_list_itog)
|
# collect_tm_brd_files(root_dir_tm_data, column_list, column_list_itog)
|
||||||
|
|
||||||
## plot 'evolution' 1 Hz from tm brd data
|
## plot 'evolution' 1 Hz from tm brd data
|
||||||
print('plot evolution 1 Hz from tm brd data')
|
print('plot evolution 1 Hz from tm brd data')
|
||||||
@@ -97,5 +97,7 @@ if __name__ == "__main__":
|
|||||||
fname = path_itog_brd_data + 'mvn_tm_brd01.csv'
|
fname = path_itog_brd_data + 'mvn_tm_brd01.csv'
|
||||||
df = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f")
|
df = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f")
|
||||||
|
|
||||||
|
# print(df)
|
||||||
plt.plot(df['timestamp'], df['PER_1Hz'], '.')
|
plt.plot(df['timestamp'], df['PER_1Hz'], '.')
|
||||||
|
plt.grid()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
@@ -3,13 +3,18 @@ import os
|
|||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
|
from matplotlib import dates
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import sys
|
import sys
|
||||||
|
import seaborn as sns
|
||||||
|
|
||||||
tstamp_s = '%d.%m.%Y %H:%M:%S.%f'
|
tstamp_s = '%d.%m.%Y %H:%M:%S.%f'
|
||||||
ox_dtime_format = '%d.%m.%Y %H:%M'
|
ox_dtime_format = '%H:%M'
|
||||||
|
ox_date_format = '%d.%m.%Y'
|
||||||
|
|
||||||
path_itog_brd_data = '../data/brd_data/'
|
path_itog_brd_data = '../data/brd_data/'
|
||||||
|
pict_name = '../plots/' + 'MVN_wheel'
|
||||||
|
font = 16
|
||||||
|
|
||||||
|
|
||||||
class PathFileNotFound(Exception):
|
class PathFileNotFound(Exception):
|
||||||
@@ -92,23 +97,64 @@ if __name__ == "__main__":
|
|||||||
column_list = ['TIME', 'STATE']
|
column_list = ['TIME', 'STATE']
|
||||||
column_list_itog = ['TIME', 'timestamp', 'STATE']
|
column_list_itog = ['TIME', 'timestamp', 'STATE']
|
||||||
|
|
||||||
collect_tm_brd_wheel_data(root_dir_wheel_data, column_list, column_list_itog)
|
# collect_tm_brd_wheel_data(root_dir_wheel_data, column_list, column_list_itog)
|
||||||
|
|
||||||
## parse and plot wheel csv data
|
## parse and plot wheel csv data
|
||||||
print('parse and plot wheel csv data')
|
print('parse and plot wheel csv data')
|
||||||
|
|
||||||
border_clr_wheel = 2
|
border_clr_wheel = 1
|
||||||
fname = path_itog_brd_data + 'mvn_wheel_brd01.csv'
|
fname = path_itog_brd_data + 'mvn_wheel_brd01.csv'
|
||||||
wheel_df = pd.read_csv(fname, sep=';')
|
wheel_df = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f")
|
||||||
|
## diff between 0 and 0 - 30 sec
|
||||||
wheel_df['TIME_diff'] = wheel_df['TIME'].diff()
|
wheel_df['TIME_diff'] = wheel_df['TIME'].diff()
|
||||||
median_tdiff = wheel_df['TIME_diff'].median()
|
|
||||||
|
|
||||||
wheel_df_clear = wheel_df[(wheel_df['TIME_diff'] > median_tdiff - border_clr_wheel) &
|
## sampling decimation in order to get period 60 sec
|
||||||
(wheel_df['TIME_diff'] < median_tdiff + border_clr_wheel)]
|
wheel_df = wheel_df.iloc[1::2]
|
||||||
|
wheel_df['TIME_period'] = wheel_df['TIME'].diff()
|
||||||
|
# print(wheel_df)
|
||||||
|
median_tdiff = wheel_df['TIME_period'].median()
|
||||||
|
# print(median_tdiff)
|
||||||
|
|
||||||
wheel_df_peaks = wheel_df[(wheel_df['TIME_diff'] <= median_tdiff - border_clr_wheel) |
|
## discard outliers of the measured wheel period
|
||||||
(wheel_df['TIME_diff'] >= median_tdiff + border_clr_wheel)]
|
wheel_df = wheel_df[
|
||||||
|
(wheel_df['TIME_period'] > median_tdiff - border_clr_wheel) &
|
||||||
|
(wheel_df['TIME_period'] < median_tdiff + border_clr_wheel)]
|
||||||
|
|
||||||
|
median = wheel_df['TIME_period'].median()
|
||||||
|
|
||||||
|
rows, cols = wheel_df.shape
|
||||||
|
median = pd.Series([median] * rows)
|
||||||
|
|
||||||
|
date_format = dates.DateFormatter(ox_date_format)
|
||||||
|
datetime_format = dates.DateFormatter(ox_dtime_format)
|
||||||
|
|
||||||
|
fig, axes = plt.subplots(3, 1, figsize=(18, 20), dpi=300, height_ratios=[1, 1, 1])
|
||||||
|
|
||||||
|
axes[0].plot(wheel_df['timestamp'], wheel_df['TIME_period'], '.',
|
||||||
|
markersize=5)
|
||||||
|
axes[0].plot(wheel_df['timestamp'], median)
|
||||||
|
axes[0].set_title("")
|
||||||
|
axes[0].set_xlabel("Время (ДД.MM.ГГГГ)", fontsize=font)
|
||||||
|
axes[0].set_ylabel("Полупериод, сек", fontsize=font)
|
||||||
|
axes[0].grid(True)
|
||||||
|
axes[0].xaxis.set_major_formatter(date_format)
|
||||||
|
axes[0].tick_params(axis="both", width=1, labelsize=font)
|
||||||
|
|
||||||
|
axes[1].plot(wheel_df['timestamp'][0:400], wheel_df['TIME_period'][0:400], '.', markersize=10)
|
||||||
|
axes[1].set_title("")
|
||||||
|
axes[1].set_xlabel("Время (ЧЧ:ММ)", fontsize=font)
|
||||||
|
axes[1].set_ylabel("Полупериод, сек", fontsize=font)
|
||||||
|
axes[1].grid(True)
|
||||||
|
axes[1].xaxis.set_major_formatter(datetime_format)
|
||||||
|
axes[1].tick_params(axis="both", width=1, labelsize=font)
|
||||||
|
|
||||||
|
sns.histplot(wheel_df['TIME_period'], kde=False, bins=300, ax=axes[2], color='red')
|
||||||
|
axes[2].set_title("")
|
||||||
|
axes[2].set_xlabel("Полупериод, сек", fontsize=font)
|
||||||
|
axes[2].set_ylabel("Частота встречаемости", fontsize=font)
|
||||||
|
axes[2].grid(True)
|
||||||
|
axes[2].tick_params(axis="both", width=1, labelsize=font)
|
||||||
|
|
||||||
|
fig.savefig(pict_name)
|
||||||
|
|
||||||
plt.plot(wheel_df_clear['TIME'], wheel_df_clear['TIME_diff'], '-')
|
|
||||||
plt.plot(wheel_df_peaks['TIME'], wheel_df_peaks['TIME_diff'], '.')
|
|
||||||
plt.show()
|
plt.show()
|
||||||
|
Reference in New Issue
Block a user