import sys from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QGroupBox, QLabel, QCheckBox, \ QSpinBox, QDoubleSpinBox, QComboBox, QLineEdit, QSlider, QGridLayout from PyQt5.QtGui import QFont, QIcon, QPixmap from PyQt5.QtCore import Qt, QCoreApplication import numpy as np from copy import deepcopy import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolBar from matplotlib.colors import LogNorm import Translation.constant_string as cs from Model.acoustic_data_loader import AcousticDataLoader import settings as stg _translate = QCoreApplication.translate class SignalProcessingTab(QWidget): ''' This class generates the Signal Processing Tab ''' def __init__(self, widget_tab): super().__init__() path_icon = "./icons/" icon_triangle_left = QIcon(path_icon + "triangle_left.png") icon_triangle_right = QIcon(path_icon + "triangle_right.png") ### --- General layout of widgets --- # ___________ ____________________________ # | profile | | Profile | # | position | | | # | | | | # | | | Averaged profile | # | post | | | # | proc | | | # | options | | FCB option | # |___________| |____________________________| self.horizontalLayout_Main = QHBoxLayout(widget_tab) self.verticalLayout_Left = QVBoxLayout() self.horizontalLayout_Main.addLayout(self.verticalLayout_Left, 2) self.verticalLayout_Right = QVBoxLayout() self.horizontalLayout_Main.addLayout(self.verticalLayout_Right, 8) # -------------------------------------------------------------------------------------------------------------- ### --- Layout of groupbox in the Left vertical layout box # Push button Load data # --------------------- # Profile position # --------------------- # Post processing # --------------------- # FCB options self.horizontalLayout_pushbutton_load_data_plot_bottom_line = QHBoxLayout() self.verticalLayout_Left.addLayout(self.horizontalLayout_pushbutton_load_data_plot_bottom_line) self.groupbox_display_profile_position = QGroupBox() self.verticalLayout_Left.addWidget(self.groupbox_display_profile_position) self.groupbox_post_processing = QGroupBox() self.verticalLayout_Left.addWidget(self.groupbox_post_processing) self.groupbox_FCBoption = QGroupBox() self.verticalLayout_Left.addWidget(self.groupbox_FCBoption) # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # +++ --- Push button Load data + Push button plot bottom --- +++ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ self.pushbutton_load_data = QPushButton() self.horizontalLayout_pushbutton_load_data_plot_bottom_line.addWidget(self.pushbutton_load_data) self.pushbutton_load_data.clicked.connect(self.plot_profile_position_on_transect) self.pushbutton_load_data.clicked.connect(self.plot_profiles) self.combobox_frequency = QComboBox() self.horizontalLayout_pushbutton_load_data_plot_bottom_line.addWidget(self.combobox_frequency) self.combobox_frequency.currentTextChanged.connect(self.update_plot_profile_position_on_transect) # +++++++++++++++++++++++++++++++++++++++++++++++++ # +++ --- GroupBox Display Profile Position --- +++ # +++++++++++++++++++++++++++++++++++++++++++++++++ self.verticalLayout_groupbox_display_profile_position = QVBoxLayout(self.groupbox_display_profile_position) self.label_profile_number = QLabel() self.label_profile_number.setFont(QFont("Ubuntu", 16, QFont.Bold)) self.label_profile_number.setAlignment(Qt.AlignCenter) # self.label_profile_number.setText("Profile 1 / " + str(stg.nb_profiles)) self.verticalLayout_groupbox_display_profile_position.addWidget(self.label_profile_number) self.canvas_plot_profile_position_on_transect = None # self.figure_plot_profile_position_on_transect, self.axis_plot_profile_position_on_transect = \ # plt.subplots(nrows=1, ncols=1, layout="constrained") # self.canvas_plot_profile_position_on_transect = FigureCanvas(self.figure_plot_profile_position_on_transect) # self.plot_transect_bottom_with_profile_position(0) # # # self.axis_plot_profile_position_on_transect.plot( # # 0 * np.ones(self.model.r_bottom_cross_section.shape[0]), # # self.model.r_bottom_cross_section, color='red', linestyle="solid", linewidth=2) # # self.verticalLayout_groupbox_display_profile_position.addWidget(self.canvas_plot_profile_position_on_transect) # # self.horizontalLayout_slider_plot_profile_position = QHBoxLayout() # self.verticalLayout_groupbox_display_profile_position.addLayout( # self.horizontalLayout_slider_plot_profile_position) # # # self.icon_triangle_left = QPixmap(path_icon + "triangle_left.png") # # self.pushButton_slider_plot_profile_position_left = QPushButton() # # self.pushButton_slider_plot_profile_position_left.setIcon(QIcon(self.icon_triangle_left)) # # self.icon_triangle_right = QPixmap(path_icon + "triangle_right.png") # # self.pushButton_slider_plot_profile_position_right = QPushButton() # # self.pushButton_slider_plot_profile_position_right.setIcon(QIcon(self.icon_triangle_right)) # # # # self.horizontalLayout_slider_plot_profile_position.addWidget(self.pushButton_slider_plot_profile_position_left) # # self.horizontalLayout_slider_plot_profile_position.addWidget(self.pushButton_slider_plot_profile_position_right) # # # # self.lineEdit_slider_plot_profile_position = QLineEdit() # # self.horizontalLayout_slider_plot_profile_position.addWidget(self.lineEdit_slider_plot_profile_position) # # # # self.slider_plot_profile_position = QSlider() # # self.slider_plot_profile_position.setOrientation(Qt.Horizontal) # # self.slider_plot_profile_position.setTickPosition(QSlider.TicksBelow) # # self.slider_plot_profile_position.setCursor(Qt.OpenHandCursor) # # self.slider_plot_profile_position.setMinimum(0) # # self.slider_plot_profile_position.setMaximum(1) # # self.slider_plot_profile_position.setTickInterval(1) # # self.slider_plot_profile_position.setValue(0) # # self.horizontalLayout_slider_plot_profile_position.addWidget(self.slider_plot_profile_position) # # # self.horizontalLayoutTop_signalProcessing.addWidget(self.groupbox_display_profile_position, 3) # ++++++++++++++++++++++++++++++++++++++++ # +++ --- GroupBox Post Processing --- +++ # ++++++++++++++++++++++++++++++++++++++++ self.verticalLayout_groupbox_post_processing = QVBoxLayout(self.groupbox_post_processing) self.groupbox_acoustic_profile = QGroupBox() self.verticalLayout_groupbox_post_processing.addWidget(self.groupbox_acoustic_profile) self.groupbox_window_size = QGroupBox() self.verticalLayout_groupbox_post_processing.addWidget(self.groupbox_window_size) self.groupbox_rayleigh_criterion = QGroupBox() self.verticalLayout_groupbox_post_processing.addWidget(self.groupbox_rayleigh_criterion) # --- Groupbox acoustic profile --- self.gridLayout_groupbox_acoustic_profile = QGridLayout(self.groupbox_acoustic_profile) self.checkbox_SNR_criterion = QCheckBox() self.gridLayout_groupbox_acoustic_profile.addWidget(self.checkbox_SNR_criterion, 0, 0, 1, 1) self.spinbox_SNR_criterion = QSpinBox() self.spinbox_SNR_criterion.setRange(0, 9999) self.spinbox_SNR_criterion.setValue(0) self.spinbox_SNR_criterion.setDisabled(True) self.gridLayout_groupbox_acoustic_profile.addWidget(self.spinbox_SNR_criterion, 0, 1, 1, 1) self.checkbox_SNR_criterion.clicked.connect(self.enable_disable_spinbox_snr_value) self.pushbutton_snr_filter = QPushButton() self.pushbutton_snr_filter.setText("Apply SNR") self.pushbutton_snr_filter.setDisabled(True) self.gridLayout_groupbox_acoustic_profile.addWidget(self.pushbutton_snr_filter, 0, 2, 1, 1) self.spinbox_SNR_criterion.valueChanged.connect(self.remove_point_with_snr_filter) # self.spinbox_SNR_criterion.valueChanged.connect(self.update_plot_profiles) # self.spinbox_SNR_criterion.valueChanged.connect(self.update_plot_profile_position_on_transect) self.pushbutton_snr_filter.clicked.connect(self.update_plot_profiles) # self.pushbutton_snr_filter.clicked.connect(self.remove_point_with_snr_filter) # self.pushbutton_snr_filter.clicked.connect(self.update_plot_profile_position_on_transect) # --- Groupbox Window size --- self.horizontalLayout_groupbox_window_size = QHBoxLayout(self.groupbox_window_size) self.label_signal_averaging_over = QLabel() self.label_signal_averaging_over.setText("Signal averaging over ") self.horizontalLayout_groupbox_window_size.addWidget(self.label_signal_averaging_over) self.spinbox_average = QSpinBox() self.spinbox_average.setRange(0, 9999) self.spinbox_average.setValue(0) self.horizontalLayout_groupbox_window_size.addWidget(self.spinbox_average) self.label_cells = QLabel() self.horizontalLayout_groupbox_window_size.addWidget(self.label_cells) # --- Groupbox Rayleigh criterion --- # # self.groupbox_rayleigh_criterion.setTitle("Rayleigh criterion") # # self.groupbox_despiking_signal = QGroupBox() # # self.groupbox_despiking_signal.setTitle("Despiking the signal") # # self.verticalLayout_despiking_signal = QVBoxLayout(self.groupbox_despiking_signal) # # self.horizontalLayout_despiking_signal_label = QHBoxLayout() # # # self.gridLayout_rayleigh_criterion = QGridLayout(self.groupbox_rayleigh_criterion) # self.horizontalLayout_rayleigh_criterion = QHBoxLayout(self.groupbox_rayleigh_criterion) # # self.label_Rayleigh_criterion = QLabel() # self.label_Rayleigh_criterion.setText("/² <=") # # self.horizontalLayout_despiking_signal_label.addWidget(self.label_Rayleigh_criterion) # # self.gridLayout_rayleigh_criterion.addWidget(self.label_Rayleigh_criterion, 0, 0, 1, 1) # self.horizontalLayout_rayleigh_criterion.addWidget(self.label_Rayleigh_criterion) # # self.lineEdit_despiking_signal_label = QLineEdit() # # self.lineEdit_despiking_signal_label.setText("10") # self.spinbox_rayleigh_criterion = QSpinBox() # self.spinbox_rayleigh_criterion.setRange(0, 9999) # self.spinbox_rayleigh_criterion.setValue(10) # # self.horizontalLayout_despiking_signal_label.addWidget(self.lineEdit_despiking_signal_label) # # self.gridLayout_rayleigh_criterion.addWidget(self.lineEdit_despiking_signal_label, 0, 1, 1, 1) # self.horizontalLayout_rayleigh_criterion.addWidget(self.spinbox_rayleigh_criterion) # self.label_4pi = QLabel() # self.label_4pi.setText("% x 4/pi") # # self.horizontalLayout_despiking_signal_label.addWidget(self.label_4pi) # # self.gridLayout_rayleigh_criterion.addWidget(self.label_4pi, 0, 2, 1, 1) # self.horizontalLayout_rayleigh_criterion.addWidget(self.label_4pi) # # self.verticalLayout_despiking_signal.addLayout(self.horizontalLayout_despiking_signal_label) # # self.pushbutton_despiking_signal = QPushButton() # # self.pushbutton_despiking_signal.setText("Despiking the signal") # # self.verticalLayout_despiking_signal.addWidget(self.pushbutton_despiking_signal) # self.checkbox_despiked_acoustic_signal = QCheckBox() # # self.checkbox_despiked_acoustic_signal.setText("Despiking") # self.checkbox_despiked_acoustic_signal.setToolTip("Enable for further computation") # # self.gridLayout_rayleigh_criterion.addWidget(self.checkbox_rayleigh_criterion_enable, 0, 3, 1, 1) # self.horizontalLayout_rayleigh_criterion.addWidget(self.checkbox_despiked_acoustic_signal) # # self.horizontalLayout_averaged_profile_despiking_signal.addWidget(self.groupbox_rayleigh_criterion) # # # self.verticalLayout_groupbox_averageprofile_despikingsignal.addWidget(self.groupbox_despiking_signal) # # self.horizontalLayoutMid_signalProcessing.addWidget(self.groupbox_post_processing, 3) # self.verticalLayout_left_SignalProcessingTab.addWidget(self.groupbox_post_processing) # # # self.horizontalLayoutBottom_signalProcessing = QHBoxLayout() # # self.verticalLayout_signalProcessingTab.addLayout(self.horizontalLayoutBottom_signalProcessing, 3) # # ++++++++++++++++++++++++++++++++++++ # +++ --- GroupBox FCB options --- +++ # ++++++++++++++++++++++++++++++++++++ self.verticalLayout_groupbox_FCBoption = QVBoxLayout(self.groupbox_FCBoption) # --- Groupbox water attenuation --- self.groupbox_water_attenuation = QGroupBox() self.verticalLayout_groupbox_FCBoption.addWidget(self.groupbox_water_attenuation) # self.verticalLayout_groupbox_water_attenuation = QVBoxLayout(self.groupbox_water_attenuation) # self.horizontalLayout_waterAttenuationModel_temperature = QHBoxLayout() # self.verticalLayout_groupbox_water_attenuation.addLayout( # self.horizontalLayout_waterAttenuationModel_temperature) # # self.combobox_water_attenuation_model = QComboBox() # self.combobox_water_attenuation_model.addItem("François & Garrison 1982") # self.combobox_water_attenuation_model.addItem("Other model") # self.horizontalLayout_waterAttenuationModel_temperature.addWidget(self.combobox_water_attenuation_model) # # self.label_temperature_water_attenation = QLabel() # # self.label_temperature_water_attenation.setText("Temperature:") # self.horizontalLayout_waterAttenuationModel_temperature.addWidget(self.label_temperature_water_attenation) # # # self.lineEdit_temperature_water_attenuation = QLineEdit() # self.spinbox_temperature_water_attenuation = QSpinBox() # self.horizontalLayout_waterAttenuationModel_temperature.addWidget(self.spinbox_temperature_water_attenuation) # # self.label_degre_celsius = QLabel() # self.label_degre_celsius.setText("°C") # self.horizontalLayout_waterAttenuationModel_temperature.addWidget(self.label_degre_celsius) # # self.horizontalLayout_comboboxFrequencies_WaterAttenuationValue = QHBoxLayout() # self.verticalLayout_groupbox_water_attenuation.addLayout( # self.horizontalLayout_comboboxFrequencies_WaterAttenuationValue) # # self.combobox_water_attenuation = QComboBox() # self.combobox_water_attenuation.addItem('0.3 MHz') # self.combobox_water_attenuation.addItem('0.5 MHz') # self.combobox_water_attenuation.addItem('1 MHz') # self.combobox_water_attenuation.addItem('5 MHz') # # self.combobox_water_attenuation.currentIndexChanged.connect(self.alpha_value_changed) # # self.horizontalLayout_comboboxFrequencies_WaterAttenuationValue.addWidget(self.combobox_water_attenuation) # # self.label_water_attenuation = QLabel() # self.label_water_attenuation.setText("\u03B1w = 0.02 dB/m") # self.label_water_attenuation.setFont(QFont("Ubuntu", 14, QFont.Normal)) # self.horizontalLayout_comboboxFrequencies_WaterAttenuationValue.addWidget(self.label_water_attenuation) # --- Groupbox fit regression line --- self.groupbox_fit_regression_line = QGroupBox() self.verticalLayout_groupbox_FCBoption.addWidget(self.groupbox_fit_regression_line) # self.verticalLayout_groupbox_fit_regression = QVBoxLayout(self.groupbox_fit_regression_line) # # self.label_alphaS_expression = QLabel() # # self.label_alphaS_expression.setText("For homogeneous suspension: dFCB/dr = -2\u03B1s<\sub>") # self.verticalLayout_groupbox_fit_regression.addWidget(self.label_alphaS_expression) # # self.horizontalLayout_alphaS_computation = QHBoxLayout() # self.verticalLayout_groupbox_fit_regression.addLayout(self.horizontalLayout_alphaS_computation) # # self.combobox_frequency_compute_alphaS = QComboBox() # self.combobox_frequency_compute_alphaS.addItem("0.3 MHz") # self.combobox_frequency_compute_alphaS.addItem("0.5 MHz") # self.combobox_frequency_compute_alphaS.addItem("1 MHz") # self.combobox_frequency_compute_alphaS.addItem("5 MHz") # self.combobox_frequency_compute_alphaS.addItem("All frequencies") # self.horizontalLayout_alphaS_computation.addWidget(self.combobox_frequency_compute_alphaS) # # self.label_alphaS_computation_from = QLabel() # # self.label_alphaS_computation_from.setText("From") # self.horizontalLayout_alphaS_computation.addWidget(self.label_alphaS_computation_from) # # # self.lineEdit_alphaS_computation_from = QLineEdit() # self.spinbox_alphaS_computation_from = QDoubleSpinBox() # self.spinbox_alphaS_computation_from.setRange(0, 9999) # self.horizontalLayout_alphaS_computation.addWidget(self.spinbox_alphaS_computation_from) # # self.label_alphaS_computation_to = QLabel() # # self.label_alphaS_computation_to.setText("to") # self.horizontalLayout_alphaS_computation.addWidget(self.label_alphaS_computation_to) # # # self.lineEdit_alphaS_computation_to = QLineEdit() # self.spinbox_alphaS_computation_to = QDoubleSpinBox() # self.horizontalLayout_alphaS_computation.addWidget(self.spinbox_alphaS_computation_to) # # self.horizontalLayout_fitButton_alphaWvalue = QHBoxLayout() # self.verticalLayout_groupbox_fit_regression.addLayout(self.horizontalLayout_fitButton_alphaWvalue) # # self.pushbutton_fit_regression_line = QPushButton() # self.pushbutton_fit_regression_line.setText("Fit && Compute \u03B1s") # self.horizontalLayout_fitButton_alphaWvalue.addWidget(self.pushbutton_fit_regression_line) # # self.label_alphaS = QLabel() # self.label_alphaS.setText("\u03B1s = " + "0.0" + "dB/m") # self.label_alphaS.setFont(QFont("Ubuntu", 14, QFont.Normal)) # self.horizontalLayout_fitButton_alphaWvalue.addWidget(self.label_alphaS) # # self.verticalLayout_groupbox_fit_regression # -------------------------------------------------------------------------------------------------------------- ### --- Layout of groupbox in the Right vertical layout box # Plot Profiles # ------------------------- # Plot averaged profile # ------------------------- # Plot FCB profiles self.groupbox_plot_profile = QGroupBox() self.verticalLayout_Right.addWidget(self.groupbox_plot_profile) self.groupbox_plot_averaged_profile = QGroupBox() self.verticalLayout_Right.addWidget(self.groupbox_plot_averaged_profile) self.groupbox_FCB_profile = QGroupBox() self.verticalLayout_Right.addWidget(self.groupbox_FCB_profile) # +++++++++++++++++++++++++++++++++++++ # +++ --- GroupBox Plot profile --- +++ # +++++++++++++++++++++++++++++++++++++ self.verticalLayout_groupbox_plot_profile = QVBoxLayout(self.groupbox_plot_profile) self.canvas_profile = None # # self.data_test_slider = np.array([[0, 1, 2, 3, 4, 5], # # [0, 1, 4, 9, 16, 25], # # [0, 1, 8, 27, 64, 125]]) # # # # self.verticalLayout_plotprofiles = QVBoxLayout(self.groupbox_plot_profile) # self.figure_profile, self.axis_profile = plt.subplots(nrows=1, ncols=4, layout='constrained') # self.canvas_profile = FigureCanvas(self.figure_profile) # # self.toolbar_profile =import NavigationToolBar(self.canvas_profile, self) # # self.addToolBar(Qt.RightToolBarArea, self.toolbar_profile) # # self.linear(self.figure_profile, self.axis_profile) # for i in range(4): # self.axis_profile[i].plot(self.model.BS_raw_cross_section.V[:, i, 0], self.model.r, c='k') # # self.axis_profile.plot(self.data_test_slider[0, :], self.data_test_slider[0, :]) # # self.toolbar_post_processing_tab = NavigationToolBar(self.canvas_profile, self) # # self.addToolBar(Qt.RightToolBarArea, self.toolbar_post_processing_tab) # # # self.label_icon = QLabel() # # self.label_icon.setPixmap(QPixmap("../icons/smiley1.jpg")) # # # self.verticalLayout_plotprofiles.addWidget(self.toolbar_profile) # self.verticalLayout_plotprofiles.addWidget(self.canvas_profile) # # self.verticalLayout_plotprofiles.addLayout(self.horizontalLayout_slider_plotprofil) # # # # self.verticalLayout_plotprofiles.addWidget(self.label_icon) # # self.verticalLayout_plotprofiles.addWidget(self.slider_plotprofile) # # # self.slider_plotprofile.valueChanged.connect(self.changePlot) # # # self.horizontalLayoutTop_signalProcessing.addLayout(self.verticalLayout_plotprofiles, 7) # # self.horizontalLayoutTop_signalProcessing.addWidget(self.groupbox_plot_profile, 7) # # self.verticalLayout_right_SignalProcessingTab.addWidget(self.toolbar_profile) # ++++++++++++++++++++++++++++++++++++++++++++++ # +++ --- GroupBox Plot averaged profile --- +++ # ++++++++++++++++++++++++++++++++++++++++++++++ self.verticalLayout_groupbox_plot_averaged_profile = QVBoxLayout(self.groupbox_plot_averaged_profile) self.canvas_averaged_profile = None # self.verticalLayout_averagedprofile = QVBoxLayout(self.groupbox_plot_averaged_profile) # self.figure_averagedprofile, self.axis_averagedprofile = plt.subplots(nrows=1, ncols=4, layout='constrained') # self.canvas_averagedprofile = FigureCanvas(self.figure_averagedprofile) # # self.toolbar_averagedprofile = NavigationToolBar(self.canvas_averagedprofile, self) # # self.addToolBar(Qt.RightToolBarArea, self.toolbar_averagedprofile) # # self.toolbar_profile = NavigationToolBar(self.canvas_averagedprofile, self) # # self.polynome(self.figure_averagedprofile, self.axis_averagedprofile) # for i in range(4): # self.axis_averagedprofile[i].plot(self.model.BS_averaged_cross_section.V[:, i, 0], self.model.r, c='b') # # self.toolbar_post_processing_tab = NavigationToolBar(self.canvas_averagedprofile, self) # # # self.horizontalLayout_slider_averagedprofile = QHBoxLayout() # # # # self.pushButton_slider_averagedprofile_right = QPushButton() # # self.pushButton_slider_averagedprofile_right.setIcon(icon_triangle_right) # # # # self.pushButton_slider_averagedprofile_left = QPushButton() # # self.pushButton_slider_averagedprofile_left.setIcon(icon_triangle_left) # # # # self.horizontalLayout_slider_averagedprofile.addWidget(self.pushButton_slider_averagedprofile_left) # # self.horizontalLayout_slider_averagedprofile.addWidget(self.pushButton_slider_averagedprofile_right) # # # # self.lineEdit_slider_averaged_profile = QLineEdit() # # self.lineEdit_slider_averaged_profile.setFixedWidth(50) # # self.lineEdit_slider_averaged_profile.setText("1") # # self.horizontalLayout_slider_averagedprofile.addWidget(self.lineEdit_slider_averaged_profile) # # # # self.slider_averagedprofile = QSlider() # # self.slider_averagedprofile.setOrientation(Qt.Horizontal) # # self.slider_averagedprofile.setTickPosition(QSlider.TicksBelow) # # self.slider_averagedprofile.setCursor(Qt.OpenHandCursor) # # self.slider_averagedprofile.setMinimum(0) # # self.slider_averagedprofile.setMaximum(1) # # self.slider_averagedprofile.setTickInterval(1) # # self.slider_averagedprofile.setValue(0) # # # self.slider_plotprofile.valueChanged.connect(self.changePlot) # # # # self.horizontalLayout_slider_averagedprofile.addWidget(self.slider_averagedprofile) # # # self.verticalLayout_averagedprofile.addWidget(self.toolbar_averagedprofile) # self.verticalLayout_averagedprofile.addWidget(self.canvas_averagedprofile) # # self.verticalLayout_averagedprofile.addLayout(self.horizontalLayout_slider_averagedprofile) # # # self.horizontalLayoutMid_signalProcessing.addLayout(self.verticalLayout_averagedprofile, 7) # # self.horizontalLayoutMid_signalProcessing.addWidget(self.groupbox_plot_averaged_profile, 7) # ++++++++++++++++++++++++++++++++++++++++++++++ # +++ --- GroupBox Plot FCB profile --- +++ # ++++++++++++++++++++++++++++++++++++++++++++++ self.verticalLayout_groupbox_plot_FCB_profile = QVBoxLayout(self.groupbox_FCB_profile) self.canvas_FCB_profile = None # self.verticalLayout_FCBoptions = QVBoxLayout(self.groupbox_FCB_profile) # self.figure_FCBoptions, self.axis_FCBoptions = plt.subplots(nrows=1, ncols=4, layout="constrained") # self.canvas_FCBoptions = FigureCanvas(self.figure_FCBoptions) # self.toolbar_FCBoptions = NavigationToolBar(self.canvas_FCBoptions, self) # # self.addToolBar(Qt.LeftToolBarArea, self.toolbar_FCBoptions) # # self.toolbar_profile = NavigationToolBar(self.canvas_FCBoptions, self) # # self.cubique(self.figure_FCBoptions, self.axis_FCBoptions) # for i in range(4): # self.axis_FCBoptions[i].plot(self.model.FCB[:, i, 0], self.model.r, c='r') # # self.toolbar_post_processing_tab = NavigationToolBar(self.canvas_FCBoptions, self) # # # self.horizontalLayout_slider_FCBoptions = QHBoxLayout() # # # # self.pushButton_slider_FCBoptions_right = QPushButton() # # self.pushButton_slider_FCBoptions_right.setIcon(icon_triangle_right) # # # # self.pushButton_slider_FCBoptions_left = QPushButton() # # self.pushButton_slider_FCBoptions_left.setIcon(icon_triangle_left) # # # # self.horizontalLayout_slider_FCBoptions.addWidget(self.pushButton_slider_FCBoptions_left) # # self.horizontalLayout_slider_FCBoptions.addWidget(self.pushButton_slider_FCBoptions_right) # # # # self.lineEdit_slider_FCBplot = QLineEdit() # # self.lineEdit_slider_FCBplot.setFixedWidth(50) # # self.lineEdit_slider_FCBplot.setText("1") # # self.horizontalLayout_slider_FCBoptions.addWidget(self.lineEdit_slider_FCBplot) # # # # self.slider_FCBoptions = QSlider() # # self.slider_FCBoptions.setOrientation(Qt.Horizontal) # # self.slider_FCBoptions.setTickPosition(QSlider.TicksBelow) # # self.slider_FCBoptions.setCursor(Qt.OpenHandCursor) # # self.slider_FCBoptions.setMinimum(0) # # self.slider_FCBoptions.setMaximum(1) # # self.slider_FCBoptions.setTickInterval(1) # # self.slider_FCBoptions.setValue(0) # # # self.slider_plotprofile.valueChanged.connect(self.changePlot) # # # # self.horizontalLayout_slider_FCBoptions.addWidget(self.slider_FCBoptions) # # # self.verticalLayout_FCBoptions.addWidget(self.toolbar_FCBoptions) # self.verticalLayout_FCBoptions.addWidget(self.canvas_FCBoptions) # # self.verticalLayout_FCBoptions.addLayout(self.horizontalLayout_slider_FCBoptions) # # # self.horizontalLayoutBottom_signalProcessing.addLayout(self.verticalLayout_FCBoptions, 7) # # self.horizontalLayoutBottom_signalProcessing.addWidget(self.groupbox_FCB_profile, 7) # # --- Slider ---- self.horizontalLayout_slider = QHBoxLayout() self.verticalLayout_Right.addLayout(self.horizontalLayout_slider) self.pushbutton_slider_left = QPushButton() self.pushbutton_slider_left.setIcon(icon_triangle_left) self.horizontalLayout_slider.addWidget(self.pushbutton_slider_left) self.pushbutton_slider_right = QPushButton() self.pushbutton_slider_right.setIcon(icon_triangle_right) self.horizontalLayout_slider.addWidget(self.pushbutton_slider_right) self.pushbutton_slider_right.clicked.connect(self.slide_profile_number_to_right) self.pushbutton_slider_left.clicked.connect(self.slide_profile_number_to_left) # self.horizontalLayout_slider_plotprofil.addWidget(self.pushButton_slider_plotprofile_left) # self.horizontalLayout_slider_plotprofil.addWidget(self.pushButton_slider_plotprofile_right) # self.lineEdit_slider = QLineEdit() self.lineEdit_slider.setText("1") # # self.lineEdit_slider_acoustic_profile.setFixedWidth(self.pushButton_slider_plotprofile_left.size().width()) self.lineEdit_slider.setFixedWidth(50) self.horizontalLayout_slider.addWidget(self.lineEdit_slider) self.lineEdit_slider.returnPressed.connect(self.profile_number_on_lineEdit) self.slider = QSlider() self.horizontalLayout_slider.addWidget(self.slider, 9) self.slider.setOrientation(Qt.Horizontal) # # self.slider_plotprofile.setTickPosition(QSlider.TicksBelow) self.slider.setCursor(Qt.OpenHandCursor) self.slider.setMinimum(1) # self.slider.setMaximum(stg.nb_profiles)#self.model.BS_averaged_cross_section_corr.V.shape[2]) self.slider.setTickInterval(1) self.slider.setValue(1) self.slider.valueChanged.connect(self.update_lineEdit_by_moving_slider) self.slider.valueChanged.connect(self.update_plot_profile_position_on_transect) self.slider.valueChanged.connect(self.update_plot_profiles) self.retranslate_signal_processing_tab() # # -------------------- Functions for Signal processing Tab -------------------- # def retranslate_signal_processing_tab(self): self.pushbutton_load_data.setText(_translate("CONSTANT_STRING", cs.LOAD_DATA_FROM_ACOUSTIC_DATA_TAB)) self.groupbox_display_profile_position.setTitle(_translate("CONSTANT_STRING", cs.DISPLAY_PROFILE_POSITION)) # self.label_profile_number.setText(_translate("CONSTANT_STRING", cs.PROFILE_NUMBER) + " " + # str(self.string_profile_number) + " / " + str(self.string_profile_number_max)) self.groupbox_post_processing.setTitle(_translate("CONSTANT_STRING", cs.POST_PROCESSING)) self.groupbox_acoustic_profile.setTitle(_translate("CONSTANT_STRING", cs.ACOUSTIC_PROFILE)) # self.checkbox_substract_noise.setText(_translate("CONSTANT_STRING", cs.SUBTRACT_THE_NOISE)) self.checkbox_SNR_criterion.setText(_translate("CONSTANT_STRING", cs.SNR_CRITERION)) # self.groupbox_window_size.setTitle(_translate("CONSTANT_STRING", cs.WINDOW_SIZE)) # self.label_averageH.setText(_translate("CONSTANT_STRING", cs.HORIZONTAL) + ": +/-") self.label_cells.setText(_translate("CONSTANT_STRING", cs.CELLS) + " = +/- ? sec") self.groupbox_rayleigh_criterion.setTitle(_translate("CONSTANT_STRING", cs.RAYLEIGH_CRITERION)) # self.checkbox_despiked_acoustic_signal.setText(_translate("CONSTANT_STRING", cs.DESPIKING)) # self.groupbox_FCBoption.setTitle(_translate("CONSTANT_STRING", cs.FCB_OPTIONS)) # self.groupbox_water_attenuation.setTitle(_translate("CONSTANT_STRING", cs.COMPUTING_WATER_ATTENUATION)) # self.label_temperature_water_attenation.setText(_translate("CONSTANT_STRING", cs.TEMPERATURE) + ":") # self.groupbox_fit_regression_line.setTitle(_translate("CONSTANT_STRING", cs.FIT_REGRESSION_LINE)) # self.label_alphaS_expression.setText( # _translate("CONSTANT_STRING", cs.FOR_HOMOGENEOUS_SUSPENSION) + ": dFCB/dr = -2\u03B1s<\sub>") # self.label_alphaS_computation_from.setText(_translate("CONSTANT_STRING", cs.FROM)) # self.label_alphaS_computation_to.setText(_translate("CONSTANT_STRING", cs.TO)) # self.groupbox_plot_profile.setTitle(_translate("CONSTANT_STRING", cs.PROFILE)) self.groupbox_plot_averaged_profile.setTitle(_translate("CONSTANT_STRING", cs.AVERAGED_PROFILE)) self.groupbox_FCB_profile.setTitle(_translate("CONSTANT_STRING", cs.FCB_PROFILE)) def slide_profile_number_to_right(self): self.slider.setValue(int(self.slider.value()) + 1) self.lineEdit_slider.setText(str(self.slider.value())) def slide_profile_number_to_left(self): self.slider.setValue(int(self.slider.value()) - 1) self.lineEdit_slider.setText(str(self.slider.value())) def profile_number_on_lineEdit(self): self.slider.setValue(int(self.lineEdit_slider.text())) def update_lineEdit_by_moving_slider(self): self.lineEdit_slider.setText(str(self.slider.value())) def enable_disable_spinbox_snr_value(self): if self.checkbox_SNR_criterion.isChecked(): self.spinbox_SNR_criterion.setEnabled(True) self.pushbutton_snr_filter.setEnabled(True) else: self.spinbox_SNR_criterion.setDisabled(True) self.pushbutton_snr_filter.setDisabled(True) def remove_point_with_snr_filter(self): stg.BS_data_filter_snr = deepcopy(stg.BS_data) print("Before : ", np.sum(np.isnan(stg.BS_data_filter_snr[:, 0, :]))) for f in range(stg.freq.shape[0]): stg.BS_data_filter_snr[np.where(stg.SNR_data[:, 0, :] < self.spinbox_SNR_criterion.value())[0], f, np.where(stg.SNR_data[:, 0, :] < self.spinbox_SNR_criterion.value())[1]] \ = np.nan print("After : ", np.sum(np.isnan(stg.BS_data_filter_snr[:, 0, :]))) def plot_profile_position_on_transect(self): self.combobox_frequency.addItems(stg.freq_text) self.slider.setMaximum(stg.t.shape[0]) self.label_profile_number.clear() self.label_profile_number.setText("Profile " + str(self.slider.value()) + " / " + str(self.slider.maximum())) self.canvas_plot_profile_position_on_transect = FigureCanvas() self.figure_plot_profile_position_on_transect, self.axis_plot_profile_position_on_transect = \ plt.subplots(nrows=1, ncols=1, layout="constrained") self.canvas_plot_profile_position_on_transect = FigureCanvas(self.figure_plot_profile_position_on_transect) self.verticalLayout_groupbox_display_profile_position.addWidget(self.canvas_plot_profile_position_on_transect) if stg.r_bottom.size == 0: val_min = np.min(stg.BS_data[:, stg.freq_bottom_detection, :]) val_max = np.max(stg.BS_data[:, stg.freq_bottom_detection, :]) if val_min == 0: val_min = 1e-5 pcm = self.axis_plot_profile_position_on_transect.pcolormesh( stg.t, -stg.r, stg.BS_data[:, stg.freq_bottom_detection, :], cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) if stg.r_bottom.size != 0: self.axis_plot_profile_position_on_transect.plot( stg.t, -stg.r_bottom, color='black', linewidth=1, linestyle="solid") self.axis_plot_profile_position_on_transect.plot( stg.t[self.slider.value() - 1] * np.ones(stg.r.shape[0]), -stg.r, color='red', linestyle="solid", linewidth=2) self.figure_plot_profile_position_on_transect.canvas.draw_idle() else: stg.BS_data_section = deepcopy(stg.BS_data) for f in range(stg.freq.shape[0]): for k in range(stg.r_bottom.shape[0]): # print(k, np.where(stg.r >= stg.r_bottom[k])[0]) stg.BS_data_section[np.where(stg.r >= stg.r_bottom[k])[0], f, k] \ = np.nan # print("----------------------------------------------------------") val_min = np.min(stg.BS_data_section[:, stg.freq_bottom_detection, :]) val_max = np.max(stg.BS_data_section[:, stg.freq_bottom_detection, :]) if val_min == 0: val_min = 1e-5 pcm = self.axis_plot_profile_position_on_transect.pcolormesh( stg.t, -stg.r, stg.BS_data_section[:, stg.freq_bottom_detection, :], cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) if stg.r_bottom.size != 0: self.axis_plot_profile_position_on_transect.plot( stg.t, -stg.r_bottom, color='black', linewidth=1, linestyle="solid") self.axis_plot_profile_position_on_transect.plot( stg.t[self.slider.value() - 1] * np.ones(stg.r.shape[0]), -stg.r, color='red', linestyle="solid", linewidth=2) self.figure_plot_profile_position_on_transect.canvas.draw_idle() def update_plot_profile_position_on_transect(self): # --- Update label "Profile N / max(N)" --- self.label_profile_number.clear() self.label_profile_number.setText("Profile " + str(self.slider.value()) + " / " + str(self.slider.maximum())) # --- Update transect plot --- if self.canvas_plot_profile_position_on_transect != None: if stg.r_bottom.size != 0: self.axis_plot_profile_position_on_transect.cla() val_min = np.min(stg.BS_data_section[:, self.combobox_frequency.currentIndex(), :]) val_max = np.max(stg.BS_data_section[:, self.combobox_frequency.currentIndex(), :]) if val_min == 0: val_min = 1e-5 pcm = self.axis_plot_profile_position_on_transect.pcolormesh( stg.t, -stg.r, stg.BS_data_section[:, self.combobox_frequency.currentIndex(), :], cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) if stg.r_bottom.size != 0: self.axis_plot_profile_position_on_transect.plot( stg.t, -stg.r_bottom, color='black', linewidth=1, linestyle="solid") self.axis_plot_profile_position_on_transect.plot( stg.t[self.slider.value() - 1] * np.ones(stg.r.shape[0]), -stg.r, color='red', linestyle="solid", linewidth=2) self.figure_plot_profile_position_on_transect.canvas.draw_idle() else: self.axis_plot_profile_position_on_transect.cla() val_min = np.min(stg.BS_data[:, self.combobox_frequency.currentIndex(), :]) val_max = np.max(stg.BS_data[:, self.combobox_frequency.currentIndex(), :]) if val_min == 0: val_min = 1e-5 pcm = self.axis_plot_profile_position_on_transect.pcolormesh( stg.t, -stg.r, stg.BS_data[:, self.combobox_frequency.currentIndex(), :], cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) if stg.r_bottom.size != 0: self.axis_plot_profile_position_on_transect.plot( stg.t, -stg.r_bottom, color='black', linewidth=1, linestyle="solid") self.axis_plot_profile_position_on_transect.plot( stg.t[self.slider.value()-1] * np.ones(stg.r.shape[0]), -stg.r, color='red', linestyle="solid", linewidth=2) self.figure_plot_profile_position_on_transect.canvas.draw_idle() def plot_profiles(self): # --- Raw profile --- self.figure_profile, self.axis_profile \ = plt.subplots(nrows=1, ncols=stg.freq.shape[0], layout='constrained') self.canvas_profile = FigureCanvas(self.figure_profile) self.verticalLayout_groupbox_plot_profile.addWidget(self.canvas_profile) for f in range(stg.freq.shape[0]): self.axis_profile[f].cla() self.axis_profile[f].plot(stg.BS_data[:, f, self.slider.value() - 1], -stg.r, linestyle='solid', color='k', linewidth=1) if stg.r_bottom.size != 0: self.axis_profile[f].plot( np.array([0, np.nanmax(stg.BS_data[:, stg.freq_bottom_detection, self.slider.value() - 1])]), -stg.r_bottom[self.slider.value() - 1]*np.ones(2), linestyle='solid', color='red', linewidth=1) self.axis_profile[f].set_ylim(-np.max(stg.r), np.min(stg.r)) self.figure_profile.canvas.draw_idle() # --- Raw averaged profile --- self.figure_averaged_profile, self.axis_averaged_profile \ = plt.subplots(nrows=1, ncols=stg.freq.shape[0], layout='constrained') self.canvas_averaged_profile = FigureCanvas(self.figure_averaged_profile) self.verticalLayout_groupbox_plot_averaged_profile.addWidget(self.canvas_averaged_profile) for f in range(stg.freq.shape[0]): self.axis_averaged_profile[f].cla() self.axis_averaged_profile[f].plot(stg.BS_data[:, f, self.slider.value() - 1], -stg.r, linestyle='solid', color='k', linewidth=1) self.axis_averaged_profile[f].set_ylim(-np.max(stg.r), np.min(stg.r)) # --- Raw FCB profile --- self.figure_FCB_profile, self.axis_FCB_profile \ = plt.subplots(nrows=1, ncols=stg.freq.shape[0], layout='constrained') self.canvas_FCB_profile = FigureCanvas(self.figure_FCB_profile) self.verticalLayout_groupbox_plot_FCB_profile.addWidget(self.canvas_FCB_profile) def update_plot_profiles(self): if self.checkbox_SNR_criterion.isChecked(): # self.remove_point_with_snr_filter() for f in range(stg.freq.shape[0]): self.axis_profile[f].cla() self.axis_profile[f].plot(stg.BS_data_filter_snr[:, f, self.slider.value()-1], -stg.r, linestyle='solid', color='k', linewidth=1) # if stg.r_bottom.size != 0: # self.axis_profile[f].plot( # np.array([0, np.nanmax(stg.BS_data[:, stg.freq_bottom_detection, self.slider.value() - 1])]), # -stg.r_bottom[self.slider.value() - 1] * np.ones(2), # linestyle='dashed', color='red', linewidth=1) self.axis_profile[f].set_ylim(-np.max(stg.r), np.min(stg.r)) else: for f in range(stg.freq.shape[0]): self.axis_profile[f].cla() self.axis_profile[f].plot(stg.BS_data[:, f, self.slider.value()-1], -stg.r, linestyle='solid', color='k', linewidth=1) # if stg.r_bottom.size != 0: # self.axis_profile[f].plot( # np.array([0, np.nanmax(stg.BS_data[:, stg.freq_bottom_detection, self.slider.value() - 1])]), # -stg.r_bottom[self.slider.value() - 1] * np.ones(2), # linestyle='dashed', color='red', linewidth=1) self.axis_profile[f].set_ylim(-np.max(stg.r), np.min(stg.r)) self.figure_profile.canvas.draw_idle() def compute_averaged_profile(self): pass # def plot_transect_bottom_with_profile_position(self, profile_position): # frequency = self.model.Freq[0] # val_min = 0 # np.nanmin(self.model.BS_averaged_cross_section_corr.V[:, 0, :]) # val_max = np.nanmax(self.model.BS_averaged_cross_section_corr.V[:, 0, :]) # # print('val_min=', val_min) # # print('val_max=', val_max) # if val_min == 0: # val_min = 1e-5 # # print('val_min update=', val_min) # # if val_min == 0: # # val_min = 1e-5 # # self.axis_plot_profile_position_on_transect.imshow(np.asarray(np.array(self.model.V[:, 0, :2300], dtype=float)), aspect='auto', # # extent=[0, 2300, self.model.depth[-1][0], self.model.depth[0][0]], # # cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) # self.axis_plot_profile_position_on_transect.cla() # # self.figure_plot_profile_position_on_transect.clf() # self.axis_plot_profile_position_on_transect.pcolormesh(self.model.dist_BS_section, # np.flipud(self.model.BS_raw_cross_section.r), # self.model.BS_averaged_cross_section_corr.V[:, 0, # :], # cmap='viridis', # norm=LogNorm(vmin=val_min, vmax=val_max), # shading='gouraud') # self.axis_plot_profile_position_on_transect.plot(self.model.dist_BS_section, # np.max(self.model.r_bottom_cross_section) - # self.model.r_bottom_cross_section + # np.min(self.model.r_bottom_cross_section), # color='k', linewidth=2) # self.axis_plot_profile_position_on_transect.plot( # self.model.dist_BS_section[profile_position] * np.ones(self.model.r_bottom_cross_section.shape[0]), # self.model.r_bottom_cross_section, color='red', linestyle="solid", linewidth=2) # self.axis_plot_profile_position_on_transect.set_xticks([]) # self.axis_plot_profile_position_on_transect.set_yticks([]) # self.figure_plot_profile_position_on_transect.canvas.draw_idle() # # # def changePlot(self): # value = self.slider_plotprofile.value() # # self.string_profile_number = value # self.label_profile_number.setText("Profile " + str(value) + # " / " + str(self.string_profile_number_max)) # # self.plot_transect_bottom_with_profile_position(value) # # self.lineEdit_slider_acoustic_profile.setText(str(value)) # # for i in range(4): # self.axis_profile[i].cla() # self.axis_profile[i].plot(self.model.BS_raw_cross_section.V[:, i, value-1], self.model.r, c='k') # # self.axis_averagedprofile[i].cla() # self.axis_averagedprofile[i].plot(self.model.BS_averaged_cross_section.V[:, i, value-1], self.model.r, c='b') # # self.axis_FCBoptions[i].cla() # self.axis_FCBoptions[i].plot(self.model.FCB[:, i, value-1], self.model.r, c='r') # # self.axis_profile.plot(self.data_test_slider[0, :], self.data_test_slider[value-1, :]) # # self.figure_profile.canvas.draw_idle() # # self.figure_profile.canvas.flush_events() # self.figure_averagedprofile.canvas.draw_idle() # # self.figure_averagedprofile.canvas.flush_events() # self.figure_FCBoptions.canvas.draw_idle() # # self.figure_FCBoptions.canvas.flush_events() # def linear(self, figure, axis, i): # # for i in range(4): # # axis[i].plot([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], '*-') # # figure.tight_layout() # for i in range(4): # axis[i].plot(self.model.BS_raw_cross_section.V[:, i, 800], self.model.r, c='k') # # def polynome(self, figure, axis): # # for i in range(4): # # axis[i].plot([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100], '*-') # # figure.tight_layout() # for i in range(4): # axis[i].plot(self.model.BS_averaged_cross_section.V[:, i, 800], self.model.r, c='b') # # def cubique(self, figure, axis): # # for i in range(4): # # axis[i].plot([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000], '*-') # # figure.tight_layout() # for i in range(4): # axis[i].plot(self.model.FCB[:, i, 800], self.model.r, c='r') # #