From 9030c3f9b4b30fe6f062bd5ea1e4fbb26bb0f1ab Mon Sep 17 00:00:00 2001 From: Olivier Jossoud <olivier.jossoud@lsce.ipsl.fr> Date: Fri, 11 Oct 2019 09:51:25 +0200 Subject: [PATCH] Use config file to set a default data directory. --- config/settings.ini | 3 +++ src/config.py | 31 +++++++++++++++++++++++++++++++ src/main.py | 8 +++++++- src/uim/conductcalibuim.py | 7 +++++-- src/utils.py | 10 ++++++++++ 5 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 config/settings.ini create mode 100644 src/config.py diff --git a/config/settings.ini b/config/settings.ini new file mode 100644 index 0000000..97caeda --- /dev/null +++ b/config/settings.ini @@ -0,0 +1,3 @@ +[DATA_SOURCE] +# Absolute path of the base directory where the data files produced by the CFA are be stored. +absolute_root_dir = /homel/ojossoud/_temp/data_cfa diff --git a/src/config.py b/src/config.py new file mode 100644 index 0000000..3bf3c47 --- /dev/null +++ b/src/config.py @@ -0,0 +1,31 @@ +from configobj import ConfigObj +import utils +import threading + + +class Config: + + def __init__(self, filename): + self.full_filename = "../config/" + filename + self.config_parser = ConfigObj(self.full_filename) + self.file_access_lock = threading.Lock() + + def write(self, instrument, key, value): + self.file_access_lock.acquire() + + self.config_parser.reload() + self.config_parser[instrument][key] = str(value) + self.config_parser.write() + self.file_access_lock.release() + + def read(self, instrument, key): + self.file_access_lock.acquire() + self.config_parser.reload() + try: + value = self.config_parser[instrument][key] + except: + self.file_access_lock.release() + raise + self.file_access_lock.release() + value = utils.convert_to_numeric(value) + return value diff --git a/src/main.py b/src/main.py index cf758f3..7dbeab7 100755 --- a/src/main.py +++ b/src/main.py @@ -3,12 +3,18 @@ import sys from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QThread +from config import Config + from gui.mainwindow import MainWindow from dataprovider.conductcalibprovider import ConductCalibProvider from uim.conductcalibuim import ConductCalibUim +######################################################################################################################## +# CONFIG +######################################################################################################################## +config = Config("settings.ini") ######################################################################################################################## # WINDOWS @@ -27,7 +33,7 @@ conduct_prvd = ConductCalibProvider() # GUI MANAGERS ######################################################################################################################## -conductcalib_uim = ConductCalibUim(conduct_prvd, main_window_ui) +conductcalib_uim = ConductCalibUim(conduct_prvd, main_window_ui, config) ######################################################################################################################## # LAUNCH APPLICATION diff --git a/src/uim/conductcalibuim.py b/src/uim/conductcalibuim.py index e620168..7b0d217 100644 --- a/src/uim/conductcalibuim.py +++ b/src/uim/conductcalibuim.py @@ -5,6 +5,7 @@ import pandas as pd import numpy as np import utils +from config import Config from dataprovider.conductcalibprovider import ConductCalibProvider from dataprovider.conductcalibprovider import CalibRun from gui.uimainwindow import Ui_MainWindow @@ -27,9 +28,10 @@ class ConductCalibUim: VALIDAUTO_COL = 5 VALIDMANUAL_COL = 6 - def __init__(self, conduct_prvd: ConductCalibProvider, main_ui: Ui_MainWindow): + def __init__(self, conduct_prvd: ConductCalibProvider, main_ui: Ui_MainWindow, config: Config): self.main_ui = main_ui self.conduct_prvd = conduct_prvd + self.config = config self.current_calib_run = None self.current_channel = int(self.main_ui.conduct_combobox_channel.currentText()) @@ -50,7 +52,8 @@ class ConductCalibUim: self.main_ui.conduct_tablewidget_run.cellClicked.connect(self.highlight_step) def load_data(self): - directory = QFileDialog.getExistingDirectory() + directory = QFileDialog.getExistingDirectory( + directory=self.config.read("DATA_SOURCE", "absolute_root_dir") + "/conduct_calib") # If user cancels directory selection, do nothing. if directory == "": diff --git a/src/utils.py b/src/utils.py index 309a333..ba5d688 100644 --- a/src/utils.py +++ b/src/utils.py @@ -2,6 +2,7 @@ import pyqtgraph as pg import datetime import pandas as pd import numpy as np +import re from PyQt5.QtWidgets import QTableWidget from PyQt5.QtGui import QColor @@ -16,6 +17,15 @@ def datetime64_to_epoch_ms(datetimes_list: np.ndarray) -> list: return [float(instant) / 1e9 for instant in datetimes_list] +def convert_to_numeric(str_value: str): + """Convert a string to float (if there is a "." in the string) or to integer, if possible.""" + if re.match("^-?\d+\.\d+$", str_value): + return float(str_value) + elif re.match("^-?\d+$", str_value): + return int(str_value) + else: + return str_value + #################################################################### # Graphics -- GitLab