The sediment calibration tab includes plot of acoustic recordings and profile of the concentration of fine sediments. The user can choose the data, frequencies and select the samples for the calibration.

dev-brahim
brahim 2024-07-19 17:46:44 +02:00
parent f8e7951139
commit 57b5490f5f
2 changed files with 559 additions and 2 deletions

View File

@ -710,7 +710,7 @@ class SampleDataTab(QWidget):
self.item_checkbox_fine.setCheckState(Qt.Unchecked)
self.tableWidget_fine.setItem(i, 1, self.item_checkbox_fine)
self.item_checkbox_fine.setText("F" + str(i + 1))
stg.sample_fine.append("F" + str(i + 1))
stg.sample_fine.append(("F" + str(i + 1), i))
# print(f"S{i+1} ", self.tableWidget_sample.item(i, 1).checkState())
# --- Fill table with data ---
@ -927,7 +927,7 @@ class SampleDataTab(QWidget):
self.item_checkbox_sand.setCheckState(Qt.Unchecked)
self.tableWidget_sand.setItem(i, 1, self.item_checkbox_sand)
self.item_checkbox_sand.setText("S" + str(i + 1))
stg.sample_sand.append("S" + str(i + 1))
stg.sample_sand.append(("S" + str(i + 1), i))
# print(f"S{i+1} ", self.tableWidget_sample.item(i, 1).checkState())
# --- Fill table with data ---

View File

