From a25bc7392dddf9abefbf48c8283db6252c17f627 Mon Sep 17 00:00:00 2001 From: brahim Date: Mon, 22 Jul 2024 11:16:18 +0200 Subject: [PATCH] Sound speed and sound attenuation in water are added group box of the measurements information. Sound attenuation is updated with the combobox frequency. --- View/acoustic_data_tab.py | 203 ++++++++++++++++++++++++++++---------- settings.py | 11 ++- 2 files changed, 158 insertions(+), 56 deletions(-) diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index 605aea7..cc8b378 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -243,6 +243,18 @@ class AcousticDataTab(QWidget): self.spinbox_temperature = QDoubleSpinBox() self.spinbox_temperature.setSuffix("°C") + self.label_speed_of_sound = QLabel("Speed of sound : ") + + self.spinbox_speed_of_sound = QDoubleSpinBox() + self.spinbox_speed_of_sound.setSuffix("m/s") + self.spinbox_speed_of_sound.setMaximum(1e5) + + self.label_sound_attenuation = QLabel("Sound attenuation : ") + + self.spinbox_sound_attenuation = QDoubleSpinBox() + self.spinbox_sound_attenuation.setSuffix("/m") + self.spinbox_sound_attenuation.setDecimals(5) + self.label_ABS_name = QLabel() self.label_date_acoustic_file = QLabel() @@ -1388,6 +1400,12 @@ class AcousticDataTab(QWidget): self.label_temperature.hide() self.spinbox_temperature.hide() + self.label_speed_of_sound.hide() + self.spinbox_speed_of_sound.hide() + + self.label_sound_attenuation.hide() + self.spinbox_sound_attenuation.hide() + self.label_freq.hide() self.combobox_frequency_information.hide() @@ -1421,6 +1439,12 @@ class AcousticDataTab(QWidget): self.label_temperature.hide() self.spinbox_temperature.hide() + self.label_speed_of_sound.hide() + self.spinbox_speed_of_sound.hide() + + self.label_sound_attenuation.hide() + self.spinbox_sound_attenuation.hide() + self.label_freq.hide() self.combobox_frequency_information.hide() @@ -1467,46 +1491,56 @@ class AcousticDataTab(QWidget): self.spinbox_temperature.show() self.gridLayout_goupbox_info.addWidget(self.spinbox_temperature, 2, 1, 1, 1) + self.label_speed_of_sound.show() + self.gridLayout_goupbox_info.addWidget(self.label_speed_of_sound, 3, 0, 1, 1) + self.spinbox_speed_of_sound.show() + self.gridLayout_goupbox_info.addWidget(self.spinbox_speed_of_sound, 3, 1, 1, 1) + + self.label_sound_attenuation.show() + self.gridLayout_goupbox_info.addWidget(self.label_sound_attenuation, 4, 0, 1, 1) + self.spinbox_sound_attenuation.show() + self.gridLayout_goupbox_info.addWidget(self.spinbox_sound_attenuation, 4, 1, 1, 1) + self.label_freq.show() - self.gridLayout_goupbox_info.addWidget(self.label_freq, 3, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_freq, 5, 0, 1, 1) self.combobox_frequency_information.show() - self.gridLayout_goupbox_info.addWidget(self.combobox_frequency_information, 3, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.combobox_frequency_information, 5, 1, 1, 1) self.label_profiles.show() - self.gridLayout_goupbox_info.addWidget(self.label_profiles, 4, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles, 6, 0, 1, 1) self.label_profiles_per_sec.show() - self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec, 5, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec, 7, 0, 1, 1) self.label_cells.show() - self.gridLayout_goupbox_info.addWidget(self.label_cells, 6, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cells, 8, 0, 1, 1) self.label_cell_size.show() - self.gridLayout_goupbox_info.addWidget(self.label_cell_size, 7, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cell_size, 9, 0, 1, 1) self.label_pulse_length.show() - self.gridLayout_goupbox_info.addWidget(self.label_pulse_length, 8, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pulse_length, 10, 0, 1, 1) self.label_pings_per_sec.show() - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec, 9, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec, 11, 0, 1, 1) self.label_pings_per_profile.show() - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile, 10, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile, 12, 0, 1, 1) self.label_kt.show() - self.gridLayout_goupbox_info.addWidget(self.label_kt, 11, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_kt, 13, 0, 1, 1) self.spinbox_kt.show() - self.gridLayout_goupbox_info.addWidget(self.spinbox_kt, 11, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.spinbox_kt, 13, 1, 1, 1) self.checkbox_kt.show() - self.gridLayout_goupbox_info.addWidget(self.checkbox_kt, 11, 2, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.checkbox_kt, 13, 2, 1, 1) self.label_rx.show() - self.gridLayout_goupbox_info.addWidget(self.label_rx, 12, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_rx, 14, 0, 1, 1) self.spinbox_rx.show() - self.gridLayout_goupbox_info.addWidget(self.spinbox_rx, 12, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.spinbox_rx, 14, 1, 1, 1) self.checkbox_rx.show() - self.gridLayout_goupbox_info.addWidget(self.checkbox_rx, 12, 2, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.checkbox_rx, 14, 2, 1, 1) self.label_tx.show() - self.gridLayout_goupbox_info.addWidget(self.label_tx, 13, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_tx, 15, 0, 1, 1) self.spinbox_tx.show() - self.gridLayout_goupbox_info.addWidget(self.spinbox_tx, 13, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.spinbox_tx, 15, 1, 1, 1) self.checkbox_tx.show() - self.gridLayout_goupbox_info.addWidget(self.checkbox_tx, 13, 2, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.checkbox_tx, 15, 2, 1, 1) def groupbox_measurement_information_UBSediFlow(self): # --- Hide Aquascat information --- @@ -1518,6 +1552,12 @@ class AcousticDataTab(QWidget): self.label_temperature.hide() self.spinbox_temperature.hide() + self.label_speed_of_sound.hide() + self.spinbox_speed_of_sound.hide() + + self.label_sound_attenuation.hide() + self.spinbox_sound_attenuation.hide() + self.label_freq.hide() self.combobox_frequency_information.hide() @@ -1563,51 +1603,97 @@ class AcousticDataTab(QWidget): self.spinbox_temperature.show() self.gridLayout_goupbox_info.addWidget(self.spinbox_temperature, 2, 1, 1, 1) + self.label_speed_of_sound.show() + self.gridLayout_goupbox_info.addWidget(self.label_speed_of_sound, 3, 0, 1, 1) + self.spinbox_speed_of_sound.show() + self.gridLayout_goupbox_info.addWidget(self.spinbox_speed_of_sound, 3, 1, 1, 1) + + self.label_sound_attenuation.show() + self.gridLayout_goupbox_info.addWidget(self.label_sound_attenuation, 4, 0, 1, 1) + self.spinbox_sound_attenuation.show() + self.gridLayout_goupbox_info.addWidget(self.spinbox_sound_attenuation, 4, 1, 1, 1) + self.label_freq.show() - self.gridLayout_goupbox_info.addWidget(self.label_freq, 3, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_freq, 5, 0, 1, 1) self.combobox_frequency_information.show() - self.gridLayout_goupbox_info.addWidget(self.combobox_frequency_information, 3, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.combobox_frequency_information, 5, 1, 1, 1) self.label_profiles.show() - self.gridLayout_goupbox_info.addWidget(self.label_profiles, 4, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles, 6, 0, 1, 1) self.label_profiles_per_sec.show() - self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec, 5, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec, 7, 0, 1, 1) self.label_cells.show() - self.gridLayout_goupbox_info.addWidget(self.label_cells, 6, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cells, 8, 0, 1, 1) self.label_cell_size.show() - self.gridLayout_goupbox_info.addWidget(self.label_cell_size, 7, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cell_size, 9, 0, 1, 1) self.label_pulse_length.show() - self.gridLayout_goupbox_info.addWidget(self.label_pulse_length, 8, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pulse_length, 10, 0, 1, 1) self.label_pings_per_sec.show() - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec, 9, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec, 11, 0, 1, 1) self.label_pings_per_profile.show() - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile, 10, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile, 12, 0, 1, 1) self.label_kt.show() - self.gridLayout_goupbox_info.addWidget(self.label_kt, 11, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_kt, 13, 0, 1, 1) self.spinbox_kt.show() - self.gridLayout_goupbox_info.addWidget(self.spinbox_kt, 11, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.spinbox_kt, 13, 1, 1, 1) self.checkbox_kt.show() - self.gridLayout_goupbox_info.addWidget(self.checkbox_kt, 11, 2, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.checkbox_kt, 13, 2, 1, 1) self.label_rx.show() - self.gridLayout_goupbox_info.addWidget(self.label_rx, 12, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_rx, 14, 0, 1, 1) self.spinbox_rx.show() - self.gridLayout_goupbox_info.addWidget(self.spinbox_rx, 12, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.spinbox_rx, 14, 1, 1, 1) self.checkbox_rx.show() - self.gridLayout_goupbox_info.addWidget(self.checkbox_rx, 12, 2, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.checkbox_rx, 14, 2, 1, 1) self.label_tx.show() - self.gridLayout_goupbox_info.addWidget(self.label_tx, 13, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_tx, 15, 0, 1, 1) self.spinbox_tx.show() - self.gridLayout_goupbox_info.addWidget(self.spinbox_tx, 13, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.spinbox_tx, 15, 1, 1, 1) self.checkbox_tx.show() - self.gridLayout_goupbox_info.addWidget(self.checkbox_tx, 13, 2, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.checkbox_tx, 15, 2, 1, 1) def temperature_value(self): if self.fileListWidget.count() > 0: stg.temperature[self.fileListWidget.currentRow()] = self.spinbox_temperature.value() - # print(f"stg.temperature : {stg.temperature}") + print(f"stg.temperature : {stg.temperature}") + self.water_velocity() + self.water_attenuation() + + def water_velocity(self): + """Computing sond speed from Bilaniuk and Wong 1993""" + C = (1.40238744 * 1e3 + + 5.03836171 * self.spinbox_temperature.value() - + 5.81172916 * 1e-2 * self.spinbox_temperature.value() ** 2 + + 3.34638117 * 1e-4 * self.spinbox_temperature.value() ** 3 - + 1.48259672 * 1e-6 * self.spinbox_temperature.value() ** 4 + + 3.16585020 * 1e-9 * self.spinbox_temperature.value() ** 5) + stg.water_velocity[self.fileListWidget.currentRow()] = C + self.spinbox_speed_of_sound.setValue(stg.water_velocity[self.fileListWidget.currentRow()]) + + + # -------- Computing water attenuation coefficient ----------- # + def water_attenuation(self): + """Computing attenuation from François and Garrison 1982""" + for f in stg.freq[self.fileListWidget.currentRow()]: + if self.spinbox_temperature.value() > 20: + alpha = ((3.964 * 1e-4 - + 1.146 * 1e-5 * self.spinbox_temperature.value() + + 1.45 * 1e-7 * self.spinbox_temperature.value() ** 2 - + 6.5 * 1e-10 * self.spinbox_temperature.value() ** 3) * + 1e-3 * (np.log(10) / 20) * (f * 1e-3) ** 2) + else: + alpha = ((4.937 * 1e-4 - + 2.59 * 1e-5 * self.spinbox_temperature.value() + + 9.11 * 1e-7 * self.spinbox_temperature.value() ** 2 - + 1.5 * 1e-8 * self.spinbox_temperature.value() ** 3) * + 1e-3 * (np.log(10) / 20) * (f * 1e-3) ** 2) + + stg.water_attenuation[self.fileListWidget.currentRow()].append(alpha) + + self.spinbox_sound_attenuation.setValue(stg.water_attenuation[self.fileListWidget.currentRow()] + [self.combobox_frequency_information.currentIndex()]) def clicked_pushbutton_noise_level(self): self.WindowNoiseLevelTailAveragedProfile().show() @@ -1789,6 +1875,8 @@ class AcousticDataTab(QWidget): self.label_hour_acoustic_file.clear() self.label_hour_acoustic_file.setText("Hour: ") self.spinbox_temperature.clear() + self.spinbox_speed_of_sound.clear() + self.spinbox_sound_attenuation.clear() self.combobox_frequency_information.clear() self.label_profiles_value.clear() self.label_profiles_per_sec_value.clear() @@ -1859,6 +1947,8 @@ class AcousticDataTab(QWidget): self.label_hour_acoustic_file.clear() self.label_hour_acoustic_file.setText("Hour: ") self.spinbox_temperature.clear() + self.spinbox_speed_of_sound.clear() + self.spinbox_sound_attenuation.clear() self.combobox_frequency_information.clear() self.label_profiles_value.clear() self.label_profiles_per_sec_value.clear() @@ -2079,7 +2169,10 @@ class AcousticDataTab(QWidget): # stg.kt_corrected.append(acoustic_data._kt) stg.gain_rx.append(acoustic_data._gain_rx) stg.gain_tx.append(acoustic_data._gain_tx) - stg.temperature.append(self.spinbox_temperature.value()) + stg.temperature.append(0) + stg.water_velocity.append(0) + stg.water_attenuation.append([]) + # --- The other acoustic variables lists are filled with empty object. --- # --- They will be used for pre- and post-processing --- @@ -2242,31 +2335,31 @@ class AcousticDataTab(QWidget): self.label_profiles_value.setText(str(stg.nb_profiles[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()])) - self.gridLayout_goupbox_info.addWidget(self.label_profiles_value, 4, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles_value, 6, 1, 1, 1) self.label_profiles_per_sec_value.setText(str(stg.nb_profiles_per_sec[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()]) + " Hz") - self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec_value, 5, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec_value, 7, 1, 1, 1) self.label_cells_value.setText(str(stg.nb_cells[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()])) - self.gridLayout_goupbox_info.addWidget(self.label_cells_value, 6, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cells_value, 8, 1, 1, 1) self.label_cell_size_value.setText(str(100*round(stg.cell_size[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()], 3)) + " cm") - self.gridLayout_goupbox_info.addWidget(self.label_cell_size_value, 7, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cell_size_value, 9, 1, 1, 1) self.label_pulse_length_value.setText(str(round(stg.pulse_length[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()], 6)) + " sec") - self.gridLayout_goupbox_info.addWidget(self.label_pulse_length_value, 8, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pulse_length_value, 10, 1, 1, 1) self.label_pings_per_sec_value.setText(str(stg.nb_pings_per_sec[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()]) + " Hz") - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec_value, 9, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec_value, 11, 1, 1, 1) self.label_pings_per_profile_value.setText(str(stg.nb_pings_averaged_per_profile[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()])) - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile_value, 10, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile_value, 12, 1, 1, 1) stg.kt_corrected = deepcopy(stg.kt_read) # if self.checkbox_kt.isChecked(): @@ -2380,46 +2473,52 @@ class AcousticDataTab(QWidget): def combobox_frequency_information_update(self): if self.fileListWidget.count() > 0: + print("stg.water_attenuation ", stg.water_attenuation) + if stg.water_attenuation[self.fileListWidget.currentRow()]: + self.spinbox_sound_attenuation.clear() + self.spinbox_sound_attenuation.setValue(stg.water_attenuation[self.fileListWidget.currentRow()] + [self.combobox_frequency_information.currentIndex()]) + self.label_profiles_value.clear() self.gridLayout_goupbox_info.removeWidget(self.label_profiles_value) self.label_profiles_value.setText(str(stg.nb_profiles[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()])) - self.gridLayout_goupbox_info.addWidget(self.label_profiles_value, 4, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles_value, 6, 1, 1, 1) self.label_profiles_per_sec_value.clear() self.label_profiles_per_sec_value.setText( str(stg.nb_profiles_per_sec[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()]) + " Hz") - self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec_value, 5, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec_value, 7, 1, 1, 1) self.label_cells_value.clear() self.label_cells_value.setText(str(stg.nb_cells[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()])) - self.gridLayout_goupbox_info.addWidget(self.label_cells_value, 6, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cells_value, 8, 1, 1, 1) self.label_cell_size_value.clear() self.gridLayout_goupbox_info.removeWidget(self.label_cell_size_value) self.label_cell_size_value.setText( str(100 * round(stg.cell_size[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()], 3)) + " cm") - self.gridLayout_goupbox_info.addWidget(self.label_cell_size_value, 7, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cell_size_value, 9, 1, 1, 1) self.label_pulse_length_value.clear() self.label_pulse_length_value.setText( str(round(stg.pulse_length[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()], 6)) + " sec") - self.gridLayout_goupbox_info.addWidget(self.label_pulse_length_value, 8, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pulse_length_value, 10, 1, 1, 1) self.label_pings_per_sec_value.clear() self.label_pings_per_sec_value.setText(str(stg.nb_pings_per_sec[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()]) + " Hz") - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec_value, 9, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec_value, 11, 1, 1, 1) self.label_pings_per_profile_value.clear() self.label_pings_per_profile_value.setText( str(stg.nb_pings_averaged_per_profile[self.fileListWidget.currentRow()] [self.combobox_frequency_information.currentIndex()])) - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile_value, 10, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile_value, 12, 1, 1, 1) self.spinbox_kt.clear() if self.checkbox_kt.isChecked(): diff --git a/settings.py b/settings.py index affbd8d..ff67fc6 100644 --- a/settings.py +++ b/settings.py @@ -101,8 +101,7 @@ BS_stream_bed_pre_process_SNR_average = [] # BS data averaged and time_average = np.array([]) SNR_data_average = np.array([]) # SNR data computed with BS signal averaged (not with BS raw signal) -water_attenuation = 0 -sediment_attenuation = 0 +sediment_attenuation = [] FCB = np.array([]) lin_reg = tuple() @@ -128,6 +127,8 @@ frac_vol_fine = [] frac_vol_fine_cumul = [] # Cumulated volume fraction (%) +fine_sample_profile = [] # Fine sample choose for the profile in calibration + sample_sand = [] path_sand = "" @@ -146,14 +147,16 @@ frac_vol_sand = [] # Volume fraction (%) frac_vol_sand_cumul = [] # Cumulated volume fraction (%) +sand_sample_target = [] # Sand sample target for calibration + Ctot_fine_per_cent = [] Ctot_sand_per_cent = [] # --- Acoustic inversion method --- temperature = [] -water_attenuation = np.array([]) -water_velocity = 0 +water_attenuation = [] +water_velocity = [] X_exponent = np.array([])