Source code for ada.database_utils.fetch_files
import os
from pathlib import Path
from typing import Tuple
[docs]
def uniqe_files(files: str | list[str]) -> list[str]:
"""Files are duplicated (2 recordings from the same hand for each subject.) Return only one of them.
Args:
files (str | list[str]): Unix-style path pattern or list of paths to files.
Returns:
list[str]: List of paths.
"""
if type(files) is str:
files = [str(e) for e in Path(os.path.dirname(files)).glob(os.path.basename(files))]
used = set()
out = []
for file in files:
name = file[:file.index("wrist")]
if name not in used:
used.add(name)
out.append(file)
return out
[docs]
def hand_paths(files: str | list[str], hand: str = 'left') -> list[str]:
"""Return path to recordings from given hand.
Args:
files (str | list[str]): Unix-style path pattern or list of paths to files.
hand (str, optional): Desired hand. Can be 'left' or 'right'. Defaults to 'left'.
Returns:
list[str]: List of paths.
"""
if type(files) is str:
files = [str(e) for e in Path(os.path.dirname(files)).glob(os.path.basename(files))]
out = []
for file in files:
file_hand = file[file.index("wrist") - 3:file.index("wrist") - 2]
if file_hand == 'h':
file_hand = 'right'
elif file_hand == 'f':
file_hand = 'left'
else:
file_hand = 'none'
if file_hand == hand:
out.append(file)
return out
[docs]
def fetch_acti(files: str | list[str], tag_file: str) -> list[str]:
"""Find all actigraphic recordings corresponding to given obci.tag.
Args:
files (str | list[str]): Unix-style path pattern or list of paths to files.
tag_file (str): Path to desired obci.tag file.
Returns:
list[str]: List of paths.
"""
if type(files) is str:
files = [str(e) for e in Path(os.path.dirname(files)).glob(os.path.basename(files))]
name = os.path.basename(tag_file).split('.')[0]
out = []
for file in files:
acti_name = os.path.basename(file).split('_')[0]
if name == acti_name:
out.append(file)
return out
[docs]
def fetch_from_tag(tag_file: str, acti_folder: str, xml_folder: str, hand: str = 'left') -> Tuple[str, str]:
"""For given obci.tag file fetch corrersponding actigraphic data and .xml with PSG metadata.
Args:
tag_file (str): Path to obci.tag file.
acti_folder (str): Path to folder with actigraphic data.
xml_folder (str): Path to folder with .xml metadadata corresponding to PSG recordings.
hand (str, optional): Desired hand. Can be 'left' or 'right'. Defaults to 'left'.
Raises:
RuntimeError: Can't match actigraphic data or .xml to provided obci.tag.
Returns:
Tuple[str, str]: Path to .xml and to actigraphic data, respectively.
"""
xml_path = os.path.join(xml_folder, os.path.basename(tag_file)[:-3] + 'xml')
if not os.path.exists(xml_path):
raise RuntimeError("No .xml file found!")
acti_files = [str(e) for e in Path(acti_folder).glob("*.bin")]
if not acti_files:
acti_files = [str(e) for e in Path(acti_folder).glob("*.ada")]
acti = fetch_acti(acti_files, tag_file)
acti = uniqe_files(acti)
acti = hand_paths(acti, hand)
try:
return xml_path, acti[0]
except IndexError:
raise RuntimeError("No actigraphic file found!")
[docs]
def fetch_from_acti(acti_file: str, xml_folder: str, tag_folder: str, tag: bool = True) -> Tuple[str, str]:
"""For given actigraphic file find corresponding .xml and .tag files.
Args:
acti_file (str): Path to actigraphic data file.
xml_folder (str): Path to folder with .xml metadata corresponding to PSG recordings.
tag_folder (str): Path to folder with .tag tags corresponding to PSG recordings.
tag (bool): If True, raise error if tag is not found. When False, path to tag might be meaningless. Defaults to True.
Raises:
RuntimeError: Can't match .tag or .xml files to provided actigraphic file.
Returns:
Tuple[str, str]: Path to .xml and .tag files corresponding to provided actigraphic file.
"""
name = os.path.basename(acti_file).split('_')[0]
xml_path = os.path.join(xml_folder, name + '.obci.xml')
if not os.path.exists(xml_path):
raise RuntimeError("No .xml file found!")
tag_path = os.path.join(tag_folder, name + '.obci.tag')
if not os.path.exists(tag_path) and tag:
raise RuntimeError("No .tag file found!")
return xml_path, tag_path