First commit of acoustic data loader python file for UBSediFlow Acoustic Backscatter System

dev-brahim
brahim 2023-10-05 15:51:23 +02:00
parent e0b76447e6
commit 4537a7d414
1 changed files with 207 additions and 0 deletions

View File

@ -0,0 +1,207 @@
from Model.AquascatDataLoader import RawAquascatData
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from udt_extract.raw_extract import raw_extract
# raw_20210519_102332.udt raw_20210520_135452.udt raw_20210525_092759.udt
# path_BS_raw_data = ("/home/bmoudjed/Documents/3 SSC acoustic meas project/Graphical interface project/Data/APAVER_2021/"
# "Rhone_20210519/Rhone_20210519/record/raw_20210525_092759.udt")
class AcousticDataLoaderUBSediFlow():
def __init__(self, path_BS_raw_data: str):
self.path_BS_raw_data = path_BS_raw_data
# --- Extract Backscatter acoustic raw data with class ---
# Extraction function:
device_name, time_begin, time_end, param_us_dicts, data_us_dicts, data_dicts, settings_dict \
= raw_extract(self.path_BS_raw_data)
self._freq = []
self._r = np.array([[]])
self._time = np.array([[]])
self._BS_raw_data = np.array([[[]]])
time_len = []
for config in param_us_dicts.keys():
# print("-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x")
# print(f"config : {config} \n")
for channel in param_us_dicts[config].keys():
# print("-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x")
# print(f"channel : {channel} \n")
# --- Frequencies ---
self._freq.append(param_us_dicts[config][channel]['f0'])
# --- Depth for each frequencies ---
depth = [param_us_dicts[config][channel]['r_cell1'] * i
for i in list(range(param_us_dicts[config][channel]['n_cell']))]
if self._r.shape[1] == 0:
self._r = np.array([depth])
else:
self._r = np.append(self._r, [depth], axis=0)
# --- Time for each frequencies ---
time = [[(t - data_us_dicts[config][channel]['echo_avg_profile']['time'][0]).total_seconds()
for t in data_us_dicts[config][channel]['echo_avg_profile']['time']]]
time_len = np.append(time_len, len(time[0]))
if len(time_len) == 1:
# print(f"1 time length : {len(time[0])}")
self._time = np.array(time)
# print(f"self._time.shape {self._time.shape}")
elif self._time.shape[1] == len(time[0]):
# print(f"2 time length : {len(time[0])}")
self._time = np.append(self._time, time, axis=0)
# print(f"self._time.shape {self._time.shape}")
elif self._time.shape[1] > len(time[0]):
# print(f"3 time length : {len(time[0])}")
# print(f"self._time.shape {self._time.shape}")
# print([int(np.min(time_len)) + int(i) - 1 for i in range(1, int(np.max(time_len))-int(np.min(time_len))+1)])
self._time = np.delete(self._time,
[int(np.min(time_len)) + int(i) - 1 for i in range(1, int(np.max(time_len))-int(np.min(time_len))+1)],
axis=1)
self._time = np.append(self._time, time, axis=0)
# print(f"self._time.shape {self._time.shape}")
elif self._time.shape[1] < len(time[0]):
# print(f"4 time length : {len(time[0])}")
time = time[:int(np.max(time_len)) - (int(np.max(time_len)) - int(np.min(time_len)))]
self._time = np.append(self._time, time, axis=0)
# print(f"self._time.shape {self._time.shape}")
# --- US Backscatter raw signal ---
for f, freq in enumerate(self._freq):
if f == 0:
# print(data_us_dicts[config][channel]['echo_avg_profile']['data'])
self._BS_raw_data = np.array([np.reshape(data_us_dicts[config][channel]['echo_avg_profile']['data'],
(self._time.shape[1], self._r.shape[1])).transpose()])
# print(self._BS_raw_data.shape)
else:
self._BS_raw_data = np.append(self._BS_raw_data,
np.array([np.reshape(np.array(
data_us_dicts[config][channel]['echo_avg_profile']['data']),
(self._time.shape[1], self._r.shape[1])).transpose()]),
axis=0)
# print(self._BS_raw_data.shape)
# print(len(self._BS_raw_data))
# print(self._BS_raw_data)
print("self._time.shape ", self._time.shape)
print("self._r.shape ", self._r.shape)
self._freq_text = [str(f) for f in [np.round(f*1e-6, 2) for f in self._freq]]
print("self._freq_text ", self._freq_text)
# self._BS_raw_data = np.array(np.reshape(self._BS_raw_data, (len(self._freq), self._r.shape[1], self._time.shape[1])))
print("self._BS_raw_data.shape ", self._BS_raw_data.shape)
# print("device_name ", device_name, "\n")
# print("time_begin ", time_begin, "\n")
# print("time_end ", time_end, "\n")
# print(f"param_dicts keys {param_us_dicts.keys()} \n")
# print(param_us_dicts, "\n")
# for i in range(len(list(param_us_dicts.keys()))):
# print(f"param_us_dicts {i} : {list(param_us_dicts.items())[i]} \n")
# # print("settings_dict ", settings_dict, "\n")
# print(f"keys in data_us_dicts {data_us_dicts[1][1].keys()} \n")
# # les clés du dictionnaire data_us_dicts :
# # dict_keys(['echo_avg_profile', 'saturation_avg_profile', 'velocity_avg_profile', 'snr_doppler_avg_profile',
# # 'velocity_std_profile', 'a1_param', 'a0_param', 'noise_g_high', 'noise_g_low'])
# print(f"data_us_dicts keys in echo avg profile {data_us_dicts[1][1]['echo_avg_profile'].keys()} \n")
# print(f"number of profiles {len(data_us_dicts[1][1]['echo_avg_profile']['data'])} \n")
# print(f"number of cells {data_us_dicts[1][1]['echo_avg_profile']['data'][0].shape} \n")
# self._data_BS = RawAquascatData(self.path_BS_raw_data)
#
# self._date = self._data_BS.date.date()
# self._hour = self._data_BS.date.time()
# self._nb_profiles = self._data_BS.NumProfiles
# self._nb_profiles_per_sec = self._data_BS.ProfileRate
# self._nb_cells = self._data_BS.NumCells
# self._cell_size = self._data_BS.cellSize
# self._pulse_length = self._data_BS.TxPulseLength
# self._nb_pings_per_sec = self._data_BS.PingRate
# self._nb_pings_averaged_per_profile = self._data_BS.Average
# self._kt = self._data_BS.Kt
# self._gain_rx = self._data_BS.RxGain
# self._gain_tx = self._data_BS.TxGain
# self._snr = np.array([])
# self._snr_reshape = np.array([])
# self._time_snr = np.array([])
# print(type(self._gain_tx))
# print(["BS - " + f for f in self._freq_text])
# print(self._time.shape[0]*self._r.shape[0]*4)
# print(self._time[np.where(np.floor(self._time) == 175)])
# print(np.where((self._time) == 155)[0][0])
fig, ax = plt.subplots(nrows=len(self._freq), ncols=1)
for f, freq in enumerate(self._freq):
# print(f"{f} : {freq} \n")
pcm = ax[f].pcolormesh(self._time[f, :], self._r[f, :], (self._BS_raw_data[f, :, :self._time.shape[1]]),
cmap='viridis',
norm=LogNorm(vmin=np.min(self._BS_raw_data[f, :, :]), vmax=np.max(self._BS_raw_data[f, :, :])), shading='gouraud') # )
# ax.pcolormesh(range(self._BS_raw_data.shape[2]), range(self._BS_raw_data.shape[0]), self._BS_raw_data[:, 1, :], cmap='viridis',
# norm=LogNorm(vmin=1e-5, vmax=np.max(self._BS_raw_data[:, 0, :]))) # , shading='gouraud')
fig.colorbar(pcm, ax=ax[:], shrink=1, location='right')
plt.show()
# fig, ax = plt.subplots(nrows=1, ncols=1)
# ax.plot(list(range(self._time.shape[1])), self._time[0, :])
# # ax.set_ylim(2, 20)
# plt.show()
# print(self.reshape_BS_raw_cross_section()[0, 0])
# self.reshape_r()
# self.reshape_t()
# def reshape_BS_raw_cross_section(self):
# BS_raw_cross_section = np.reshape(self._BS_raw_data,
# (self._r.shape[0]*len(self._time), self._freq.shape[0]),
# order="F")
# return BS_raw_cross_section
#
# def reshape_r(self):
# r = np.reshape(np.repeat(self._r, self._time.shape[0], axis=1),
# self._r.shape[0]*self._time.shape[0],
# order="F")
# return r
#
# def compute_r_2D(self):
# r2D = np.repeat(self._r, self._time.size, axis=1)
# return r2D
#
# def reshape_t(self):
# t = np.reshape(np.repeat(self._time, self._r.shape[0]), (self._time.shape[0]*self._r.shape[0], 1))
# return t
# def concatenate_data(self):
# self.reshape_t()
# self.reshape_BS_raw_cross_section()
# # print(self.reshape_t().shape)
# # print(se.lf.reshape_BS_raw_cross_section().shape)
# df = pd.DataFrame(np.concatenate((self.reshape_t(), self.reshape_BS_raw_cross_section()), axis=1),
# columns=["time"] + self._freq_text)
# return df
# if __name__ == "__main__":
# AcousticDataLoaderUBSediFlow(path_BS_raw_data)