From e204ddba0ebafada24471dd778b02dd9f2d21ea1 Mon Sep 17 00:00:00 2001 From: brahim Date: Mon, 29 Jan 2024 14:04:33 +0100 Subject: [PATCH] All plots are drawn as soon as acoustic file is download. Bottom line river is plotted on acoustic profile. --- View/acoustic_data_tab.py | 150 ++++++++++++++++++++++++++++---------- 1 file changed, 112 insertions(+), 38 deletions(-) diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index da38d83..be15b85 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -183,11 +183,14 @@ class AcousticDataTab(QWidget): self.horizontalLayout_radiobutton_gps.addWidget(self.radiobutton_file) self.groupbox_gps_value = QGroupBox() - self.formLayout_gps_value = QFormLayout(self.groupbox_gps_value) + self.gridLayout_gps_value = QGridLayout(self.groupbox_gps_value) self.label_distance_value = QLabel() self.label_distance_value.setText("Distance : ") + self.gridLayout_gps_value.addWidget(self.label_distance_value, 0, 0, 1, 1) self.lineEdit_gps_value = QLineEdit() - self.formLayout_gps_value.addRow(self.label_distance_value, self.lineEdit_gps_value) + self.gridLayout_gps_value.addWidget(self.lineEdit_gps_value, 0, 1, 1, 1) + self.label_m_per_record = QLabel("m / record") + self.gridLayout_gps_value.addWidget(self.label_m_per_record, 0, 2, 1, 1) self.verticalLayout_gps_input_data.addWidget(self.groupbox_gps_value) @@ -198,17 +201,17 @@ class AcousticDataTab(QWidget): self.combobox_gps_system_choice = QComboBox() self.combobox_gps_system_choice.addItems([" ", "GPS1", "GPS2", "no GPS"]) - self.gridLayout_groupbox_gps_file.addWidget(self.combobox_gps_system_choice, 0, 0, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.combobox_gps_system_choice, 0, 0, 1, 2) self.pushbutton_gps_file = QPushButton() self.pushbutton_gps_file.setIcon(self.icon_folder) - self.gridLayout_groupbox_gps_file.addWidget(self.pushbutton_gps_file, 0, 1, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.pushbutton_gps_file, 0, 2, 1, 1) self.lineEdit_gps_file = QLineEdit() - self.gridLayout_groupbox_gps_file.addWidget(self.lineEdit_gps_file, 0, 2, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.lineEdit_gps_file, 0, 3, 1, 2) self.label_date_groupbox_gps_file = QLabel() self.gridLayout_groupbox_gps_file.addWidget(self.label_date_groupbox_gps_file, 1, 0, 1, 2) self.label_hour_groupbox_gps_file = QLabel() - self.gridLayout_groupbox_gps_file.addWidget(self.label_hour_groupbox_gps_file, 1, 2, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.label_hour_groupbox_gps_file, 1, 2, 1, 2) # Download Push Button event : connect button clicked signal to open file slot # self.pushButton_gpsfile.clicked.connect(self.open_dialog_box) @@ -221,38 +224,51 @@ class AcousticDataTab(QWidget): self.gridLayout_time_offset = QGridLayout() self.label_time_offset = QLabel() - self.gridLayout_time_offset.addWidget(self.label_time_offset, 0, 0, 1, 1) + # self.gridLayout_time_offset.addWidget(self.label_time_offset, 0, 0, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.label_time_offset, 2, 0, 1, 1) self.label_acoustic_gps_time = QLabel() self.label_acoustic_gps_time.setText( "Tacoustic =" + " Tgps") - self.gridLayout_time_offset.addWidget(self.label_acoustic_gps_time, 0, 1, 1, 1) + # self.gridLayout_time_offset.addWidget(self.label_acoustic_gps_time, 0, 1, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.label_acoustic_gps_time, 2, 1, 1, 1) self.combobox_plus_minus = QComboBox() self.combobox_plus_minus.addItem("+") self.combobox_plus_minus.addItem("-") - self.gridLayout_time_offset.addWidget(self.combobox_plus_minus, 0, 2, 1, 1) + # self.gridLayout_time_offset.addWidget(self.combobox_plus_minus, 0, 2, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.combobox_plus_minus, 2, 2, 1, 1) self.spinbox_time_offset_value = QSpinBox() - self.gridLayout_time_offset.addWidget(self.spinbox_time_offset_value, 0, 3, 1, 1) + # self.gridLayout_time_offset.addWidget(self.spinbox_time_offset_value, 0, 3, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.spinbox_time_offset_value, 2, 3, 1, 1) self.label_seconds = QLabel() self.label_seconds.setText("sec") - self.gridLayout_time_offset.addWidget(self.label_seconds, 0, 4, 1, 1) + # self.gridLayout_time_offset.addWidget(self.label_seconds, 0, 4, 1, 1) + self.gridLayout_groupbox_gps_file.addWidget(self.label_seconds, 2, 4, 1, 1) self.verticalLayout_groupbox_download.addLayout(self.gridLayout_time_offset) # ++++++++++++++++++++++++++++++++++++++ # | Group Box Measurements information | # ++++++++++++++++++++++++++++++++++++++ - self.verticalLayout_groupbox_info = QVBoxLayout(self.groupbox_info) - - self.formLayout_temperature = QFormLayout() - self.label_temperature = QLabel("Temperature : ") - self.lineEdit_temperature = QLineEdit() - self.formLayout_temperature.addRow(self.label_temperature, self.lineEdit_temperature) - self.verticalLayout_groupbox_info.addLayout(self.formLayout_temperature) - - self.gridLayout_goupbox_info = QGridLayout() - self.verticalLayout_groupbox_info.addLayout(self.gridLayout_goupbox_info) + # self.verticalLayout_groupbox_info = QVBoxLayout(self.groupbox_info) + # + # self.formLayout_temperature = QFormLayout() + # self.label_temperature = QLabel("Temperature : ") + # self.lineEdit_temperature = QLineEdit() + # self.formLayout_temperature.addRow(self.label_temperature, self.lineEdit_temperature) + # self.verticalLayout_groupbox_info.addLayout(self.formLayout_temperature) + # + # self.gridLayout_goupbox_info = QGridLayout() + # self.verticalLayout_groupbox_info.addLayout(self.gridLayout_goupbox_info) # --- Information for Aquascat --- + self.gridLayout_goupbox_info = QGridLayout(self.groupbox_info) + + self.label_temperature = QLabel("Temperature : ") + self.gridLayout_goupbox_info.addWidget(self.label_temperature, 0, 0, 1, 1) + self.lineEdit_temperature = QLineEdit() + self.gridLayout_goupbox_info.addWidget(self.lineEdit_temperature, 0, 1, 1, 1) + self.label_degreCelsius = QLabel("°C") + self.gridLayout_goupbox_info.addWidget(self.label_degreCelsius, 0, 2, 1, 1) self.label_profiles = QLabel() self.label_profiles_per_sec = QLabel() @@ -742,17 +758,17 @@ class AcousticDataTab(QWidget): self.label_rx.show() self.label_tx.show() - self.gridLayout_goupbox_info.addWidget(self.label_profiles, 0, 0, 1, 1) - self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec, 0, 1, 1, 1) - self.gridLayout_goupbox_info.addWidget(self.label_cells, 1, 0, 1, 1) - self.gridLayout_goupbox_info.addWidget(self.label_cell_size, 1, 1, 1, 1) - self.gridLayout_goupbox_info.addWidget(self.label_pulse_length, 2, 0, 1, 1) - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec, 3, 0, 1, 1) - self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile, 3, 1, 1, 1) - self.gridLayout_goupbox_info.addWidget(self.label_freq, 4, 0, 1, 2) - self.gridLayout_goupbox_info.addWidget(self.label_kt, 5, 0, 1, 2) - self.gridLayout_goupbox_info.addWidget(self.label_rx, 6, 0, 1, 2) - self.gridLayout_goupbox_info.addWidget(self.label_tx, 7, 0, 1, 2) + self.gridLayout_goupbox_info.addWidget(self.label_profiles, 1, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_profiles_per_sec, 1, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cells, 2, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_cell_size, 2, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pulse_length, 3, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_sec, 4, 0, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_pings_per_profile, 4, 1, 1, 1) + self.gridLayout_goupbox_info.addWidget(self.label_freq, 5, 0, 1, 2) + self.gridLayout_goupbox_info.addWidget(self.label_kt, 6, 0, 1, 2) + self.gridLayout_goupbox_info.addWidget(self.label_rx, 7, 0, 1, 2) + self.gridLayout_goupbox_info.addWidget(self.label_tx, 8, 0, 1, 2) def groupbox_measurement_information_UBSediFlow(self): # self.gridLayout_goupbox_info.itemAt(0).widget().deleteLater() @@ -838,6 +854,7 @@ class AcousticDataTab(QWidget): self.label_hour_groupbox_acoustic_file.setText( _translate("CONSTANT_STRING", cs.HOUR) + ": " + str(stg.hour)) self.fill_measurements_information_groupbox() + self.plot_transect_with_BS_raw_data() self.combobox_freq_choice.addItems([f for f in stg.freq_text]) self.combobox_frequency_profile.addItems([f for f in stg.freq_text]) @@ -1136,7 +1153,7 @@ class AcousticDataTab(QWidget): self.fig_BS.supxlabel('Time (sec)', fontsize=10) self.fig_BS.supylabel('Depth (m)', fontsize=10) cbar = self.fig_BS.colorbar(pcm, ax=self.axis_BS[:], shrink=1, location='right') - cbar.set_label(label='Backscatter acoustic signal (V)', rotation=270, labelpad=10) + cbar.set_label(label='Acoustic backscatter signal (V)', rotation=270, labelpad=10) self.fig_BS.canvas.draw_idle() self.plot_profile() @@ -1259,6 +1276,12 @@ class AcousticDataTab(QWidget): pcm = self.axis_BS[f].pcolormesh(stg.t[f, :], -stg.r[f, :], np.log(stg.BS_cross_section[f, :, :]), cmap='Blues') + # --- Plot river bottom line --- + + if stg.r_bottom.size != 0: + self.axis_BS[f].plot(stg.t[self.combobox_freq_choice.currentIndex(), :], -stg.r_bottom, + color='black', linewidth=1, linestyle="solid") + # --- Plot red solid line on transect to visualize position of plotted profile --- self.axis_BS[self.combobox_frequency_profile.currentIndex()].plot( stg.t[0, # self.combobox_frequency_profile.currentIndex(), @@ -1373,18 +1396,54 @@ class AcousticDataTab(QWidget): self.slider.setMaximum(stg.t.shape[1]) + slider_value = [self.slider.value() - 1 if self.slider.value() -1 <= stg.t.shape[1]-1 else np.max(stg.t.shape[1]-1)][0] + self.axis_profile.cla() - self.axis_profile.plot(stg.BS_cross_section[ - self.combobox_frequency_profile.currentIndex(), :, - [self.slider.value() - 1 if self.slider.value() -1 <= stg.t.shape[1]-1 else np.max(stg.t.shape[1]-1)][0]], + + # --- Profile plot --- + self.axis_profile.plot(stg.BS_cross_section[self.combobox_frequency_profile.currentIndex(), :, slider_value], -stg.r[self.combobox_frequency_profile.currentIndex(), :], linestyle='solid', color='k', linewidth=1) - self.axis_profile.text(.95, .05, stg.freq_text[self.combobox_frequency_profile.currentIndex()], - fontsize=10, fontweight='bold', fontname="Ubuntu", + + # --- Plot upper limit line --- + + # self.axis_profile.plot([0, + # stg.BS_cross_section[self.combobox_frequency_profile.currentIndex(), + # stg.ind_bottom[slider_value], + # slider_value]], + # -stg. + # ) + + # --- Plot lower limit line --- + + # --- Write frequency on graph --- + + self.axis_profile.text(.95, .90, stg.freq_text[self.combobox_frequency_profile.currentIndex()], + fontsize=14, fontweight='bold', fontname="Ubuntu", fontstyle="normal", c="black", alpha=0.2, horizontalalignment='right', verticalalignment='bottom', transform=self.axis_profile.transAxes) + # --- Plot bottom line --- + + if stg.r_bottom.size != 0: + + self.axis_profile.plot([0, + np.nanmax(stg.BS_cross_section[self.combobox_frequency_profile.currentIndex(), + :, slider_value])], + -stg.r[self.combobox_frequency_profile.currentIndex(), stg.ind_bottom[slider_value]]*np.ones(2), + linestyle='solid', color='r', linewidth=1) + + position_x = (stg.r[self.combobox_frequency_profile.currentIndex(), stg.ind_bottom[slider_value]] / + np.nanmax(stg.r[self.combobox_frequency_profile.currentIndex(), :])) + + self.axis_profile.text(.95, 1-position_x + 0.05, "River bed", + fontsize=10, fontweight='normal', fontname="Times New Roman", + fontstyle="italic", c="red", alpha=0.2, + horizontalalignment='right', verticalalignment='bottom', + transform=self.axis_profile.transAxes) + + self.fig_profile.supxlabel("Acoustic Backscatter Signal (V)") self.fig_profile.supylabel("Depth (m)") self.fig_profile.canvas.draw_idle() @@ -1813,7 +1872,18 @@ class AcousticDataTab(QWidget): # int(stg.tmax[self.combobox_freq_choice.currentIndex()])] stg.val_bottom = val_bottom#[int(stg.tmin[self.combobox_freq_choice.currentIndex()]): # int(stg.tmax[self.combobox_freq_choice.currentIndex()])] + stg.ind_bottom = r_bottom_ind + print("stg.ind_bottom : ", stg.ind_bottom) + print("stg.val_bottom : ", stg.val_bottom) + + stg.BS_stream_bed = deepcopy(stg.BS_cross_section) + for f, _ in enumerate(stg.freq): + for k, _ in enumerate(stg.r_bottom): + # print(k, np.where(stg.r >= stg.r_bottom[k])[0]) + stg.BS_stream_bed[ + f, np.where(stg.r[self.combobox_freq_choice.currentIndex(), :] >= stg.r_bottom[k])[ + 0], k] = np.nan # --- Plot transect BS with bathymetry --- @@ -1858,6 +1928,10 @@ class AcousticDataTab(QWidget): horizontalalignment='right', verticalalignment='bottom', transform=self.axis_BS[f].transAxes) + # --- Update plot profile --- + self.update_plot_profile() + + self.fig_BS.canvas.draw_idle() # # --- Plot transect SNR with bathymetry ---