Skip to content

For Users - Analysis Libraries

Access standardized biomechanical data through Python, MATLAB, and R with validated, research-ready libraries

Choose your preferred language and approach. Work directly with raw parquet files for maximum control, or use our high-level libraries for rapid analysis with built-in validation and visualization.

Python

Full-featured analysis with pandas, numpy, and visualization tools

The Python library provides comprehensive data access with built-in statistical analysis, cycle extraction, and publication-ready plotting.

from user_libs.python.locomotion_data import LocomotionData

data = LocomotionData('umich_2021_phase.parquet')
cycles, features = data.get_cycles('SUB01', 'level_walking')
import pandas as pd
import numpy as np

data = pd.read_parquet('umich_2021_phase.parquet')
subject_data = data[data['subject'] == 'SUB01']
cycles = subject_data[subject_data['task'] == 'level_walking']

✓ Numpy/Pandas integration
✓ Statistical analysis functions
✓ Matplotlib/Plotly visualization
✓ Jupyter notebook compatible

View Tutorials API Reference

MATLAB

Native MATLAB analysis with biomechanics-focused tooling

MATLAB tools designed for biomechanical researchers with familiar syntax and integrated visualization capabilities.

% Load phase-indexed data
data = load_locomotion_data('gtech_2023_phase.parquet');

% Extract gait cycles
[cycles, features] = get_cycles(data, 'SUB01', 'level_walking');
% Read parquet file directly
data = parquetread('gtech_2023_phase.parquet');

% Filter for subject and task
subject_mask = strcmp(data.subject, 'SUB01');
task_mask = strcmp(data.task, 'level_walking');
filtered_data = data(subject_mask & task_mask, :);

✓ Matrix operations optimized
✓ Biomechanics-specific functions
✓ MATLAB plotting integration
✓ Compatible with existing workflows

View Tutorials API Reference

R

Statistical analysis and reporting with tidyverse integration

R package optimized for statistical analysis, mixed-effects modeling, and reproducible research reports with RMarkdown.

library(locomotion)

# Load and analyze data
data <- load_locomotion_data("umich_2021_phase.parquet")
cycles <- get_cycles(data, "SUB01", "level_walking")
library(arrow)
library(dplyr)

# Read parquet file directly
data <- read_parquet("umich_2021_phase.parquet")

# Filter for subject and task
filtered_data <- data %>%
  filter(subject == "SUB01", task == "level_walking")

✓ Tidyverse compatible
✓ Statistical modeling built-in
✓ RMarkdown report templates
✓ ggplot2 visualization

View Tutorials API Reference

Quick Start Examples

Load Dataset

from user_libs.python.locomotion_data import LocomotionData

# Load a phase-indexed dataset (150 points per gait cycle)
data = LocomotionData('converted_datasets/umich_2021_phase.parquet')

# Or load time-indexed data
data_time = LocomotionData('converted_datasets/gtech_2023_time.parquet')

# List available subjects and tasks
subjects = data.get_subjects()
tasks = data.get_tasks()
import pandas as pd
import numpy as np

# Load a phase-indexed dataset
data = pd.read_parquet('converted_datasets/umich_2021_phase.parquet')

# Or load time-indexed data
data_time = pd.read_parquet('converted_datasets/gtech_2023_time.parquet')

# List available subjects and tasks
subjects = data['subject'].unique()
tasks = data['task'].unique()
% Load phase-indexed dataset
data = load_locomotion_data('converted_datasets/gtech_2023_phase.parquet');

% Or load time-indexed data
data_time = load_locomotion_data('converted_datasets/umich_2021_time.parquet');

% List available subjects and tasks
subjects = get_subjects(data);
tasks = get_tasks(data);
% Load phase-indexed dataset
data = parquetread('converted_datasets/gtech_2023_phase.parquet');

% Or load time-indexed data
data_time = parquetread('converted_datasets/umich_2021_time.parquet');

% List available subjects and tasks
subjects = unique(data.subject);
tasks = unique(data.task);
library(locomotion)

# Load phase-indexed dataset
data <- load_locomotion_data("converted_datasets/umich_2021_phase.parquet")

# Or load time-indexed data
data_time <- load_locomotion_data("converted_datasets/gtech_2023_time.parquet")

# List available subjects and tasks
subjects <- get_subjects(data)
tasks <- get_tasks(data)
library(arrow)
library(dplyr)

