diff --git a/ohmpi.py b/ohmpi.py index ce32bfb3b8e056297503b4a9100054475ee1b314..86e92232f8e25d2be78f34828a4139c937b54057 100644 --- a/ohmpi.py +++ b/ohmpi.py @@ -1057,7 +1057,128 @@ class OhmPi(object): status = False def run_sequence(self, cmd_id=None, **kwargs): - """ Run the sequence in a separate thread. Can be stopped by 'OhmPi.stop()'. + """Run sequence in sync mode + """ + self.status = 'running' + self.exec_logger.debug(f'Status: {self.status}') + self.exec_logger.debug(f'Measuring sequence: {self.sequence}') + + t0 = time.time() + + # create filename with timestamp + filename = self.settings["export_path"].replace('.csv', + f'_{datetime.now().strftime("%Y%m%dT%H%M%S")}.csv') + self.exec_logger.debug(f'Saving to {filename}') + + # make sure all multiplexer are off + self.reset_mux() + + # measure all quadrupole of the sequence + if self.sequence is None: + n = 1 + else: + n = self.sequence.shape[0] + for i in range(0, n): + if self.sequence is None: + quad = np.array([0, 0, 0, 0]) + else: + quad = self.sequence[i, :] # quadrupole + if self.status == 'stopping': + break + + # call the switch_mux function to switch to the right electrodes + self.switch_mux_on(quad) + + # run a measurement + if self.on_pi: + acquired_data = self.run_measurement(quad, **kwargs) + else: # for testing, generate random data + acquired_data = { + 'A': [quad[0]], 'B': [quad[1]], 'M': [quad[2]], 'N': [quad[3]], + 'R [ohm]': np.abs(np.random.randn(1)) + } + + # switch mux off + self.switch_mux_off(quad) + + # add command_id in dataset + acquired_data.update({'cmd_id': cmd_id}) + # log data to the data logger + self.data_logger.info(f'{acquired_data}') + print(f'{acquired_data}') + # save data and print in a text file + self.append_and_save(filename, acquired_data) + self.exec_logger.debug(f'{i+1:d}/{n:d}') + + self.status = 'idle' + + def run_sequence_async(self, cmd_id=None, **kwargs): + """ Run the sequence in a separate thread. Can be stopped by 'OhmPi.interrupt()'. + """ + # self.run = True + self.status = 'running' + self.exec_logger.debug(f'Status: {self.status}') + self.exec_logger.debug(f'Measuring sequence: {self.sequence}') + + def func(): + # if self.status != 'running': + # self.exec_logger.warning('Data acquisition interrupted') + # break + t0 = time.time() + + # create filename with timestamp + filename = self.settings["export_path"].replace('.csv', + f'_{datetime.now().strftime("%Y%m%dT%H%M%S")}.csv') + self.exec_logger.debug(f'Saving to {filename}') + + # make sure all multiplexer are off + self.reset_mux() + + # measure all quadrupole of the sequence + if self.sequence is None: + n = 1 + else: + n = self.sequence.shape[0] + for i in range(0, n): + if self.sequence is None: + quad = np.array([0, 0, 0, 0]) + else: + quad = self.sequence[i, :] # quadrupole + if self.status == 'stopping': + break + + # call the switch_mux function to switch to the right electrodes + self.switch_mux_on(quad) + + # run a measurement + if self.on_pi: + acquired_data = self.run_measurement(quad, **kwargs) + else: # for testing, generate random data + acquired_data = { + 'A': [quad[0]], 'B': [quad[1]], 'M': [quad[2]], 'N': [quad[3]], + 'R [ohm]': np.abs(np.random.randn(1)) + } + + # switch mux off + self.switch_mux_off(quad) + + # add command_id in dataset + acquired_data.update({'cmd_id': cmd_id}) + # log data to the data logger + self.data_logger.info(f'{acquired_data}') + print(f'{acquired_data}') + # save data and print in a text file + self.append_and_save(filename, acquired_data) + self.exec_logger.debug(f'{i+1:d}/{n:d}') + + self.status = 'idle' + + self.thread = threading.Thread(target=func) + self.thread.start() + + def run_multiple_sequences(self, cmd_id=None, **kwargs): + """ Run multiple sequences in a separate thread for monitoring mode. + Can be stopped by 'OhmPi.interrupt()'. """ # self.run = True self.status = 'running' @@ -1065,7 +1186,7 @@ class OhmPi(object): self.exec_logger.debug(f'Measuring sequence: {self.sequence}') def func(): - for g in range(0, self.settings["nbr_meas"]): # for time-lapse monitoring + for g in range(0, self.settings["nb_meas"]): # for time-lapse monitoring if self.status != 'running': self.exec_logger.warning('Data acquisition interrupted') break diff --git a/ohmpi_settings.json b/ohmpi_settings.json index fe28a272124e643c4f6f8f8f61a864b5bfb99836..800f0421427efe8b56d1688d2a1f6edfded129b2 100644 --- a/ohmpi_settings.json +++ b/ohmpi_settings.json @@ -1,8 +1,8 @@ { "nb_electrodes": 64, "injection_duration": 0.2, - "nbr_meas": 1, - "sequence_delay": 1, "nb_stack": 1, + "nb_meas" : 1, + "sequence_delay": 1, "export_path": "data/measurement.csv" }