diff --git a/ohmpi/ohmpi.py b/ohmpi/ohmpi.py index 825ce6d995f6cf40f525b8fcd10c73bfa81c893b..b25add816ed5beb3c191c1131eb917a4dd179368 100644 --- a/ohmpi/ohmpi.py +++ b/ohmpi/ohmpi.py @@ -15,6 +15,7 @@ from copy import deepcopy import numpy as np import csv import time +import pandas as pd from shutil import rmtree, make_archive from threading import Thread from inspect import getmembers, isfunction @@ -51,8 +52,7 @@ class OhmPi(object): Dictionnary of parameters. Possible parameters with their default values: `{'injection_duration': 0.2, 'nb_meas': 1, 'sequence_delay': 1, 'nb_stack': 1, 'sampling_interval': 2, 'tx_volt': 5, 'duty_cycle': 0.5, - 'strategy': 'constant', 'export_path': None, 'export_dir': 'data', - 'export_name': 'measurement.csv'`. + 'strategy': 'constant', 'export_path': None sequence : str, optional Path of the .csv or .txt file with A, B, M and N electrodes. Electrode index starts at 1. See `OhmPi.load_sequence()` for full docstring. @@ -74,9 +74,10 @@ class OhmPi(object): self._hw = OhmPiHardware(**{'exec_logger': self.exec_logger, 'data_logger': self.data_logger, 'soh_logger': self.soh_logger}) self.exec_logger.info('Hardware configured...') - + # default acquisition settings - self.update_settings('settings/default.json') + self.settings = {} + self.update_settings(os.path.join(os.path.split(os.path.dirname(__file__))[0],'settings/default.json')) # read in acquisition settings self.update_settings(settings) @@ -169,18 +170,17 @@ class OhmPi(object): Unique command identifier. """ # check if directory 'data' exists - ddir = os.path.join(os.path.dirname(__file__), '../data/') + ddir = os.path.split(filename)[0] if os.path.exists(ddir) is not True: os.mkdir(ddir) last_measurement = deepcopy(last_measurement) - # TODO need to make all the full data of the same size (pre-populate - # readings with NaN in hardware_system.OhmPiHardware.read_values()) + # save full waveform data in a long .csv file if fw_in_zip: fw_filename = filename.replace('.csv', '_fw.csv') if not os.path.exists(fw_filename): # new file, write headers first - with open(fw_filane, 'w') as f: + with open(fw_filename, 'w') as f: f.write('A,B,M,N,t,pulse,polarity,current,voltage\n') # write full data with open(fw_filename, 'a') as f: @@ -191,10 +191,9 @@ class OhmPi(object): df['M'] = last_measurement['M'] df['N'] = last_measurement['N'] df.to_csv(f, index=False, header=False) - print('--------', fw_filename) if fw_in_csv: - d = last_measurement['fulldata'] + d = last_measurement['full_waveform'] n = d.shape[0] if n > 1: idic = dict(zip(['i' + str(i) for i in range(n)], d[:, 0])) @@ -256,7 +255,8 @@ class OhmPi(object): # get all .csv file in data folder if survey_names is None: survey_names = [] - ddir = os.path.join(os.path.dirname(__file__), '../data/') + # ddir = os.path.join(os.path.dirname(__file__), '../data/') + ddir = self.settings['export_dir'] fnames = [fname for fname in os.listdir(ddir) if fname[-4:] == '.csv'] ddic = {} if cmd_id is None: @@ -397,20 +397,10 @@ class OhmPi(object): """ self.exec_logger.debug('Getting hardware config') self.id = OHMPI_CONFIG['id'] # ID of the OhmPi - # self.r_shunt = OHMPI_CONFIG['R_shunt'] # reference resistance value in ohm - # self.Imax = OHMPI_CONFIG['Imax'] # maximum current - # self.exec_logger.debug(f'The maximum current cannot be higher than {self.Imax} mA') - # self.coef_p2 = OHMPI_CONFIG['coef_p2'] # slope for current conversion for ads.P2, measurement in V/V - # self.nb_samples = OHMPI_CONFIG['nb_samples'] # number of samples measured for each stack - # self.version = OHMPI_CONFIG['version'] # hardware version - # self.max_elec = OHMPI_CONFIG['max_elec'] # maximum number of electrodes - # self.board_addresses = OHMPI_CONFIG['board_addresses'] - # self.board_version = OHMPI_CONFIG['board_version'] - # self.mcp_board_address = OHMPI_CONFIG['mcp_board_address'] self.exec_logger.debug(f'OHMPI_CONFIG = {str(OHMPI_CONFIG)}') def remove_data(self, cmd_id=None): - """Remove all data in the ´data/´ folder on the raspberrypi. + """Remove all data in the ´export_path´ folder on the raspberrypi. Parameters ---------- @@ -418,7 +408,8 @@ class OhmPi(object): Unique command identifier. """ self.exec_logger.debug(f'Removing all data following command {cmd_id}') - datadir = os.path.join(os.path.dirname(__file__), '../data') + datadir = os.path.split(self.settings['export_path']) + #datadir = os.path.join(os.path.dirname(__file__), '../data') rmtree(datadir) os.mkdir(datadir) @@ -436,7 +427,8 @@ class OhmPi(object): def download_data(self, cmd_id=None): """Create a zip of the data folder to then download it easily. """ - datadir = os.path.join(os.path.dirname(__file__), '../data/') + datadir = os.path.split(self.settings['export_path']) + # datadir = os.path.join(os.path.dirname(__file__), '../data/') make_archive(datadir, 'zip', 'data') self.data_logger.info(json.dumps({'download': 'ready'})) @@ -911,10 +903,7 @@ class OhmPi(object): - nb_stack (number of stack for each quadrupole measurement) - strategy (injection strategy: constant, vmax, vmin) - duty_cycle (injection duty cycle comprised between 0.5 - 1) - - export_dir (directory where to export the data) - - export_name (name of exported file, timestamp will be added to filename) - - export_path (path where to export the data, timestamp will be added to filename ; - if export_path is given, it goes over export_dir and export_name) + - export_path (path where to export the data, timestamp will be added to filename) Parameters ---------- @@ -942,10 +931,11 @@ class OhmPi(object): self.exec_logger.warning('Settings are missing...') if self.settings['export_path'] is None: - self.settings['export_path'] = os.path.join(self.settings['export_dir'], self.settings['export_name']) - else: - self.settings['export_dir'] = os.path.split(self.settings['export_path'])[0] - self.settings['export_name'] = os.path.split(self.settings['export_path'])[1] + self.settings['export_path'] = os.path.join("data", "measurement.csv") + + if not os.path.isabs(self.settings['export_path']): + export_dir = os.path.split(os.path.dirname(__file__))[0] + self.settings['export_path'] = os.path.join(export_dir, self.settings['export_path']) def run_inversion(self, survey_names=None, elec_spacing=1, **kwargs): """Run a simple 2D inversion using ResIPy (https://gitlab.com/hkex/resipy). @@ -999,7 +989,7 @@ class OhmPi(object): # get absolule filename fnames = [] for survey_name in survey_names: - fname = os.path.join(pdir, '../data', survey_name) + fname = os.path.join(self.settings['export_path'], survey_name) if os.path.exists(fname): fnames.append(fname) else: diff --git a/settings/default.json b/settings/default.json new file mode 100644 index 0000000000000000000000000000000000000000..8e0510fa52c8ef3326f3671ed094dc658e8ec8d6 --- /dev/null +++ b/settings/default.json @@ -0,0 +1,12 @@ +{ + "injection_duration": 0.2, + "nb_meas": 1, + "sequence_delay": 1, + "nb_stack": 1, + "sampling_interval": 2, + "tx_volt": 5, + "duty_cycle": 0.5, + "strategy": "constant", + "fulldata": false, + "export_path": "data/measurements.csv" +} \ No newline at end of file