# Load phase-indexed dataset
data <- read_parquet("converted_datasets/umich_2021_phase.parquet")

# Or load time-indexed data
data_time <- read_parquet("converted_datasets/gtech_2023_time.parquet")

# List available subjects and tasks
subjects <- unique(data$subject)
tasks <- unique(data$task)

Analyze and Visualize

# Get gait cycles for a subject and task
cycles_3d, features = data.get_cycles('SUB01', 'level_walking')

# Get mean patterns across cycles
mean_patterns = data.get_mean_patterns('SUB01', 'level_walking')

# Create publication-ready plots
data.plot_phase_patterns('SUB01', 'level_walking', 
                         ['knee_flexion_angle_ipsi_rad',
                          'hip_flexion_angle_ipsi_rad'])

# Calculate range of motion
rom = data.calculate_rom('SUB01', 'level_walking')
# Filter for subject and task
subject_data = data[(data['subject'] == 'SUB01') & 
                    (data['task'] == 'level_walking')]

# Get mean patterns
mean_patterns = subject_data.groupby('phase_percent').mean()

# Calculate ROM
rom = {}
for col in mean_patterns.columns:
    if 'angle' in col:
        rom[col] = mean_patterns[col].max() - mean_patterns[col].min()

# Plot with matplotlib
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(mean_patterns.index, 
        np.degrees(mean_patterns['knee_flexion_angle_ipsi_rad']))
ax.set_xlabel('Gait Cycle (%)')
ax.set_ylabel('Knee Flexion (degrees)')
plt.show()
% Get gait cycles for a subject and task
[cycles_3d, features] = get_cycles(data, 'SUB01', 'level_walking');

% Get mean patterns
mean_patterns = get_mean_patterns(data, 'SUB01', 'level_walking');

% Create plots
plot_phase_patterns(data, 'SUB01', 'level_walking', ...
                   {'knee_flexion_angle_ipsi_rad', ...
                    'hip_flexion_angle_ipsi_rad'});

% Calculate ROM
rom = calculate_rom(data, 'SUB01', 'level_walking');
% Filter for subject and task
subject_mask = strcmp(data.subject, 'SUB01');
task_mask = strcmp(data.task, 'level_walking');
subject_data = data(subject_mask & task_mask, :);

% Calculate mean pattern
[unique_phases, ~, idx] = unique(subject_data.phase_percent);
mean_knee = accumarray(idx, subject_data.knee_flexion_angle_ipsi_rad, [], @mean);

% Calculate ROM
rom = max(mean_knee) - min(mean_knee);

% Plot
figure;
plot(unique_phases, rad2deg(mean_knee));
xlabel('Gait Cycle (%)');
ylabel('Knee Flexion (degrees)');
# Get gait cycles for a subject and task
result <- get_cycles(data, "SUB01", "level_walking")
cycles_3d <- result$cycles
features <- result$features

# Get mean patterns
mean_patterns <- get_mean_patterns(data, "SUB01", "level_walking")

# Create visualization
plot_phase_patterns(data, "SUB01", "level_walking",
                   c("knee_flexion_angle_ipsi_rad",
                     "hip_flexion_angle_ipsi_rad"))

# Calculate ROM
rom <- calculate_rom(data, "SUB01", "level_walking")
# Filter for subject and task
subject_data <- data %>%
  filter(subject == "SUB01", task == "level_walking")

# Calculate mean patterns
mean_patterns <- subject_data %>%
  group_by(phase_percent) %>%
  summarise(across(everything(), mean, na.rm = TRUE))

# Calculate ROM
rom <- mean_patterns %>%
  summarise(across(contains("angle"), ~max(.x) - min(.x)))

# Plot with ggplot2
library(ggplot2)
ggplot(mean_patterns, aes(x = phase_percent, 
                          y = knee_flexion_angle_ipsi_rad * 180/pi)) +
  geom_line() +
  labs(x = "Gait Cycle (%)", y = "Knee Flexion (degrees)") +
  theme_minimal()

Need Help?

Resources & Support

Documentation - API Reference - Detailed function documentation - Python Tutorials - Step-by-step learning path - Validation Guide - Understanding data quality

Datasets - Download Datasets - Dataset Documentation - Validation Reports

Community - GitHub Issues - Report bugs or request features - Discussions - Ask questions and share insights