Source code for aurora.general_helper_functions

import inspect
import os
import scipy.io as sio
import subprocess

from loguru import logger
from pathlib import Path

import aurora
import mt_metadata

init_file = inspect.getfile(aurora)
AURORA_PATH = Path(init_file).parent.parent
DATA_PATH = AURORA_PATH.joinpath("data")
TEST_PATH = AURORA_PATH.joinpath("tests")
CONFIG_PATH = AURORA_PATH.joinpath("aurora", "config")
BAND_SETUP_PATH = CONFIG_PATH.joinpath("emtf_band_setup")


[docs]def get_test_path(): test_path = AURORA_PATH.joinpath("tests") if not test_path.exists(): msg = ( f"Could not locate test directory {TEST_PATH}\n " f"This is most likely because aurora was installed from pypi or conda forge\n" f"TEST_PATH should be replaced with DATA_PATH" ) logger.warning(msg) return test_path
try: FIGURES_PATH = DATA_PATH.joinpath("figures") FIGURES_PATH.mkdir(exist_ok=True, parents=True) except OSError: FIGURES_PATH = None mt_metadata_init = inspect.getfile(mt_metadata) MT_METADATA_DATA = Path(mt_metadata_init).parent.parent.joinpath("data")
[docs]def count_lines(file_name): """ acts like wc -l in unix, raise FileNotFoundError: if file_name does not exist. Parameters ---------- file_name: str or pathlib.Path The file to apply line counting to Returns ------- num_lines: int Number of lines present in fileName or -1 if file does not exist """ i = -1 with open(file_name) as f: for i, l in enumerate(f): pass num_lines = i + 1 return num_lines
[docs]def execute_subprocess(cmd, **kwargs): """ Parameters ---------- cmd : string command as it would be typed in a terminal kwargs Returns ------- """ """ A wrapper for subprocess.call """ exit_status = subprocess.call([cmd], shell=True, **kwargs) if exit_status != 0: raise Exception("Failed to execute \n {}".format(cmd)) return
[docs]def execute_command(cmd, **kwargs): """ Executes command in terminal from script. Parameters: cmd (str): command to exectute from a terminal kwargs: exec_dir (str): the directory from which to execute kwargs: no_exception: suppress output if exception Other Parameters: exit_status: :code:`0` is good, otherwise there is some problem .. note:: When executing :code:`rm *` this crashes if the directory we are removing from is empty .. note:: if you can you should probably use execute_subprocess() instead """ exec_dir = kwargs.get("exec_dir", os.path.expanduser("~/")) allow_exception = kwargs.get("allow_exception", True) logger.info("executing from {}".format(exec_dir)) cwd = os.getcwd() os.chdir(exec_dir) exit_status = os.system(cmd) if exit_status != 0: logger.info(f"exit_status of {cmd} = {exit_status}") if allow_exception: raise Exception(f"Failed to successfully execute \n {cmd}") os.chdir(cwd)
[docs]def save_to_mat(data, variable_name, filename): """ Example Usage: x = X.to_array(dim="channel") save_to_mat(x.data, "x", "x.mat") Reading into matlab or Octave: tmp = load("x.mat"); data = tmp.x; Parameters ---------- data : numpy array the data to save to file. its fine if this is complex-valued. variable_name : string The name that we use to reference the variable within the struct in the matfile. filename : string The filepath to output Returns ------- """ sio.savemat(filename, {variable_name: data}) return
[docs]class DotDict(dict): """ Helper function for debugging, casts a dict so that its values can be accessed via dict.key as well as dict["key"] Usage: dot_dict = DotDict(basic_dict) """ def __getattr__(self, name): if name in self: return self[name] raise AttributeError( f"'{self.__class__.__name__}' object has no attribute '{name}'" ) def __setattr__(self, name, value): self[name] = value