From 1b2c5954ee563e871a9ef7b6f0d03dfe751a3a20 Mon Sep 17 00:00:00 2001 From: brahim Date: Fri, 30 Aug 2024 20:41:12 +0200 Subject: [PATCH] Vertical profile plot of SSC sand is added and a red vertical line display the profile position 2D field. Measured vs Inverted SSC sand is added. User can choose sample to display. --- View/acoustic_inversion_tab.py | 545 +++++++++++++++++++++++++++++---- 1 file changed, 491 insertions(+), 54 deletions(-) diff --git a/View/acoustic_inversion_tab.py b/View/acoustic_inversion_tab.py index a333815..c509d52 100644 --- a/View/acoustic_inversion_tab.py +++ b/View/acoustic_inversion_tab.py @@ -110,10 +110,15 @@ class AcousticInversionTab(QWidget): self.horizontalLayoutBottom.addWidget(self.groupbox_plot_SSC_sand, 6) self.groupbox_plot_SSC_sand_vertical_profile = QGroupBox() - self.horizontalLayoutBottom.addWidget(self.groupbox_plot_SSC_sand_vertical_profile, 3) + # self.horizontalLayoutBottom.addWidget(self.groupbox_plot_SSC_sand_vertical_profile, 3) + self.verticalLayout_groupbox_plot_SSC_sand_profile_and_slider = QVBoxLayout() + self.horizontalLayoutBottom.addLayout(self.verticalLayout_groupbox_plot_SSC_sand_profile_and_slider, 3) self.groupbox_plot_measured_vs_inverted_SSC_sand = QGroupBox() - self.horizontalLayoutBottom.addWidget(self.groupbox_plot_measured_vs_inverted_SSC_sand, 3) + # self.horizontalLayoutBottom.addWidget(self.groupbox_plot_measured_vs_inverted_SSC_sand, 3) + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand_and_combobox = QVBoxLayout() + self.horizontalLayoutBottom.addLayout(self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand_and_combobox, + 3) # ===================================================== @@ -238,6 +243,9 @@ class AcousticInversionTab(QWidget): # | Group box SSC sand vertical profile | # +++++++++++++++++++++++++++++++++++++++++++++++ + self.verticalLayout_groupbox_plot_SSC_sand_profile_and_slider.addWidget( + self.groupbox_plot_SSC_sand_vertical_profile) + self.verticalLayout_groupbox_plot_vertical_profile_sand = QVBoxLayout( self.groupbox_plot_SSC_sand_vertical_profile) @@ -248,7 +256,8 @@ class AcousticInversionTab(QWidget): self.verticalLayout_groupbox_plot_vertical_profile_sand.addWidget(self.canvas_profile_sand) self.horizontalLayout_slider_sand = QHBoxLayout() - self.verticalLayout_groupbox_plot_vertical_profile_sand.addLayout(self.horizontalLayout_slider_sand) + # self.verticalLayout_groupbox_plot_vertical_profile_sand.addLayout(self.horizontalLayout_slider_sand) + self.verticalLayout_groupbox_plot_SSC_sand_profile_and_slider.addLayout(self.horizontalLayout_slider_sand) self.pushbutton_left_to_begin_sand = QPushButton() self.pushbutton_left_to_begin_sand.setIcon(self.icon_triangle_left_to_begin) @@ -282,9 +291,12 @@ class AcousticInversionTab(QWidget): self.slider_sand.setValue(1) # +++++++++++++++++++++++++++++++++++++++++++++++++++ - # | Group box Measured VS Inverted SSC Fine | + # | Group box Measured VS Inverted SSC Sand | # +++++++++++++++++++++++++++++++++++++++++++++++++++ + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand_and_combobox.addWidget( + self.groupbox_plot_measured_vs_inverted_SSC_sand) + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand = QVBoxLayout( self.groupbox_plot_measured_vs_inverted_SSC_sand) @@ -297,16 +309,23 @@ class AcousticInversionTab(QWidget): self.canvas_inverted_vs_measured_SSC_sand) self.horizontalLayout_combobox_sand_sample_choice = QHBoxLayout() - self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand.addLayout( + # self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand.addLayout( + # self.horizontalLayout_combobox_sand_sample_choice) + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand_and_combobox.addLayout( self.horizontalLayout_combobox_sand_sample_choice) self.label_sand_sample_choice = QLabel() self.label_sand_sample_choice.setText("Sand sample choice : ") self.horizontalLayout_combobox_sand_sample_choice.addWidget(self.label_sand_sample_choice) - self.combobox_sand_sample_choice = QComboBox() + self.combobox_sand_sample_choice = CheckableComboBox() self.horizontalLayout_combobox_sand_sample_choice.addWidget(self.combobox_sand_sample_choice) + self.pushbutton_plot_sand_sample_choice = QPushButton() + self.pushbutton_plot_sand_sample_choice.setIcon(self.icon_update) + self.pushbutton_plot_sand_sample_choice.setMaximumWidth(50) + self.horizontalLayout_combobox_sand_sample_choice.addWidget(self.pushbutton_plot_sand_sample_choice) + # ============================================================================================================== # ---------------------------------------- Connect signal of widget -------------------------------------------- # ============================================================================================================== @@ -323,15 +342,17 @@ class AcousticInversionTab(QWidget): self.slider_fine.valueChanged.connect(self.update_lineEdit_by_moving_slider_fine) self.slider_fine.valueChanged.connect(self.update_plot_SSC_fine_vertical_profile) + self.pushbutton_plot_fine_sample_choice.clicked.connect(self.plot_measured_vs_inverted_SSC_fine) + self.pushbutton_left_to_begin_sand.clicked.connect(self.slider_profile_number_to_begin_sand) self.pushbutton_left_sand.clicked.connect(self.slider_profile_number_to_left_sand) self.pushbutton_right_sand.clicked.connect(self.slider_profile_number_to_right_sand) self.pushbutton_right_to_end_sand.clicked.connect(self.slider_profile_number_to_end_sand) self.lineEdit_slider_sand.returnPressed.connect(self.profile_number_on_lineEdit_sand) self.slider_sand.valueChanged.connect(self.update_lineEdit_by_moving_slider_sand) + self.slider_sand.valueChanged.connect(self.update_plot_SSC_sand_vertical_profile) - self.pushbutton_plot_fine_sample_choice.clicked.connect(self.plot_measured_vs_inverted_SSC_fine) - self.pushbutton_plot_fine_sample_choice.clicked.connect(self.update_plot_sample_position_on_concentration_field) + self.pushbutton_plot_sand_sample_choice.clicked.connect(self.plot_measured_vs_inverted_SSC_sand) # ================================================================================================================== # ------------------------------------ Functions for Acoustic Inversion Tab ---------------------------------------- @@ -349,12 +370,18 @@ class AcousticInversionTab(QWidget): self.compute_VBI() self.compute_SSC_fine() self.compute_SSC_sand() + self.fill_combobox_fine_sample() self.plot_SSC_fine() - self.plot_SSC_sand() self.plot_SSC_fine_vertical_profile() self.plot_measured_vs_inverted_SSC_fine() + self.fill_combobox_sand_sample() + self.plot_SSC_sand() + self.plot_SSC_sand_vertical_profile() + self.plot_measured_vs_inverted_SSC_sand() + + def compute_VBI(self): print("compute VBI") @@ -969,88 +996,252 @@ class AcousticInversionTab(QWidget): self.verticalLayout_groupbox_plot_SSC_sand.addWidget(self.toolbar_SSC_sand) self.verticalLayout_groupbox_plot_SSC_sand.addWidget(self.canvas_SSC_sand) - val_min = np.nanmin(stg.SSC_sand) - val_max = np.nanmax(stg.SSC_sand) + val_min = np.nanmin(stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()]) + val_max = np.nanmax(stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()]) + + print("ABS name ", stg.ABS_name) if stg.ABS_name[0] == "Aquascat 1000R": + print("hey !") + if stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + print("hey hey !") + + # print("time cross section ", stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + # stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + # print("depth cross section ", stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + # stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + # print(stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]) + pcm_SSC_sand = self.axis_SSC_sand.pcolormesh( stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()], - cmap='rainbow', norm=LogNorm(vmin=1e-2, vmax=10), shading='gouraud') + cmap='rainbow', norm=LogNorm(vmin=1e0, vmax=10), shading='gouraud') if stg.depth_bottom[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): self.axis_SSC_sand.plot(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ - stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], + stg.frequency_for_inversion[ + self.combobox_acoustic_data_choice.currentIndex()][0][1]], -stg.depth_bottom[self.combobox_acoustic_data_choice.currentIndex()], color='black', linewidth=1, linestyle="solid") + self.pcm_SSC_sand_vertical_line, = self.axis_SSC_sand.plot( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], + self.slider_sand.value() - 1] * + np.ones(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][ + 1]].shape), + -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], + linestyle="solid", color='r', linewidth=2) + + print("o+o+o+o+o+o") + print(stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]) + print([i for i, _ in stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()]]) + # print([stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + # stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], i] + # for i, _ in stg.fine_sample_position[self.combobox_acoustic_data_choice.currentIndex()]]) + print("o+o+o+o+o+o") + + # self.pcm_SSC_fine_meas_vs_inv, = self.axis_SSC_fine.plot( + # [stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + # stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], i] + # for i, _ in stg.fine_sample_position[self.combobox_acoustic_data_choice.currentIndex()]], + # [-stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + # stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], j] + # for _, j in stg.fine_sample_position[self.combobox_acoustic_data_choice.currentIndex()]], + # ls=" ", marker="o", ms=5, mec="k", mfc="k") + + self.pcm_SSC_sand_meas_vs_inv, = self.axis_SSC_sand.plot(stg.time_sand, stg.depth_sand, + ls=" ", marker="o", ms=5, mec="k", mfc="k") + + print(stg.time_sand) + print(stg.depth_sand) + print([f for _, f in stg.sample_sand]) + for i, j in stg.sample_sand: + self.pcm_SSC_sand_meas_vs_inv_text = self.axis_SSC_sand.text( + stg.time_sand[j], + stg.depth_sand[j], + i) + else: pcm_SSC_sand = self.axis_SSC_sand.pcolormesh( - stg.time[self.combobox_acoustic_data_choice.currentIndex()][stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], - -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], + stg.time[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()], cmap='rainbow', norm=LogNorm(vmin=1e0, vmax=10), shading='gouraud') if stg.depth_bottom[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): self.axis_SSC_sand.plot(stg.time[self.combobox_acoustic_data_choice.currentIndex()][ - stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], + stg.frequency_for_inversion[ + self.combobox_acoustic_data_choice.currentIndex()][0][1]], -stg.depth_bottom[self.combobox_acoustic_data_choice.currentIndex()], color='black', linewidth=1, linestyle="solid") + self.pcm_SSC_sand_meas_vs_inv, = self.axis_SSC_sand.plot( + [stg.time[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], i] + for i, _ in stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()]], + [-stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], j] + for _, j in stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()]], + ls=" ", marker="o", ms=5, mec="k", mfc="k") + cbar_SSC_sand = self.figure_SSC_sand.colorbar(pcm_SSC_sand, ax=self.axis_SSC_sand, shrink=1, location='right') - cbar_SSC_sand.set_label(label='Sand SSC (g/L', rotation=270, labelpad=15) + cbar_SSC_sand.set_label(label='Fine SSC (g/L', rotation=270, labelpad=15) elif stg.ABS_name[0] == "UB-SediFlow": pcm_SSC_sand = self.axis_SSC_sand.pcolormesh(stg.t[0, :], - -stg.r[0, 5:155], - (stg.SSC_sand[5:155, :]), - cmap="plasma", - # cmap='rainbow', - vmin=0, vmax=10, - # vmin=1e-2, vmax=10) - # vmin=val_min, vmax=val_max, - # norm=LogNorm(vmin=1e-2, vmax=1), - shading='gouraud') - # self.axis_SSC_2D_field[1].plot(stg.t[1, 52] * np.ones(len(stg.r[1, 5:152])), -stg.r[1, 5:152], - # c='b', ls='solid', lw=2) - # self.axis_SSC_2D_field[1].plot(stg.t[1, ] * np.ones(len(stg.r[1, 5:152])), -stg.r[1, 5:152], - # c='red', ls='solid', lw=2) - # self.axis_SSC_2D_field[1].plot(stg.t[1, 777] * np.ones(len(stg.r[1, 5:152])), -stg.r[1, 5:152], - # c='red', ls='solid', lw=2) - - # pcm_SSC_sand = self.axis_SSC_2D_field[1].pcolormesh(stg.t[int(stg.frequency_to_compute_SSC[0]), :], - # -stg.r[int(stg.frequency_to_compute_SSC[0]), :], - # stg.SSC_sand, - # cmap='rainbow', - # # vmin=val_min, vmax=val_max, - # norm=LogNorm(vmin=1e-2, vmax=2), - # shading='gouraud') - - # if stg.r_bottom.size: - # self.axis_SSC_sand.plot(stg.t[0, :], - # -stg.r_bottom, - # color='black', linewidth=1, linestyle="solid") - # # self.axis_SSC_2D_field[1].plot(stg.t[int(stg.frequency_to_compute_SSC[0]), :], - # # -stg.r_bottom, - # # color='black', linewidth=1, linestyle="solid") - # - # if self.combobox_fig_choice.currentText() == "Inverted SSC sand vertical profile": - # self.axis_SSC_sand.plot(stg.t[0, self.slider.value() - 1] * np.ones(stg.r.shape[1]), - # -stg.r[0, :], - # color='black', linestyle="solid", linewidth=2) + -stg.r[0, :], + stg.SSC_sand, + cmap='rainbow', + norm=LogNorm(vmin=1e-2, vmax=10), + shading='gouraud') self.figure_SSC_sand.supxlabel("Time (sec)", fontsize=10) self.figure_SSC_sand.supylabel("Depth (m)", fontsize=10) self.figure_SSC_sand.canvas.draw_idle() + def plot_SSC_sand_vertical_profile(self): + + if stg.filename_BS_noise_data != []: + + if stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + + self.slider_sand.setMaximum(stg.SSC_fine[self.combobox_acoustic_data_choice.currentIndex()].shape[1]) + + self.verticalLayout_groupbox_plot_vertical_profile_sand.removeWidget(self.toolbar_profile_sand) + self.verticalLayout_groupbox_plot_vertical_profile_sand.removeWidget(self.canvas_profile_sand) + + self.figure_vertical_profile_SSC_sand, self.axis_vertical_profile_SSC_sand = plt.subplots( + nrows=1, ncols=1, layout="constrained") + + self.canvas_profile_sand = FigureCanvas(self.figure_vertical_profile_SSC_sand) + self.toolbar_profile_sand = NavigationToolBar(self.canvas_profile_sand) + + self.verticalLayout_groupbox_plot_vertical_profile_sand.addWidget(self.toolbar_profile_sand) + self.verticalLayout_groupbox_plot_vertical_profile_sand.addWidget(self.canvas_profile_sand) + + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + + self.plot_sand , = self.axis_vertical_profile_SSC_sand.plot( + stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][:, self.slider_sand.value() -1], + -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], + linestyle="solid", linewidth=1, color="k") + + self.pcm_SSC_sand_vertical_line.set_data( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], + self.slider_sand.value() - 1] * + np.ones(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]].shape), + -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + self.figure_SSC_sand.canvas.draw_idle() + + self.axis_vertical_profile_SSC_sand.set_ylim( + [-np.nanmax(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]), + -np.nanmin(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]])]) + + else: + + self.axis_vertical_profile_SSC_sand.plot( + stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][:, self.slider_sand.value() -1], + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]], + linestyle="solid", linewidth=1, color="k") + + self.pcm_SSC_sand_vertical_line.set_data( + stg.time[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], self.slider_sand.value() - 1] * + np.ones(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]].shape), + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + self.figure_SSC_sand.canvas.draw_idle() + + self.axis_vertical_profile_SSC_sand.set_ylim( + [-np.nanmax(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]), + -np.nanmin(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]])]) + + # self.axis_SSC_fine.plot([], [], ) + + 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() + + def update_plot_SSC_sand_vertical_profile(self): + + if stg.filename_BS_noise_data != []: + + if stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + + if stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,): + + self.plot_sand.set_data( + stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][:, + self.slider_sand.value() - 1], + -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + + self.pcm_SSC_sand_vertical_line.set_data( + stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], + self.slider_sand.value() - 1] * + np.ones(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]].shape), + -stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + self.figure_SSC_sand.canvas.draw_idle() + + self.axis_vertical_profile_SSC_sand.set_ylim( + [-np.nanmax(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]), + -np.nanmin(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]])]) + + else: + + self.axis_vertical_profile_SSC_sand.set_data( + stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][:, + self.slider_sand.value() - 1], + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + + self.pcm_SSC_sand_vertical_line.set_data( + stg.time[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1], self.slider_sand.value() - 1] * + np.ones(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]].shape), + -stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + self.figure_SSC_sand.canvas.draw_idle() + + self.axis_vertical_profile_SSC_sand.set_ylim( + [-np.nanmax(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]), + -np.nanmin(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]])]) + + 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() + def slider_profile_number_to_begin_sand(self): self.slider_sand.setValue(int(self.slider_sand.minimum())) self.lineEdit_slider_sand.setText(str(self.slider_sand.value())) @@ -1073,6 +1264,252 @@ class AcousticInversionTab(QWidget): def update_lineEdit_by_moving_slider_sand(self): self.lineEdit_slider_sand.setText(str(self.slider_sand.value())) + # --- Plot sand SSC : measured vs inverted --- + + def fill_combobox_sand_sample(self): + + print("stg.sample_sand ", stg.sample_sand) + self.combobox_sand_sample_choice.addItems([f for f, _ in stg.sample_sand]) + + # --- Get position (index, value) of sample in acoustic measurement space --- + if ((stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,)) and + (stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,))): + + print(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]]) + print(stg.depth_fine) + + for j in range(len(stg.time_sand)): + + (stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()]. + append( + ( + np.where( + np.abs(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j]) + == + np.nanmin(np.abs(stg.time_cross_section[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j])) + )[0][0], + np.where( + np.abs(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j])) + == + np.nanmin(np.abs(stg.depth_cross_section[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j]))) + )[0][0] + ) + ) + ) + + print("0 stg.sand_sample_position ", stg.sand_sample_position) + + elif ((stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,)) and + (stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,))): + + for j in range(len(stg.time_sand)): + + (stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()]. + append( + ( + np.where( + np.abs(stg.time_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j]) + == + np.nanmin(np.abs(stg.time_cross_section[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j])) + )[0][0], + np.where( + np.abs(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j])) + == + np.nanmin(np.abs(stg.depth[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j]))) + )[0][0] + ) + ) + ) + + print("1 stg.sand_sample_position ", stg.sand_sample_position) + + elif ((stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,)) and + (stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,))): + + for j in range(len(stg.time_sand)): + + (stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()]. + append( + ( + np.where( + np.abs(stg.time[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j]) + == + np.nanmin(np.abs(stg.time[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j])) + )[0][0], + np.where( + np.abs(stg.depth_cross_section[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j])) + == + np.nanmin(np.abs(stg.depth_cross_section[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j]))) + )[0][0] + ) + ) + ) + + print("2 stg.sand_sample_position ", stg.sand_sample_position) + + elif ((stg.time[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,)) and + (stg.depth[self.combobox_acoustic_data_choice.currentIndex()].shape != (0,))): + + for j in range(len(stg.time_sand)): + + (stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()]. + append( + ( + np.where( + np.abs(stg.time[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j]) + == + np.nanmin(np.abs(stg.time[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - stg.time_sand[j])) + )[0][0], + np.where( + np.abs(stg.depth[self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j])) + == + np.nanmin(np.abs(stg.depth[ + self.combobox_acoustic_data_choice.currentIndex()][ + stg.frequency_for_inversion[self.combobox_acoustic_data_choice.currentIndex()][0][1]] - (-stg.depth_sand[j]))) + )[0][0] + ) + ) + ) + + print("3 stg.sand_sample_position ", stg.sand_sample_position) + + def plot_measured_vs_inverted_SSC_sand(self): + + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand.removeWidget( + self.toolbar_inverted_vs_measured_SSC_sand) + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand.removeWidget( + self.canvas_inverted_vs_measured_SSC_sand) + + self.figure_measured_vs_inverted_sand, self.axis_measured_vs_inverted_sand = ( + plt.subplots(nrows=1, ncols=1, layout="constrained")) + + self.canvas_inverted_vs_measured_SSC_sand = FigureCanvas(self.figure_measured_vs_inverted_sand) + self.toolbar_inverted_vs_measured_SSC_sand = NavigationToolBar(self.canvas_inverted_vs_measured_SSC_sand, self) + + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand.addWidget( + self.toolbar_inverted_vs_measured_SSC_sand) + self.verticalLayout_groupbox_plot_measured_vs_inverted_SSC_sand.addWidget( + self.canvas_inverted_vs_measured_SSC_sand) + + print("self.combobox_sand_sample_choice.currentData() ", self.combobox_sand_sample_choice.currentData()) + print("self.combobox_sand_sample_choice.currentIndex() ", self.combobox_sand_sample_choice.currentIndex()) + + print("///////////////////////////////////////////////////") + self.sand_sample_to_plot = [int(f[1:]) - 1 for f in self.combobox_sand_sample_choice.currentData()] + print("self.sand_sample_to_plot ", self.sand_sample_to_plot) + + # for k in self.fine_sample_to_plot: + # print("stg.Ctot_fine[k] ", stg.Ctot_fine[k]) + # print(stg.fine_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][1]) + # print(stg.fine_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][0]) + # print(stg.SSC_fine[self.combobox_acoustic_data_choice.currentIndex()][ + # stg.fine_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][1], + # stg.fine_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][0]]) + + if self.sand_sample_to_plot: + + self.axis_measured_vs_inverted_sand.plot( + [stg.Ctot_sand[k] for k in self.sand_sample_to_plot], + [stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][1], + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][0]] for k in + self.sand_sample_to_plot], + ls=" ", marker='o', ms=5, mec='black', mfc="black" + ) + + self.axis_measured_vs_inverted_sand.plot( + [0, np.nanmax([np.nanmax([stg.Ctot_sand[c] for c in self.sand_sample_to_plot]), + np.nanmax([stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][1], + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][0]] + for i in self.sand_sample_to_plot])]) + 1], + [0, np.nanmax([np.nanmax([stg.Ctot_sand[c] for c in self.sand_sample_to_plot]), + np.nanmax([stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][1], + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][0]] + for i in self.sand_sample_to_plot])]) + 1], + ls="solid", linewidth=1, color="k" + ) + + # --- Display sample label on plot --- + for i in self.sand_sample_to_plot: + self.axis_measured_vs_inverted_sand.text( + stg.Ctot_sand[i], + stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][i][1], + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][i][0]], + stg.sample_sand[i][0], + fontstyle="normal", fontweight="light", fontsize=10) + + else: + + self.axis_measured_vs_inverted_sand.plot( + [stg.Ctot_sand[k] for k in range(len(stg.sample_sand))], + [stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][1], + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][k][0]] for k in + range(len(stg.sample_sand))], + ls=" ", marker='o', ms=5, mec='black', mfc="black" + ) + + self.axis_measured_vs_inverted_sand.plot( + [0, np.nanmax([np.nanmax([stg.Ctot_sand[c] for c in range(len(stg.sample_sand))]), + np.nanmax([stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][1], + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][0]] + for i in range(len(stg.sample_sand))])]) + 1], + [0, np.nanmax([np.nanmax([stg.Ctot_sand[c] for c in range(len(stg.sample_sand))]), + np.nanmax([stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][1], + stg.sand_sample_position[ + self.combobox_acoustic_data_choice.currentIndex()][i][0]] + for i in range(len(stg.sample_sand))])]) + 1], + ls="solid", linewidth=1, color="k" + ) + + for j in range(len(stg.sample_sand)): + self.axis_measured_vs_inverted_sand.text( + stg.Ctot_sand[j], + stg.SSC_sand[self.combobox_acoustic_data_choice.currentIndex()][ + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][j][1], + stg.sand_sample_position[self.combobox_acoustic_data_choice.currentIndex()][j][0]], + stg.sample_sand[j][0], + fontstyle="normal", fontweight="light", fontsize=10) + + self.axis_measured_vs_inverted_sand.set_xlabel("Measured SSC sand (g/L)") + self.axis_measured_vs_inverted_sand.set_ylabel("Inverted SSC sand (g/L)") + + self.figure_measured_vs_inverted_sand.canvas.draw_idle() # -------------------------------------------------------------------------------------------------------------- @@ -1083,7 +1520,7 @@ class AcousticInversionTab(QWidget): # | | | | / # |______| |________ |________/ - # COMMENT OLD CODE LINE FROM HERE .... + # COMMENT OLD CODE LINE FROM HERE ... # ### --- Layout of groupbox in the Top horizontal layout box #