1
2
3
4
5
6
7
8
9 """Unit tests for PyMVPA IO helpers"""
10
11 import os
12 import unittest
13 from tempfile import mkstemp
14 import numpy as N
15
16 from nose.tools import ok_
17
18 from mvpa import pymvpa_dataroot
19 from mvpa.misc.io import *
20 from mvpa.misc.fsl import *
21 from mvpa.misc.bv import BrainVoyagerRTC
22
23
25
27 ex1 = """eins zwei drei
28 0 1 2
29 3 4 5
30 """
31 file, fpath = mkstemp('mvpa', 'test')
32 file = open(fpath, 'w')
33 file.write(ex1)
34 file.close()
35
36
37 d = ColumnData(fpath, header=True)
38
39
40 self.failUnless(sorted(d.keys()) == ['drei','eins','zwei'])
41
42 self.failUnless(d['eins'] == [0, 3])
43 self.failUnless(d['zwei'] == [1, 4])
44 self.failUnless(d['drei'] == [2, 5])
45
46
47 d2 = ColumnData(d)
48
49
50 self.failUnless(sorted(d2.keys()) == ['drei','eins','zwei'])
51 self.failUnless(d2['eins'] == [0, 3])
52 self.failUnless(d2['zwei'] == [1, 4])
53 self.failUnless(d2['drei'] == [2, 5])
54
55
56 d += d2
57
58
59 self.failUnless(sorted(d.keys()) == ['drei','eins','zwei'])
60
61
62 self.failUnlessEqual(d['eins'], [0, 3, 0, 3])
63 self.failUnlessEqual(d['zwei'], [1, 4, 1, 4])
64 self.failUnlessEqual(d['drei'], [2, 5, 2, 5])
65
66
67
68 header_order = ['drei', 'zwei', 'eins']
69 d.tofile(fpath, header_order=header_order)
70
71
72 dsel = d.selectSamples([0, 2])
73 self.failUnlessEqual(dsel['eins'], [0, 0])
74 self.failUnlessEqual(dsel['zwei'], [1, 1])
75 self.failUnlessEqual(dsel['drei'], [2, 2])
76
77
78 d3 = ColumnData(fpath)
79 self.failUnlessEqual(d3._header_order, header_order)
80
81
82
83 d3['four'] = [0.1] * len(d3['eins'])
84 d3.tofile(fpath)
85
86 d4 = ColumnData(fpath)
87 self.failUnlessEqual(d4._header_order, header_order + ['four'])
88
89
90 try:
91 os.remove(fpath)
92 except WindowsError:
93 pass
94
95
97 sa = SampleAttributes(os.path.join(pymvpa_dataroot,
98 'attributes_literal.txt'),
99 literallabels=True)
100
101 ok_(sa.nrows == 1452, msg='There should be 1452 samples')
102
103
104 ev = sa.toEvents(funky='yeah')
105 ok_(len(ev) == 17 * (max(sa.chunks) + 1),
106 msg='Not all events got detected.')
107
108 ok_(len([e for e in ev if e.has_key('funky')]) == len(ev),
109 msg='All events need to have to custom arg "funky".')
110
111 ok_(ev[0]['label'] == ev[-1]['label'] == 'rest',
112 msg='First and last event are rest condition.')
113
114 ok_(ev[-1]['onset'] + ev[-1]['duration'] == sa.nrows,
115 msg='Something is wrong with the timiing of the events')
116
117
119 ex1 = """0.0 2.0 1
120 13.89 2 1
121 16 2.0 0.5
122 """
123 file, fpath = mkstemp('mvpa', 'test')
124 file = open(fpath, 'w')
125 file.write(ex1)
126 file.close()
127
128
129 d = FslEV3(fpath)
130
131
132 self.failUnless(sorted(d.keys()) == \
133 ['durations','intensities','onsets'])
134
135 self.failUnless(d['onsets'] == [0.0, 13.89, 16.0])
136 self.failUnless(d['durations'] == [2.0, 2.0, 2.0])
137 self.failUnless(d['intensities'] == [1.0, 1.0, 0.5])
138
139 self.failUnless(d.getNEVs() == 3)
140 self.failUnless(d.getEV(1) == (13.89, 2.0, 1.0))
141
142 try:
143 os.remove(fpath)
144 except WindowsError:
145 pass
146
147 d = FslEV3(os.path.join(pymvpa_dataroot, 'fslev3.txt'))
148 ev = d.toEvents()
149 self.failUnless(len(ev) == 3)
150 self.failUnless([e['duration'] for e in ev] == [9] * 3)
151 self.failUnless([e['onset'] for e in ev] == [6, 21, 35])
152 self.failUnless([e['features'] for e in ev] == [[1],[1],[1]])
153
154 ev = d.toEvents(label='face', chunk=0, crap=True)
155 ev[0]['label'] = 'house'
156 self.failUnless(len(ev) == 3)
157 self.failUnless([e['duration'] for e in ev] == [9] * 3)
158 self.failUnless([e['onset'] for e in ev] == [6, 21, 35])
159 self.failUnless([e['features'] for e in ev] == [[1],[1],[1]])
160 self.failUnless([e['label'] for e in ev] == ['house', 'face', 'face'])
161 self.failUnless([e['chunk'] for e in ev] == [0]*3)
162 self.failUnless([e['crap'] for e in ev] == [True]*3)
163
164
173
175 """Simple testing of reading RTC files from BrainVoyager"""
176
177 attr = BrainVoyagerRTC(os.path.join(pymvpa_dataroot, 'bv', 'smpl_model.rtc'))
178 self.failUnlessEqual(attr.ncolumns, 4, "We must have 4 colums")
179 self.failUnlessEqual(attr.nrows, 147, "We must have 147 rows")
180
181 self.failUnlessEqual(attr._header_order,
182 ['l_60 B', 'r_60 B', 'l_80 B', 'r_80 B'],
183 "We must got column names correctly")
184 self.failUnless(len(attr.r_60_B) == attr.nrows,
185 "We must have got access to column by property")
186 self.failUnless(attr.toarray() != None,
187 "We must have got access to column by property")
188
190 """Simple testing of helper Design2Labels"""
191
192 attr = BrainVoyagerRTC(os.path.join(pymvpa_dataroot, 'bv', 'smpl_model.rtc'))
193 labels0 = design2labels(attr, baseline_label='silence')
194 labels = design2labels(attr, baseline_label='silence',
195 func=lambda x:x>0.5)
196 Nsilence = lambda x:len(N.where(N.array(x) == 'silence')[0])
197
198 nsilence0 = Nsilence(labels0)
199 nsilence = Nsilence(labels)
200 self.failUnless(nsilence0 < nsilence,
201 "We must have more silence if thr is higher")
202 self.failUnlessEqual(len(labels), attr.nrows,
203 "We must have the same number of labels as rows")
204 self.failUnlessRaises(ValueError, design2labels, attr,
205 baseline_label='silence', func=lambda x:x>-1.0)
206
207
219
220
226
227
233
236
237
238 if __name__ == '__main__':
239 import runner
240