@ -0,0 +1,557 @@
import sys
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import (QWidget, QMainWindow, QApplication, QVBoxLayout, QHBoxLayout, QGroupBox, QComboBox,
QGridLayout, QLabel, QPushButton, QSpinBox, QDoubleSpinBox, QAbstractSpinBox, QSpacerItem,
QSizePolicy, QSlider, QLineEdit, QDial)
from PyQt5.QtCore import QCoreApplication, Qt
from PyQt5.QtGui import QStandardItemModel, QIcon, QPixmap
import settings as stg
import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolBar
from matplotlib.colors import LogNorm
from View.checkable_combobox import CheckableComboBox
from Model.acoustic_inversion_method_high_concentration import AcousticInversionMethodHighConcentration
class SedimentCalibrationTab(QWidget):
''' This class generates the Sediment Calibration Tab '''
def __init__(self, widget_tab):
super().__init__()
self.path_icon = "./icons/"
self.icon_update = self.path_icon + "update.png"
self.inv_hc = AcousticInversionMethodHighConcentration()
### --- General layout of widgets ---
self.verticalLayoutMain = QVBoxLayout(widget_tab)
self.horizontalLayoutTop = QHBoxLayout()
self.verticalLayoutMain.addLayout(self.horizontalLayoutTop, 5) # 1O units is 100% , 1 units is 10%
self.horizontalLayoutBottom = QHBoxLayout()
self.verticalLayoutMain.addLayout(self.horizontalLayoutBottom, 5)
# --------------------------------------------------------------------------------------------------------------
self.groupbox_acoustic_data = QGroupBox()
self.horizontalLayoutTop.addWidget(self.groupbox_acoustic_data, 6)
self.groupbox_Mfine_profile = QGroupBox()
self.horizontalLayoutTop.addWidget(self.groupbox_Mfine_profile, 4)
# ++++++++++++++++++++++++++++++
# +++ Groupbox acoustic data +++
self.verticalLayout_groupbox_acoustic_data = QVBoxLayout(self.groupbox_acoustic_data)
# self.horizontalLayout_acoustic_data_choice = QHBoxLayout()
# self.verticalLayout_groupbox_acoustic_data.addLayout(self.horizontalLayout_acoustic_data_choice)
self.gridLayout_data_choice = QGridLayout()
self.verticalLayout_groupbox_acoustic_data.addLayout(self.gridLayout_data_choice)
self.pushbutton_update_acoustic_file = QPushButton()
self.pushbutton_update_acoustic_file.setIcon(QIcon(self.icon_update))
# self.horizontalLayout_acoustic_data_choice.addWidget(self.pushbutton_update_acoustic_file)
self.gridLayout_data_choice.addWidget(self.pushbutton_update_acoustic_file, 0, 0, 2, 1)
self.combobox_acoustic_data_choice = QComboBox()
# self.horizontalLayout_acoustic_data_choice.addWidget(self.combobox_acoustic_data_choice)
self.gridLayout_data_choice.addWidget(self.combobox_acoustic_data_choice, 0, 1, 1, 1)
self.combobox_freq1 = QComboBox()
# self.horizontalLayout_acoustic_data_choice.addWidget(self.combobox_freq1)
self.gridLayout_data_choice.addWidget(self.combobox_freq1, 0, 2, 1, 1)
self.combobox_freq2 = QComboBox()
# self.horizontalLayout_acoustic_data_choice.addWidget(self.combobox_freq2)
self.gridLayout_data_choice.addWidget(self.combobox_freq2, 0, 3, 1, 1)
# self.horizontalLayout_sample_data_choice = QHBoxLayout()
# self.verticalLayout_groupbox_acoustic_data.addLayout(self.horizontalLayout_sample_data_choice)
# self.label_fine_sample_choice = QLabel()
# self.label_fine_sample_choice.setText("Fine sediments :")
# self.horizontalLayout_sample_data_choice.addWidget(self.label_fine_sample_choice)
self.combobox_fine_sample_choice = CheckableComboBox()
# self.horizontalLayout_sample_data_choice.addWidget(self.combobox_fine_sample_choice)
self.gridLayout_data_choice.addWidget(self.combobox_fine_sample_choice, 1, 1, 1, 1)
# self.label_sand_sample_choice = QLabel()
# self.label_sand_sample_choice.setText("Sand sediments :")
# self.horizontalLayout_sample_data_choice.addWidget(self.label_sand_sample_choice)
self.combobox_sand_sample_choice = CheckableComboBox()
# self.horizontalLayout_sample_data_choice.addWidget(self.combobox_sand_sample_choice)
self.gridLayout_data_choice.addWidget(self.combobox_sand_sample_choice, 1, 2, 1, 1)
self.pushbutton_plot_sample = QPushButton()
self.pushbutton_plot_sample.setText("Plot sample")
# self.horizontalLayout_sample_data_choice.addWidget(self.pushbutton_plot_sample)
self.gridLayout_data_choice.addWidget(self.pushbutton_plot_sample, 1, 3, 1, 1)
self.canvas_BS = FigureCanvas()
self.verticalLayout_groupbox_acoustic_data.addWidget(self.canvas_BS)
# --------------------------------------------------------------------------------------------------------------
# +++++++++++++++++++++++++++++++++++++++++++
# +++ Groupbox Fine concentration profile +++
self.verticalLayout_groupbox_Mfine_profile = QVBoxLayout(self.groupbox_Mfine_profile)
self.canvas_Mfine = FigureCanvas()
self.toolbar_Mfine = NavigationToolBar(self.canvas_Mfine, self)
self.verticalLayout_groupbox_Mfine_profile.addWidget(self.toolbar_Mfine)
self.verticalLayout_groupbox_Mfine_profile.addWidget(self.canvas_Mfine)
# --------------------------------------------------------------------------------------------------------------
self.groupbox_FCB = QGroupBox()
self.horizontalLayoutBottom.addWidget(self.groupbox_FCB, 6)
self.groupbox_sediment_calibration = QGroupBox()
self.horizontalLayoutBottom.addWidget(self.groupbox_sediment_calibration, 4)
# ++++++++++++++++++++
# +++ Groupbox FCB +++
self.verticalLayout_groupbox_FCB = QVBoxLayout(self.groupbox_FCB)
self.canvas_FCB = FigureCanvas()
self.toolbar_FCB = NavigationToolBar(self.canvas_FCB, self)
self.verticalLayout_groupbox_FCB.addWidget(self.toolbar_FCB)
self.verticalLayout_groupbox_FCB.addWidget(self.canvas_FCB)
# +++++++++++++++++++++++++++++++++++++
# +++ Groupbox sediment calibration +++
self.groupbox_sediment_calibration.setTitle("Sediment calibration")
self.gridLayout_groupbox_sediment_calibration = QGridLayout(self.groupbox_sediment_calibration)
self.label_freq1 = QLabel("freq1")
self.gridLayout_groupbox_sediment_calibration.addWidget(self.label_freq1, 0, 1, 1, 1)
self.label_freq2 = QLabel("freq2")
self.gridLayout_groupbox_sediment_calibration.addWidget(self.label_freq2, 0, 2, 1, 1)
self.label_ks = QLabel()
self.label_ks.setText("ks")
self.gridLayout_groupbox_sediment_calibration.addWidget(self.label_ks, 1, 0, 1, 1)
self.label_sv = QLabel()
self.label_sv.setText("sv")
self.gridLayout_groupbox_sediment_calibration.addWidget(self.label_sv, 2, 0, 1, 1)
self.label_X = QLabel()
self.label_X.setText("X")
self.gridLayout_groupbox_sediment_calibration.addWidget(self.label_X, 3, 0, 1, 1)
self.label_alphas = QLabel()
self.label_alphas.setText("\u03B1s")
self.gridLayout_groupbox_sediment_calibration.addWidget(self.label_alphas, 4, 0, 1, 1)
self.label_zeta = QLabel()
self.label_zeta.setText("\u03B6")
self.gridLayout_groupbox_sediment_calibration.addWidget(self.label_zeta, 5, 0, 1, 1)
# ==============================================================================================================
# ---------------------------------------- Connect signal of widget --------------------------------------------
# ==============================================================================================================
self.pushbutton_update_acoustic_file.clicked.connect(self.function_pushbutton_update_acoustic_file)
self.pushbutton_plot_sample.clicked.connect(self.function_pushbutton_plot_sample)
# ==============================================================================================================
# ----------------------------------- Functions for Signal processing Tab --------------------------------------
# ==============================================================================================================
def function_pushbutton_update_acoustic_file(self):
self.update_acoustic_data()
def function_pushbutton_plot_sample(self):
self.sample_choice_for_calibration()
self.plot_acoustic_recording()
self.plot_profile_of_concentration_fine()
def update_acoustic_data(self):
self.combobox_acoustic_data_choice.clear()
self.combobox_acoustic_data_choice.addItems(stg.filename_BS_raw_data)
self.combobox_acoustic_data_choice.currentIndexChanged.connect(self.plot_acoustic_recording)
self.combobox_freq1.clear()
self.combobox_freq1.addItems(stg.freq_text[self.combobox_acoustic_data_choice.currentIndex()])
self.combobox_freq2.clear()
self.combobox_freq2.addItems(stg.freq_text[self.combobox_acoustic_data_choice.currentIndex()])
self.combobox_freq2.currentIndexChanged.connect(self.plot_acoustic_recording)
self.combobox_fine_sample_choice.clear()
self.combobox_fine_sample_choice.addItems([f[0] for f in stg.sample_fine])
self.combobox_sand_sample_choice.clear()
self.combobox_sand_sample_choice.addItems([s[0] for s in stg.sample_sand])
self.plot_acoustic_recording()
def plot_acoustic_recording(self):
self.verticalLayout_groupbox_acoustic_data.removeWidget(self.canvas_BS)
self.fig_BS, self.axis_BS = plt.subplots(nrows=1, ncols=1, sharex=True, sharey=False, layout='constrained')
self.canvas_BS = FigureCanvas(self.fig_BS)
self.verticalLayout_groupbox_acoustic_data.addWidget(self.canvas_BS)
if stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,):
val_min = np.nanmin(
stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(),
:, :])
val_max = np.nanmax(
stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(),
:, :])
if val_min == 0:
val_min = 1e-5
self.axis_BS.pcolormesh(
stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][
self.combobox_freq2.currentIndex(), :],
-stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][
self.combobox_freq2.currentIndex(), :],
stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(),
:, :],
cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max))
elif stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,):
val_min = np.nanmin(
stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()][
self.combobox_freq2.currentIndex(), :, :])
val_max = np.nanmax(
stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()][
self.combobox_freq2.currentIndex(), :, :])
if val_min == 0:
val_min = 1e-5
self.axis_BS.pcolormesh(
stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][
self.combobox_freq2.currentIndex(), :],
-stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][
self.combobox_freq2.currentIndex(), :],
stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()][
self.combobox_freq2.currentIndex(), :, :],
cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max))
elif stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,):
val_min = np.nanmin(
stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :,
:])
val_max = np.nanmax(
stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :,
:])
if val_min == 0:
val_min = 1e-5
self.axis_BS.pcolormesh(
stg.time[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :],
-stg.depth[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :],
stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :,
:],
cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max))
print("stg.fine_sample_profile ", stg.fine_sample_profile)
print("stg.sand_sample_target ", stg.sand_sample_target)
if (stg.fine_sample_profile) or (stg.sand_sample_target):
self.axis_BS.scatter([stg.time_fine[f[1]] for f in stg.fine_sample_profile],
[stg.depth_fine[f[1]] for f in stg.fine_sample_profile],
marker='o', s=20, facecolor="k", edgecolor="None")
self.axis_BS.scatter([stg.time_sand[s[1]] for s in stg.sand_sample_target],
[stg.depth_sand[s[1]] for s in stg.sand_sample_target],
marker='o', s=50, facecolor="None", edgecolor="k")
for i in stg.fine_sample_profile:
self.axis_BS.text(stg.time_fine[i[1]] + 5, stg.depth_fine[i[1]] - .2, i[0],
fontstyle="normal", fontweight="light", fontsize=8)
for j in stg.sand_sample_target:
self.axis_BS.text(stg.time_sand[j[1]] - 12, stg.depth_sand[j[1]] - .2, j[0],
fontstyle="normal", fontweight="light", fontsize=8)
elif (stg.sample_fine) or (stg.sample_sand):
self.axis_BS.scatter(stg.time_fine, stg.depth_fine, marker='o', s=20, facecolor="k", edgecolor="None")
self.axis_BS.scatter(stg.time_sand, stg.depth_sand, marker='o', s=50, facecolor="None", edgecolor="k")
for i in stg.sample_fine:
self.axis_BS.text(stg.time_fine[i[1]] + 5, stg.depth_fine[i[1]] - .2, i[0],
fontstyle="normal", fontweight="light", fontsize=8)
for j in stg.sample_sand:
self.axis_BS.text(stg.time_sand[j[1]] - 12, stg.depth_sand[j[1]] - .2, j[0],
fontstyle="normal", fontweight="light", fontsize=8)
# self.axis_BS.set_xticks([])
# self.axis_BS.set_yticks([])
self.axis_BS.set_xlabel("Time (sec)")
self.axis_BS.set_ylabel("Depth (m)")
self.fig_BS.canvas.draw_idle()
def sample_choice_for_calibration(self):
# --- List selected fine samples ---
stg.fine_sample_profile = [(f, int(f[1:]) - 1) for f in self.combobox_fine_sample_choice.currentData()]
print(f"stg.fine_sample_profile : {stg.fine_sample_profile}")
# --- List selected sand samples ---
stg.sand_sample_target = [(s, int(s[1:]) - 1) for s in self.combobox_sand_sample_choice.currentData()]
print(f"stg.sand_sample_target : {stg.sand_sample_target}")
def plot_profile_of_concentration_fine(self):
if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,):
print("test find indice of time ", np.where( np.abs(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :]
- (stg.time_fine[stg.fine_sample_profile[-1][1]])) ==
np.nanmin(np.abs(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :]
- (stg.time_fine[stg.fine_sample_profile[-1][1]]))) ))
print(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :])
print(stg.time_fine[stg.fine_sample_profile[-1][1]])
range_lin_interp, M_profile_fine = (
self.inv_hc.M_profile_SCC_fine_interpolated(
sample_depth=[-stg.depth_fine[k[1]] for k in stg.fine_sample_profile],
M_profile=[stg.Ctot_fine[k[1]] for k in stg.fine_sample_profile],
range_cells=stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :],
r_bottom=stg.depth_bottom[self.combobox_acoustic_data_choice.currentIndex()]
[
np.where( np.abs(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :]
- stg.time_fine[stg.fine_sample_profile[-1][1]]) ==
np.nanmin(np.abs(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :]
- stg.time_fine[stg.fine_sample_profile[-1][1]])) )[0][0]
]
)
)
# print(f"range_lin_interp : {range_lin_interp}")
# print(f"M_profile_fine : {M_profile_fine}")
else:
range_lin_interp, M_profile_fine = (
self.inv_hc.M_profile_SCC_fine_interpolated(
sample_depth=[-stg.depth_fine[k[1]] for k in stg.fine_sample_profile],
M_profile=[stg.Ctot_fine[k[1]] for k in stg.fine_sample_profile],
range_cells=stg.depth[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq2.currentIndex(), :],
r_bottom=stg.depth_bottom[self.combobox_acoustic_data_choice.currentIndex()]))
M_profile_fine = M_profile_fine[:len(range_lin_interp)]
print(f"M_profile_fine : {M_profile_fine}")
# --- Plot profile of the concentration of the fine sediments ---
self.verticalLayout_groupbox_Mfine_profile.removeWidget(self.canvas_Mfine)
self.verticalLayout_groupbox_Mfine_profile.removeWidget(self.toolbar_Mfine)
self.fig_Mfine, self.ax_Mfine = plt.subplots(1, 1, layout="constrained")
self.canvas_Mfine = FigureCanvas(self.fig_Mfine)
self.toolbar_Mfine = NavigationToolBar(self.canvas_Mfine, self)
self.verticalLayout_groupbox_Mfine_profile.addWidget(self.toolbar_Mfine)
self.verticalLayout_groupbox_Mfine_profile.addWidget(self.canvas_Mfine)
self.ax_Mfine.plot([stg.Ctot_fine[c] for _, c in stg.fine_sample_profile],
[stg.depth_fine[c] for _, c in stg.fine_sample_profile],
marker="o", mfc="k", mec="k", ms=12, ls="None")
self.ax_Mfine.plot(M_profile_fine[:len(range_lin_interp)], -range_lin_interp,
marker="*", mfc="b", mec="b", ms=8, ls="None")
self.ax_Mfine.set_xlabel("Concentration fine sediments (g/L)")
self.ax_Mfine.set_ylabel("Depth (m)")
for i in stg.fine_sample_profile:
self.ax_Mfine.text(stg.time_fine[i[1]], stg.depth_fine[i[1]] - .05, i[0],
fontstyle="normal", fontweight="light", fontsize=12)
self.ax_Mfine.set_xlabel("Fine sediments concentration (g/L)")
self.ax_Mfine.set_ylabel("Depth (m)")
def range_cells_function(self):
""" Computing the real cell size, that depends on the temperature """
# defaut Aquascat cell size
aquascat_cell_size = stg.r[0, 1] - stg.r[0, 0]
# Pulse duration
tau = aquascat_cell_size * 2 / 1500 # figure 2.9 1500 vitesse du son entrée pour le paramètrage des mesures aquascat
# Sound speed
cel = self.inv_hc.water_velocity(self.spinbox_temperature_water_attenuation.value())
# Real cell size
real_cell_size = cel * tau / 2 # voir fig 2.9
# Converting to real cell profile
real_r = stg.r / aquascat_cell_size * real_cell_size # (/ aquascat_cell_size) pour ramener BS.r entre 0 et 1
# (* real_cell_size) pour remettre les échelles spatiales sur la taille réelle des cellules
# R with right shape (numpy array)
R_real = real_r # np.repeat(real_r, len(stg.freq), axis=1)
return R_real
def compute_FCB(self):
print(f"self.range_cells_function() : {self.range_cells_function()}")
print(f"self.range_cells_function() shape : {self.range_cells_function().shape}")
R_real = np.repeat(self.range_cells_function()[:, :, np.newaxis], stg.t.shape[1], axis=2)
print(f"R_real shape : {R_real.shape}")
if (stg.BS_stream_bed_pre_process_average.size == 0) and (stg.BS_stream_bed_pre_process_SNR.size == 0):
stg.FCB = (np.log(stg.BS_stream_bed) + np.log(R_real) +
2 * stg.water_attenuation * R_real)
elif stg.BS_stream_bed_pre_process_SNR.size == 0:
stg.FCB = (np.log(stg.BS_stream_bed_pre_process_average) + np.log(R_real) +
2 * stg.water_attenuation * R_real)
else:
stg.FCB = (np.log(stg.BS_stream_bed_pre_process_SNR) + np.log(R_real) +
2 * stg.water_attenuation * R_real)
self.plot_FCB()
# def fit_FCB_profile_with_linear_regression_and_compute_alphaS(self):
#
# if stg.FCB.size == 0:
# msgBox = QMessageBox()
# msgBox.setWindowTitle("Linear regression error")
# msgBox.setIcon(QMessageBox.Warning)
# msgBox.setText("Please compute FCB before")
# msgBox.setStandardButtons(QMessageBox.Ok)
# msgBox.exec()
# else:
# try:
# y0 = stg.FCB[self.combobox_frequency_compute_alphaS.currentIndex(), :, self.slider.value()]
# y = y0[np.where(np.isnan(y0) == False)]
#
# x0 = stg.r[0, :].reshape(-1)
# x = x0[np.where(np.isnan(y0) == False)]
#
# value1 = np.where(np.round(np.abs(x - self.spinbox_alphaS_computation_from.value()), 2)
# == np.min(np.round(np.abs(x - self.spinbox_alphaS_computation_from.value()), 2)))
# value2 = np.where(np.round(np.abs(x - self.spinbox_alphaS_computation_to.value()), 2)
# == np.min(np.round(np.abs(x - self.spinbox_alphaS_computation_to.value()), 2)))
#
# # print(np.round(np.abs(x - self.spinbox_alphaS_computation_from.value()), 2))
# # # print("value1 ", value1[0][0])
# # print(np.round(np.abs(x - self.spinbox_alphaS_computation_to.value()), 2))
# # print("value2 ", value2[0][0])
#
# # print("y limited ", y[value1[0][0]:value2[0][0]])
#
# lin_reg_compute = stats.linregress(x[value1[0][0]:value2[0][0]], y[value1[0][0]:value2[0][0]])
# except ValueError:
# msgBox = QMessageBox()
# msgBox.setWindowTitle("Linear regression error")
# msgBox.setIcon(QMessageBox.Warning)
# msgBox.setText("Please check boundaries to fit a linear line")
# msgBox.setStandardButtons(QMessageBox.Ok)
# msgBox.exec()
# else:
# stg.lin_reg = (lin_reg_compute.slope, lin_reg_compute.intercept)
# # print(f"y = {stg.lin_reg[0]}x + {stg.lin_reg[1]}")
#
# self.label_alphaS.clear()
# self.label_alphaS.setText(f"\u03B1s = {-0.5*stg.lin_reg[0]:.4f} dB/m")
#
# # for i, value_freq in enumerate(stg.freq):
# # for k, value_t in enumerate(stg.t):
# # # print(f"indice i: {i}, indice k: {k}")
# # # print(f"values of FCB: {stg.FCB[:, i, k]}")
# # y = stg.FCB[:, i, k]
# # # print("y : ", y)
# # # print(f"values of FCB where FCB is not Nan {y[np.where(np.isnan(y) == False)]}")
# # # print(f"values of r where FCB is not Nan {x[np.where(np.isnan(y) == False)]}")
# # lin_reg_compute = stats.linregress(x[np.where(np.isnan(y) == False)], y[np.where(np.isnan(y) == False)])
# # lin_reg_tuple = (lin_reg_compute.slope, lin_reg_compute.intercept)
# # stg.lin_reg.append(lin_reg_tuple)
#
# # print(f"y = {lin_reg.slope}x + {lin_reg.intercept}")
#
# # plt.figure()
# # plt.plot(stg.r, stg.FCB[:, 0, 825], 'k-', stg.r, lin_reg.slope*stg.r + lin_reg.intercept, "b--")
# # plt.show()
#
# # print("lin_reg length ", len(stg.lin_reg))
# # print("lin_reg ", stg.lin_reg)
# print([stg.time_fine[c] for _, c in stg.fine_sample_profile])
# print([stg.depth_fine[c] for _, c in stg.fine_sample_profile])
# --- Plot positions of the samples selected in comboboxes ---
# self.scat.set_array(np.array([[stg.time_fine[c] for _, c in stg.fine_sample_profile],
# [stg.depth_fine[c] for _, c in stg.fine_sample_profile]]).transpose())
# self.scat.set_array(np.array([[stg.time_fine[c] for _, c in stg.fine_sample_profile],
# [stg.depth_fine[c] for _, c in stg.fine_sample_profile]]).transpose())
# self.gridLayout_groupbox_data_choice = QGridLayout(self.groupbox_acoustic_data_choice)
#
# self.gridLayout_groupbox_data_choice.addWidget(self.combobox_acoustic_data_choice, 0, 0, 1, 4)
# self.combobox_acoustic_data_choice.addItems(["acoustic data 1", "acoustic data 2", "acoustic data 3"])
#
# self.label_temperature = QLabel("Temperature = ")
# self.gridLayout_groupbox_data_choice.addWidget(self.label_temperature, 1, 0, 1, 1)
#
# self.label_temperature_value = QLabel("7 °C")
# self.gridLayout_groupbox_data_choice.addWidget(self.label_temperature_value, 1, 1, 1, 1)
#
# self.label_sound_velocity = QLabel("Sound velocity (m/s) = ")
# self.gridLayout_groupbox_data_choice.addWidget(self.label_sound_velocity, 1, 2, 1, 1)
#
# self.spinbox_sound_velocity_value = QSpinBox()
# self.gridLayout_groupbox_data_choice.addWidget(self.spinbox_sound_velocity_value, 1, 3, 1, 1)
#
# self.label_freq1 = QLabel("freq 1:")
# self.gridLayout_groupbox_data_choice.addWidget(self.label_freq1, 2, 0, 1, 1)
# self.combobox_freq1 = QComboBox()
# self.combobox_freq1.addItems(["0.3 MHz", "0.5 MHz", "1 MHz", "5 MHz"])
# self.gridLayout_groupbox_data_choice.addWidget(self.combobox_freq1, 2, 1, 1, 1)
#
# self.label_freq2 = QLabel("freq 2:")
# self.gridLayout_groupbox_data_choice.addWidget(self.label_freq2, 2, 2, 1, 1)
# self.combobox_freq2 = QComboBox()
# self.combobox_freq2.addItems(["0.3 MHz", "0.5 MHz", "1 MHz", "5 MHz"])
# self.gridLayout_groupbox_data_choice.addWidget(self.combobox_freq2, 2, 3, 1, 1)
#
# self.label_kt = QLabel("kt = :")
# self.gridLayout_groupbox_data_choice.addWidget(self.label_kt, 3, 0, 1, 1)
#
# self.spinbox_kt_freq1 = QDoubleSpinBox()
# self.spinbox_kt_freq1.setDecimals(5)
# self.gridLayout_groupbox_data_choice.addWidget(self.spinbox_kt_freq1, 3, 1, 1, 1)
#
# self.spinbox_kt_freq2 = QDoubleSpinBox()
# self.spinbox_kt_freq2.setDecimals(5)
# self.gridLayout_groupbox_data_choice.addWidget(self.spinbox_kt_freq2, 3, 3, 1, 1)
#
# self.groupbox_acoustic_data_plot = QGroupBox()
# self.verticalLayout_groupbox_acoustic_data_plot = QVBoxLayout(self.groupbox_acoustic_data_plot)
# self.gridLayout_groupbox_data_choice.addWidget(self.groupbox_acoustic_data_plot, 4, 0, 1, 4)
#
# self.fig_acoustic, self.ax_acoustic = plt.subplots(nrows=1, ncols=1, layout="constrained")
# self.canvas_fig_acoustic = FigureCanvas(self.fig_acoustic)
# self.verticalLayout_groupbox_acoustic_data_plot.addWidget(self.canvas_fig_acoustic)