diff --git a/ABS_calibration_constant_kt.xlsx b/ABS_calibration_constant_kt.xlsx new file mode 100644 index 0000000..577741f Binary files /dev/null and b/ABS_calibration_constant_kt.xlsx differ diff --git a/AcouSed_UserManual.pdf b/AcouSed_UserManual.pdf new file mode 100644 index 0000000..9512bc0 Binary files /dev/null and b/AcouSed_UserManual.pdf differ diff --git a/Acoustic_Inversion_theory.pdf b/Acoustic_Inversion_theory.pdf new file mode 100644 index 0000000..d10560a Binary files /dev/null and b/Acoustic_Inversion_theory.pdf differ diff --git a/Model/acoustic_inversion_method_high_concentration.py b/Model/acoustic_inversion_method_high_concentration.py index b7c943c..83482b3 100644 --- a/Model/acoustic_inversion_method_high_concentration.py +++ b/Model/acoustic_inversion_method_high_concentration.py @@ -1,3 +1,26 @@ +# ============================================================================== # + # mainwindow.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + + # by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + import matplotlib.pyplot as plt import numpy as np import settings as stg @@ -277,6 +300,7 @@ class AcousticInversionMethodHighConcentration(): def M_profile_SCC_fine_interpolated(self, sample_depth, M_profile, range_cells, r_bottom): res = np.zeros((len(range_cells),)) * np.nan + print("range_cells ", range_cells.shape) l0 = sample_depth print("l0 = ", l0) l1 = [l0.index(x) for x in sorted(l0)] @@ -322,6 +346,9 @@ class AcousticInversionMethodHighConcentration(): i += -1 if r_bottom.size != 0: + print("res ", res.shape) + print("range_cells ", len(range_cells)) + # print("r_bottom ", len(r_bottom)) res[np.where(range_cells > r_bottom)] = np.nan loc_point_lin_interp0 = range_cells[np.where((range_cells > l2[0]) & (range_cells < l2[-1]))] diff --git a/Model/calibration_constant_kt.py b/Model/calibration_constant_kt.py index c1743e1..e7301d3 100644 --- a/Model/calibration_constant_kt.py +++ b/Model/calibration_constant_kt.py @@ -1,68 +1,60 @@ -import sys +# ============================================================================== # + # calibration_constant_kt.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # -import os -import pandas as pd -from PyQt5.QtGui import QIcon, QPixmap -from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout, QVBoxLayout, QApplication, QMainWindow, QGridLayout, - QDialog, QDialogButtonBox, QPushButton, QTextEdit, QFrame, QTabWidget, QScrollArea, - QLineEdit, QFileDialog) -from PyQt5.QtCore import Qt + # by Brahim MOUDJED # +# ============================================================================== # -import numpy as np from os import path - -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, BoundaryNorm - -import datetime - -import settings as stg - -from Translation.constant_string import HORIZONTAL -from settings import depth_cross_section +import pandas as pd +from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QDialog, QTabWidget, QGridLayout, QScrollArea, + QFileDialog, QMessageBox, QLabel) +from PyQt5.QtCore import Qt class CalibrationConstantKt(QDialog): - icon_folder = ( - "/home/bmoudjed/Documents/3 SSC acoustic meas project/Graphical interface project/acoused/icons/folder.png") - def __init__(self, parent=None): super(CalibrationConstantKt, self).__init__(parent) - - self.setGeometry(400, 200, 300, 400) self.setWindowTitle("Calibration constant kt") self.verticalLayout_Main = QVBoxLayout() - self.setLayout(self.verticalLayout_Main) - - self.horizontalLayout_file = QHBoxLayout() - self.verticalLayout_Main.addLayout(self.horizontalLayout_file) - - self.pushbutton_file = QPushButton() - self.pushbutton_file.setIcon(QIcon(CalibrationConstantKt.icon_folder)) - self.horizontalLayout_file.addWidget(self.pushbutton_file) - # self.pushbutton_file.clicked.connect(self.open_dialog_box) - - self.lineEdit_file = QLineEdit() - self.horizontalLayout_file.addWidget(self.lineEdit_file) self.tab = QTabWidget() self.verticalLayout_Main.addWidget(self.tab) - # "/home/bmoudjed/Documents/3 SSC acoustic meas project/Graphical interface project/acoused/ - self.data_ABS = pd.read_excel("ABS_calibration_constant_kt.xlsx", header=0, sheet_name=None) - self.lineEdit_file.setText("ABS_calibration_constant_kt.xlsx") + try: + self.data_ABS = pd.read_excel("ABS_calibration_constant_kt.xlsx", header=0, sheet_name=None) - print([*self.data_ABS.values()][0].columns[1]) + except FileNotFoundError as e: + msgBox = QMessageBox() + msgBox.setWindowTitle("File Not Found Error") + msgBox.setIcon(QMessageBox.Warning) + msgBox.setText("Please check Excel file name for the calibration constant kt \n" + "It should be an excel file named : 'ABS_calibration_constant_kt.xlsx'") + msgBox.setStandardButtons(QMessageBox.Ok) + msgBox.exec() + + self.setLayout(self.verticalLayout_Main) self.load_freq_and_kt_values() def open_dialog_box(self): @@ -86,12 +78,12 @@ class CalibrationConstantKt(QDialog): for t_index, t_value in enumerate(list(self.data_ABS.keys())): - exec("self.tab_" + str(t_index) + "= QWidget()") - eval("self.tab.addTab(self.tab_" + str(t_index) + ", '" + str(t_value) + "')") + exec("self.tab_calib_" + str(t_index) + "= QWidget()") + eval("self.tab.addTab(self.tab_calib_" + str(t_index) + ", '" + str(t_value) + "')") - exec("self.verticalLayout_tab_" + str(t_index) + "= QVBoxLayout(self.tab_" + str(t_index) + ")") + exec("self.verticalLayout_tab_" + str(t_index) + "= QVBoxLayout(self.tab_calib_" + str(t_index) + ")") - exec("self.scrollarea_tab_" + str(t_index) + " = QScrollArea(self.tab_" + str(t_index) + ")") + exec("self.scrollarea_tab_" + str(t_index) + " = QScrollArea(self.tab_calib_" + str(t_index) + ")") eval("self.scrollarea_tab_" + str(t_index) + ".setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)") eval("self.scrollarea_tab_" + str(t_index) + ".setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)") eval("self.scrollarea_tab_" + str(t_index) + ".setWidgetResizable(True)") @@ -122,10 +114,10 @@ class CalibrationConstantKt(QDialog): ", " + str(x+1) + ", 1, 1, 1, Qt.AlignCenter)") -if __name__ == "__main__": - app = QApplication(sys.argv) - cal = CalibrationConstantKt() - cal.show() - # sys.exit(app.exec_()) - app.exec() +# if __name__ == "__main__": +# app = QApplication(sys.argv) +# cal = CalibrationConstantKt() +# cal.show() +# # sys.exit(app.exec_()) +# app.exec() diff --git a/Model/create_table_for_save_as.py b/Model/create_table_for_save_as.py index cc721be..0a56f28 100644 --- a/Model/create_table_for_save_as.py +++ b/Model/create_table_for_save_as.py @@ -1,3 +1,26 @@ +# ============================================================================== # + # create_table_for_save_as.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + + # by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + import numpy as np from PyQt5.QtWidgets import QFileDialog, QApplication, QMessageBox import sqlite3 @@ -26,8 +49,11 @@ class CreateTableForSaveAs: self.create_Measure = """ CREATE TABLE Measure( ID INTEGER PRIMARY KEY AUTOINCREMENT, - acoustic_data INTEGER, - frequency FLOAT, + acoustic_data INTEGER, + Date DATE, + Hour TIME, + frequency FLOAT, + sound_attenuation FLOAT, kt_read FLOAT, kt_corrected FLOAT, NbProfiles FLOAT, @@ -38,20 +64,23 @@ class CreateTableForSaveAs: NbPingsPerSeconds FLOAT, NbPingsAveragedPerProfile FLOAT, GainRx FLOAT, - GainTx FLOAT) + GainTx FLOAT + ) """ self.create_BSRawData = '''CREATE TABLE BSRawData( ID INTEGER PRIMARY KEY AUTOINCREMENT, acoustic_data INTEGER, time BLOB, depth BLOB, BS_raw_data BLOB, + time_reshape BLOB, depth_reshape BLOB, BS_raw_data_reshape BLOB, time_cross_section BLOB, depth_cross_section BLOB, BS_cross_section BLOB, BS_stream_bed BLOB, depth_bottom, val_bottom, ind_bottom, time_noise BLOB, depth_noise BLOB, BS_noise_raw_data BLOB, SNR_raw_data BLOB, SNR_cross_section BLOB, SNR_stream_bed BLOB, BS_raw_data_pre_process_SNR BLOB, BS_raw_data_pre_process_average BLOB, BS_cross_section_pre_process_SNR BLOB, BS_cross_section_pre_process_average BLOB, - BS_stream_bed_pre_process_SNR BLOB, BS_stream_bed_pre_process_average BLOB + BS_stream_bed_pre_process_SNR BLOB, BS_stream_bed_pre_process_average BLOB, + BS_mean BLOB )''' self.create_Settings = '''CREATE TABLE Settings( @@ -60,16 +89,27 @@ class CreateTableForSaveAs: temperature FLOAT, tmin_index FLOAT, tmin_value FLOAT, tmax_index FLOAT, tmax_value FLOAT, rmin_index FLOAT, rmin_value FLOAT, rmax_index FLOAT, rmax_value FLOAT, - freq_bottom_detection, dept_bottom_detection_min, depth_bottom_detection_max, depth_bottom_detection_1st_int_area, + freq_bottom_detection_index FLOAT, freq_bottom_detection_value STRING, SNR_filter_value FLOAT, Nb_cells_to_average_BS_signal FLOAT )''' self.create_SedimentsFile = """CREATE TABLE SedimentsFile( - ID INTEGER PRIMARY KEY AUTOINCREMENT, - path_fine STRING, - filename_fine STRING - ) - """ + ID INTEGER PRIMARY KEY AUTOINCREMENT, + path_fine STRING, + filename_fine STRING, + radius_grain_fine BLOB, + path_sand STRING, + filename_sand STRING, + radius_grain_sand BLOB, + time_column_label STRING, + distance_from_bank_column_label STRING, + depth_column_label STRING, + Ctot_fine_column_label STRING, + D50_fine_column_label STRING, + Ctot_sand_column_label STRING, + D50_sand_column_label STRING + ) + """ self.create_SedimentsData = """CREATE TABLE SedimentsData( ID INTEGER PRIMARY KEY AUTOINCREMENT, @@ -82,7 +122,17 @@ class CreateTableForSaveAs: Ctot_fine_per_cent FLOAT, D50_fine FLOAT, frac_vol_fine BLOB, - frac_vol_fine_cumul BLOB + frac_vol_fine_cumul BLOB, + sample_sand_name STRING, + sample_sand_index INTEGER, + distance_from_bank_sand FLOAT, + depth_sand FLOAT, + time_sand FLOAT, + Ctot_sand FLOAT, + Ctot_sand_per_cent FLOAT, + D50_sand FLOAT, + frac_vol_sand BLOB, + frac_vol_sand_cumul BLOB ) """ @@ -148,9 +198,9 @@ class CreateTableForSaveAs: cur = cnx.cursor() # -------------------------------------------------------------------------------------------------------------- - # ++++++++++++++++++ - # --- Table File --- - # ++++++++++++++++++ + # +++++++++++++++++++++++++++ + # --- Table Acoustic File --- + # +++++++++++++++++++++++++++ start_table_File = time.time() @@ -188,17 +238,21 @@ class CreateTableForSaveAs: # Execute the CREATE TABLE statement cur.execute(self.create_Measure) - + print("stg.date ", stg.date, "stg.hour ", stg.hour) # Fill the table Measure for i in stg.acoustic_data: for j in range(stg.freq[i].shape[0]): - cur.execute(''' INSERT into Measure(acoustic_data, frequency, kt_read, kt_corrected, NbProfiles, - NbProfilesPerSeconds, NbCells, CellSize, PulseLength, - NbPingsPerSeconds, NbPingsAveragedPerProfile, GainRx, GainTx) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.acoustic_data[i], stg.freq[i][j], stg.kt_read[j], stg.kt_corrected[j], + cur.execute(''' INSERT into Measure(acoustic_data, Date, Hour, frequency, sound_attenuation, kt_read, kt_corrected, + NbProfiles, NbProfilesPerSeconds, NbCells, CellSize, PulseLength, + NbPingsPerSeconds, NbPingsAveragedPerProfile, GainRx, GainTx + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + (stg.acoustic_data[i], #stg.date[i], stg.hour[i], + str(stg.date[i].year) + str('-') + str(stg.date[i].month) + str('-') + str(stg.date[i].day), + str(stg.hour[i].hour) + str(':') + str(stg.hour[i].minute), + stg.freq[i][j], stg.water_attenuation[i][j], stg.kt_read[j], stg.kt_corrected[j], stg.nb_profiles[i][j], stg.nb_profiles_per_sec[i][j], stg.nb_cells[i][j], stg.cell_size[i][j], stg.pulse_length[i][j], stg.nb_pings_per_sec[i][j], stg.nb_pings_averaged_per_profile[i][j], stg.gain_rx[i][j], stg.gain_tx[i][j])) @@ -223,26 +277,34 @@ class CreateTableForSaveAs: for i in stg.acoustic_data: cur.execute(''' INSERT into BSRawData(acoustic_data, time, depth, BS_raw_data, + time_reshape, depth_reshape, BS_raw_data_reshape, time_cross_section, depth_cross_section, BS_cross_section, BS_stream_bed, + depth_bottom, val_bottom, ind_bottom, time_noise, depth_noise, BS_noise_raw_data, SNR_raw_data, SNR_cross_section, SNR_stream_bed, BS_raw_data_pre_process_SNR, BS_raw_data_pre_process_average, BS_cross_section_pre_process_SNR, BS_cross_section_pre_process_average, - BS_stream_bed_pre_process_SNR, BS_stream_bed_pre_process_average) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + BS_stream_bed_pre_process_SNR, BS_stream_bed_pre_process_average, + BS_mean) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', (stg.acoustic_data[i], stg.time[i].tobytes(), stg.depth[i].tobytes(), stg.BS_raw_data[i].tobytes(), + stg.time_reshape[i].tobytes(), stg.depth_reshape[i].tobytes(), stg.BS_raw_data_reshape[i].tobytes(), stg.time_cross_section[i].tobytes(), stg.depth_cross_section[i].tobytes(), stg.BS_cross_section[i].tobytes(), stg.BS_stream_bed[i].tobytes(), + stg.depth_bottom[i].tobytes(), np.array(stg.val_bottom[i]).tobytes(), np.array(stg.ind_bottom[i]).tobytes(), stg.time_noise[i].tobytes(), stg.depth_noise[i].tobytes(), stg.BS_noise_raw_data[i].tobytes(), stg.SNR_raw_data[i].tobytes(), stg.SNR_cross_section[i].tobytes(), stg.SNR_stream_bed[i].tobytes(), stg.BS_raw_data_pre_process_SNR[i].tobytes(), stg.BS_raw_data_pre_process_average[i].tobytes(), stg.BS_cross_section_pre_process_SNR[i].tobytes(), stg.BS_cross_section_pre_process_average[i].tobytes(), - stg.BS_stream_bed_pre_process_SNR[i].tobytes(), stg.BS_stream_bed_pre_process_average[i].tobytes() + stg.BS_stream_bed_pre_process_SNR[i].tobytes(), stg.BS_stream_bed_pre_process_average[i].tobytes(), + stg.BS_mean[i].tobytes() ) ) + print("stg.ind_bottom ", stg.ind_bottom[i]) + print(np.array([stg.ind_bottom[i]]), np.array(stg.ind_bottom[i]).shape) # Commit the transaction after executing INSERT. cnx.commit() @@ -265,12 +327,16 @@ class CreateTableForSaveAs: cur.execute('''INSERT into Settings(acoustic_data, temperature, tmin_index, tmin_value, tmax_index, tmax_value, rmin_index, rmin_value, rmax_index, rmax_value, - SNR_filter_value, Nb_cells_to_average_BS_signal) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + freq_bottom_detection_index, freq_bottom_detection_value, + SNR_filter_value, Nb_cells_to_average_BS_signal + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', (stg.acoustic_data[i], stg.temperature, stg.tmin[i][0], stg.tmin[i][1], stg.tmax[i][0], stg.tmax[i][1], stg.rmin[i][0], stg.rmin[i][1], stg.rmax[i][0], stg.rmax[i][1], - stg.SNR_filter_value[i], stg.Nb_cells_to_average_BS_signal[i]) + stg.freq_bottom_detection[i][0], stg.freq_bottom_detection[i][1], + stg.SNR_filter_value[i], stg.Nb_cells_to_average_BS_signal[i] + ) ) cnx.commit() @@ -288,8 +354,16 @@ class CreateTableForSaveAs: cur.execute(self.create_SedimentsFile) - cur.execute('''INSERT into SedimentsFile(path_fine, filename_fine) VALUES(?, ?)''', - (stg.path_fine, stg.filename_fine)) + cur.execute('''INSERT into SedimentsFile(path_fine, filename_fine, radius_grain_fine, + path_sand, filename_sand, radius_grain_sand, + time_column_label, distance_from_bank_column_label, + depth_column_label, Ctot_fine_column_label, D50_fine_column_label, + Ctot_sand_column_label, D50_sand_column_label) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + (stg.path_fine, stg.filename_fine, stg.radius_grain_fine.tobytes(), + stg.path_sand, stg.filename_sand, stg.radius_grain_sand.tobytes(), + stg.columns_fine[0], stg.columns_fine[1], stg.columns_fine[2], + stg.columns_fine[3], stg.columns_fine[4], stg.columns_sand[3], stg.columns_sand[4])) cnx.commit() @@ -308,13 +382,21 @@ class CreateTableForSaveAs: for f in range(len(stg.sample_fine)): cur.execute('''INSERT into SedimentsData(sample_fine_name, sample_fine_index, distance_from_bank_fine, - depth_fine, time_fine, Ctot_fine, Ctot_fine_per_cent, D50_fine, frac_vol_fine, - frac_vol_fine_cumul) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + depth_fine, time_fine, Ctot_fine, Ctot_fine_per_cent, D50_fine, + frac_vol_fine, frac_vol_fine_cumul, + sample_sand_name, sample_sand_index, distance_from_bank_sand, + depth_sand, time_sand, Ctot_sand, Ctot_sand_per_cent, D50_sand, + frac_vol_sand, frac_vol_sand_cumul + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', (stg.sample_fine[f][0] , stg.sample_fine[f][1], stg.distance_from_bank_fine[f], stg.depth_fine[f], stg.time_fine[f], stg.Ctot_fine[f], stg.Ctot_fine_per_cent[f], stg.D50_fine[f], - stg.frac_vol_fine[f].tobytes(), stg.frac_vol_fine_cumul[f].tobytes())) + stg.frac_vol_fine[f].tobytes(), stg.frac_vol_fine_cumul[f].tobytes(), + stg.sample_sand[f][0], stg.sample_sand[f][1], + stg.distance_from_bank_sand[f], stg.depth_sand[f], stg.time_sand[f], stg.Ctot_sand[f], + stg.Ctot_sand_per_cent[f], stg.D50_sand[f], + stg.frac_vol_sand[f].tobytes(), stg.frac_vol_sand_cumul[f].tobytes())) cnx.commit() diff --git a/Model/read_table_for_open.py b/Model/read_table_for_open.py index d810365..7e5e075 100644 --- a/Model/read_table_for_open.py +++ b/Model/read_table_for_open.py @@ -1,112 +1,370 @@ +# ============================================================================== # + # read_table_for_open.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + + # by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + +import sys import numpy as np -from PyQt5.QtWidgets import QFileDialog, QApplication +from PyQt5.QtWidgets import QFileDialog, QApplication, QWidget, QTabWidget import sqlite3 from os import path, chdir import settings as stg +from settings import BS_raw_data, acoustic_data +from View.acoustic_data_tab import AcousticDataTab class ReadTableForOpen: def __init__(self): - self.open_file_dialog() - - chdir(stg.dirname_open) - self.sql_file_to_open = open(stg.filename_open) - - self.read_table() - - # self.reshape_variables() + pass def open_file_dialog(self): - name = QFileDialog.getOpenFileName(caption="Open Acoused file", directory="", filter="Acoused file (*.acd)") + name = QFileDialog.getOpenFileName(caption="Open Acoused file", directory="", filter="Acoused file (*.acd)", + options=QFileDialog.DontUseNativeDialog) if name: stg.dirname_open = path.dirname(name[0]) stg.filename_open = path.basename(name[0]) + chdir(stg.dirname_open) + self.sql_file_to_open = open(stg.filename_open) + + self.read_table() + def read_table(self): + stg.read_table_trigger = 1 + # connexion to File db cnx = sqlite3.connect(stg.filename_open) # Create database cursor to execute SQL statements and fetch results from SQL queries. cur = cnx.cursor() - query = '''SELECT acoustic_data, acoustic_file FROM File''' - data = cur.execute(query).fetchall() - stg.acoustic_data, stg.filename_BS_raw_data = [x[0] for x in data], [y[1] for y in data] + # -------------------------------------------------------------------------------------------------------------- + # +++++++++++++++++++++++++++ + # --- Table Acoustic File --- + # +++++++++++++++++++++++++++ - for i in stg.acoustic_data: + query0 = f'''SELECT acoustic_data FROM AcousticFile''' + data0 = cur.execute(query0).fetchall() + print("data0 ", data0) - query1 = f'''SELECT frequency, kt, NbProfiles, NbProfilesPerSeconds, " - f"NbCells, CellSize, PulseLength, NbPingsPerSeconds, " - f"NbPingsAveragedPerProfile, GainRx, GainTx - FROM Measure WHERE (acoustic_data = {i})''' + stg.acoustic_data = [x[0] for x in data0] + print("stg.acoustic_data ", stg.acoustic_data) + + for k in range(len(stg.acoustic_data)): + print("hello") + query = f'''SELECT acoustic_data, acoustic_file, ABS_name, path_BS_noise_data, filename_BS_noise_data, + noise_method, noise_value, data_preprocessed FROM AcousticFile WHERE (acoustic_data = {k})''' + data = cur.execute(query).fetchall() + print("data acoustic file", data) + + stg.filename_BS_raw_data.append([str(y[1]) + '.aqa' for y in data][0]) + stg.ABS_name.append([z[2] for z in data][0]) + stg.path_BS_noise_data.append([z[3] for z in data][0]) + stg.filename_BS_noise_data.append([z[4] for z in data][0]) + stg.noise_method.append([z[5] for z in data][0]) + stg.noise_value.append([z[6] for z in data][0]) + stg.data_preprocessed.append([z[7] for z in data][0]) + + print("data acoustic file ", stg.filename_BS_raw_data, stg.ABS_name, stg.path_BS_noise_data, stg.filename_BS_noise_data, + stg.noise_method, stg.noise_value, stg.data_preprocessed) + + # -------------------------------------------------------------------------------------------------------------- + # +++++++++++++++++++++ + # --- Table Measure --- + # +++++++++++++++++++++ + + stg.date = [0]*len(stg.acoustic_data) + stg.hour = [0]*len(stg.acoustic_data) + for i in range(len(stg.acoustic_data)): + print("i = ", i) + query1 = f'''SELECT acoustic_data, Date, Hour, frequency, sound_attenuation, kt_read, kt_corrected, NbProfiles, + NbProfilesPerSeconds, NbCells, CellSize, PulseLength, NbPingsPerSeconds, NbPingsAveragedPerProfile, + GainRx, GainTx FROM Measure WHERE (acoustic_data = {i})''' data1 = cur.execute(query1).fetchall() - # print(data1) - # print([x[0] for x in data1]) - stg.freq.append([x[0] for x in data1]) - stg.kt.append([x[1] for x in data1]) - stg.nb_profiles.append([x[2] for x in data1]) - stg.nb_profiles_per_sec.append([x[3] for x in data1]) - stg.nb_cells.append([x[4] for x in data1]) - stg.cell_size.append([x[5] for x in data1]) - stg.pulse_length.append([x[6] for x in data1]) - stg.nb_pings_per_sec.append([x[7] for x in data1]) - stg.nb_pings_averaged_per_profile.append([x[8] for x in data1]) - stg.gain_rx.append([x[9] for x in data1]) - stg.gain_tx.append([x[10] for x in data1]) - # for f_ind, f_val in enumerate(stg.freq[i]): - # - # exec("query2 = '''SELECT time_" + str(int(f_val)) + ", depth_" + str(int(f_val)) + ", BS_raw_data_" + str(int(f_val)) + - # " FROM BSRawData_" + str(int(i)) + " WHERE (acoustic_data = " + str(i) + ") ''' ") - # exec("data2 = cur.execute(query2).fetchall()") - # # print(eval("data2")) - # - # if f_ind == 0: - # time_reshape_temp = np.array([[x[0] for x in eval("data2")]]) - # # print("1 time_reshape_temp.shape ", time_reshape_temp.shape) - # depth_reshape_temp = np.array([[x[1] for x in eval("data2")]]) - # BS_raw_data_reshape_temp = np.array([[x[2] for x in eval("data2")]]) - # else: - # time_reshape_temp = np.insert(time_reshape_temp, f_ind, [x[0] for x in eval("data2")], axis=0) - # # print("2 time_reshape_temp.shape ", time_reshape_temp.shape) - # depth_reshape_temp = np.insert(depth_reshape_temp, f_ind, [x[1] for x in eval("data2")], axis=0) - # BS_raw_data_reshape_temp = np.insert(BS_raw_data_reshape_temp, f_ind, [x[1] for x in eval("data2")], axis=0) - # - # stg.time_reshape.append(time_reshape_temp.transpose()) - # # print(len(stg.time_reshape)) - # # print(stg.time_reshape[i].shape) - # stg.depth_reshape.append(depth_reshape_temp.transpose()) - # stg.BS_raw_data_reshape.append(BS_raw_data_reshape_temp.transpose()) + print("--------------------------------------") + print("data1 ", data1) - query2 = f'''SELECT acoustic_data, time, depth, BS_raw_data FROM BSRawData WHERE (acoustic_data = {i})''' + stg.date[i] = data1[0][1] + stg.hour[i] = data1[0][2] + stg.freq.append(np.array([x[3] for x in data1])) + stg.freq_text.append([str(x[3]*1e-6) + 'MHz' for x in data1]) + stg.water_attenuation.append([x[4] for x in data1]) + stg.kt_read.append([x[5] for x in data1]) + stg.kt_corrected = [x[6] for x in data1] + stg.nb_profiles.append([x[7] for x in data1]) + stg.nb_profiles_per_sec.append([x[8] for x in data1]) + stg.nb_cells.append([x[9] for x in data1]) + stg.cell_size.append([x[10] for x in data1]) + stg.pulse_length.append([x[11] for x in data1]) + stg.nb_pings_per_sec.append([x[12] for x in data1]) + stg.nb_pings_averaged_per_profile.append([x[13] for x in data1]) + stg.gain_rx.append([x[14] for x in data1]) + stg.gain_tx.append([x[15] for x in data1]) + + print(stg.acoustic_data, stg.freq, stg.water_attenuation, stg.kt_read, stg.kt_corrected, stg.nb_profiles, stg.nb_profiles_per_sec, + stg.nb_cells, stg.cell_size, stg.pulse_length, stg.nb_pings_per_sec, stg.nb_pings_averaged_per_profile, + stg.gain_rx, stg.gain_tx) + + print(stg.date) + print(stg.hour) + + # -------------------------------------------------------------------------------------------------------------- + # +++++++++++++++++++++++ + # --- Table BSRawData --- + # ++++++++++++++++++++++ + print("len stg.acoustic_data ", len(stg.acoustic_data)) + for j in range(len(stg.acoustic_data)): + print(f"j = {j}") + query2 = f'''SELECT acoustic_data, time, depth, BS_raw_data, + time_reshape, depth_reshape, BS_raw_data_reshape, + time_cross_section, depth_cross_section, + BS_cross_section, BS_stream_bed, + depth_bottom, val_bottom, ind_bottom, + time_noise, depth_noise, BS_noise_raw_data, + SNR_raw_data, SNR_cross_section, SNR_stream_bed, + BS_raw_data_pre_process_SNR, BS_raw_data_pre_process_average, + BS_cross_section_pre_process_SNR, BS_cross_section_pre_process_average, + BS_stream_bed_pre_process_SNR, BS_stream_bed_pre_process_average, BS_mean + FROM BSRawData WHERE (acoustic_data = {j})''' data2 = cur.execute(query2).fetchall() - print("len(data2) ", len(data2[0])) - # print("data2 : ", data2) - # data2_retreived = np.frombuffer(data2[0][1], dtype=np.float64) - # print("", data2_retreived) + print("len data2 ", len(data2)) - stg.time.append(np.frombuffer(data2[0][1], dtype=np.float64).reshape((len(stg.freq[i]), -1))) - print(stg.time[0].shape) + stg.time.append(np.frombuffer(data2[0][1], dtype=np.float64).reshape((stg.freq[j].shape[0], -1))) + print("stg.time[0].shape ", stg.time[j].shape, np.frombuffer(data2[0][1], dtype=np.float64).shape) print(stg.time) - stg.depth.append(np.frombuffer(data2[0][2], dtype=np.float64).reshape(len(stg.freq[i]), -1)) - print(stg.depth[0].shape) + stg.depth.append(np.frombuffer(data2[0][2], dtype=np.float64).reshape((stg.freq[j].shape[0], -1))) + print("stg.depth[0].shape ", stg.depth[j].shape) print(stg.depth) - stg.BS_raw_data.append(np.frombuffer(data2[0][3], dtype=np.float64)) + stg.BS_raw_data.append(np.frombuffer(data2[0][3], dtype=np.float64).reshape((stg.freq[j].shape[0], stg.depth[j].shape[1], stg.time[j].shape[1]))) + print("BS_raw_data ", stg.BS_raw_data[j].shape) + stg.time_reshape.append(np.frombuffer(data2[0][4], dtype=np.float64).reshape((-1, stg.freq[j].shape[0]))) + print("stg.time_reshape[0].shape ", stg.time_reshape[j].shape) + stg.depth_reshape.append(np.frombuffer(data2[0][5], dtype=np.float64).reshape((-1, stg.freq[j].shape[0]))) + stg.BS_raw_data_reshape.append(np.frombuffer(data2[0][6], dtype=np.float64).reshape((-1, stg.freq[j].shape[0]))) + print("time cross section ", stg.time_cross_section, stg.time_cross_section == []) - # time_reshape_temp = np.insert(time_reshape_temp, time_reshape_temp.shape[0], [x[0] for x in eval("data2")], axis=0) - # stg.depth_reshape.append([x[2] for x in data2]) - # stg.BS_raw_data_reshape.append([x[3] for x in data2]) + print("np.frombuffer(data2[0][9], dtype=np.float64) ", np.frombuffer(data2[0][9], dtype=np.float64)) + if len(np.frombuffer(data2[0][9], dtype=np.float64)) == 0: + print("Je suis là") + stg.time_cross_section.append(np.array([])) + stg.depth_cross_section.append(np.array([])) + stg.BS_cross_section.append(np.array([])) + else: + print("Je suis ici") + print(stg.freq[j].shape) + print(np.frombuffer(data2[0][7], dtype=np.float64).shape) + stg.time_cross_section.append(np.frombuffer(data2[0][7], dtype=np.float64).reshape((stg.freq[j].shape[0], -1))) + print("time cross section ", stg.time_cross_section, stg.time_cross_section[j].shape) + stg.depth_cross_section.append(np.frombuffer(data2[0][8], dtype=np.float64).reshape((stg.freq[j].shape[0], -1))) + print("depth cross section ", stg.depth_cross_section, stg.depth_cross_section[j].shape) + stg.BS_cross_section.append(np.frombuffer(data2[0][9], dtype=np.float64).reshape( + (stg.freq[j].shape[0], stg.depth_cross_section[j].shape[1], stg.time_cross_section[j].shape[1]))) + + if len(np.frombuffer(data2[0][10], dtype=np.float64)) == 0: + stg.BS_stream_bed.append(np.array([])) + else: + stg.BS_stream_bed.append(np.frombuffer(data2[0][10], dtype=np.float64).reshape( + (stg.freq[j].shape[0], stg.depth_cross_section[j].shape[1], stg.time_cross_section[j].shape[1]))) + + if len(np.frombuffer(data2[0][11], dtype=np.float64)) == 0: + stg.depth_bottom.append(np.array([])) + stg.val_bottom.append([]) + stg.ind_bottom.append([]) + else: + stg.depth_bottom.append(np.frombuffer(data2[0][11], dtype=np.float64)) + stg.val_bottom.append(np.frombuffer(data2[0][12], dtype=np.float64).tolist()) + stg.ind_bottom.append(np.frombuffer(data2[0][13], dtype=np.float64).tolist()) + print("stg.depth_bottom ", stg.depth_bottom) + print("stg.val_bottom ", stg.val_bottom) + print("stg.ind_bottom ", stg.ind_bottom) + + if len(np.frombuffer(data2[0][14], dtype=np.float64)) == 0: + stg.time_noise.append(np.array([])) + stg.depth_noise.append(np.array([])) + stg.BS_noise_raw_data.append(np.array([])) + else: + stg.time_noise.append(np.frombuffer(data2[0][14], dtype=np.float64).reshape((stg.freq[j].shape[0], -1))) + stg.depth_noise.append(np.frombuffer(data2[0][15], dtype=np.float64).reshape((stg.freq[j].shape[0], -1))) + stg.BS_noise_raw_data.append(np.frombuffer(data2[0][16], dtype=np.float64).reshape( + (stg.freq[j].shape[0], stg.depth_noise[j].shape[1], stg.time_noise[j].shape[1]))) + + if len(np.frombuffer(data2[0][17], dtype=np.float64)) == 0: + stg.SNR_raw_data.append(np.array([])) + else: + stg.SNR_raw_data.append(np.frombuffer(data2[0][17], dtype=np.float64).reshape(stg.BS_raw_data[j].shape)) + + if len(np.frombuffer(data2[0][18], dtype=np.float64)) == 0: + stg.SNR_cross_section.append(np.array([])) + else: + stg.SNR_cross_section.append(np.frombuffer(data2[0][18], dtype=np.float64).reshape(stg.BS_cross_section[j].shape)) + + if len(np.frombuffer(data2[0][19], dtype=np.float64)) == 0: + stg.SNR_stream_bed.append(np.array([])) + else: + stg.SNR_stream_bed.append(np.frombuffer(data2[0][19], dtype=np.float64).reshape(stg.BS_stream_bed[j].shape)) + + if len(np.frombuffer(data2[0][20], dtype=np.float64)) == 0: + stg.BS_raw_data_pre_process_SNR.append(np.array([])) + else: + stg.BS_raw_data_pre_process_SNR.append(np.frombuffer(data2[0][20], dtype=np.float64).reshape(stg.BS_raw_data[j].shape)) + + if len(np.frombuffer(data2[0][21], dtype=np.float64)) == 0: + stg.BS_raw_data_pre_process_average.append(np.array([])) + else: + stg.BS_raw_data_pre_process_average.append(np.frombuffer(data2[0][21], dtype=np.float64).reshape(stg.BS_raw_data[j].shape)) + + if len(np.frombuffer(data2[0][22], dtype=np.float64)) == 0: + stg.BS_cross_section_pre_process_SNR.append(np.array([])) + else: + stg.BS_cross_section_pre_process_SNR.append(np.frombuffer(data2[0][22], dtype=np.float64).reshape(stg.BS_cross_section[j].shape)) + + if len(np.frombuffer(data2[0][23], dtype=np.float64)) == 0: + stg.BS_cross_section_pre_process_average.append(np.array([])) + else: + stg.BS_cross_section_pre_process_average.append(np.frombuffer(data2[0][23], dtype=np.float64).reshape(stg.BS_cross_section[j].shape)) + + if len(np.frombuffer(data2[0][24], dtype=np.float64)) == 0: + stg.BS_stream_bed_pre_process_SNR.append(np.array([])) + else: + stg.BS_stream_bed_pre_process_SNR.append(np.frombuffer(data2[0][24], dtype=np.float64).reshape(stg.BS_stream_bed[j].shape)) + + if len(np.frombuffer(data2[0][25], dtype=np.float64)) == 0: + stg.BS_stream_bed_pre_process_average.append(np.array([])) + else: + stg.BS_stream_bed_pre_process_average.append(np.frombuffer(data2[0][25], dtype=np.float64).reshape(stg.BS_stream_bed[j].shape)) + + if len(np.frombuffer(data2[0][26], dtype=np.float64)) == 0: + stg.BS_mean.append(np.array([])) + else: + stg.BS_mean.append(np.frombuffer(data2[0][26], dtype=np.float64).reshape((stg.freq[j].shape[0], -1))) + print(stg.BS_mean[j].shape) + # -------------------------------------------------------------------------------------------------------------- + # +++++++++++++++++++++++ + # --- Table Settings --- + # +++++++++++++++++++++++ + + for s in range(len(stg.acoustic_data)): + query3 = f'''SELECT acoustic_data, temperature, + tmin_index, tmin_value, tmax_index, tmax_value, + rmin_index, rmin_value, rmax_index, rmax_value, + freq_bottom_detection_index, freq_bottom_detection_value, + SNR_filter_value, Nb_cells_to_average_BS_signal + FROM Settings WHERE (acoustic_data = {s})''' + + data3 = cur.execute(query3).fetchall() + + stg.temperature = [x[1] for x in data3][0] + stg.tmin.append([(x[2], x[3]) for x in data3]) + stg.tmax.append([(x[4], x[5]) for x in data3]) + stg.rmin.append([(x[6], x[7]) for x in data3]) + stg.rmax.append([(x[8], x[9]) for x in data3]) + stg.freq_bottom_detection.append([(x[10], x[11]) for x in data3]) + stg.SNR_filter_value.append([x[12] for x in data3]) + stg.Nb_cells_to_average_BS_signal.append([x[13] for x in data3]) + + # -------------------------------------------------------------------------------------------------------------- + # +++++++++++++++++++++++++++ + # --- Table Sediment File --- + # +++++++++++++++++++++++++++ + + query4 = f'''SELECT path_fine, filename_fine, radius_grain_fine, path_sand, filename_sand, radius_grain_sand, + time_column_label, distance_from_bank_column_label, depth_column_label, + Ctot_fine_column_label, D50_fine_column_label, + Ctot_sand_column_label, D50_sand_column_label + from SedimentsFile''' + + data4 = cur.execute(query4).fetchall() + + print("data4 ", data4) + + stg.path_fine = data4[0][0] + stg.filename_fine = data4[0][1] + stg.radius_grain_fine = np.array(np.frombuffer(data4[0][2], dtype=np.float64)) + stg.path_sand = data4[0][3] + stg.filename_sand = data4[0][4] + stg.radius_grain_sand = np.array(np.frombuffer(data4[0][5], dtype=np.float64)) + stg.columns_fine = [data4[0][6], data4[0][7], data4[0][8], data4[0][9], data4[0][10]] + list(stg.radius_grain_fine) + stg.columns_sand = [data4[0][6], data4[0][7], data4[0][8], data4[0][11], data4[0][12]] + list(stg.radius_grain_sand) + + print("sediment file : ", stg.path_fine, stg.filename_fine, stg.path_sand, stg.filename_sand) + print(stg.radius_grain_fine, stg.radius_grain_sand) + print('stg.columns_fine ', stg.columns_fine) + + # -------------------------------------------------------------------------------------------------------------- + # +++++++++++++++++++++++++++ + # --- Table Sediment Data --- + # +++++++++++++++++++++++++++ + + query5 = f'''SELECT sample_fine_name, sample_fine_index, distance_from_bank_fine, depth_fine, time_fine, + Ctot_fine, Ctot_fine_per_cent, D50_fine, frac_vol_fine, frac_vol_fine_cumul, + sample_sand_name, sample_sand_index, distance_from_bank_sand, depth_sand, time_sand, + Ctot_sand, Ctot_sand_per_cent, D50_sand, frac_vol_sand, frac_vol_sand_cumul + from SedimentsData''' + + data5 = cur.execute(query5).fetchall() + + stg.frac_vol_fine = [] + stg.frac_vol_fine_cumul = [] + stg.frac_vol_sand = [] + stg.frac_vol_sand_cumul = [] + + for f in range(len(data5)): + stg.sample_fine.append((data5[f][0], data5[f][1])) + stg.distance_from_bank_fine.append(data5[f][2]) + stg.depth_fine.append(data5[f][3]) + stg.time_fine.append(data5[f][4]) + stg.Ctot_fine.append(data5[f][5]) + stg.Ctot_fine_per_cent.append(data5[f][6]) + stg.D50_fine.append(data5[f][7]) + print("np.frombuffer(data4[f][8], dtype=np.float64) ", np.frombuffer(data5[f][8], dtype=np.float64)) + stg.frac_vol_fine.append(np.frombuffer(data5[f][8], dtype=np.float64)) + stg.frac_vol_fine_cumul.append(np.frombuffer(data5[f][9], dtype=np.float64)) + stg.sample_sand.append((data5[f][10], data5[f][11])) + stg.distance_from_bank_sand.append(data5[f][12]) + stg.depth_sand.append(data5[f][13]) + stg.time_sand.append(data5[f][14]) + stg.Ctot_sand.append(data5[f][15]) + stg.Ctot_sand_per_cent.append(data5[f][16]) + stg.D50_sand.append(data5[f][17]) + stg.frac_vol_sand.append(np.frombuffer(data5[f][18], dtype=np.float64)) + stg.frac_vol_sand_cumul.append(np.frombuffer(data5[f][19], dtype=np.float64)) + + stg.frac_vol_fine = np.array(stg.frac_vol_fine) + stg.frac_vol_fine_cumul = np.array(stg.frac_vol_fine_cumul) + stg.frac_vol_sand = np.array(stg.frac_vol_sand) + stg.frac_vol_sand_cumul = np.array(stg.frac_vol_sand_cumul) + + # print("data 4 : ", len(data4), data4) + print('data 5 :') + print(stg.Ctot_fine, stg.sample_sand) + print(type(stg.frac_vol_fine_cumul), stg.frac_vol_fine_cumul) - # query = '''SELECT acoustic_file FROM File''' - # cur.execute(query) - # stg.acoustic_data = cur.fetchall() # Close database cursor cur.close() @@ -114,6 +372,27 @@ class ReadTableForOpen: # Close database connection cnx.close() + print("read table finished") + + def fill_acoustic_data_tab(self): + print("start fill acoustic data tab") + + # tab_adt = AcousticDataTab(self.master_widget) + print("1 AcousticDataTab ", id(AcousticDataTab)) + print("tab_adt.combobox_ABS_system_choice ", self.tab.combobox_ABS_system_choice) + self.tab.combobox_ABS_system_choice.editTextChanged.connect(self.tab.ABS_system_choice) + if stg.ABS_name[0] == "AQUAscat": + self.tab.combobox_ABS_system_choice.setCurrentText(stg.ABS_name[0]) + print("combobox_ABS_system_choice.setCurrentIndex(1)", self.tab.combobox_ABS_system_choice.itemText(1), + self.tab.combobox_ABS_system_choice.itemText(2)) + else: + self.tab.combobox_ABS_system_choice.setCurrentText(stg.ABS_name[0]) + + self.tab.plot_backscattered_acoustic_signal_recording() + # app = QApplication(sys.argv) + + # sys.exit(app.exec_()) + def reshape_variables(self): for i in stg.acoustic_data: @@ -150,8 +429,3 @@ class ReadTableForOpen: stg.BS_raw_data.append(np.reshape(stg.BS_raw_data_reshape[i], (len(stg.freq[i]), stg.depth[i].shape[1], stg.time[i].shape[1]))) - - - - - diff --git a/Model/udt_extract/convert_type.py b/Model/udt_extract/convert_type.py index 0567958..1e1ed6d 100644 --- a/Model/udt_extract/convert_type.py +++ b/Model/udt_extract/convert_type.py @@ -161,7 +161,7 @@ def translate_key(raw_key, _type="data"): #if translated_key == None: # print("delete %s"%raw_key) - print(f"translated_key : {translated_key}") + # print(f"translated_key : {translated_key}") return translated_key def translate_paramdict(param_dict): diff --git a/Model/update_table_for_save.py b/Model/update_table_for_save.py index b7fd911..d2060dc 100644 --- a/Model/update_table_for_save.py +++ b/Model/update_table_for_save.py @@ -1,3 +1,26 @@ +# ============================================================================== # + # update_table_for_save.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + + # by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + import numpy as np from PyQt5.QtWidgets import QFileDialog, QApplication, QMessageBox import sqlite3 @@ -82,8 +105,11 @@ class UpdateTableForSave: cur.execute("DROP TABLE if exists Measure") cur.execute("""CREATE TABLE Measure(ID INTEGER PRIMARY KEY AUTOINCREMENT, - acoustic_data INTEGER, - frequency FLOAT, + acoustic_data INTEGER, + Date STRING, + Hour STRING, + frequency FLOAT, + sound_attenuation FLOAT, kt_read FLOAT, kt_corrected FLOAT, NbProfiles FLOAT, @@ -94,21 +120,26 @@ class UpdateTableForSave: NbPingsPerSeconds FLOAT, NbPingsAveragedPerProfile FLOAT, GainRx FLOAT, - GainTx FLOAT) + GainTx FLOAT + ) """) # Fill the table Measure for i in stg.acoustic_data: for j in range(stg.freq[i].shape[0]): - cur.execute(''' INSERT into Measure(acoustic_data, frequency, kt_read, kt_corrected, NbProfiles, + cur.execute(''' INSERT into Measure(acoustic_data, Date, Hour, frequency, sound_attenuation, kt_read, kt_corrected, NbProfiles, NbProfilesPerSeconds, NbCells, CellSize, PulseLength, - NbPingsPerSeconds, NbPingsAveragedPerProfile, GainRx, GainTx) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.acoustic_data[i], stg.freq[i][j], stg.kt_read[j], stg.kt_corrected[j], + NbPingsPerSeconds, NbPingsAveragedPerProfile, GainRx, GainTx, + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + (stg.acoustic_data[i], stg.freq[i][j], stg.water_attenuation[i][j], stg.kt_read[j], stg.kt_corrected[j], stg.nb_profiles[i][j], stg.nb_profiles_per_sec[i][j], stg.nb_cells[i][j], stg.cell_size[i][j], stg.pulse_length[i][j], stg.nb_pings_per_sec[i][j], - stg.nb_pings_averaged_per_profile[i][j], stg.gain_rx[i][j], stg.gain_tx[i][j])) + stg.nb_pings_averaged_per_profile[i][j], stg.gain_rx[i][j], stg.gain_tx[i][j], + str(stg.date[i].year) + str('-') + str(stg.date[i].month) + str('-') + str(stg.date[i].day), + str(stg.hour[i].hour) + str(':') + str(stg.hour[i].minute) + )) # Commit the transaction after executing INSERT. cnx.commit() @@ -126,30 +157,38 @@ class UpdateTableForSave: cur.execute('''CREATE TABLE BSRawData(ID INTEGER PRIMARY KEY AUTOINCREMENT, acoustic_data INTEGER, - time BLOB, depth BLOB, BS_raw_data BLOB, + time BLOB, depth BLOB, BS_raw_data BLOB, + time_reshape BLOB, depth_reshape BLOB, BS_raw_data_reshape BLOB, time_cross_section BLOB, depth_cross_section BLOB, BS_cross_section BLOB, BS_stream_bed BLOB, depth_bottom, val_bottom, ind_bottom, time_noise BLOB, depth_noise BLOB, BS_noise_raw_data BLOB, SNR_raw_data BLOB, SNR_cross_section BLOB, SNR_stream_bed BLOB, BS_raw_data_pre_process_SNR BLOB, BS_raw_data_pre_process_average BLOB, BS_cross_section_pre_process_SNR BLOB, BS_cross_section_pre_process_average BLOB, - BS_stream_bed_pre_process_SNR BLOB, BS_stream_bed_pre_process_average BLOB + BS_stream_bed_pre_process_SNR BLOB, BS_stream_bed_pre_process_average BLOB, + BS_mean BLOB )''') for i in stg.acoustic_data: cur.execute(''' INSERT into BSRawData(acoustic_data, time, depth, BS_raw_data, + time_reshape, depth_reshape, BS_raw_data_reshape, time_cross_section, depth_cross_section, BS_cross_section, BS_stream_bed, + depth_bottom, val_bottom, ind_bottom, time_noise, depth_noise, BS_noise_raw_data, SNR_raw_data, SNR_cross_section, SNR_stream_bed, BS_raw_data_pre_process_SNR, BS_raw_data_pre_process_average, BS_cross_section_pre_process_SNR, BS_cross_section_pre_process_average, - BS_stream_bed_pre_process_SNR, BS_stream_bed_pre_process_average) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + BS_stream_bed_pre_process_SNR, BS_stream_bed_pre_process_average, + BS_mean) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', (stg.acoustic_data[i], stg.time[i].tobytes(), stg.depth[i].tobytes(), stg.BS_raw_data[i].tobytes(), + stg.time_reshape[i].tobytes(), stg.depth_reshape[i].tobytes(), stg.BS_raw_data_reshape[i].tobytes(), stg.time_cross_section[i].tobytes(), stg.depth_cross_section[i].tobytes(), stg.BS_cross_section[i].tobytes(), - stg.BS_stream_bed[i].tobytes(), stg.time_noise[i].tobytes(), stg.depth_noise[i].tobytes(), + stg.BS_stream_bed[i].tobytes(), + stg.depth_bottom[i].tobytes(), stg.val_bottom[i].tobytes(), np.array(stg.ind_bottom[i]).tobytes(), + stg.time_noise[i].tobytes(), stg.depth_noise[i].tobytes(), stg.BS_noise_raw_data[i].tobytes(), stg.SNR_raw_data[i].tobytes(), stg.SNR_cross_section[i].tobytes(), stg.SNR_stream_bed[i].tobytes(), @@ -158,7 +197,8 @@ class UpdateTableForSave: stg.BS_cross_section_pre_process_SNR[i].tobytes(), stg.BS_cross_section_pre_process_average[i].tobytes(), stg.BS_stream_bed_pre_process_SNR[i].tobytes(), - stg.BS_stream_bed_pre_process_average[i].tobytes() + stg.BS_stream_bed_pre_process_average[i].tobytes(), + stg.BS_mean[i].tobytes() ) ) @@ -180,7 +220,7 @@ class UpdateTableForSave: temperature FLOAT, tmin_index FLOAT, tmin_value FLOAT, tmax_index FLOAT, tmax_value FLOAT, rmin_index FLOAT, rmin_value FLOAT, rmax_index FLOAT, rmax_value FLOAT, - freq_bottom_detection, dept_bottom_detection_min, depth_bottom_detection_max, depth_bottom_detection_1st_int_area, + freq_bottom_detection_index FLOAT, freq_bottom_detection_value STRING, SNR_filter_value FLOAT, Nb_cells_to_average_BS_signal FLOAT )''' ) @@ -189,11 +229,13 @@ class UpdateTableForSave: cur.execute('''INSERT into Settings(acoustic_data, temperature, tmin_index, tmin_value, tmax_index, tmax_value, rmin_index, rmin_value, rmax_index, rmax_value, + freq_bottom_detection_index, freq_bottom_detection_value, SNR_filter_value, Nb_cells_to_average_BS_signal) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', (stg.acoustic_data[i], stg.temperature, stg.tmin[i][0], stg.tmin[i][1], stg.tmax[i][0], stg.tmax[i][1], stg.rmin[i][0], stg.rmin[i][1], stg.rmax[i][0], stg.rmax[i][1], + stg.freq_bottom_detection[i][0], stg.freq_bottom_detection[i][1], stg.SNR_filter_value[i], stg.Nb_cells_to_average_BS_signal[i]) ) @@ -211,13 +253,33 @@ class UpdateTableForSave: cur.execute("DROP TABLE if exists SedimentsFile") cur.execute("""CREATE TABLE SedimentsFile(ID INTEGER PRIMARY KEY AUTOINCREMENT, - path_fine STRING, - filename_fine STRING - )""" + path_fine STRING, + filename_fine STRING, + radius_grain_fine BLOB, + path_sand STRING, + filename_sand STRING, + radius_grain_sand BLOB, + time_column_label STRING, + distance_from_bank_column_label STRING, + depth_column_label STRING, + Ctot_fine_column_label STRING, + D50_fine_column_label STRING, + Ctot_sand_column_label STRING, + D50_sand_column_label STRING + )""" ) - cur.execute('''INSERT into SedimentsFile(path_fine, filename_fine) VALUES(?, ?)''', - (stg.path_fine, stg.filename_fine)) + cur.execute('''INSERT into SedimentsFile(path_fine, filename_fine, radius_grain_fine, + path_sand, filename_sand, radius_grain_sand, + time_column_label, distance_from_bank_column_label, + depth_column_label, Ctot_fine_column_label, + D50_fine_column_label, Ctot_sand_column_label, + D50_sand_column_label) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + (stg.path_fine, stg.filename_fine, stg.radius_grain_fine.tobytes(), + stg.path_sand, stg.filename_sand, stg.radius_grain_sand.tobytes(), + stg.columns_fine[0], stg.columns_fine[1], stg.columns_fine[2], + stg.columns_fine[3], stg.columns_fine[4], stg.columns_sand[3], stg.columns_sand[4])) cnx.commit() @@ -242,19 +304,37 @@ class UpdateTableForSave: Ctot_fine_per_cent FLOAT, D50_fine FLOAT, frac_vol_fine BLOB, - frac_vol_fine_cumul BLOB + frac_vol_fine_cumul BLOB, + sample_sand_name STRING, + sample_sand_index INTEGER, + distance_from_bank_sand FLOAT, + depth_sand FLOAT, + time_sand FLOAT, + Ctot_sand FLOAT, + Ctot_sand_per_cent FLOAT, + D50_sand FLOAT, + frac_vol_sand BLOB, + frac_vol_sand_cumul BLOB )""" ) for f in range(len(stg.sample_fine)): cur.execute('''INSERT into SedimentsData(sample_fine_name, sample_fine_index, distance_from_bank_fine, depth_fine, time_fine, Ctot_fine, Ctot_fine_per_cent, D50_fine, frac_vol_fine, - frac_vol_fine_cumul) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + frac_vol_fine_cumul, + sample_sand_name, sample_sand_index, distance_from_bank_sand, + depth_sand, time_sand, Ctot_sand, Ctot_sand_per_cent, D50_sand, frac_vol_sand, + frac_vol_sand_cumul) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', (stg.sample_fine[f][0], stg.sample_fine[f][1], stg.distance_from_bank_fine[f], stg.depth_fine[f], stg.time_fine[f], stg.Ctot_fine[f], stg.Ctot_fine_per_cent[f], stg.D50_fine[f], - stg.frac_vol_fine[f].tobytes(), stg.frac_vol_fine_cumul[f].tobytes())) + stg.frac_vol_fine[f].tobytes(), stg.frac_vol_fine_cumul[f].tobytes(), + stg.sample_sand[f][0], stg.sample_sand[f][1], + stg.distance_from_bank_sand[f], stg.depth_sand[f], stg.time_sand[f], stg.Ctot_sand[f], + stg.Ctot_sand_per_cent[f], stg.D50_sand[f], + stg.frac_vol_sand[f].tobytes(), stg.frac_vol_sand_cumul[f].tobytes() + )) cnx.commit() diff --git a/Tutorial_AQUAscat_software.pdf b/Tutorial_AQUAscat_software.pdf new file mode 100644 index 0000000..5080134 Binary files /dev/null and b/Tutorial_AQUAscat_software.pdf differ diff --git a/View/about_window.py b/View/about_window.py index 8860ae9..4a914ca 100644 --- a/View/about_window.py +++ b/View/about_window.py @@ -1,12 +1,28 @@ -import sys +# ============================================================================== # + # about_window.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + # by Brahim MOUDJED # +# ============================================================================== # + +import sys from PyQt5.QtGui import QIcon, QPixmap, QFont from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout, QVBoxLayout, QApplication, QMainWindow, QGridLayout, - QDialog, QDialogButtonBox, QPushButton, QTextEdit, QFrame) + QDialog, QDialogButtonBox, QPushButton, QTextEdit, QFrame, QLineEdit) from PyQt5.QtCore import Qt -from datetime import date - -from Translation.constant_string import HORIZONTAL class AboutWindow(QDialog): @@ -15,7 +31,7 @@ class AboutWindow(QDialog): super().__init__() - self.logo_path = "/home/bmoudjed/Documents/3 SSC acoustic meas project/Graphical interface project/acoused/Logo/" + self.logo_path = "./Logo" self.logo_AcouSed = QPixmap(self.logo_path + "/" + "Logo_AcouSed_AboutAcouSedWindow.png") self.logo_AcouSed.scaled(16, 16, Qt.KeepAspectRatio, Qt.SmoothTransformation) @@ -25,8 +41,6 @@ class AboutWindow(QDialog): self.setWindowTitle("About AcouSed") - # self.buttonBox = QDialogButtonBox.close - self.verticalLayout_Main = QVBoxLayout() self.setLayout(self.verticalLayout_Main) @@ -40,12 +54,12 @@ class AboutWindow(QDialog): self.gridLayout.addWidget(self.label_logo_AcouSed, 0, 0, 3, 1, Qt.AlignCenter) self.label_acoused = QLabel() - self.label_acoused.setText("Acoused 1.15") + self.label_acoused.setText("Acoused 2.0") self.label_acoused.setFont(QFont("Ubuntu", 14)) self.gridLayout.addWidget(self.label_acoused, 0, 1, 1, 1, Qt.AlignCenter) self.label_date = QLabel() - self.label_date.setText("2024.11.04") + self.label_date.setText("2025.01.01") self.label_date.setFont(QFont("Ubuntu", 12)) self.gridLayout.addWidget(self.label_date, 1, 1, 1, 1, Qt.AlignCenter) @@ -53,14 +67,10 @@ class AboutWindow(QDialog): self.label_logo_INRAE.setPixmap(self.logo_INRAE.scaledToHeight(42, Qt.SmoothTransformation)) self.gridLayout.addWidget(self.label_logo_INRAE, 2, 1, 1, 1, Qt.AlignCenter) - # self.label_date = QLabel() - # self.label_date.setText(f"") - # self.verticalLayout_AcouSed_info.addWidget(self.label_date) - # - # self.label_copyright = QLabel() - # self.label_copyright.setText(f"") - # self.verticalLayout_AcouSed_info.addWidget(self.label_copyright) - # print("je suis la") + self.label_contact = QLabel() + self.label_contact.setText("Contact : celine.berni@inrae.fr \n" + " jerome.lecoz@inrae.fr") + self.gridLayout.addWidget(self.label_contact, 3, 1, 1, 1, Qt.AlignLeft) # ---------------------------------------------------------- @@ -114,7 +124,7 @@ class Licence(QDialog): self.setWindowTitle("Licence") - self.setGeometry(500, 300, 400, 400) + self.setGeometry(500, 300, 450, 300) self.verticalLayout = QVBoxLayout() self.setLayout(self.verticalLayout) @@ -122,11 +132,18 @@ class Licence(QDialog): self.textEdit = QTextEdit() self.verticalLayout.addWidget(self.textEdit) - self.textEdit.setText("A. HISTORY OF THE SOFTWARE \n " - "========================== \n\n " - "B. TERMS AND CONDITIONS \n" - "======================= \n\n" - "Open source software .... ") + self.textEdit.setText("AcouSed \n" + "Copyright (C) 2024 - INRAE \n\n" + "This program is free software: you can redistribute it and/or modify \n" + "it under the terms of the GNU General Public License as published by \n" + "the Free Software Foundation, either version 3 of the License, or \n " + "(at your option) any later version. \n\n" + "This program is distributed in the hope that it will be useful, \n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of \n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n" + "GNU General Public License for more details. \n\n" + "You should have received a copy of the GNU General Public License \n" + "along with this program. If not, see .") class Copyright(QDialog): @@ -135,19 +152,26 @@ class Copyright(QDialog): super().__init__() + self.logo_path = "./Logo" + self.logo_INRAE = QPixmap(self.logo_path + "/" + "BlocMarque-INRAE-Inter.jpg") + self.setWindowTitle("Copyright") - self.setGeometry(500, 300, 400, 400) + self.setGeometry(500, 300, 200, 200) - self.verticalLayout = QVBoxLayout() - self.setLayout(self.verticalLayout) + self.gridLayout = QGridLayout() + self.setLayout(self.gridLayout) self.textEdit = QTextEdit() - self.verticalLayout.addWidget(self.textEdit) + self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 1) - self.textEdit.setText("Copyright (c) 2024-2030. \n" + self.textEdit.setText("Copyright (c) 2024. INRAE \n" "All Rights Reserved.") + self.label_INRAE = QLabel() + self.label_INRAE.setPixmap(self.logo_INRAE.scaledToHeight(64, Qt.SmoothTransformation)) + self.gridLayout.addWidget(self.label_INRAE, 1, 0, 1, 1, Qt.AlignCenter) + class Support(QDialog): @@ -155,149 +179,49 @@ class Support(QDialog): super().__init__() + self.logo_path = "./Logo" + + self.logo_OSR = QPixmap(self.logo_path + '/' + "OSR.png") + self.logo_CNR = QPixmap(self.logo_path + '/' + "CNR.png") + self.logo_EDF = QPixmap(self.logo_path + '/' + "EDF.png") + self.logo_Ubertone = QPixmap(self.logo_path + '/' + "Ubertone.jpeg") + self.setWindowTitle("Support") - self.setGeometry(500, 300, 400, 400) + self.setGeometry(500, 300, 300, 300) - self.verticalLayout = QVBoxLayout() - self.setLayout(self.verticalLayout) + self.gridLayout = QGridLayout() + self.setLayout(self.gridLayout) - self.textEdit = QTextEdit() - self.verticalLayout.addWidget(self.textEdit) + self.label_support = QLabel() + self.label_support.setText("The development of AcouSed was supported by OSR6 and CNR Company.") + self.gridLayout.addWidget(self.label_support, 0, 0, 1, 2, Qt.AlignLeft) - self.textEdit.setText("The development of AcouSed was supported by OSR6 and CNR. \n" - "It was made in collaboration with Ubertone and EDF Companies.") + self.label_OSR = QLabel() + self.label_OSR.setPixmap(self.logo_OSR.scaledToHeight(96, Qt.SmoothTransformation)) + self.gridLayout.addWidget(self.label_OSR, 1, 0, 1, 1, Qt.AlignCenter) + + self.label_CNR = QLabel() + self.label_CNR.setPixmap(self.logo_CNR.scaledToHeight(32, Qt.SmoothTransformation)) + self.gridLayout.addWidget(self.label_CNR, 1, 1, 1, 1, Qt.AlignCenter) + + self.label_collaboration = QLabel() + self.label_collaboration.setText("It was made in collaboration with Ubertone and EDF Companies.") + self.gridLayout.addWidget(self.label_collaboration, 2, 0, 1, 2, Qt.AlignLeft) + + self.label_Ubertone = QLabel() + self.label_Ubertone.setPixmap(self.logo_Ubertone.scaledToHeight(48, Qt.SmoothTransformation)) + self.gridLayout.addWidget(self.label_Ubertone, 3, 0, 1, 1, Qt.AlignCenter) + + self.label_EDF = QLabel() + self.label_EDF.setPixmap(self.logo_EDF.scaledToHeight(48, Qt.SmoothTransformation)) + self.gridLayout.addWidget(self.label_EDF, 3, 1, 1, 1, Qt.AlignCenter) -# app = QApplication(sys.argv) -# w = AboutWindow() -# sys.exit(app.exec_()) - -if __name__ == "__main__": - app = QApplication(sys.argv) - # otherwindow = QMainWindow() - # w = AboutWindow(otherwindow) - w = AboutWindow() - print(w) - w.show() - print("et ici") - # otherwindow.show() - # MainWindow = QMainWindow() - # ui = Ui_MainWindow() - # ui.setupUi(MainWindow) - # MainWindow.show() - sys.exit(app.exec_()) +# if __name__ == "__main__": +# app = QApplication(sys.argv) +# w = AboutWindow() +# w.show() +# sys.exit(app.exec_()) - -# import sys -# from PyQt5.QtWidgets import * -# from PyQt5.QtGui import * -# from PyQt5.QtCore import * -# -# -# class AboutWindow(QWidget): -# -# def __init__(self): -# -# super().__init__() -# -# # self.centralwidget = QWidget(window) -# -# self.execute() -# -# def execute(self): -# -# self.resize(300, 500) -# self.move(200, 200) -# self.setWindowTitle("Ma première fenêtre simple") -# # self.setWindowFlags(Qt.Popup) -# -# # QIcon -# icone = QIcon("PyQt5_icone.jpeg") -# self.setWindowIcon(icone) -# -# # QLabel -# label1 = QLabel("PyQt", self) -# label1.setText(label1.text() + "5") -# label1.setMargin(5) -# label1.setIndent(50) -# -# # QPixmap -# pic = QPixmap("PyQt5_icone.jpeg") -# label2 = QLabel(self) -# label2.setPixmap(pic) -# label2.setScaledContents(True) -# label2.resize(50, 50) -# label2.move(60, 50) -# -# # label3 = QLabel("Phrase test :", self) -# label3 = QLabel(self) -# label3.setText("Phrase test :") -# label3.move(10, 125) -# -# # QLineEdit -# line_edit = QLineEdit(self) -# line_edit.move(100, 125) -# line_edit.resize(150, 20) -# line_edit.setText("Ma Valeur par défaut") -# -# # QPushButton -# button = QPushButton(self) -# button.setText('Cliquez') -# button.move(30, 150) -# -# # QCheckBox -# checkbox = QCheckBox(self) -# checkbox.setText("Bouton Check Box") -# checkbox.move(30, 200) -# checkbox.setChecked(True) -# -# if checkbox.isChecked() == True: -# label1.setText("La case est coché") -# else: -# label1.setText("la case n'est pas coché") -# -# # QRadioButton -# radiobutton = QRadioButton(self) -# radiobutton.setText('Bouton Radio') -# radiobutton.move(30, 220) -# -# # QComboBox -# combobox = QComboBox(self) -# combobox.addItems(["France", "Espagne", "Italie", "Allemagne", "Royaume-Uni"]) -# combobox.move(100, 250) -# -# label4 = QLabel("Choix du pays", self) -# label4.move(5, 250) -# -# # QSpinBox -# spinbox = QSpinBox(self) -# spinbox.move(75, 300) -# -# label5 = QLabel("Valeur :", self) -# label5.move(5, 300) -# -# # QProgressBar -# progressbar = QProgressBar(self) -# progressbar.setGeometry(5, 350, 150, 30) -# progressbar.setValue(0) -# -# # QTextEdit -# textedit = QTextEdit(self) -# textedit.move(20, 400) -# textedit.resize(150, 40) -# textedit.setText("azertyuiopqsdfghjklmwxcvbn azertyuiopqsdfghjklmwxcvbn") -# -# self.show() -# print("coucou") -# -# # if __name__ == "__main__": -# # application = QApplication(sys.argv) -# # -# # fenetre = AboutWindow() -# # -# # fenetre.show() -# # -# # sys.exit(application.exec_()) -# diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index 5d4c944..3c9b349 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -1,3 +1,26 @@ +# ============================================================================== # + # acoustic_data_tab.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + + # by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + import sys from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QPushButton, QComboBox, QLineEdit, QLabel, @@ -47,7 +70,7 @@ _translate = QCoreApplication.translate class AcousticDataTab(QWidget): - + COMPTEUR = 1 """ This class generates the Acoustic Data Tab """ @@ -61,7 +84,8 @@ class AcousticDataTab(QWidget): def __init__(self, tab_widget): super().__init__() - + self.numero = AcousticDataTab.COMPTEUR + AcousticDataTab.COMPTEUR += 1 # Utiliser os.path.split() OU os.path.join() # if name == 'posix': @@ -83,12 +107,15 @@ class AcousticDataTab(QWidget): self.icon_clear = QIcon(self.path_icon + "clear.png") self.icon_between = QPixmap(self.path_icon + "between.png") self.icon_refresh = QIcon(self.path_icon + "update.png") - + print("CONSTRUCTEUR ", self.numero) self.calib_kt = CalibrationConstantKt() ### --- General layout of widgets --- self.verticalLayoutMain = QVBoxLayout(tab_widget) + # tab_widget = QTabWidget() + # self.verticalLayoutMain = QVBoxLayout() + # tab_widget.addLayout(self.verticalLayoutMain) # self.setLayout(self.verticalLayoutMain) self.horizontalLayoutTop = QHBoxLayout() @@ -154,8 +181,6 @@ class AcousticDataTab(QWidget): # | Group box Download file | # +++++++++++++++++++++++++++ - - # --- Group box Download multiple file --- # self.groupbox_multiple_acoustic_file = QGroupBox() @@ -174,6 +199,7 @@ class AcousticDataTab(QWidget): self.gridLayout_groupbox_acoustic_file = QGridLayout(self.groupbox_acoustic_file) self.combobox_ABS_system_choice = QComboBox() + print("tab1 combobox_ABS_system_choice ", self.combobox_ABS_system_choice) self.combobox_ABS_system_choice.addItems([" ", "AQUAscat", "UBSediFlow"]) self.gridLayout_groupbox_acoustic_file.addWidget(self.combobox_ABS_system_choice, 0, 0, 1, 1) @@ -1313,6 +1339,7 @@ class AcousticDataTab(QWidget): self.delBtn.clicked.connect(self.remove_file_from_ListWidget) self.clearBtn.clicked.connect(self.clear_files_from_ListWidget) + # self.fileListWidget.itemSelectionChanged.connect(self.fileListWidget_function) self.fileListWidget.itemSelectionChanged.connect(self.print_selected_file) self.fileListWidget.itemSelectionChanged.connect(self.fill_measurements_information_groupbox) self.fileListWidget.itemSelectionChanged.connect(self.fill_table) @@ -1403,6 +1430,19 @@ class AcousticDataTab(QWidget): def print_range_changed(self): print(f"tmax = {self.doubleRangeSlider_depth.value()[1]}") + # def fileListWidget_function(self): + # self.print_selected_file() + # self.fill_measurements_information_groupbox() + # self.fill_table() + # self.compute_tmin_tmax() + # self.compute_rmin_rmax() + # self.update_frequency_combobox() + # self.plot_backscattered_acoustic_signal_recording() + # self.plot_profile() + # self.update_plot_backscattered_acoustic_signal_recording() + # self.update_plot_profile() + # self.set_range_for_spinboxes_bathymetry() + def retranslate_acoustic_data_tab(self): # self.groupbox_download.setTitle(_translate("CONSTANT_STRING", cs.DOWNLOAD)) @@ -1530,11 +1570,14 @@ class AcousticDataTab(QWidget): def ABS_system_choice(self): if self.combobox_ABS_system_choice.currentText() == " ": + print("0 combobox_ABS_system_choice ", self.combobox_ABS_system_choice.currentText()) self.groupbox_measurement_information_no_ABS() elif self.combobox_ABS_system_choice.currentText() == "AQUAscat": + print("1 combobox_ABS_system_choice ", self.combobox_ABS_system_choice.currentText()) self.groupbox_measurement_information_Aquascat() # self.lineEdit_acoustic_file.clear() elif self.combobox_ABS_system_choice.currentText() == "UBSediFlow": + print("2 combobox_ABS_system_choice ", self.combobox_ABS_system_choice.currentText()) self.groupbox_measurement_information_UBSediFlow() # self.lineEdit_acoustic_file.clear() # self.label_date_groupbox_acoustic_file.clear() @@ -1653,7 +1696,7 @@ class AcousticDataTab(QWidget): # self.spinbox_tx.hide() self.lineEdit_tx.hide() self.checkbox_tx.hide() - + print("Coucou 0") for i in reversed(range(self.gridLayout_groupbox_info.count())): widgetToRemove = self.gridLayout_groupbox_info.itemAt(i).widget() # remove it from the layout list @@ -1700,6 +1743,7 @@ class AcousticDataTab(QWidget): self.gridLayout_groupbox_info.addWidget(self.lineEdit_speed_of_sound, 4, 1, 1, 1, Qt.AlignLeft) self.label_speed_of_sound_unit.show() self.gridLayout_groupbox_info.addWidget(self.label_speed_of_sound_unit, 4, 2, 1, 1, Qt.AlignLeft) + print("Coucou 1.5") self.label_freq.show() self.gridLayout_groupbox_info.addWidget(self.label_freq, 5, 0, 1, 1, Qt.AlignLeft) @@ -1754,6 +1798,7 @@ class AcousticDataTab(QWidget): self.gridLayout_groupbox_info.addWidget(self.lineEdit_tx, 16, 1, 1, 1, Qt.AlignLeft) self.checkbox_tx.show() self.gridLayout_groupbox_info.addWidget(self.checkbox_tx, 16, 3, 1, 1, Qt.AlignLeft) + print("Coucou 2") def groupbox_measurement_information_UBSediFlow(self): # --- Hide Aquascat information --- @@ -2099,7 +2144,7 @@ class AcousticDataTab(QWidget): msgBox.setStandardButtons(QMessageBox.Ok) msgBox.exec() elif self.combobox_ABS_system_choice.currentIndex() == 1: - print("hello ", [stg.path_BS_raw_data[-1] if self.fileListWidget.count() > 0 else ""][0]) + # print("hello ", [stg.path_BS_raw_data[-1] if self.fileListWidget.count() > 0 else ""][0]) filename = QFileDialog.getOpenFileNames(self, "AQUAscat file", [stg.path_BS_raw_data[-1] if self.fileListWidget.count() > 0 else ""][0], "Aquascat file (*.aqa)", @@ -2519,7 +2564,7 @@ class AcousticDataTab(QWidget): stg.BS_raw_data.append(acoustic_data._BS_raw_data) stg.BS_raw_data_reshape.append(acoustic_data.reshape_BS_raw_data()) stg.depth.append(acoustic_data._r) - stg.depth_2D.append(acoustic_data.compute_r_2D()) + stg.depth_2D.append(np.array([])) print("stg.depth_2D ", len(stg.depth_2D), stg.depth_2D[0].shape) # stg.depth_2D.append(np.array([])) stg.depth_reshape.append(acoustic_data.reshape_r()) @@ -2531,6 +2576,7 @@ class AcousticDataTab(QWidget): print("stg.freq text", stg.freq_text) stg.date.append(acoustic_data._date) stg.hour.append(acoustic_data._hour) + print("date ", stg.date, "hour ", stg.hour) stg.distance_from_ABS_to_free_surface.append(0.00) stg.nb_profiles.append(acoustic_data._nb_profiles) stg.nb_profiles_per_sec.append(acoustic_data._nb_profiles_per_sec) @@ -2557,16 +2603,16 @@ class AcousticDataTab(QWidget): stg.depth_cross_section.append(np.array([])) stg.time_cross_section.append(np.array([])) - stg.tmin.append("") - stg.tmax.append("") - stg.rmin.append("") - stg.rmax.append("") + stg.tmin.append((0, 0)) + stg.tmax.append((0, 0)) + stg.rmin.append((0, 0)) + stg.rmax.append((0, 0)) stg.BS_stream_bed.append(np.array([])) stg.depth_bottom.append(np.array([])) stg.val_bottom.append([]) stg.ind_bottom.append([]) - stg.freq_bottom_detection.append(()) + stg.freq_bottom_detection.append((0, 0)) # stg.depth_bottom_detection_1st_int_area.append([]) stg.BS_mean.append(np.array([])) @@ -2603,6 +2649,8 @@ class AcousticDataTab(QWidget): # stg.fine_sample_position.append([]) # stg.sand_sample_position.append([]) + stg.kt2D.append(np.array([])) + stg.kt3D.append(np.array([])) stg.J_cross_section.append([np.array([]), np.array([])]) stg.VBI_cross_section.append(np.array([])) stg.SSC_fine.append(np.array([])) @@ -2726,6 +2774,7 @@ class AcousticDataTab(QWidget): # self.spinbox_tx.setValue(stg.gain_tx[self.fileListWidget.currentRow()][self.combobox_frequency_information.currentIndex()]) # self.spinbox_tx.setEnabled(False) + print("--gain tx-- ", self.fileListWidget.currentRow(), self.combobox_frequency_information.currentIndex(), stg.gain_tx) self.lineEdit_tx.setText(str("%.2f" % stg.gain_tx[self.fileListWidget.currentRow()][self.combobox_frequency_information.currentIndex()])) self.lineEdit_tx.setEnabled(False) self.checkbox_tx.stateChanged.connect(self.activate_unactivate_spinbox_tx) @@ -3360,14 +3409,16 @@ class AcousticDataTab(QWidget): # self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.addWidget(self.scroll_BS) # plt.close(self.fig_BS) - - if self.fileListWidget.currentRow() != -1: + print("On est là ") + print("fileList widget ", self.fileListWidget.count()) + # if self.fileListWidget.currentRow() != -1: + if self.fileListWidget.count() > 0: self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.removeWidget(self.toolbar_BS) self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.removeWidget(self.scroll_BS) self.fig_BS, self.axis_BS = plt.subplots(nrows=stg.freq[self.fileListWidget.currentRow()].shape[0], ncols=1, - sharex=True, sharey=False, layout="constrained") + sharex=False, sharey=False, layout="constrained") self.canvas_BS = FigureCanvas(self.fig_BS) self.toolbar_BS = NavigationToolBar(self.canvas_BS, self) # self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.addWidget(self.canvas_BS) @@ -3392,11 +3443,14 @@ class AcousticDataTab(QWidget): # print(f"freq = {f}") if self.combobox_ABS_system_choice.currentIndex() == 1: + print("stg.time[self.fileListWidget.currentRow()][f, :]", stg.time[self.fileListWidget.currentRow()][f, :].shape) + print("stg.depth[self.fileListWidget.currentRow()][f, :]", stg.depth[self.fileListWidget.currentRow()][f, :].shape) + print("stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, :]", stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, :].shape) pcm = self.axis_BS[f].pcolormesh(stg.time[self.fileListWidget.currentRow()][f, :], - -stg.depth[self.fileListWidget.currentRow()][f, :], - stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, :], - # stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, int(stg.tmin[self.fileListWidget.currentRow()]):int(stg.tmax[self.fileListWidget.currentRow()])], - cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + -stg.depth[self.fileListWidget.currentRow()][f, :], + stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, :], + # stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, int(stg.tmin[self.fileListWidget.currentRow()]):int(stg.tmax[self.fileListWidget.currentRow()])], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) elif self.combobox_ABS_system_choice.currentIndex() == 2: pcm = self.axis_BS[f].pcolormesh(stg.time[self.fileListWidget.currentRow()][f, :], @@ -3404,6 +3458,7 @@ class AcousticDataTab(QWidget): np.log(stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, :]), # np.log(stg.BS_raw_data[self.fileListWidget.currentRow()][f, :, int(stg.tmin[self.fileListWidget.currentRow()]):int(stg.tmax[self.fileListWidget.currentRow()])]), cmap='Blues') + self.axis_BS[f].text(1, .70, stg.freq_text[self.fileListWidget.currentRow()][f], fontsize=14, fontweight='bold', fontname="Ubuntu", c="black", alpha=0.5, horizontalalignment='right', verticalalignment='bottom', @@ -3422,6 +3477,7 @@ class AcousticDataTab(QWidget): cbar = self.fig_BS.colorbar(pcm, ax=self.axis_BS[:], shrink=1, location='right') cbar.set_label(label='Acoustic backscatter signal (V)', rotation=270, labelpad=10) self.fig_BS.canvas.draw_idle() + # plt.show() # plt.close(self.fig_BS) # self.plot_profile() @@ -3446,7 +3502,7 @@ class AcousticDataTab(QWidget): if len(self.axis_BS.tolist()) != stg.freq[self.fileListWidget.currentRow()].shape[0]: self.fig_BS, self.axis_BS = plt.subplots(nrows=stg.freq[self.fileListWidget.currentRow()].shape[0], ncols=1, - sharex=True, sharey=False, layout="constrained") + sharex=False, sharey=False, layout="constrained") for f, _ in enumerate(stg.freq[self.fileListWidget.currentRow()]): self.axis_BS[f].cla() @@ -3827,18 +3883,19 @@ class AcousticDataTab(QWidget): # if (len(stg.depth_bottom) != 0) and (len(stg.depth_bottom) == self.fileListWidget.count()): if len(stg.depth_bottom[self.fileListWidget.currentRow()]) != 0: - + print("slider value : ", self.fileListWidget.currentRow(), self.combobox_frequency_profile.currentIndex(), + slider_value, stg.ind_bottom[self.fileListWidget.currentRow()][slider_value]) self.axis_profile.plot([0, - np.nanmax(stg.BS_cross_section[self.fileListWidget.currentRow()][ + np.nanmax(stg.BS_raw_data[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), :, slider_value])], -stg.depth[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), - stg.ind_bottom[self.fileListWidget.currentRow()][slider_value]] * np.ones(2), + int(stg.ind_bottom[self.fileListWidget.currentRow()][slider_value])] * np.ones(2), linestyle='solid', color='r', linewidth=1) position_x = (stg.depth[self.fileListWidget.currentRow()][self.combobox_frequency_profile.currentIndex(), - stg.ind_bottom[self.fileListWidget.currentRow()][slider_value]] / + int(stg.ind_bottom[self.fileListWidget.currentRow()][slider_value])] / np.nanmax( stg.depth[self.fileListWidget.currentRow()][self.combobox_frequency_profile.currentIndex(), :])) @@ -3900,13 +3957,13 @@ class AcousticDataTab(QWidget): :, slider_value])], -stg.depth[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), - stg.ind_bottom[self.fileListWidget.currentRow()][ - slider_value]] * np.ones(2), + int(stg.ind_bottom[self.fileListWidget.currentRow()][ + slider_value])] * np.ones(2), linestyle='solid', color='r', linewidth=1) position_x = (stg.depth[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), - stg.ind_bottom[self.fileListWidget.currentRow()][slider_value]] / + int(stg.ind_bottom[self.fileListWidget.currentRow()][slider_value])] / np.nanmax(stg.depth[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), :])) @@ -3949,13 +4006,13 @@ class AcousticDataTab(QWidget): :, slider_value])], -stg.depth[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), - stg.ind_bottom[self.fileListWidget.currentRow()][ - slider_value]] * np.ones(2), + int(stg.ind_bottom[self.fileListWidget.currentRow()][ + slider_value])] * np.ones(2), linestyle='solid', color='r', linewidth=1) position_x = (stg.depth[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), - stg.ind_bottom[self.fileListWidget.currentRow()][slider_value]] / + int(stg.ind_bottom[self.fileListWidget.currentRow()][slider_value])] / np.nanmax(stg.depth[self.fileListWidget.currentRow()][ self.combobox_frequency_profile.currentIndex(), :])) diff --git a/View/acoustic_inversion_tab.py b/View/acoustic_inversion_tab.py index 2a69f26..5a04c6c 100644 --- a/View/acoustic_inversion_tab.py +++ b/View/acoustic_inversion_tab.py @@ -1,8 +1,9 @@ import sys +import pandas as pd from PyQt5.QtWidgets import (QWidget, QMainWindow, QApplication, QVBoxLayout, QHBoxLayout, QGroupBox, QComboBox, QGridLayout, QLabel, QPushButton, QSpinBox, QDoubleSpinBox, QAbstractSpinBox, QSpacerItem, - QSizePolicy, QSlider, QLineEdit, QMessageBox) + QSizePolicy, QSlider, QLineEdit, QMessageBox, QFileDialog) from PyQt5.QtCore import QCoreApplication, Qt, pyqtSignal from PyQt5.QtGui import QStandardItemModel, QIcon, QPixmap @@ -17,6 +18,7 @@ from matplotlib.colors import LogNorm, BoundaryNorm, CSS4_COLORS from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolBar +from os import path, chdir import datetime from scipy import stats @@ -32,6 +34,7 @@ import settings as stg from View.show_popup_combobox import ComboBoxShowPopUpWindow from Model.acoustic_inversion_method_high_concentration import AcousticInversionMethodHighConcentration +from settings import SSC_fine _translate = QCoreApplication.translate @@ -95,6 +98,11 @@ class AcousticInversionTab(QWidget): self.spacerItem_RunInversion = QSpacerItem(1000, 10)#, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_Run_Inversion.addSpacerItem(self.spacerItem_RunInversion) + self.pushbutton_save_result = QPushButton() + self.pushbutton_save_result.setText("Save Results") + self.pushbutton_save_result.setMaximumWidth(110) + self.horizontalLayout_Run_Inversion.addWidget(self.pushbutton_save_result) + ### --- Layout of groupbox in the Top horizontal layout box # Plot SSC 2D field | SSC vertical profile | Plot SSC graph sample vs inversion ===>>> FINE @@ -343,6 +351,7 @@ class AcousticInversionTab(QWidget): self.pushbutton_update_acoustic_data_choice.clicked.connect(self.update_acoustic_data_choice) self.pushbutton_run_inversion.clicked.connect(self.function_run_inversion) + self.pushbutton_save_result.clicked.connect(self.save_result_in_excel_file) self.pushbutton_left_to_begin_fine.clicked.connect(self.slider_profile_number_to_begin_fine) self.pushbutton_left_fine.clicked.connect(self.slider_profile_number_to_left_fine) @@ -476,6 +485,7 @@ class AcousticInversionTab(QWidget): ) print("stg.SSC_fine ", stg.SSC_fine) + print("stg.SSC_fine shape ", stg.SSC_fine[self.combobox_acoustic_data_choice.currentIndex()].shape) def compute_SSC_sand(self): @@ -493,6 +503,7 @@ class AcousticInversionTab(QWidget): ks=stg.ks[1]) print("stg.SSC_sand ", stg.SSC_sand) + print("stg.SSC_sand shape ", stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()].shape) def plot_SSC_fine(self): @@ -748,6 +759,7 @@ class AcousticInversionTab(QWidget): # self.axis_SSC_fine.plot([], [], ) + self.axis_vertical_profile_SSC_fine.set_xlim(0, 10) self.axis_vertical_profile_SSC_fine.set_xlabel("Inverted Fine SSC (g/L)") self.axis_vertical_profile_SSC_fine.set_ylabel("Depth (m)") self.figure_vertical_profile_SSC_fine.canvas.draw_idle() @@ -852,6 +864,7 @@ class AcousticInversionTab(QWidget): marker='*', s=48, c='r', edgecolors='r') self.axis_vertical_profile_SSC_fine.text(stg.Ctot_fine[f[1]], stg.depth_fine[f[1]], f[0]) + self.axis_vertical_profile_SSC_fine.set_xlim(0, 10) self.axis_vertical_profile_SSC_fine.set_xlabel("Inverted Fine SSC (g/L)") self.axis_vertical_profile_SSC_fine.set_ylabel("Depth (m)") self.figure_vertical_profile_SSC_fine.canvas.draw_idle() @@ -1445,6 +1458,7 @@ class AcousticInversionTab(QWidget): # self.axis_SSC_fine.plot([], [], ) + self.axis_vertical_profile_SSC_sand.set_xlim(0, 10) self.axis_vertical_profile_SSC_sand.set_xlabel("Inverted Sand SSC (g/L)") self.axis_vertical_profile_SSC_sand.set_ylabel("Depth (m)") self.figure_vertical_profile_SSC_sand.canvas.draw_idle() @@ -1553,6 +1567,7 @@ class AcousticInversionTab(QWidget): stg.depth_fine[stg.sand_sample_target[0][1]], stg.sand_sample_target[0][0]) + self.axis_vertical_profile_SSC_sand.set_xlim(0, 10) self.axis_vertical_profile_SSC_sand.set_xlabel("Inverted Sand SSC (g/L)") self.axis_vertical_profile_SSC_sand.set_ylabel("Depth (m)") self.figure_vertical_profile_SSC_sand.canvas.draw_idle() @@ -1864,6 +1879,117 @@ class AcousticInversionTab(QWidget): self.figure_measured_vs_inverted_sand.canvas.draw_idle() + + def save_result_in_excel_file(self): + + if self.combobox_acoustic_data_choice.count() > 0: + + name = QFileDialog.getSaveFileName( + caption="Save As - Inversion results", directory="", filter="Excel Files (*.xlsx)", + options=QFileDialog.DontUseNativeDialog) + + if name[0]: + dirname = "/".join(name[0].split("/")[:-1]) + "/" + filename = name[0].split("/")[-1] + chdir(dirname) + + for k in range(self.combobox_acoustic_data_choice.count()): + + if stg.time_cross_section[k].shape != (0,): + + if stg.depth_cross_section[k].shape != (0,): + + t = np.repeat(stg.time_cross_section[k][stg.frequency_for_inversion[1]], + stg.depth_cross_section[k].shape[1]) + + r = np.zeros((stg.depth_cross_section[k].shape[1] *stg.time_cross_section[k].shape[1],1)) + + for i in range(stg.time_cross_section[k].shape[1]): + for j in range(stg.depth_cross_section[k].shape[1]): + r[i * stg.depth_cross_section[k].shape[1] + j] = ( + stg.depth_cross_section[k][int(stg.frequency_for_inversion[1]), j]) + + if stg.SSC_fine[k].shape == (0,): + stg.SSC_fine[k] = np.zeros(r.shape[0]) + if stg.SSC_sand[k].shape == (0,): + stg.SSC_sand[k] = np.zeros(r.shape[0]) + + else: + + t = np.repeat(stg.time_cross_section[k][stg.frequency_for_inversion[1]], stg.depth[k].shape[1]) + + r = np.zeros((stg.depth[k].shape[1] * stg.time_cross_section[k].shape[1], 1)) + for i in range(stg.time_cross_section[k].shape[1]): + for j in range(stg.depth[k].shape[1]): + r[i * stg.depth[k].shape[1] + j] = ( + stg.depth[k][int(stg.frequency_for_inversion[1]), j]) + + if stg.SSC_fine[k].shape == (0,): + stg.SSC_fine[k] = np.zeros(r.shape[0]) + if stg.SSC_sand[k].shape == (0,): + stg.SSC_sand[k] = np.zeros(r.shape[0]) + + else: + + if stg.depth_cross_section[k].shape != (0,): + + t = np.repeat(stg.time[k][stg.frequency_for_inversion[1]], stg.depth_cross_section[k].shape[1]) + + r = np.zeros((stg.depth_cross_section[k].shape[1] * stg.time[k].shape[1], 1)) + for i in range(stg.time[k].shape[1]): + for j in range(stg.depth_cross_section[k].shape[1]): + r[i * stg.depth_cross_section[k].shape[1] + j] = ( + stg.depth_cross_section[k][int(stg.frequency_for_inversion[1]), j]) + + if stg.SSC_fine[k].shape == (0,): + stg.SSC_fine[k] = np.zeros(r.shape[0]) + if stg.SSC_sand[k].shape == (0,): + stg.SSC_sand[k] = np.zeros(r.shape[0]) + + else: + + t = np.repeat(stg.time[k][stg.frequency_for_inversion[1]], stg.depth[k].shape[1]) + + r = np.zeros(stg.depth[k].shape[1] * stg.time[k].shape[1]) + + for i in range(stg.time[k].shape[1]): + for j in range(stg.depth[k].shape[1]): + r[i * stg.depth[k].shape[1] + j] = ( + stg.depth[k][int(stg.frequency_for_inversion[1]), j]) + + if stg.SSC_fine[k].shape == (0,): + stg.SSC_fine[k] = np.zeros(r.shape[0]) + if stg.SSC_sand[k].shape == (0,): + stg.SSC_sand[k] = np.zeros(r.shape[0]) + + + print("<<<<<<<<<<<<<<<<<<<<<<<<<") + print(t.shape, r.shape, stg.SSC_fine[k].shape, stg.SSC_sand[k].shape) + exec("result_" + str(k) + "= pd.DataFrame({'Time (sec)': t," + + "'Depth (m)': r," + + "'SSC_fine (g/L)': stg.SSC_fine[" + str(k) + "].reshape(t.shape[0])," + + "'SSC_sand (g/L)': stg.SSC_sand[" + str(k) + "].reshape(t.shape[0])})") + + + + with pd.ExcelWriter(dirname + filename + '.xlsx') as writer: + print("writer ", writer) + for k in range(self.combobox_acoustic_data_choice.count()): + eval("result_" + str(k) + ".to_excel(writer, index=False, " + + "engine='xlsxwriter', na_rep='NA', " + + "sheet_name=stg.data_preprocessed[" + str(k) + "])") + # result.to_excel(excel_writer=filename + '.xlsx', index=False, engine='xlsxwriter', na_rep='NA', + # sheet_name=stg.data_preprocessed[k]) + + # except ValueError as e: + # print("error = ", e) + # msgBox = QMessageBox() + # msgBox.setWindowTitle("Save Inversion Result Error") + # msgBox.setIcon(QMessageBox.Warning) + # msgBox.setText("No saved file") + # msgBox.setStandardButtons(QMessageBox.Ok) + # msgBox.exec() + # -------------------------------------------------------------------------------------------------------------- # ______ _______ diff --git a/View/mainwindow.py b/View/mainwindow.py index 3f6ea3d..3a9abe2 100644 --- a/View/mainwindow.py +++ b/View/mainwindow.py @@ -1,4 +1,25 @@ +# ============================================================================== # + # mainwindow.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + + # by Brahim MOUDJED # +# ============================================================================== # + # -*- coding: utf-8 -*- + import os # Form implementation generated from reading ui file 'mainwindow.ui' @@ -21,7 +42,8 @@ import numpy as np from subprocess import check_call, run import time -# from View.acoustic_data_tab import AcousticDataTab + +from View.acoustic_data_tab import AcousticDataTab class Ui_MainWindow(object): @@ -92,11 +114,11 @@ class Ui_MainWindow(object): self.toolBar = QtWidgets.QToolBar(self.mainwindow) self.toolBar.setObjectName("toolBar") self.mainwindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) - self.actionNew = QtWidgets.QAction(self.mainwindow) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap("icons/new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionNew.setIcon(icon) - self.actionNew.setObjectName("actionNew") + # self.actionNew = QtWidgets.QAction(self.mainwindow) + # icon = QtGui.QIcon() + # icon.addPixmap(QtGui.QPixmap("icons/new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + # self.actionNew.setIcon(icon) + # self.actionNew.setObjectName("actionNew") self.actionOpen = QtWidgets.QAction(self.mainwindow) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("icons/icon_folder.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -107,21 +129,21 @@ class Ui_MainWindow(object): icon2.addPixmap(QtGui.QPixmap("icons/save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionSave.setIcon(icon2) self.actionSave.setObjectName("actionSave") - self.actionCopy = QtWidgets.QAction(self.mainwindow) - icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap("icons/copy.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionCopy.setIcon(icon3) - self.actionCopy.setObjectName("actionCopy") - self.actionCut = QtWidgets.QAction(self.mainwindow) - icon4 = QtGui.QIcon() - icon4.addPixmap(QtGui.QPixmap("icons/cut.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionCut.setIcon(icon4) - self.actionCut.setObjectName("actionCut") - self.actionPaste = QtWidgets.QAction(self.mainwindow) - icon5 = QtGui.QIcon() - icon5.addPixmap(QtGui.QPixmap("icons/paste.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionPaste.setIcon(icon5) - self.actionPaste.setObjectName("actionPaste") + # self.actionCopy = QtWidgets.QAction(self.mainwindow) + # icon3 = QtGui.QIcon() + # icon3.addPixmap(QtGui.QPixmap("icons/copy.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + # self.actionCopy.setIcon(icon3) + # self.actionCopy.setObjectName("actionCopy") + # self.actionCut = QtWidgets.QAction(self.mainwindow) + # icon4 = QtGui.QIcon() + # icon4.addPixmap(QtGui.QPixmap("icons/cut.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + # self.actionCut.setIcon(icon4) + # self.actionCut.setObjectName("actionCut") + # self.actionPaste = QtWidgets.QAction(self.mainwindow) + # icon5 = QtGui.QIcon() + # icon5.addPixmap(QtGui.QPixmap("icons/paste.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + # self.actionPaste.setIcon(icon5) + # self.actionPaste.setObjectName("actionPaste") self.actionEnglish = QtWidgets.QAction(self.mainwindow) icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap("icons/en.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -142,6 +164,10 @@ class Ui_MainWindow(object): self.actionAbout.setObjectName("actionAbout") self.actionUserManual = QtWidgets.QAction(self.mainwindow) self.actionUserManual.setText("User Manual") + self.action_AcousticInversionTheory = QtWidgets.QAction(self.mainwindow) + self.action_AcousticInversionTheory.setText("Acoustic inversion theory") + self.action_AQUAscatUserManual = QtWidgets.QAction(self.mainwindow) + self.action_AQUAscatUserManual.setText("Tutorial AQUAscat software") self.actionDB_Browser_for_SQLite = QtWidgets.QAction(self.mainwindow) self.actionDB_Browser_for_SQLite.setObjectName("actionDB_Browser_for_SQLite") self.menuLanguage.addAction(self.actionEnglish) @@ -159,16 +185,18 @@ class Ui_MainWindow(object): self.menuTools.addAction(self.actionDB_Browser_for_SQLite) self.menuHelp.addAction(self.actionAbout) self.menuHelp.addAction(self.actionUserManual) + self.menuHelp.addAction(self.action_AcousticInversionTheory) + self.menuHelp.addAction(self.action_AQUAscatUserManual) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuTools.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) - self.toolBar.addAction(self.actionNew) + # self.toolBar.addAction(self.actionNew) self.toolBar.addAction(self.actionOpen) self.toolBar.addAction(self.actionSave) self.toolBar.addSeparator() - self.toolBar.addAction(self.actionCopy) - self.toolBar.addAction(self.actionCut) - self.toolBar.addAction(self.actionPaste) + # self.toolBar.addAction(self.actionCopy) + # self.toolBar.addAction(self.actionCut) + # self.toolBar.addAction(self.actionPaste) self.toolBar.addSeparator() self.toolBar.addAction(self.actionEnglish) self.toolBar.addAction(self.actionFrench) @@ -188,7 +216,7 @@ class Ui_MainWindow(object): # --- Connect Action Open --- self.actionOpen.triggered.connect(self.open) - self.actionOpen.triggered.connect(lambda: print('tott')) + # self.actionOpen.triggered.connect(lambda: print('tott')) # --- Connect Action ABS calibration constant kt --- self.action_ABSCalibrationConstant.triggered.connect(self.load_calibration_constant_values) @@ -205,6 +233,8 @@ class Ui_MainWindow(object): # --- Connect Action User Manual --- self.actionUserManual.triggered.connect(self.user_manual) + self.action_AcousticInversionTheory.triggered.connect(self.inversion_acoustic_theory) + self.action_AQUAscatUserManual.triggered.connect(self.tutorial_AQUAscat_software) def createContextMenu(self): @@ -227,7 +257,8 @@ class Ui_MainWindow(object): UpdateTableForSave() def open(self): - ReadTableForOpen() + pass + # ReadTableForOpen() # acoustic_data_tab = AcousticDataTab() # @@ -246,10 +277,16 @@ class Ui_MainWindow(object): aw.exec() def user_manual(self): - print(os.getcwd()) - print(check_call("ls")) - open('User_manual_0.pdf') - run(["open", 'User_manual_0.pdf']) + open('AcouSed_UserManual.pdf') + run(["open", 'AcouSed_UserManual.pdf']) + + def inversion_acoustic_theory(self): + open('Acoustic_Inversion_theory.pdf') + run(["open", 'Acoustic_Inversion_theory.pdf']) + + def tutorial_AQUAscat_software(self): + open('Tutorial_AQUAscat_software.pdf') + run(["open", 'Tutorial_AQUAscat_software.pdf']) def export_table_of_acoustic_BS_values_to_excel_or_libreOfficeCalc_file(self): @@ -328,12 +365,12 @@ class Ui_MainWindow(object): self.menuTools.setTitle(_translate("MainWindow", "Tools")) self.menuHelp.setTitle(_translate("MainWindow", "Help")) self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar")) - self.actionNew.setText(_translate("MainWindow", "New")) + # self.actionNew.setText(_translate("MainWindow", "New")) self.actionOpen.setText(_translate("MainWindow", "Open ...")) self.actionSave.setText(_translate("MainWindow", "Save")) - self.actionCopy.setText(_translate("MainWindow", "Copy")) - self.actionCut.setText(_translate("MainWindow", "Cut")) - self.actionPaste.setText(_translate("MainWindow", "Paste")) + # self.actionCopy.setText(_translate("MainWindow", "Copy")) + # self.actionCut.setText(_translate("MainWindow", "Cut")) + # self.actionPaste.setText(_translate("MainWindow", "Paste")) self.actionEnglish.setText(_translate("MainWindow", "English")) self.actionFrench.setText(_translate("MainWindow", "French")) self.actionTable_of_Backscatter_values.setText(_translate("MainWindow", "Table of Backscatter values")) @@ -342,11 +379,11 @@ class Ui_MainWindow(object): self.actionDB_Browser_for_SQLite.setText(_translate("MainWindow", "DB Browser for SQLite")) -# if __name__ == "__main__": -# import sys -# app = QtWidgets.QApplication(sys.argv) -# MainWindow = QtWidgets.QMainWindow() -# ui = Ui_MainWindow() -# ui.setupUi(MainWindow) -# MainWindow.show() -# sys.exit(app.exec_()) +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) diff --git a/View/sample_data_tab.py b/View/sample_data_tab.py index 83bee82..eeca14a 100644 --- a/View/sample_data_tab.py +++ b/View/sample_data_tab.py @@ -1,3 +1,26 @@ +# ============================================================================== # + # mainwindow.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + +# by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QLabel, QSpinBox, QSpacerItem, QSizePolicy, \ QTabWidget, QTableWidget, QPushButton, QLineEdit, QTableView, QCheckBox, \ QAbstractScrollArea, QTableWidgetItem, QComboBox, QFileDialog, QGridLayout, QMessageBox, \ @@ -18,7 +41,7 @@ from copy import deepcopy from os import path import csv -from View.show_popup_combobox import ComboBoxShowPopUpWindow +# from View.show_popup_combobox import ComboBoxShowPopUpWindow from Model.granulo_loader import GranuloLoader @@ -685,6 +708,7 @@ class SampleDataTab(QWidget): # --- Set horizontal header --- # horizontal_header = list(map(str, ["Color", "Sample"] + stg.fine_sediment_columns + # stg.sand_sediment_columns[2:])) + print("stg.columns_fine ", stg.columns_fine) horizontal_header = list(itertools.chain(["Color", "Sample"], list(map(str, stg.columns_fine[[0, 2]])), list(map(str, stg.columns_fine[3:])))) @@ -1330,7 +1354,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( stg.time_fine, stg.depth_fine, - linestyle='None', marker="x", s=15, c=color_list_fine) + linestyle='None', marker="x", s=15, c=color_list_fine, label='fine') for i in range(len(stg.time_fine)): self.axis_plot_sample_position_on_transect.text( @@ -1342,7 +1366,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( stg.time_sand, stg.depth_sand, - linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand) + linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand, label='sand') for i in range(len(stg.time_sand)): self.axis_plot_sample_position_on_transect.text( @@ -1540,7 +1564,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( stg.time_fine, stg.depth_fine, - linestyle='None', marker="x", s=15, c=color_list_fine) + linestyle='None', marker="x", s=15, c=color_list_fine, label='fine') for i in range(len(stg.time_fine)): self.axis_plot_sample_position_on_transect.text( @@ -1552,7 +1576,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( stg.time_sand, stg.depth_sand, - linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand) + linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand, label='sand') for i in range(len(stg.time_sand)): self.axis_plot_sample_position_on_transect.text( @@ -1568,15 +1592,16 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.tick_params(axis='y', labelrotation=90) self.axis_plot_sample_position_on_transect.tick_params(axis='both', labelsize=8) - self.axis_plot_sample_position_on_transect.text(.98, .03, "Time", + self.axis_plot_sample_position_on_transect.text(.98, .03, "Time (sec)", fontsize=10, fontweight='bold', fontname="Ubuntu", c="black", alpha=0.9, horizontalalignment='right', verticalalignment='bottom', rotation='horizontal', transform=self.axis_plot_sample_position_on_transect.transAxes) - self.axis_plot_sample_position_on_transect.text(.04, .65, "Depth", + self.axis_plot_sample_position_on_transect.text(.04, .53, "Depth (m)", fontsize=10, fontweight='bold', fontname="Ubuntu", c="black", alpha=0.9, horizontalalignment='right', verticalalignment='bottom', rotation='vertical', transform=self.axis_plot_sample_position_on_transect.transAxes) + self.axis_plot_sample_position_on_transect.legend(loc="lower left") self.figure_plot_sample_position_on_transect.canvas.draw_idle() def update_plot_sample_position_on_transect(self): @@ -1598,7 +1623,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( time_fine_to_plot, depth_fine_to_plot, - linestyle='None', marker="x", s=15, c=color_list_fine) + linestyle='None', marker="x", s=15, c=color_list_fine, label='fine') for i in range(len(time_fine_to_plot)): self.axis_plot_sample_position_on_transect.text( @@ -1618,7 +1643,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( time_sand_to_plot, depth_sand_to_plot, - linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand) + linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand, label='sand') for i in range(len(time_sand_to_plot)): self.axis_plot_sample_position_on_transect.text( @@ -1855,7 +1880,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( time_fine_to_plot, depth_fine_to_plot, - linestyle='None', marker="x", s=15, c=color_list_fine) + linestyle='None', marker="x", s=15, c=color_list_fine, label='fine') for i in range(len(time_fine_to_plot)): self.axis_plot_sample_position_on_transect.text( @@ -1877,7 +1902,7 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.scatter( time_sand_to_plot, depth_sand_to_plot, - linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand) + linestyle='None', marker="o", s=60, facecolors='None', edgecolors=color_list_sand, label='sand') for i in range(len(time_sand_to_plot)): self.axis_plot_sample_position_on_transect.text( @@ -1893,19 +1918,20 @@ class SampleDataTab(QWidget): self.axis_plot_sample_position_on_transect.tick_params(axis='y', labelrotation=90) self.axis_plot_sample_position_on_transect.tick_params(axis='both', labelsize=8) - self.axis_plot_sample_position_on_transect.text(.98, .03, "Time", + self.axis_plot_sample_position_on_transect.text(.98, .03, "Time (sec)", fontsize=10, fontweight='bold', fontname="Ubuntu", c="black", alpha=0.9, horizontalalignment='right', verticalalignment='bottom', rotation='horizontal', transform=self.axis_plot_sample_position_on_transect.transAxes) - self.axis_plot_sample_position_on_transect.text(.04, .65, "Depth", + self.axis_plot_sample_position_on_transect.text(.04, .53, "Depth (m)", fontsize=10, fontweight='bold', fontname="Ubuntu", c="black", alpha=0.9, horizontalalignment='right', verticalalignment='bottom', rotation='vertical', transform=self.axis_plot_sample_position_on_transect.transAxes) + self.axis_plot_sample_position_on_transect.legend(loc="lower right") self.figure_plot_sample_position_on_transect.canvas.draw_idle() # if stg.BS_raw_data.size == 0: @@ -2030,7 +2056,7 @@ class SampleDataTab(QWidget): self.axis_total_concentration.cla() self.axis_total_concentration.scatter(Ctot_fine_to_plot, sample_depth_to_plot_fine, - s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5) + s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5, label='fine') self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) @@ -2038,7 +2064,7 @@ class SampleDataTab(QWidget): elif (self.combobox_x_axis.currentIndex() == 1) and (self.combobox_y_axis.currentIndex() == 0): self.axis_total_concentration.cla() self.axis_total_concentration.scatter(Ctot_fine_percent_to_plot, sample_depth_to_plot_fine, - s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5) + s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5, label='fine') self.axis_total_concentration.set_xlim(0, 100) self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) @@ -2051,7 +2077,7 @@ class SampleDataTab(QWidget): self.axis_total_concentration.scatter( Ctot_fine_to_plot, [x / y for x, y in zip(sample_depth_to_plot_fine, depth_bottom_to_plot_fine)], - s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5) + s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5, label='fine') else: @@ -2074,7 +2100,7 @@ class SampleDataTab(QWidget): self.axis_total_concentration.scatter( Ctot_fine_percent_to_plot, [x / y for x, y in zip(sample_depth_to_plot_fine, depth_bottom_to_plot_fine)], - s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5) + s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5, label='fine') else: @@ -2090,7 +2116,7 @@ class SampleDataTab(QWidget): self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) - self.figure_total_concentration.canvas.draw_idle() + # self.figure_total_concentration.canvas.draw_idle() # =================================================== # --- FINE file NOT uploaded / SAND file uploaded --- @@ -2112,7 +2138,7 @@ class SampleDataTab(QWidget): self.axis_total_concentration.scatter(Ctot_sand_to_plot, sample_depth_to_plot_sand, s=300, facecolor="None", edgecolor=color_list_sand, - alpha=0.5) + alpha=0.5, label='sand') self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) @@ -2123,7 +2149,7 @@ class SampleDataTab(QWidget): print("Ctot_sand_percent_to_plot ", Ctot_sand_percent_to_plot) self.axis_total_concentration.scatter(Ctot_sand_percent_to_plot, sample_depth_to_plot_sand, s=300, facecolor="None", edgecolor=color_list_sand, - alpha=0.5) + alpha=0.5, label='sand') self.axis_total_concentration.set_xlim(0, 100) self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) @@ -2138,7 +2164,7 @@ class SampleDataTab(QWidget): Ctot_sand_to_plot, [x / y for x, y in zip(sample_depth_to_plot_sand, depth_bottom_to_plot_sand)], # stg.depth_bottom[self.combobox_acoustic_data.currentIndex()][indices_bottom_sand], - s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5) + s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5, label='sand') else: @@ -2163,7 +2189,7 @@ class SampleDataTab(QWidget): Ctot_sand_percent_to_plot, [x / y for x, y in zip(sample_depth_to_plot_sand, depth_bottom_to_plot_sand)], # stg.depth_bottom[self.combobox_acoustic_data.currentIndex()][indices_bottom_sand], - s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5) + s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5, label='sand') else: @@ -2179,7 +2205,7 @@ class SampleDataTab(QWidget): self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) - self.figure_total_concentration.canvas.draw_idle() + # self.figure_total_concentration.canvas.draw_idle() # =============================================== # --- FINE file uploaded / SAND file uploaded --- @@ -2201,11 +2227,11 @@ class SampleDataTab(QWidget): self.axis_total_concentration.scatter(Ctot_fine_to_plot, sample_depth_to_plot_fine, s=100, facecolor=color_list_fine, edgecolor="None", - alpha=0.5) + alpha=0.5, label='fine') self.axis_total_concentration.scatter(Ctot_sand_to_plot, sample_depth_to_plot_sand, s=300, facecolor="None", edgecolor=color_list_sand, - alpha=0.5) + alpha=0.5, label='sand') self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) @@ -2216,10 +2242,10 @@ class SampleDataTab(QWidget): print("sample_depth_to_plot_fine", sample_depth_to_plot_fine) self.axis_total_concentration.scatter(Ctot_fine_percent_to_plot, sample_depth_to_plot_fine, s=100, facecolor=color_list_fine, edgecolor="None", - alpha=0.5) + alpha=0.5, label='fine') self.axis_total_concentration.scatter(Ctot_sand_percent_to_plot, sample_depth_to_plot_sand, s=300, facecolor="None", edgecolor=color_list_sand, - alpha=0.5) + alpha=0.5, label='sand') self.axis_total_concentration.set_xlim(0, 100) self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) @@ -2232,11 +2258,11 @@ class SampleDataTab(QWidget): self.axis_total_concentration.scatter( Ctot_fine_to_plot, [x / y for x, y in zip(sample_depth_to_plot_fine, depth_bottom_to_plot_fine)], - s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5) + s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5, label='fine') self.axis_total_concentration.scatter( Ctot_sand_to_plot, [x / y for x, y in zip(sample_depth_to_plot_sand, depth_bottom_to_plot_sand)], - s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5) + s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5, label='sand') else: @@ -2259,12 +2285,12 @@ class SampleDataTab(QWidget): self.axis_total_concentration.scatter( Ctot_fine_percent_to_plot, [x / y for x, y in zip(sample_depth_to_plot_fine, depth_bottom_to_plot_fine)], - s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5) + s=100, facecolor=color_list_fine, edgecolor="None", alpha=0.5, label='fine') self.axis_total_concentration.scatter( Ctot_sand_percent_to_plot, [x / y for x, y in zip(sample_depth_to_plot_sand, depth_bottom_to_plot_sand)], - s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5) + s=300, facecolor="None", edgecolor=color_list_sand, alpha=0.5, label='sand') else: @@ -2280,9 +2306,8 @@ class SampleDataTab(QWidget): self.axis_total_concentration.set_xlabel(self.combobox_x_axis.currentText()) self.axis_total_concentration.set_ylabel(self.combobox_y_axis.currentText()) - self.figure_total_concentration.canvas.draw_idle() - - + self.axis_total_concentration.legend(loc="upper right") + self.figure_total_concentration.canvas.draw_idle() # ------------------------------------------------------------------------------------------------------------------ diff --git a/View/sediment_calibration_tab.py b/View/sediment_calibration_tab.py index 3ae7261..b46168b 100644 --- a/View/sediment_calibration_tab.py +++ b/View/sediment_calibration_tab.py @@ -304,7 +304,7 @@ class SedimentCalibrationTab(QWidget): Qt.AlignLeft) self.label_kt_freq2 = QLabel() - self.label_kt_freq2.setText("0.00 V.m1.5") + self.label_kt_freq2.setText("0.00") self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_kt_freq2, 2, 3, 1, 1, Qt.AlignRight) self.label_kt_freq2_unit = QLabel() @@ -333,7 +333,7 @@ class SedimentCalibrationTab(QWidget): self.label_ks_freq1_unit = QLabel() self.label_ks_freq1_unit.setText("m.kg-0.5") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_ks_freq1_unit, 5, 2, 1, 1, + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_ks_freq1_unit, 4, 2, 1, 1, Qt.AlignLeft) # self.spinbox_ks_freq2 = QDoubleSpinBox() @@ -342,16 +342,16 @@ class SedimentCalibrationTab(QWidget): self.lineEdit_ks_freq2 = QLineEdit() self.lineEdit_ks_freq2.setMaximumWidth(100) self.lineEdit_ks_freq2.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_ks_freq2, 5, 3, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_ks_freq2, 4, 3, 1, 1) self.label_ks_freq2_unit = QLabel() self.label_ks_freq2_unit.setText("m.kg-0.5") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_ks_freq2_unit, 5, 4, 1, 1, + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_ks_freq2_unit, 4, 4, 1, 1, Qt.AlignLeft) self.label_sv = QLabel() self.label_sv.setText("sv") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_sv, 6, 0, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_sv, 5, 0, 1, 1, Qt.AlignCenter) # self.spinbox_sv_freq1 = QDoubleSpinBox() # self.spinbox_sv_freq1.setDecimals(8) @@ -359,11 +359,11 @@ class SedimentCalibrationTab(QWidget): self.lineEdit_sv_freq1 = QLineEdit() self.lineEdit_sv_freq1.setMaximumWidth(100) self.lineEdit_sv_freq1.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_sv_freq1, 6, 1, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_sv_freq1, 5, 1, 1, 1) self.label_sv_freq1_unit = QLabel() self.label_sv_freq1_unit.setText("m-1") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_sv_freq1_unit, 6, 2, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_sv_freq1_unit, 5, 2, 1, 1) # self.spinbox_sv_freq2 = QDoubleSpinBox() # self.spinbox_sv_freq2.setDecimals(8) @@ -371,26 +371,26 @@ class SedimentCalibrationTab(QWidget): self.lineEdit_sv_freq2 = QLineEdit() self.lineEdit_sv_freq2.setMaximumWidth(100) self.lineEdit_sv_freq2.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_sv_freq2, 6, 3, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_sv_freq2, 5, 3, 1, 1) self.label_sv_freq2_unit = QLabel() self.label_sv_freq2_unit.setText("m-1") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_sv_freq2_unit, 6, 4, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_sv_freq2_unit, 5, 4, 1, 1) self.label_X = QLabel() self.label_X.setText("X") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_X, 7, 0, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_X, 6, 0, 1, 1, Qt.AlignCenter) # self.spinbox_X = QDoubleSpinBox() # self.spinbox_X.setDecimals(2) self.lineEdit_X = QLineEdit() self.lineEdit_X.setMaximumWidth(100) self.lineEdit_X.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_X, 7, 2, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_X, 6, 2, 1, 1, Qt.AlignCenter) self.label_alphas = QLabel() self.label_alphas.setText("\u03B1s") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_alphas, 8, 0, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_alphas, 7, 0, 1, 1, Qt.AlignCenter) # self.spinbox_alphas_freq1 = QDoubleSpinBox() # self.spinbox_alphas_freq1.setDecimals(4) @@ -398,11 +398,11 @@ class SedimentCalibrationTab(QWidget): self.lineEdit_alphas_freq1 = QLineEdit() self.lineEdit_alphas_freq1.setMaximumWidth(100) self.lineEdit_alphas_freq1.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_alphas_freq1, 8, 1, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_alphas_freq1, 7, 1, 1, 1) self.label_alphas_freq1_unit = QLabel() self.label_alphas_freq1_unit.setText("m-1") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_alphas_freq1_unit, 8, 2, 1, 1, Qt.AlignLeft) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_alphas_freq1_unit, 7, 2, 1, 1, Qt.AlignLeft) # self.spinbox_alphas_freq2 = QDoubleSpinBox() # self.spinbox_alphas_freq2.setDecimals(4) @@ -410,15 +410,15 @@ class SedimentCalibrationTab(QWidget): self.lineEdit_alphas_freq2 = QLineEdit() self.lineEdit_alphas_freq2.setMaximumWidth(100) self.lineEdit_alphas_freq2.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_alphas_freq2, 8, 3, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_alphas_freq2, 7, 3, 1, 1) self.label_alphas_freq2_unit = QLabel() self.label_alphas_freq2_unit.setText("m-1") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_alphas_freq2_unit, 8, 4, 1, 1, Qt.AlignLeft) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_alphas_freq2_unit, 7, 4, 1, 1, Qt.AlignLeft) self.label_zeta = QLabel() self.label_zeta.setText("\u03B6") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_zeta, 9, 0, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_zeta, 8, 0, 1, 1, Qt.AlignCenter) # self.spinbox_zeta_freq1 = QDoubleSpinBox() # self.spinbox_zeta_freq1.setDecimals(4) @@ -426,11 +426,11 @@ class SedimentCalibrationTab(QWidget): self.lineEdit_zeta_freq1 = QLineEdit() self.lineEdit_zeta_freq1.setMaximumWidth(100) self.lineEdit_zeta_freq1.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_zeta_freq1, 9, 1, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_zeta_freq1, 8, 1, 1, 1) self.label_zeta_freq1_unit = QLabel() self.label_zeta_freq1_unit.setText("m-1") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_zeta_freq1_unit, 9, 2, 1, 1, + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_zeta_freq1_unit, 8, 2, 1, 1, Qt.AlignLeft) # self.spinbox_zeta_freq2 = QDoubleSpinBox() @@ -439,16 +439,16 @@ class SedimentCalibrationTab(QWidget): self.lineEdit_zeta_freq2 = QLineEdit() self.lineEdit_zeta_freq2.setMaximumWidth(100) self.lineEdit_zeta_freq2.setText("0.00") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_zeta_freq2, 9, 3, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.lineEdit_zeta_freq2, 8, 3, 1, 1) self.label_zeta_freq2_unit = QLabel() self.label_zeta_freq2_unit.setText("m-1") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_zeta_freq2_unit, 9, 4, 1, 1, + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.label_zeta_freq2_unit, 8, 4, 1, 1, Qt.AlignLeft) self.pushbutton_save_calibration = QPushButton() self.pushbutton_save_calibration.setText("Save calibration") - self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.pushbutton_save_calibration,10, 5, 1, 1) + self.gridLayout_groupbox_sediment_calibration_parameter.addWidget(self.pushbutton_save_calibration,9, 5, 1, 1) # self.groupbox_calibration_compute_size_change() @@ -721,14 +721,46 @@ class SedimentCalibrationTab(QWidget): 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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ - self.combobox_freq2.currentIndex(), :, :], - cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + 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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + self.axis_BS.pcolormesh( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + stg.BS_stream_bed_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + self.axis_BS.pcolormesh( + stg.time[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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + 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_stream_bed_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + + elif stg.BS_stream_bed_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): @@ -741,14 +773,44 @@ class SedimentCalibrationTab(QWidget): 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_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ - self.combobox_freq2.currentIndex(), :, :], - cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + 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_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + self.axis_BS.pcolormesh( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + stg.BS_stream_bed_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + self.axis_BS.pcolormesh( + stg.time[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_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + 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_stream_bed_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) elif stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): @@ -762,14 +824,45 @@ class SedimentCalibrationTab(QWidget): 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)) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + 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)) + else: + self.axis_BS.pcolormesh( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + -stg.depth[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)) + + else: + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + self.axis_BS.pcolormesh( + stg.time[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)) + else: + 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_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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): @@ -782,14 +875,44 @@ class SedimentCalibrationTab(QWidget): 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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ - self.combobox_freq2.currentIndex(), :, :], - cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + 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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + self.axis_BS.pcolormesh( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + stg.BS_cross_section_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + self.axis_BS.pcolormesh( + stg.time[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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + 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_cross_section_pre_process_average[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_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): @@ -802,14 +925,44 @@ class SedimentCalibrationTab(QWidget): 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_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ - self.combobox_freq2.currentIndex(), :, :], - cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0): + 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_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + self.axis_BS.pcolormesh( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + stg.BS_cross_section_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0): + self.axis_BS.pcolormesh( + stg.time[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_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :, :], + cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + else: + 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_cross_section_pre_process_SNR[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,): @@ -822,14 +975,45 @@ class SedimentCalibrationTab(QWidget): 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)) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + 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)) + else: + self.axis_BS.pcolormesh( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :], + -stg.depth[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)) + else: + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + self.axis_BS.pcolormesh( + stg.time[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)) + else: + 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_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_pre_process_average[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): @@ -847,6 +1031,8 @@ class SedimentCalibrationTab(QWidget): self.combobox_freq2.currentIndex(), :, :], cmap='viridis', norm=LogNorm(vmin=val_min, vmax=val_max)) + + elif stg.BS_raw_data_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): val_min = np.nanmin(stg.BS_raw_data_pre_process_SNR[self.combobox_acoustic_data_choice.currentIndex()][ @@ -1143,29 +1329,82 @@ class SedimentCalibrationTab(QWidget): 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]]) - stg.range_lin_interp, stg.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] - ] - ) - ) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + + stg.range_lin_interp, stg.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] + ] + ) + ) + + else: + + stg.range_lin_interp, stg.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[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[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: - stg.range_lin_interp, stg.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()])) + + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + + stg.range_lin_interp, stg.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()] + [ + 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] + ] + )) + + else: + + stg.range_lin_interp, stg.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()] + [ + np.where(np.abs(stg.time[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[self.combobox_acoustic_data_choice.currentIndex()][ + self.combobox_freq2.currentIndex(), :] + - stg.time_fine[stg.fine_sample_profile[-1][1]])))[0][0] + ] + )) + print(f"1 M_profile_fine : {stg.M_profile_fine}") stg.range_lin_interp = stg.range_lin_interp stg.M_profile_fine = stg.M_profile_fine @@ -1574,9 +1813,11 @@ class SedimentCalibrationTab(QWidget): self.label_temperature.clear() self.label_temperature.setText("T = " + str(stg.temperature) + " °C") + self.compute_depth_2D() self.compute_ks() self.compute_sv() self.compute_X() + self.compute_kt2D_kt3D() self.compute_J_cross_section() self.compute_alpha_s() self.compute_zeta() @@ -1656,220 +1897,98 @@ class SedimentCalibrationTab(QWidget): # --- Compute kt2D, kt3D and depth_2D --- - if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + for i in range(self.combobox_acoustic_data_choice.count()): - if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if stg.depth_cross_section[i].shape != (0,): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()] = ( - # np.zeros((stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], - # stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1]))) - # - # for f, _ in enumerate(stg.freq[self.combobox_acoustic_data_choice.currentIndex()]): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()][f, :, :] = ( - # np.repeat(np.transpose(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()] - # [self.combobox_freq1.currentIndex()])[:, np.newaxis], - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1)) - # - # print("kt cor ", stg.kt_corrected) - # print("kt read", stg.kt_read) + if stg.time_cross_section[i].shape != (0,): - if stg.kt_corrected != stg.kt_read: + if stg.kt_corrected != stg.kt_read: - kt2D = np.repeat( - np.array([stg.kt_corrected]).transpose(), - stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) + stg.kt2D[i] = np.repeat(np.array([stg.kt_corrected]).transpose(), + stg.time_cross_section[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], stg.depth_cross_section[i].shape[1], axis=1) - else: + else: - kt2D = np.repeat( - np.array([stg.kt_read]).transpose(), - stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - print(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape) - print("kt2D shape ", kt2D.shape) - print("kt2D ", kt2D) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) + stg.kt2D[i] = np.repeat(np.array([stg.kt_read]).transpose(), + stg.time_cross_section[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], stg.depth_cross_section[i].shape[1], axis=1) - print("kt3D shape ", kt3D.shape) - print("kt3D ", kt3D) + elif stg.time[i].shape != (0,): - elif stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + if (stg.kt_corrected != stg.kt_read): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()] = ( - # np.zeros((stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], - # stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1]))) - # - # for f, _ in enumerate(stg.freq[self.combobox_acoustic_data_choice.currentIndex()]): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()][f, :, :] = ( - # np.repeat( - # np.transpose(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()] - # [self.combobox_freq1.currentIndex()])[:, np.newaxis], - # stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1)) + stg.kt2D[i] = np.repeat(np.array([stg.kt_corrected]).transpose(), stg.time[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], stg.depth_cross_section[i].shape[1], axis=1) - print("kt cor ", stg.kt_corrected) - print("kt read", stg.kt_read) + else: - if (stg.kt_corrected != stg.kt_read): + stg.kt2D[i] = np.repeat(np.array([stg.kt_read]).transpose(), stg.time[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], stg.depth_cross_section[i].shape[1], axis=1) - kt2D = np.repeat( - np.array([stg.kt_corrected]).transpose(), - stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) + elif stg.depth[i].shape != (0,): - else: + if stg.time_cross_section[i].shape != (0,): - kt2D = np.repeat( - np.array([stg.kt_read]).transpose(), - stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - print(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape) - print("kt2D shape ", kt2D.shape) - print("kt2D ", kt2D) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) + if (stg.kt_corrected != stg.kt_read): - print("kt3D shape ", kt3D.shape) - print("kt3D ", kt3D) + stg.kt2D[i] = np.repeat(np.array([stg.kt_corrected]).transpose(), + stg.time_cross_section[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], stg.depth[i].shape[1], axis=1) - elif stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + else: - if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + stg.kt2D[i] = np.repeat(np.array([stg.kt_read]).transpose(), + stg.time_cross_section[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], stg.depth[i].shape[1], axis=1) - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()] = ( - # np.zeros((stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], - # stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1]))) - # - # for f, _ in enumerate(stg.freq[self.combobox_acoustic_data_choice.currentIndex()]): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()][f, :, :] = ( - # np.repeat( - # np.transpose(stg.depth[self.combobox_acoustic_data_choice.currentIndex()] - # [self.combobox_freq1.currentIndex()])[:, np.newaxis], - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1)) + elif stg.time[i].shape != (0,): - print("kt cor ", stg.kt_corrected) - print("kt read", stg.kt_read) + if (stg.kt_corrected != stg.kt_read): - if (stg.kt_corrected != stg.kt_read): + stg.kt2D[i] = np.repeat(np.array([stg.kt_corrected]).transpose(), stg.time[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], + stg.depth[i].shape[1], + axis=1) - kt2D = np.repeat( - np.array([stg.kt_corrected]).transpose(), - stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) + else: - else: + stg.kt2D[i] = np.repeat(np.array([stg.kt_read]).transpose(), stg.time[i].shape[1], axis=1) + stg.kt3D[i] = np.repeat(stg.kt2D[i][:, np.newaxis, :], stg.depth[i].shape[1], axis=1) - kt2D = np.repeat( - np.array([stg.kt_read]).transpose(), - stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - print(stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape) - print("kt2D shape ", kt2D.shape) - print("kt2D ", kt2D) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - - print("kt3D shape ", kt3D.shape) - print("kt3D ", kt3D) - - elif stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): - - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()] = ( - # np.zeros((stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], - # stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1]))) - # - # for f, _ in enumerate(stg.freq[self.combobox_acoustic_data_choice.currentIndex()]): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()][f, :, :] = ( - # np.repeat( - # np.transpose(stg.depth[self.combobox_acoustic_data_choice.currentIndex()] - # [self.combobox_freq1.currentIndex()])[:, np.newaxis], - # stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1)) - - print("kt cor ", stg.kt_corrected) - print("kt read", stg.kt_read) - - if (stg.kt_corrected != stg.kt_read): - # print([stg.kt_corrected[key] for key in stg.freq_text[self.combobox_acoustic_data_choice.currentIndex()]]) - kt2D = np.repeat( - np.array([stg.kt_corrected]).transpose(), - stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - - else: - - kt2D = np.repeat( - np.array([stg.kt_read]).transpose(), - stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - print(stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape) - print("kt2D shape ", kt2D.shape) - print("kt2D ", kt2D) - kt3D = np.repeat( - kt2D[:, np.newaxis, :], - stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - axis=1) - - print("kt3D shape ", kt3D.shape) - print("kt3D ", kt3D) - - return kt2D, kt3D + print('kt2D ', stg.kt2D) + print('kt3D ', stg.kt3D) def compute_J_cross_section(self): for i in range(self.combobox_acoustic_data_choice.count()): - kt2D, kt3D = self.compute_kt2D_kt3D() + print('kt2D shape ', stg.kt2D[i].shape) + print('kt3D shape ', stg.kt3D[i].shape) J_cross_section_freq1 = np.array([]) J_cross_section_freq2 = np.array([]) # --- Compute J --- if stg.BS_stream_bed_pre_process_average[i].shape != (0,): - + print("000000000000000000000000000000000") + print(stg.BS_stream_bed_pre_process_average[i][stg.frequencies_for_calibration[0][1], :, :].shape, + stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :].shape, + stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :].shape) J_cross_section_freq1 = self.inv_hc.j_cross_section( BS=stg.BS_stream_bed_pre_process_average[i][ stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_stream_bed_pre_process_average[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_stream_bed_pre_process_SNR[i].shape != (0,): @@ -1878,58 +1997,27 @@ class SedimentCalibrationTab(QWidget): stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_stream_bed_pre_process_SNR[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_stream_bed[i].shape != (0,): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()] = ( - # np.zeros(stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()].shape)) - # for f, _ in enumerate(stg.freq[self.combobox_acoustic_data_choice.currentIndex()]): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()][f, :, :] = ( - # np.repeat(np.transpose(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()] - # [self.combobox_freq1.currentIndex()])[:, np.newaxis], - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1)) - # - # print("kt cor ", stg.kt_corrected) - # print("kt read", stg.kt_read) - # - # if (stg.kt_corrected[self.combobox_acoustic_data_choice.currentIndex()] != - # stg.kt_read[self.combobox_acoustic_data_choice.currentIndex()]): - # kt2D = np.repeat(np.array([stg.kt_corrected[self.combobox_acoustic_data_choice.currentIndex()]]).transpose(), - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # kt3D = np.repeat(kt2D[:, np.newaxis, :], - # stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], axis=1) - # else: - # kt2D = np.repeat(np.array([stg.kt_read[self.combobox_acoustic_data_choice.currentIndex()]]).transpose(), - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # print(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape) - # print("kt2D shape ", kt2D.shape) - # print("kt2D ", kt2D) - # kt3D = np.repeat(kt2D[:, np.newaxis, :], - # stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], axis=1) - # print("kt3D shape ", kt3D.shape) - # print("kt3D ", kt3D) - J_cross_section_freq1 = self.inv_hc.j_cross_section( BS=stg.BS_stream_bed[i][stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_stream_bed[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_cross_section_pre_process_average[i].shape != (0,): @@ -1938,14 +2026,14 @@ class SedimentCalibrationTab(QWidget): stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_cross_section_pre_process_average[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_cross_section_pre_process_SNR[i].shape != (0,): @@ -1954,49 +2042,28 @@ class SedimentCalibrationTab(QWidget): stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_cross_section_pre_process_SNR[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_cross_section[i].shape != (0,): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()] = np.zeros(stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape) - # for f, _ in enumerate(stg.freq[self.combobox_acoustic_data_choice.currentIndex()]): - # stg.depth_2D[self.combobox_acoustic_data_choice.currentIndex()][f, :, :] = np.repeat( - # np.transpose(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()] - # [self.combobox_freq1.currentIndex()])[:, np.newaxis], - # stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # - # if stg.kt_corrected[self.combobox_acoustic_data_choice.currentIndex()]: - # kt2D = np.repeat(np.array(stg.kt_corrected[self.combobox_acoustic_data_choice.currentIndex()]), - # stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # kt3D = np.repeat(kt2D[:, :, np.newaxis], - # stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], axis=2) - # else: - # kt2D = np.repeat(np.array(stg.kt_read[self.combobox_acoustic_data_choice.currentIndex()]), - # stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # kt3D = np.repeat(kt2D[:, :, np.newaxis], - # stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], axis=2) - J_cross_section_freq1 = self.inv_hc.j_cross_section( BS=stg.BS_cross_section[i][ stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i, :, :][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_cross_section[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i, :, :][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_raw_data_pre_process_average[i].shape != (0,): @@ -2004,13 +2071,13 @@ class SedimentCalibrationTab(QWidget): BS=stg.BS_raw_data_pre_process_average[i][ stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_raw_data_pre_process_average[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_raw_data_pre_process_SNR[i].shape != (0,): @@ -2018,51 +2085,30 @@ class SedimentCalibrationTab(QWidget): BS=stg.BS_raw_data_pre_process_SNR[i][ stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_raw_data_pre_process_SNR[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) elif stg.BS_raw_data: - # stg.depth_2D = np.zeros(stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()].shape) - # for f, _ in enumerate(stg.freq[self.combobox_acoustic_data_choice.currentIndex()]): - # stg.depth_2D[f, :, :] = np.repeat( - # np.transpose(stg.depth[self.combobox_acoustic_data_choice.currentIndex()] - # [self.combobox_freq1.currentIndex()])[:, np.newaxis], - # stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # - # if stg.kt_corrected[self.combobox_acoustic_data_choice.currentIndex()]: - # kt2D = np.repeat(np.array(stg.kt_corrected[self.combobox_acoustic_data_choice.currentIndex()]), - # stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # kt3D = np.repeat(kt2D[:, :, np.newaxis], - # stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], axis=2) - # else: - # kt2D = np.repeat(np.array(stg.kt_read[self.combobox_acoustic_data_choice.currentIndex()]), - # stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape[1], - # axis=1) - # kt3D = np.repeat(kt2D[:, :, np.newaxis], - # stg.freq[self.combobox_acoustic_data_choice.currentIndex()].shape[0], axis=2) - J_cross_section_freq1 = self.inv_hc.j_cross_section( BS=stg.BS_raw_data[i][ stg.frequencies_for_calibration[0][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[0][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[0][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[0][1], :, :]) J_cross_section_freq2 = self.inv_hc.j_cross_section( BS=stg.BS_raw_data[i][ stg.frequencies_for_calibration[1][1], :, :], r2D=stg.depth_2D[i][stg.frequencies_for_calibration[1][1], :, :], - kt=kt3D[stg.frequencies_for_calibration[1][1], :, :]) + kt=stg.kt3D[i][stg.frequencies_for_calibration[1][1], :, :]) - stg.J_cross_section[i].append(J_cross_section_freq1) - stg.J_cross_section[i].append(J_cross_section_freq2) + stg.J_cross_section[i][0] = J_cross_section_freq1 + stg.J_cross_section[i][1] = J_cross_section_freq2 print(f"J_cross_section {str(i)} freq1 shape ", J_cross_section_freq1.shape, J_cross_section[i][0].shape) print(f"J_cross_section {str(i)} freq2 shape ", J_cross_section_freq2.shape, J_cross_section[i][1].shape) diff --git a/View/show_popup_combobox.py b/View/show_popup_combobox.py new file mode 100644 index 0000000..96e6bb9 --- /dev/null +++ b/View/show_popup_combobox.py @@ -0,0 +1,9 @@ +from PyQt5.QtWidgets import QComboBox +from PyQt5.QtCore import pyqtSignal + +class ComboBoxShowPopUpWindow(QComboBox): + ShowPopUpWindowSignal = pyqtSignal() + + def showPopup(self): + self.ShowPopUpWindowSignal.emit() + super(ComboBoxShowPopUpWindow, self).showPopup() diff --git a/View/signal_processing_tab.py b/View/signal_processing_tab.py index 7ec2cbd..a09add4 100644 --- a/View/signal_processing_tab.py +++ b/View/signal_processing_tab.py @@ -1,3 +1,27 @@ +# ============================================================================== # + # mainwindow.py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # +from cProfile import label + +# by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + import sys from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QGroupBox, QLabel, QCheckBox, @@ -26,6 +50,7 @@ import Translation.constant_string as cs from Model.acoustic_data_loader import AcousticDataLoader import settings as stg +from settings import depth_cross_section _translate = QCoreApplication.translate @@ -716,14 +741,17 @@ class SignalProcessingTab(QWidget): print("val2 ", val2) # --- Compute averaged signal --- - if stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): - stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()] = ( - np.nanmean(stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()][:, :, val1:val2], axis=2)) - elif stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): - stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()] = ( - np.nanmean(stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()][:, :, val1:val2], axis=2)) - elif stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): - stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()] = ( + # if stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + # stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()] = ( + # np.nanmean(stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()][:, :, val1:val2], axis=2)) + # elif stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + # stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()] = ( + # np.nanmean(stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()][:, :, val1:val2], axis=2)) + # elif stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + print("self.combobox_acoustic_data_choice.currentIndex() ", self.combobox_acoustic_data_choice.currentIndex(), + self.combobox_acoustic_data_choice.currentText(), val1, val2, + stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()].shape) + stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()] = ( np.nanmean(stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()][:, :, val1:val2], axis=2)) # for i in range(self.combobox_freq_noise_from_profile_tail.count()): @@ -743,29 +771,29 @@ class SignalProcessingTab(QWidget): self.verticalLayout_groupbox_plot_profile_tail.addWidget(self.canvas_profile_tail) - if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): - - self.axis_profile_tail.plot( - -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq_noise_from_profile_tail.currentIndex()], - stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq_noise_from_profile_tail.currentIndex()], - color="blue", linewidth=1) - self.axis_profile_tail.plot( - -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ - self.combobox_freq_noise_from_profile_tail.currentIndex()], - float(self.lineEdit_profile_tail_value.text().replace(",", ".")) * - np.ones(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ - self.combobox_freq_noise_from_profile_tail.currentIndex()].shape[0]), - linestyle='dashed', linewidth=2, color='red') - - elif stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): - - print(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ - self.combobox_freq_noise_from_profile_tail.currentIndex()].shape) - self.axis_profile_tail.plot( + # if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + # + # self.axis_profile_tail.plot( + # -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq_noise_from_profile_tail.currentIndex()], + # stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq_noise_from_profile_tail.currentIndex()], + # color="blue", linewidth=1) + # self.axis_profile_tail.plot( + # -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + # self.combobox_freq_noise_from_profile_tail.currentIndex()], + # float(self.lineEdit_profile_tail_value.text().replace(",", ".")) * + # np.ones(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + # self.combobox_freq_noise_from_profile_tail.currentIndex()].shape[0]), + # linestyle='dashed', linewidth=2, color='red') + # + # elif stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + # + # print(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + # self.combobox_freq_noise_from_profile_tail.currentIndex()].shape) + self.axis_profile_tail.plot( -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq_noise_from_profile_tail.currentIndex()], stg.BS_mean[self.combobox_acoustic_data_choice.currentIndex()][self.combobox_freq_noise_from_profile_tail.currentIndex()], color="blue", linewidth=1) - self.axis_profile_tail.plot( + self.axis_profile_tail.plot( -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ self.combobox_freq_noise_from_profile_tail.currentIndex()], float(self.lineEdit_profile_tail_value.text().replace(",", ".")) * @@ -776,11 +804,11 @@ class SignalProcessingTab(QWidget): self.axis_profile_tail.set_yscale('log') self.axis_profile_tail.tick_params(axis='both', labelsize=8) # self.axis_profile_tail.set_yticklabels(fontsize=8) - self.axis_profile_tail.text(.98, .03, "Depth", + self.axis_profile_tail.text(.98, .03, "Depth (m)", fontsize=8, fontweight='bold', fontname="Ubuntu", c="black", alpha=0.9, horizontalalignment='right', verticalalignment='bottom', rotation='horizontal', transform=self.axis_profile_tail.transAxes) - self.axis_profile_tail.text(.1, .50, "BS signal", + self.axis_profile_tail.text(.1, .45, "BS signal (v)", fontsize=8, fontweight='bold', fontname="Ubuntu", c="black", alpha=0.9, horizontalalignment='right', verticalalignment='bottom', rotation='vertical', transform=self.axis_profile_tail.transAxes) @@ -1138,6 +1166,19 @@ class SignalProcessingTab(QWidget): # np.full(stg.BS_raw_data[self.combobox_acoustic_data_choice.currentIndex()].shape, # self.spinbox_compute_noise_from_value.value())) + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + stg.time_noise[self.combobox_acoustic_data_choice.currentIndex()] = ( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()]) + else: + stg.time_noise[self.combobox_acoustic_data_choice.currentIndex()] = ( + stg.time[self.combobox_acoustic_data_choice.currentIndex()]) + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + stg.depth_noise[self.combobox_acoustic_data_choice.currentIndex()] = ( + stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()]) + else: + stg.depth_noise[self.combobox_acoustic_data_choice.currentIndex()] = ( + stg.depth[self.combobox_acoustic_data_choice.currentIndex()]) + # --- Compute noise from value and compute SNR --- if stg.BS_stream_bed[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): @@ -1154,9 +1195,6 @@ class SignalProcessingTab(QWidget): - stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()]) ** 2, stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()] ** 2)) - stg.time_noise[self.combobox_acoustic_data_choice.currentIndex()] = ( - stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()]) - elif stg.BS_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()] = ( @@ -1171,9 +1209,6 @@ class SignalProcessingTab(QWidget): - stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()]) ** 2, stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()] ** 2)) - stg.time_noise[self.combobox_acoustic_data_choice.currentIndex()] = ( - stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()]) - else: stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()] = ( @@ -1187,8 +1222,6 @@ class SignalProcessingTab(QWidget): - stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()]) ** 2, stg.BS_noise_raw_data[self.combobox_acoustic_data_choice.currentIndex()] ** 2)) - stg.time_noise[self.combobox_acoustic_data_choice.currentIndex()] = ( - stg.time[self.combobox_acoustic_data_choice.currentIndex()]) # print("stg.BS_noise_averaged_data ", stg.BS_noise_averaged_data) diff --git a/icons/add.png b/icons/add.png new file mode 100755 index 0000000..4ac1baf Binary files /dev/null and b/icons/add.png differ diff --git a/icons/add0.png b/icons/add0.png new file mode 100644 index 0000000..b2d0155 Binary files /dev/null and b/icons/add0.png differ diff --git a/icons/approved.png b/icons/approved.png new file mode 100644 index 0000000..8e5702d Binary files /dev/null and b/icons/approved.png differ diff --git a/icons/between.png b/icons/between.png new file mode 100644 index 0000000..154d248 Binary files /dev/null and b/icons/between.png differ diff --git a/icons/circle_green_arrow_right.png b/icons/circle_green_arrow_right.png new file mode 100644 index 0000000..f99d34b Binary files /dev/null and b/icons/circle_green_arrow_right.png differ diff --git a/icons/clear.png b/icons/clear.png new file mode 100755 index 0000000..6b9fa6d Binary files /dev/null and b/icons/clear.png differ diff --git a/icons/clear0.png b/icons/clear0.png new file mode 100644 index 0000000..ba56419 Binary files /dev/null and b/icons/clear0.png differ diff --git a/icons/delete.png b/icons/delete.png new file mode 100755 index 0000000..f953427 Binary files /dev/null and b/icons/delete.png differ diff --git a/icons/delete0.png b/icons/delete0.png new file mode 100644 index 0000000..88d4d0e Binary files /dev/null and b/icons/delete0.png differ diff --git a/icons/navigation.png b/icons/navigation.png new file mode 100755 index 0000000..d6c5261 Binary files /dev/null and b/icons/navigation.png differ diff --git a/icons/no_approved.png b/icons/no_approved.png new file mode 100644 index 0000000..017036c Binary files /dev/null and b/icons/no_approved.png differ diff --git a/icons/no_entry.png b/icons/no_entry.png new file mode 100644 index 0000000..4565fbe Binary files /dev/null and b/icons/no_entry.png differ diff --git a/icons/red_record.png b/icons/red_record.png new file mode 100755 index 0000000..5cd9ea9 Binary files /dev/null and b/icons/red_record.png differ diff --git a/icons/triangle_left.png b/icons/triangle_left.png index 599d548..6dad108 100644 Binary files a/icons/triangle_left.png and b/icons/triangle_left.png differ diff --git a/icons/triangle_left_old.png b/icons/triangle_left_old.png new file mode 100644 index 0000000..599d548 Binary files /dev/null and b/icons/triangle_left_old.png differ diff --git a/icons/triangle_left_to_begin.png b/icons/triangle_left_to_begin.png new file mode 100755 index 0000000..08813d6 Binary files /dev/null and b/icons/triangle_left_to_begin.png differ diff --git a/icons/triangle_left_to_begin_old.png b/icons/triangle_left_to_begin_old.png new file mode 100755 index 0000000..62daa7a Binary files /dev/null and b/icons/triangle_left_to_begin_old.png differ diff --git a/icons/triangle_right.png b/icons/triangle_right.png index 87d5f83..2dfaef5 100644 Binary files a/icons/triangle_right.png and b/icons/triangle_right.png differ diff --git a/icons/triangle_right_old.png b/icons/triangle_right_old.png new file mode 100644 index 0000000..87d5f83 Binary files /dev/null and b/icons/triangle_right_old.png differ diff --git a/icons/triangle_right_to_end.png b/icons/triangle_right_to_end.png new file mode 100755 index 0000000..f36454d Binary files /dev/null and b/icons/triangle_right_to_end.png differ diff --git a/icons/triangle_right_to_end_old.png b/icons/triangle_right_to_end_old.png new file mode 100755 index 0000000..e4a4930 Binary files /dev/null and b/icons/triangle_right_to_end_old.png differ diff --git a/icons/update.png b/icons/update.png new file mode 100755 index 0000000..2900e9d Binary files /dev/null and b/icons/update.png differ diff --git a/icons/warning.png b/icons/warning.png new file mode 100644 index 0000000..f971d40 Binary files /dev/null and b/icons/warning.png differ diff --git a/icons/yellow_push.png b/icons/yellow_push.png new file mode 100755 index 0000000..730a2c4 Binary files /dev/null and b/icons/yellow_push.png differ diff --git a/main.py b/main.py index 5fb3ed4..0972456 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,8 @@ from View.sediment_calibration_tab import SedimentCalibrationTab from View.acoustic_inversion_tab import AcousticInversionTab from View.note_tab import NoteTab from View.user_manual_tab import UserManualTab +import settings as stg +from Model.read_table_for_open import ReadTableForOpen import matplotlib.pyplot as plt # plt.close("all") @@ -39,19 +41,24 @@ class MainApplication(QMainWindow): height = size.height() self.resize(int(PERCENT_SCREEN_SIZE*width), int(PERCENT_SCREEN_SIZE*height)) try: - + self.read_table_open = ReadTableForOpen() # ************************************************** # -------------- Acoustic data tab --------------- self.acoustic_data_tab = AcousticDataTab(self.ui_mainwindow.tab1) + print("0 AcousticDataTab ", id(AcousticDataTab)) - # Connect push buttons to download data files22 + self.acoustic_data_tab.combobox_ABS_system_choice.editTextChanged.connect( + self.acoustic_data_tab.ABS_system_choice) # ************************************************** # --------- Signal pre-processing data tab ---------- self.signal_processing_tab = SignalProcessingTab(self.ui_mainwindow.tab2) + self.signal_processing_tab.combobox_acoustic_data_choice.editTextChanged.connect( + self.signal_processing_tab.combobox_acoustic_data_choice_change_index) + # **************************************************. # --------------- Sample data tab ---------------- @@ -77,6 +84,8 @@ class MainApplication(QMainWindow): # self.user_manual_tab = UserManualTab(self.ui_mainwindow.tab7) + self.ui_mainwindow.actionOpen.triggered.connect(self.trig_open) + # ************************************************** # ---------------- Text File Error ----------------- @@ -86,6 +95,19 @@ class MainApplication(QMainWindow): sortie.write(traceback.format_exc()) # traceback.TracebackException.from_exception(e).print(file=sortie) + def trig_open(self): + self.read_table_open.open_file_dialog() + + self.acoustic_data_tab.combobox_ABS_system_choice.setCurrentText(stg.ABS_name[0]) + self.acoustic_data_tab.fileListWidget.addFilenames(stg.filename_BS_raw_data) + + self.signal_processing_tab.combobox_acoustic_data_choice.addItems(stg.filename_BS_raw_data) + + self.sample_data_tab.fill_comboboxes_and_plot_transect() + self.sample_data_tab.lineEdit_fine_sediment.setText(stg.filename_fine) + self.sample_data_tab.lineEdit_fine_sediment.setToolTip(stg.path_fine) + # self.sample_data_tab.fill_table_fine() + if __name__ == '__main__': # print("sys.argv:", [arg for arg in sys.argv]) diff --git a/settings.py b/settings.py index 1936669..16cc40d 100644 --- a/settings.py +++ b/settings.py @@ -1,3 +1,26 @@ +# ============================================================================== # + # settings .py - AcouSed # + # Copyright (C) 2024 INRAE # + # # + # This program is free software: you can redistribute it and/or modify # + # it under the terms of the GNU General Public License as published by # + # the Free Software Foundation, either version 3 of the License, or # + # (at your option) any later version. # + # # + # This program is distributed in the hope that it will be useful, # + # but WITHOUT ANY WARRANTY; without even the implied warranty of # + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # + # GNU General Public License for more details. # + # # + # You should have received a copy of the GNU General Public License # + # along with this program. If not, see . # + + # by Brahim MOUDJED # +# ============================================================================== # + +# -*- coding: utf-8 -*- + + """ this file includs global variables shared between tab """ import numpy as np @@ -216,6 +239,8 @@ X_exponent = [] # List of one value [X_exponent] alpha_s = [] # List [alphas_freq1, alphas_freq2] # List of floats zeta = [] # List [zeta_freq1, zeta_freq2] # List of floats +kt2D = [] # List of kt2D, computed from kt_corrected or kt_read # List of 2D arrays +kt3D = [] # List of kt3D, computed from kt2D # List of 3D arrays J_cross_section = [] # List of J_cross_section compute for all acoustic data recording # List of lists of 3D arrays # [[J_cross_section_freq1, J_cross_section_freq2], [], []] FCB = [] # 3D array