Source code for biomechzoo.utils.zload
from scipy.io import loadmat
import os
import numpy as np
[docs]
def zload(filepath):
if not filepath.endswith('.zoo'):
raise ValueError(f"{filepath} is not a .zoo file")
if not os.path.exists(filepath):
raise FileNotFoundError(f"File not found: {filepath}")
mat_data = loadmat(filepath, struct_as_record=False, squeeze_me=True)
# Remove default MATLAB metadata fields
mat_data = {k: v for k, v in mat_data.items() if not k.startswith('__')}
# Convert MATLAB structs to Python dicts (recursively)
def mat_struct_to_dict(obj):
if isinstance(obj, dict):
return {k: mat_struct_to_dict(v) for k, v in obj.items()}
elif hasattr(obj, '_fieldnames'):
return {field: mat_struct_to_dict(getattr(obj, field)) for field in obj._fieldnames}
elif isinstance(obj, list):
return [mat_struct_to_dict(item) for item in obj]
else:
return obj
data = {k: mat_struct_to_dict(v) for k, v in mat_data.items()}
if 'data' in data:
data = data['data']
# Convert Video and Analog channel arrays to Python lists
for sys in ['Video', 'Analog']:
if 'zoosystem' in data and sys in data['zoosystem']:
channels = data['zoosystem'][sys].get('Channels', [])
# Convert to list and strip spaces
if isinstance(channels, np.ndarray):
channels = channels.tolist()
channels = [str(ch).strip() for ch in channels]
data['zoosystem'][sys]['Channels'] = channels
return data
if __name__ == '__main__':
""" testing: load a single zoo file from the sample_study/normalized folder"""
# -------TESTING--------
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
fl = os.path.join(project_root, 'data', 'sample_study', 'normalized', 'HC030A', 'Straight', 'HC030A05.zoo')
data = zload(fl)
channels = [k for k in data.keys()]
print('{} channels found'.format(len(channels)))
for ch in channels:
print({ch})