Package mvpa :: Package tests :: Module test_iohelpers
[hide private]
[frames] | no frames]

Source Code for Module mvpa.tests.test_iohelpers

  1  # emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- 
  2  # vi: set ft=python sts=4 ts=4 sw=4 et: 
  3  ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## 
  4  # 
  5  #   See COPYING file distributed along with the PyMVPA package for the 
  6  #   copyright and license terms. 
  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   
24 -class IOHelperTests(unittest.TestCase):
25
26 - def testColumnDataFromFile(self):
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 # intentionally rely on defaults 37 d = ColumnData(fpath, header=True) 38 39 # check header (sort because order in dict is unpredictable) 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 # make a copy 47 d2 = ColumnData(d) 48 49 # check if identical 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 # now merge back 56 d += d2 57 58 # same columns? 59 self.failUnless(sorted(d.keys()) == ['drei','eins','zwei']) 60 61 # but more data 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 # test file write 67 # TODO: check if correct 68 header_order = ['drei', 'zwei', 'eins'] 69 d.tofile(fpath, header_order=header_order) 70 71 # test sample selection 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 # test if order is read from file when available 78 d3 = ColumnData(fpath) 79 self.failUnlessEqual(d3._header_order, header_order) 80 81 # add another column -- should be appended as the last column 82 # while storing 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 # cleanup and ignore stupidity 90 try: 91 os.remove(fpath) 92 except WindowsError: 93 pass
94 95
96 - def testSamplesAttributes(self):
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 # convert to event list, with some custom attr 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
118 - def testFslEV(self):
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 # intentionally rely on defaults 129 d = FslEV3(fpath) 130 131 # check header (sort because order in dict is unpredictable) 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 # cleanup and ignore stupidity 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
165 - def testFslEV2(self):
166 attr = SampleAttributes(os.path.join(pymvpa_dataroot, 'smpl_attr.txt')) 167 168 # check header (sort because order in dict is unpredictable) 169 self.failUnless(sorted(attr.keys()) == \ 170 ['chunks','labels']) 171 172 self.failUnless(attr.nsamples == 3)
173
174 - def testBVRTC(self):
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
189 - def testdesign2labels(self):
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
208 - def testlabels2chunks(self):
209 attr = BrainVoyagerRTC(os.path.join(pymvpa_dataroot, 'bv', 'smpl_model.rtc')) 210 labels = design2labels(attr, baseline_label='silence') 211 self.failUnlessRaises(ValueError, labels2chunks, labels, 'bugga') 212 chunks = labels2chunks(labels) 213 self.failUnlessEqual(len(labels), len(chunks)) 214 # we must got them in sorted order 215 chunks_sorted = N.sort(chunks) 216 self.failUnless((chunks == chunks_sorted).all()) 217 # for this specific one we must have just 4 chunks 218 self.failUnless((N.unique(chunks) == range(4)).all())
219 220
221 - def testSensorLocations(self):
222 sl = XAVRSensorLocations(os.path.join(pymvpa_dataroot, 'xavr1010.dat')) 223 224 for var in ['names', 'pos_x', 'pos_y', 'pos_z']: 225 self.failUnless(len(eval('sl.' + var)) == 31)
226 227
228 - def testFslGLMDesign(self):
229 glm = FslGLMDesign(os.path.join(pymvpa_dataroot, 'glm.mat')) 230 231 self.failUnless(glm.mat.shape == (850, 6)) 232 self.failUnless(len(glm.ppheights) == 6)
233
234 -def suite():
235 return unittest.makeSuite(IOHelperTests)
236 237 238 if __name__ == '__main__': 239 import runner 240