-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTRCSource.m
107 lines (88 loc) · 3.3 KB
/
TRCSource.m
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
classdef TRCSource < Source
methods
function src = TRCSource(path)
if nargin == 0
src.path = [tempname, '.trc'];
else
src.path = path;
end
end
function ext = srcext(obj)
ext = srcext@Source(obj);
if isempty(ext)
ext = '.trc';
end
end
function deps = dependencies(obj)
deps = {C3DSource()};
end
function mkrs = readsource(obj, varargin)
p = inputParser;
addRequired(p, 'obj', @(x) isa(x, 'TRCSource'));
addParameter(p, 'Markers', {});
addParameter(p, 'Start', -Inf);
addParameter(p, 'Finish', Inf);
parse(p, obj, varargin{:});
start = p.Results.Start;
finish = p.Results.Finish;
mkrlabels = p.Results.Markers;
import org.opensim.modeling.*
trc = TimeSeriesTableVec3(obj.path);
fs = str2double(trc.getTableMetaDataAsString('DataRate'));
lastTime = str2double(trc.getTableMetaDataAsString('NumFrames'))/fs;
if start > -Inf && start < 0
error('time begins from zero; try a different start time')
end
if finish > lastTime
error('trial is shorter than requested finish time')
end
if start ~= -Inf
trc.trimFrom(start);
end
if finish ~= Inf
trc.trimTo(finish);
end
rm_mkrs = setdiff(trc.getColumnLabels(), mkrlabels);
for i = 1:length(rm_mkrs)
trc.removeColumn(rm_mkrs(i));
end
mkrs = osimTableToStruct(trc);
end
function src = generatesource(obj, trial, deps, varargin)
p = inputParser;
p.KeepUnmatched = true;
addRequired(p, 'obj', @(x) isa(x, 'TRCSource'));
addRequired(p, 'trial', @(x) isa(x, 'Trial'));
addOptional(p, 'deps', false);
addOptional(p, 'Filter', false);
addOptional(p, 'CutoffFrequency', false);
addParameter(p, 'LabOrientation', struct());
parse(p, obj, trial, deps, varargin{:});
filtflag = p.Results.Filter;
fc = p.Results.CutoffFrequency;
laborient = p.Results.LabOrientation;
if filtflag && fc == false
error('''CutoffFrequency'' must be given if ''Filter'' is set to true')
end
import org.opensim.modeling.*
c3dsrc = getsource(trial, C3DSource);
c3d = osimC3D(c3dsrc.path, 1);
if ~isequal(laborient, struct())
dims = fieldnames(laborient);
assert(all(ismember(dims, {'x','y','z'})));
for dimi = 1:length(dims)
dim = dims{dimi};
c3d.rotateData(dim, laborient.(dim));
end
end
mkrs = c3d.getTable_markers();
if filtflag
flat_mkrs = flatten(mkrs);
TableUtilities.filterLowpass(flat_mkrs, fc);
mkrs = packVec3(flat_mkrs);
end
TRCFileAdapter().write(mkrs, obj.path);
src = obj;
end
end
end