Source code for syncopy.datatype.util

"""
Helpers and tools for Syncopy data classes
"""

import os
from numbers import Number
import numpy as np

# Syncopy imports
from syncopy import __storage__, __storagelimit__, __sessionid__
from syncopy.shared.errors import SPYTypeError, SPYValueError

__all__ = ["TrialIndexer"]


[docs]class TrialIndexer:
[docs] def __init__(self, data_object, idx_list): """ Class to obtain an indexable trials iterable from an instantiated Syncopy data class `data_object`. Relies on the `_get_trial` method of the respective `data_object`. Parameters ---------- data_object : Syncopy data class, e.g. AnalogData idx_list : list List of valid trial indices for `_get_trial` """ self.data_object = data_object self.idx_set = set(idx_list) self._len = len(idx_list)
def __getitem__(self, trialno): # single trial access via index operator [] if not isinstance(trialno, Number): raise SPYTypeError(trialno, "trial index", "single number to index a single trial") if trialno not in self.idx_set: lgl = "index of existing trials" raise SPYValueError(lgl, "trial index", trialno) return self.data_object._get_trial(trialno) def __iter__(self): # this generator gets freshly created and exhausted # for each new iteration, with only 1 trial being in memory # at any given time yield from (self[i] for i in self.idx_set) def __len__(self): return self._len def __repr__(self): return self.__str__() def __str__(self): return "{} element iterable".format(self._len)
class TimeIndexer: def __init__(self, trialdefinition, samplerate, idx_list): """ Class to obtain an indexable time array iterable from an instantiated Syncopy data class `data_object`. Relies on the `trialdefinition` of the respective `data_object`. Parameters ---------- data_object : Syncopy data class, e.g. AnalogData idx_list : list List of valid trial indices """ self.trialdefinition = trialdefinition self.samplerate = samplerate self.idx_set = set(idx_list) self._len = len(idx_list) def construct_time_array(self, trialno): start, stop, offset = self.trialdefinition[trialno, :3] return (np.arange(0, stop - start) + offset) / self.samplerate def __getitem__(self, trialno): # single trial access via index operator [] if not isinstance(trialno, Number): raise SPYTypeError(trialno, "trial index", "single number to index a single trial") if trialno not in self.idx_set: lgl = "index of existing trials" raise SPYValueError(lgl, "trial index", trialno) return self.construct_time_array(trialno) def __iter__(self): # this generator gets freshly created and exhausted # for each new iteration, with only 1 time array being in memory # at any given time yield from (self[i] for i in self.idx_set) def __len__(self): return self._len def __repr__(self): return self.__str__() def __str__(self): return "{} element iterable".format(self._len) def get_dir_size(start_path=".", out="byte"): """ Compute size of all files in directory (and its subdirectories), in bytes or GB. """ total_size_bytes = 0 num_files = 0 for dirpath, _, filenames in os.walk(start_path): for f in filenames: fp = os.path.join(dirpath, f) # skip if it is symbolic link try: if not os.path.islink(fp): total_size_bytes += os.path.getsize(fp) num_files += 1 except Exception as ex: # Ignore issues from several parallel cleanup processes. pass if out == "GB": total_size = total_size_bytes / 1e9 elif out == "byte": total_size = total_size_bytes else: raise ValueError("Invalid 'out' unit: '{}', expected one of 'byte' or 'GB'".format(out)) return total_size, num_files def setup_storage(storage_dir=__storage__): """ Create temporary storage dir if needed, and report on its size. Returns ------- storage_size: Size of files in temporary storage directory, in GB. storage_num_files: Number of files in temporary storage directory. """ # Create package-wide tmp directory if not already present if not os.path.exists(storage_dir): try: os.mkdir(storage_dir) except Exception as exc: err = ( "Syncopy core: cannot create temporary storage directory {}. " + "Original error message below\n{}" ) raise IOError(err.format(storage_dir, str(exc))) return get_dir_size(storage_dir, out="GB")