diff --git a/View/sediment_calibration_tab.py b/View/sediment_calibration_tab.py index 8a92eb2..9abe316 100644 --- a/View/sediment_calibration_tab.py +++ b/View/sediment_calibration_tab.py @@ -1590,7 +1590,6 @@ class SedimentCalibrationTab(QWidget): self.animaiton_groupbox_compute.start() def import_calibration_file(self): - if self.combobox_acoustic_data_choice.count() == 0: msgBox = QMessageBox() msgBox.setWindowTitle("Calibration import error") @@ -1602,35 +1601,81 @@ class SedimentCalibrationTab(QWidget): msgBox.setText("Update data before importing calibration") msgBox.setStandardButtons(QMessageBox.Ok) msgBox.exec() + return - else: + path = "" + if stg.path_calibration_file: + path = stg.path_calibration_file + elif self.combobox_acoustic_data_choice.count() > 0: + path = stg.path_BS_raw_data[-1] - filename = QFileDialog.getOpenFileName( - self, "Open calibration", - [ - stg.path_calibration_file - if stg.path_calibration_file - else stg.path_BS_raw_data[-1] - if self.combobox_acoustic_data_choice.count() > 0 - else "" - ][0], - "Calibration file (*.xls, *.ods, *csv)", - options=QFileDialog.DontUseNativeDialog + file_type = { + "Calibration file (*.csv *.ods *.xls *.xlsx)": + self.read_calibration_dispatch, + "CSV Files (*.csv)": self.read_calibration_csv, + "Excel Files (*.xlsx *.xls)": self.read_calibration_excel, + "LibreOffice Calc Files (*.ods)": self.read_calibration_ods, + } + + filename, ftype = QFileDialog.getOpenFileName( + self, "Open calibration file", path, + ";;".join(file_type), + options=QFileDialog.DontUseNativeDialog + ) + + if filename == '': + return + + dir_name = os.path.dirname(filename) + name = os.path.basename(filename) + + stg.path_calibration_file = dir_name + stg.filename_calibration_file = name + + parser = file_type[ftype] + + self.lineEdit_import_calibration.clear() + self.lineEdit_import_calibration.setText(name) + + self.lineEdit_import_calibration.setToolTip(dir_name) + + self.compute_depth_2D() + try: + self.read_calibration_file_and_fill_parameter( + parser(filename) ) + except Exception as e: + logger.warning(f"read_calibration failed: {str(e)}") - dir_name = os.path.dirname(filename[0]) - name = os.path.basename(filename[0]) + def read_calibration_dispatch(self, filename): + if ".csv" in filename: + return self.read_calibration_csv(filename) + elif ".ods" in filename: + return self.read_calibration_ods(filename) + else: + return self.read_calibration_excel(filename) - stg.path_calibration_file = dir_name - stg.filename_calibration_file = name + def read_calibration_csv(self, filename): + data = pd.read_csv( + filename, header=0, index_col=0, + ) + logger.debug(f"Calibration data: {data}") + return data - self.lineEdit_import_calibration.clear() - self.lineEdit_import_calibration.setText(name) + def read_calibration_ods(self, filename): + data = pd.read_excel( + filename, header=0, index_col=0, + engine="odf" + ) + logger.debug(f"Calibration data: {data}") + return data - self.lineEdit_import_calibration.setToolTip(dir_name) - - self.compute_depth_2D() - self.read_calibration_file_and_fill_parameter() + def read_calibration_excel(self, filename): + data = pd.read_excel( + filename, header=0, index_col=0, + ) + logger.debug(f"Calibration data: {data}") + return data def update_label_freq1_for_calibration(self): self.label_freq1.clear() @@ -1668,68 +1713,49 @@ class SedimentCalibrationTab(QWidget): str('%.4f' % stg.kt_read[freq_2]) ) - def read_calibration_file_and_fill_parameter(self): + def read_calibration_file_and_fill_parameter(self, data): if stg.filename_calibration_file == "": return - # --- Read calibration file --- - data = pd.read_csv( - os.path.join( - stg.path_calibration_file, - stg.filename_calibration_file - ), header=0, index_col=0 - ) - # --- Fill spinboxes of calibration parameter --- self.label_temperature.clear() self.label_temperature.setText( "T = " + str(stg.temperature) + " °C" ) - self.label_freq1.clear() - self.label_freq1.setText(data.columns[0]) - data_id = self.combobox_acoustic_data_choice.currentIndex() - stg.calib_acoustic_data = data_id - index_freq1 = np.where( - np.asarray( - stg.freq_text[data_id] - ) == data.columns[0] - )[0][0] - stg.frequencies_for_calibration.clear() - stg.frequencies_for_calibration.append( - ( - stg.freq[data_id][index_freq1], - index_freq1 + + for label, column in [ + (self.label_freq1, 0), + (self.label_freq2, 1) + ]: + label.clear() + label.setText(data.columns[0]) + + index = next( + map( + lambda e: e[0], + filter( + lambda e: e[1] == data.columns[column], + enumerate(stg.freq_text[data_id]) + ) + ) ) - ) - stg.calib_freq_1 = index_freq1 - self.label_freq2.clear() - self.label_freq2.setText(data.columns[1]) - - index_freq2 = np.where( - np.asarray( - stg.freq_text[data_id] - ) == data.columns[1] - )[0][0] - - stg.frequencies_for_calibration.append( - ( - stg.freq[data_id][index_freq2], - index_freq2 + stg.frequencies_for_calibration.append( + ( + stg.freq[data_id][index], + index + ) ) - ) - stg.calib_freq_2 = index_freq2 - stg.frequency_for_inversion = tuple() - stg.frequency_for_inversion = ( - stg.freq[data_id][index_freq2], - index_freq2 - ) + logger.debug(f"Select freq {index}: {stg.freq_text[data_id][index]}") + + stg.calib_freq_1 = stg.frequencies_for_calibration[0][1] + stg.calib_freq_2 = stg.frequencies_for_calibration[1][1] self.lineEdit_ks_freq1.clear() self.lineEdit_ks_freq1.setText(