Sound speed and sound attenuation in water are added group box of the measurements information. Sound attenuation is updated with the combobox frequency.

dev-brahim
brahim 2024-07-22 11:16:18 +02:00
parent 57b5490f5f
commit a25bc7392d
2 changed files with 158 additions and 56 deletions

View File

@ -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():

View File

@ -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([])