-
Notifications
You must be signed in to change notification settings - Fork 0
/
cp_walk_parameters.py
134 lines (118 loc) · 4.02 KB
/
cp_walk_parameters.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# -*- coding: utf-8 -*-
"""
CP project:
read time / distance vars from c3d files
@author: Jussi (jnu@iki.fi)
"""
from __future__ import print_function
import gaitutils
import numpy as np
import logging
from gaitutils import timedist, c3d
from cp_common import get_files, params
logger = logging.getLogger(__name__)
# analysis vars of interest
vars = gaitutils.report.text._timedist_vars
def _read_data(subject, vars, cond):
""" Returns a dict of parameters for each trial """
Cfiles = get_files(subject, cond)
# 'unknown' is the default condition name
datas = {f: c3d.get_analysis(f)['unknown'] for f in Cfiles}
datas_ok = {
f: data for f, data in datas.items() if all([var in data for var in vars])
}
logger.debug(
'%s/%s: %d files read, %d files contained data'
% (subject, cond, len(datas), len(datas_ok))
)
not_ok = set(datas.keys()) - set(datas_ok.keys())
if not_ok:
logger.debug('following files not ok:')
for fn in not_ok:
logger.debug(fn)
if datas_ok:
logger.debug('including files:')
for fn in datas_ok:
logger.debug(fn)
return datas_ok
def _process_data(datas, vars, cond):
"""Yields lists for each variable"""
if not datas:
logger.debug('no data, terminating')
raise ValueError('No data')
# for picking units
data0 = datas.values()[0]
# collect into dict
results = dict()
for var in vars:
results[var] = dict()
results[var]['unit'] = data0[var]['unit']
for context in ['Right', 'Left']:
results[var][context] = list()
for f, data in datas.items():
if context not in data[var]:
logger.debug(
'missing data for %s: %s in file %s' % (var, context, f)
)
else:
thisdata = data[var][context]
if thisdata is not None:
results[var][context].append(thisdata)
else:
logger.debug(
'data is None for %s: %s in file %s' % (var, context, f)
)
# these are common to all vars
range_ = ''
type_ = 1
for var in vars:
unit_ = results[var]['unit']
for context in ['Right', 'Left']:
data = np.array(results[var][context])
mean_ = data.mean()
std_ = data.std()
yield [
'%s mean, %s %s' % (var, context.lower(), cond),
unit_,
range_,
type_,
mean_,
]
yield [
'%s stddev, %s %s' % (var, context.lower(), cond),
unit_,
range_,
type_,
std_,
]
def get_results(subjects):
if not isinstance(subjects, list):
subjects = [subjects]
logger.debug('starting time-distance analysis')
results = dict()
for j, subject in enumerate(subjects):
logger.debug('processing subject %s' % subject)
for cond in params['analysis_types']:
datas = _read_data(subject, vars, cond)
for r in _process_data(datas, vars, cond):
var = r[0]
if var not in results:
results[var] = r
else:
results[var].append(r[-1])
logger.debug('time-distance analysis finished')
return results
def get_timedist_values(subjects):
"""Get timedist vals for subjects (normal trials only).
Returns tuple of timedist (mean, std)"""
if not isinstance(subjects, list):
subjects = [subjects]
logger.debug('starting time-distance analysis')
ans = list()
filenames = list()
for subject in subjects:
logger.info('processing subject %s' % subject)
Nfiles = get_files(subject, 'normal')
filenames.extend(Nfiles)
ans.extend([c3d.get_analysis(c3dfile) for c3dfile in Nfiles])
return ans, filenames