""" run this before using this library: ipython -i cpdctrl_interactive.py always records iv-t curves i-data -> smua.nvbuffer1 v-data -> smua.nvbuffer2 """ version = "0.1" import numpy as np import matplotlib.pyplot as plt import pandas as pd from datetime import datetime as dtime from sys import exit from time import sleep from os import path, makedirs import pickle as pkl import json import atexit import threading as mt import multiprocessing as mp # from multiprocessing.managers import BaseManager import argparse if __name__ == "__main__": import sys if __package__ is None: # make relative imports work as described here: https://peps.python.org/pep-0366/#proposed-change __package__ = "cpdctrl" from os import path filepath = path.realpath(path.abspath(__file__)) sys.path.insert(0, path.dirname(path.dirname(filepath))) from . import led_control_device from . import voltage_measurement_device from .voltage_measurement_device.base import VoltageMeasurementDevice from .voltage_measurement_device.impl import keithley2700 as _volt from .led_control_device.base import LedControlDevice from .led_control_device.impl import thorlabs_ledd1b as _led from .led_script import LedScript from .measurement import measure as _measure from .utility.data import DataCollector from .utility.data import plot_cpd_data as data_plot from .utility.config_file import ConfigFile from .utility import file_io from .utility.device_select import select_device_interactive from .update_funcs import _Monitor, _update_print import logging log = logging.getLogger(__name__) # CONFIGURATION _runtime_vars = { "last-measurement": "" } # defaults, these may be overridden by a config file settings = { "datadir": path.expanduser("~/data"), "name": "interactive-test", "led": "unknown", "interval": 0.5, "flush_after": 3000, "use_buffer": False, } cfilename: str = "cpdctrl.yaml" config_path: str = "" config_file: ConfigFile = ConfigFile("") test = False # DEVICES # global variable for the instrument/client returned by pyvisa/bleak dev: VoltageMeasurementDevice|None = None led: LedControlDevice|None = None data_collector = DataCollector(data_path=settings["datadir"], data_name="interactive", dirname="interactive_test", add_number_if_dir_exists=True) t0 = 0 data = None md = None def monitor(script: str|int=0, interval: float|None=None, metadata:dict={}, flush_after: int|None=None, use_buffer: bool|None=None, max_measurements=None, stop_on_script_end: bool=False, max_points_shown=None): """ Monitor the voltage with matplotlib. - Opens a matplotlib window and takes measurements depending on settings["interval"] - Waits for the user to press a key If use_buffer=False, uses python's time.sleep() for waiting the interval, which is not very precise. With use_buffer=True, the timing of the voltage data readings will be very precise, however, the led updates may deviate up to . The data is automatically saved to "_