Source code for convnwb.paths.paths

"""Paths object that defines a layout for single-unit project."""

from copy import deepcopy
from pathlib import Path

from convnwb.io.utils import get_files, get_subfolders, make_session_name

from convnwb.paths.defaults import PROJECT_FOLDERS, SUBJECT_FOLDERS, SESSION_FOLDERS

###################################################################################################
###################################################################################################

[docs]class Paths(): """Paths object for a session of single-unit data."""
[docs] def __init__(self, project_path, subject=None, experiment=None, session=None, project_folders=PROJECT_FOLDERS, recordings_name='recordings', subject_folders=SUBJECT_FOLDERS, session_folders=SESSION_FOLDERS): """Defines a paths object for a project. Parameters ---------- project_path : str or Path The path to the project folder. subject : str, optional Subject label. experiment : str, optional Experiment name. session : str or int, optional The session label. Can be an integer index, or a string, for example `session_0`. project_folders : list, optional Defines the sub-folders that are part of the subject folder. recordings_name : str, optional The name of the subfolder (within `project_path`) to store recordings. subject_folders : list, optional Defines the sub-folders that are part of the project folder. session_folders : dict, optional Defines the folder names to that are part of the session folder. Each key defines a sub-directory within the `session` folder. Each set of values is a list of folder names within each sub-directory. """ self._subject = subject self._experiment = experiment session = 'session_' + str(session) if 'session' not in str(session) else session self._session = session self._recordings_name = recordings_name self._project_folders = deepcopy(project_folders) self._subject_folders = deepcopy(subject_folders) self._session_folders = deepcopy(session_folders) self.project = Path(project_path)
def __getattr__(self, folder): """Alias all the defined folder paths to access them as attributes.""" for subdir, subfolders in self._session_folders.items(): if folder in subdir: return self.session / subdir elif folder in subfolders: return self.session / subdir / folder for subdir in self._subject_folders: if folder in subdir: return self.subject / subdir for subdir in self._project_folders: if folder in subdir: return self.project / subdir raise ValueError('Requested path not found.') @property def session_name(self): """Name of the session this object reflects.""" return make_session_name(self._subject, self._experiment, self._session) @property def recordings(self): """"Path of the recordings folder.""" return self.project / self._recordings_name @property def subject(self): """Path of the subject folder.""" return self.recordings / self._subject @property def experiment(self): """"Path of the experiment folder.""" return self.subject / self._experiment @property def session(self): """Path of the session folder.""" return self.experiment / self._session @property def all_paths(self): """List of all path names (all labels that can be used to access a path).""" return self._make_all_paths() @property def all_folders(): """List of all folders.""" return self._make_all_folders()
[docs] def get_files(self, folder, **kwargs): """Get a list of files available in a specified folder.""" return get_files(getattr(self, folder), **kwargs)
[docs] def get_subfolders(self, folder, **kwargs): """Get a list of sub-folder available in a specified folder.""" return get_subfolders(getattr(self, folder), **kwargs)
[docs] def print_structure(self): """Print directory structure.""" for proj_path in self._project_folders: print(proj_path + '/') print(' ' * 1, str(self._subject) + '/') print(' ' * 2, str(self._experiment) + '/') print(' ' * 3, str(self._session) + '/') for subdir, subfolders in self._session_folders.items(): print(' ' * 4, subdir + '/') for subfolder in subfolders: print(' ' * 5, subfolder + '/')
def _make_all_paths(self): """Create a list of all defined path labels. Returns ------- all_paths : list of str List of all path labels in the path definition. """ all_paths = [] for subdir, subfolders in self._session_folders.items(): all_paths.append(subdir.split('_')[1]) all_paths.extend(subfolders) for subdir in self._subject_folders: all_paths.append(subdir) for subdir in self._project_folders: all_paths.append(subdir) return all_paths def _make_session_folders(self): """Make a list of all session folders. Returns ------- session_folders : list of str List of all session folders in the path definition. """ session_folders = [] for subdir, subfolders in self._session_folders.items(): for subfolder in subfolders: session_folders.append(subdir + '/' + subfolder + '/') return session_folders def _make_all_folders(self): """Make a list of all folders. Returns ------- all_folders : list of str List of all folders in the path definition. """ session_folders = self._make_session_folders() all_folders = [] all_folders.extend([cpath + '/' for cpath in self._project_folders]) all_folders.extend(['recordings/{}/'.format(self._subject) + cpath + '/' \ for cpath in self._subject_folders]) all_folders.extend(['recordings/{}/{}/'.format(self._subject, self._experiment) + cpath \ for cpath in session_folders]) return all_folders