test_irregularysampledsignal.py 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. # -*- coding: utf-8 -*-
  2. """
  3. Tests of the neo.core.irregularlysampledsignal.IrregularySampledSignal class
  4. """
  5. try:
  6. import unittest2 as unittest
  7. except ImportError:
  8. import unittest
  9. import os
  10. import pickle
  11. import numpy as np
  12. import quantities as pq
  13. from numpy.testing import assert_array_equal
  14. try:
  15. from IPython.lib.pretty import pretty
  16. except ImportError as err:
  17. HAVE_IPYTHON = False
  18. else:
  19. HAVE_IPYTHON = True
  20. from neo.core.irregularlysampledsignal import IrregularlySampledSignal
  21. from neo.core import Segment
  22. from neo.test.tools import (assert_arrays_almost_equal, assert_arrays_equal,
  23. assert_neo_object_is_compliant,
  24. assert_same_sub_schema)
  25. from neo.test.generate_datasets import (get_fake_value, get_fake_values,
  26. fake_neo, TEST_ANNOTATIONS)
  27. class Test__generate_datasets(unittest.TestCase):
  28. def setUp(self):
  29. np.random.seed(0)
  30. self.annotations = dict([(str(x), TEST_ANNOTATIONS[x]) for x in
  31. range(len(TEST_ANNOTATIONS))])
  32. def test__get_fake_values(self):
  33. self.annotations['seed'] = 0
  34. times = get_fake_value('times', pq.Quantity, seed=0, dim=1)
  35. signal = get_fake_value('signal', pq.Quantity, seed=1, dim=2)
  36. name = get_fake_value('name', str, seed=2,
  37. obj=IrregularlySampledSignal)
  38. description = get_fake_value('description', str, seed=3,
  39. obj='IrregularlySampledSignal')
  40. file_origin = get_fake_value('file_origin', str)
  41. attrs1 = {'name': name,
  42. 'description': description,
  43. 'file_origin': file_origin}
  44. attrs2 = attrs1.copy()
  45. attrs2.update(self.annotations)
  46. res11 = get_fake_values(IrregularlySampledSignal,
  47. annotate=False, seed=0)
  48. res12 = get_fake_values('IrregularlySampledSignal',
  49. annotate=False, seed=0)
  50. res21 = get_fake_values(IrregularlySampledSignal,
  51. annotate=True, seed=0)
  52. res22 = get_fake_values('IrregularlySampledSignal',
  53. annotate=True, seed=0)
  54. assert_array_equal(res11.pop('times'), times)
  55. assert_array_equal(res12.pop('times'), times)
  56. assert_array_equal(res21.pop('times'), times)
  57. assert_array_equal(res22.pop('times'), times)
  58. assert_array_equal(res11.pop('signal'), signal)
  59. assert_array_equal(res12.pop('signal'), signal)
  60. assert_array_equal(res21.pop('signal'), signal)
  61. assert_array_equal(res22.pop('signal'), signal)
  62. self.assertEqual(res11, attrs1)
  63. self.assertEqual(res12, attrs1)
  64. self.assertEqual(res21, attrs2)
  65. self.assertEqual(res22, attrs2)
  66. def test__fake_neo__cascade(self):
  67. self.annotations['seed'] = None
  68. obj_type = IrregularlySampledSignal
  69. cascade = True
  70. res = fake_neo(obj_type=obj_type, cascade=cascade)
  71. self.assertTrue(isinstance(res, IrregularlySampledSignal))
  72. assert_neo_object_is_compliant(res)
  73. self.assertEqual(res.annotations, self.annotations)
  74. def test__fake_neo__nocascade(self):
  75. self.annotations['seed'] = None
  76. obj_type = 'IrregularlySampledSignal'
  77. cascade = False
  78. res = fake_neo(obj_type=obj_type, cascade=cascade)
  79. self.assertTrue(isinstance(res, IrregularlySampledSignal))
  80. assert_neo_object_is_compliant(res)
  81. self.assertEqual(res.annotations, self.annotations)
  82. class TestIrregularlySampledSignalConstruction(unittest.TestCase):
  83. def test_IrregularlySampledSignal_creation_times_units_signal_units(self):
  84. params = {'test2': 'y1', 'test3': True}
  85. sig = IrregularlySampledSignal([1.1, 1.5, 1.7]*pq.ms,
  86. signal=[20., 40., 60.]*pq.mV,
  87. name='test', description='tester',
  88. file_origin='test.file',
  89. test1=1, **params)
  90. sig.annotate(test1=1.1, test0=[1, 2])
  91. assert_neo_object_is_compliant(sig)
  92. assert_array_equal(sig.times, [1.1, 1.5, 1.7]*pq.ms)
  93. assert_array_equal(np.asarray(sig).flatten(), np.array([20., 40., 60.]))
  94. self.assertEqual(sig.units, pq.mV)
  95. self.assertEqual(sig.name, 'test')
  96. self.assertEqual(sig.description, 'tester')
  97. self.assertEqual(sig.file_origin, 'test.file')
  98. self.assertEqual(sig.annotations['test0'], [1, 2])
  99. self.assertEqual(sig.annotations['test1'], 1.1)
  100. self.assertEqual(sig.annotations['test2'], 'y1')
  101. self.assertTrue(sig.annotations['test3'])
  102. def test_IrregularlySampledSignal_creation_units_arg(self):
  103. params = {'test2': 'y1', 'test3': True}
  104. sig = IrregularlySampledSignal([1.1, 1.5, 1.7],
  105. signal=[20., 40., 60.],
  106. units=pq.V, time_units=pq.s,
  107. name='test', description='tester',
  108. file_origin='test.file',
  109. test1=1, **params)
  110. sig.annotate(test1=1.1, test0=[1, 2])
  111. assert_neo_object_is_compliant(sig)
  112. assert_array_equal(sig.times, [1.1, 1.5, 1.7]*pq.s)
  113. assert_array_equal(np.asarray(sig).flatten(), np.array([20., 40., 60.]))
  114. self.assertEqual(sig.units, pq.V)
  115. self.assertEqual(sig.name, 'test')
  116. self.assertEqual(sig.description, 'tester')
  117. self.assertEqual(sig.file_origin, 'test.file')
  118. self.assertEqual(sig.annotations['test0'], [1, 2])
  119. self.assertEqual(sig.annotations['test1'], 1.1)
  120. self.assertEqual(sig.annotations['test2'], 'y1')
  121. self.assertTrue(sig.annotations['test3'])
  122. def test_IrregularlySampledSignal_creation_units_rescale(self):
  123. params = {'test2': 'y1', 'test3': True}
  124. sig = IrregularlySampledSignal([1.1, 1.5, 1.7]*pq.s,
  125. signal=[2., 4., 6.]*pq.V,
  126. units=pq.mV, time_units=pq.ms,
  127. name='test', description='tester',
  128. file_origin='test.file',
  129. test1=1, **params)
  130. sig.annotate(test1=1.1, test0=[1, 2])
  131. assert_neo_object_is_compliant(sig)
  132. assert_array_equal(sig.times, [1100, 1500, 1700]*pq.ms)
  133. assert_array_equal(np.asarray(sig).flatten(), np.array([2000., 4000., 6000.]))
  134. self.assertEqual(sig.units, pq.mV)
  135. self.assertEqual(sig.name, 'test')
  136. self.assertEqual(sig.description, 'tester')
  137. self.assertEqual(sig.file_origin, 'test.file')
  138. self.assertEqual(sig.annotations['test0'], [1, 2])
  139. self.assertEqual(sig.annotations['test1'], 1.1)
  140. self.assertEqual(sig.annotations['test2'], 'y1')
  141. self.assertTrue(sig.annotations['test3'])
  142. def test_IrregularlySampledSignal_different_lens_ValueError(self):
  143. times = [1.1, 1.5, 1.7]*pq.ms
  144. signal = [20., 40., 60., 70.]*pq.mV
  145. self.assertRaises(ValueError, IrregularlySampledSignal, times, signal)
  146. def test_IrregularlySampledSignal_no_signal_units_ValueError(self):
  147. times = [1.1, 1.5, 1.7]*pq.ms
  148. signal = [20., 40., 60.]
  149. self.assertRaises(ValueError, IrregularlySampledSignal, times, signal)
  150. def test_IrregularlySampledSignal_no_time_units_ValueError(self):
  151. times = [1.1, 1.5, 1.7]
  152. signal = [20., 40., 60.]*pq.mV
  153. self.assertRaises(ValueError, IrregularlySampledSignal, times, signal)
  154. class TestIrregularlySampledSignalProperties(unittest.TestCase):
  155. def setUp(self):
  156. self.times = [np.arange(10.0)*pq.s,
  157. np.arange(-100.0, 100.0, 10.0)*pq.ms,
  158. np.arange(100)*pq.ns]
  159. self.data = [np.arange(10.0)*pq.nA,
  160. np.arange(-100.0, 100.0, 10.0)*pq.mV,
  161. np.random.uniform(size=100)*pq.uV]
  162. self.signals = [IrregularlySampledSignal(t, signal=D,
  163. testattr='test')
  164. for D, t in zip(self.data, self.times)]
  165. def test__compliant(self):
  166. for signal in self.signals:
  167. assert_neo_object_is_compliant(signal)
  168. def test__t_start_getter(self):
  169. for signal, times in zip(self.signals, self.times):
  170. self.assertAlmostEqual(signal.t_start,
  171. times[0],
  172. delta=1e-15)
  173. def test__t_stop_getter(self):
  174. for signal, times in zip(self.signals, self.times):
  175. self.assertAlmostEqual(signal.t_stop,
  176. times[-1],
  177. delta=1e-15)
  178. def test__duration_getter(self):
  179. for signal, times in zip(self.signals, self.times):
  180. self.assertAlmostEqual(signal.duration,
  181. times[-1] - times[0],
  182. delta=1e-15)
  183. def test__sampling_intervals_getter(self):
  184. for signal, times in zip(self.signals, self.times):
  185. assert_arrays_almost_equal(signal.sampling_intervals,
  186. np.diff(times),
  187. threshold=1e-15)
  188. def test_IrregularlySampledSignal_repr(self):
  189. sig = IrregularlySampledSignal([1.1, 1.5, 1.7]*pq.s,
  190. signal=[2., 4., 6.]*pq.V,
  191. name='test', description='tester',
  192. file_origin='test.file',
  193. test1=1)
  194. assert_neo_object_is_compliant(sig)
  195. targ = ('<IrregularlySampledSignal(array([[ 2.],\n [ 4.],\n [ 6.]]) * V ' +
  196. 'at times [ 1.1 1.5 1.7] s)>')
  197. res = repr(sig)
  198. self.assertEqual(targ, res)
  199. # def test__children(self):
  200. # signal = self.signals[0]
  201. #
  202. # segment = Segment(name='seg1')
  203. # segment.analogsignals = [signal]
  204. # segment.create_many_to_one_relationship()
  205. #
  206. # rchan = RecordingChannel(name='rchan1')
  207. # rchan.analogsignals = [signal]
  208. # rchan.create_many_to_one_relationship()
  209. #
  210. # self.assertEqual(signal._single_parent_objects,
  211. # ('Segment', 'RecordingChannel'))
  212. # self.assertEqual(signal._multi_parent_objects, ())
  213. #
  214. # self.assertEqual(signal._single_parent_containers,
  215. # ('segment', 'recordingchannel'))
  216. # self.assertEqual(signal._multi_parent_containers, ())
  217. #
  218. # self.assertEqual(signal._parent_objects,
  219. # ('Segment', 'RecordingChannel'))
  220. # self.assertEqual(signal._parent_containers,
  221. # ('segment', 'recordingchannel'))
  222. #
  223. # self.assertEqual(len(signal.parents), 2)
  224. # self.assertEqual(signal.parents[0].name, 'seg1')
  225. # self.assertEqual(signal.parents[1].name, 'rchan1')
  226. #
  227. # assert_neo_object_is_compliant(signal)
  228. class TestIrregularlySampledSignalArrayMethods(unittest.TestCase):
  229. def setUp(self):
  230. self.data1 = np.arange(10.0)
  231. self.data1quant = self.data1 * pq.mV
  232. self.time1 = np.logspace(1, 5, 10)
  233. self.time1quant = self.time1*pq.ms
  234. self.signal1 = IrregularlySampledSignal(self.time1quant,
  235. signal=self.data1quant,
  236. name='spam',
  237. description='eggs',
  238. file_origin='testfile.txt',
  239. arg1='test')
  240. def test__compliant(self):
  241. assert_neo_object_is_compliant(self.signal1)
  242. self.assertEqual(self.signal1.name, 'spam')
  243. self.assertEqual(self.signal1.description, 'eggs')
  244. self.assertEqual(self.signal1.file_origin, 'testfile.txt')
  245. self.assertEqual(self.signal1.annotations, {'arg1': 'test'})
  246. def test__slice_should_return_IrregularlySampledSignal(self):
  247. result = self.signal1[3:8]
  248. self.assertIsInstance(result, IrregularlySampledSignal)
  249. assert_neo_object_is_compliant(result)
  250. self.assertEqual(result.name, 'spam')
  251. self.assertEqual(result.description, 'eggs')
  252. self.assertEqual(result.file_origin, 'testfile.txt')
  253. self.assertEqual(result.annotations, {'arg1': 'test'})
  254. self.assertEqual(result.size, 5)
  255. self.assertEqual(result.t_start, self.time1quant[3])
  256. self.assertEqual(result.t_stop, self.time1quant[7])
  257. assert_array_equal(self.time1quant[3:8], result.times)
  258. assert_array_equal(self.data1[3:8].reshape(-1, 1), result.magnitude)
  259. # Test other attributes were copied over (in this case, defaults)
  260. self.assertEqual(result.file_origin, self.signal1.file_origin)
  261. self.assertEqual(result.name, self.signal1.name)
  262. self.assertEqual(result.description, self.signal1.description)
  263. self.assertEqual(result.annotations, self.signal1.annotations)
  264. def test__getitem_should_return_single_quantity(self):
  265. self.assertEqual(self.signal1[0], 0*pq.mV)
  266. self.assertEqual(self.signal1[9], 9*pq.mV)
  267. self.assertRaises(IndexError, self.signal1.__getitem__, 10)
  268. def test__getitem_out_of_bounds_IndexError(self):
  269. self.assertRaises(IndexError, self.signal1.__getitem__, 10)
  270. def test_comparison_operators(self):
  271. assert_array_equal(self.signal1 >= 5*pq.mV,
  272. np.array([[False, False, False, False, False,
  273. True, True, True, True, True]]).T)
  274. def test__comparison_with_inconsistent_units_should_raise_Exception(self):
  275. self.assertRaises(ValueError, self.signal1.__gt__, 5*pq.nA)
  276. def test_simple_statistics(self):
  277. targmean = self.signal1[:-1]*np.diff(self.time1quant).reshape(-1, 1)
  278. targmean = targmean.sum()/(self.time1quant[-1] - self.time1quant[0])
  279. self.assertEqual(self.signal1.max(), 9*pq.mV)
  280. self.assertEqual(self.signal1.min(), 0*pq.mV)
  281. self.assertEqual(self.signal1.mean(), targmean)
  282. def test_mean_interpolation_NotImplementedError(self):
  283. self.assertRaises(NotImplementedError, self.signal1.mean, True)
  284. def test_resample_NotImplementedError(self):
  285. self.assertRaises(NotImplementedError, self.signal1.resample, True)
  286. def test__rescale_same(self):
  287. result = self.signal1.copy()
  288. result = result.rescale(pq.mV)
  289. self.assertIsInstance(result, IrregularlySampledSignal)
  290. assert_neo_object_is_compliant(result)
  291. self.assertEqual(result.name, 'spam')
  292. self.assertEqual(result.description, 'eggs')
  293. self.assertEqual(result.file_origin, 'testfile.txt')
  294. self.assertEqual(result.annotations, {'arg1': 'test'})
  295. self.assertEqual(result.units, 1*pq.mV)
  296. assert_array_equal(result.magnitude, self.data1.reshape(-1, 1))
  297. assert_array_equal(result.times, self.time1quant)
  298. assert_same_sub_schema(result, self.signal1)
  299. def test__rescale_new(self):
  300. result = self.signal1.copy()
  301. result = result.rescale(pq.uV)
  302. self.assertIsInstance(result, IrregularlySampledSignal)
  303. assert_neo_object_is_compliant(result)
  304. self.assertEqual(result.name, 'spam')
  305. self.assertEqual(result.description, 'eggs')
  306. self.assertEqual(result.file_origin, 'testfile.txt')
  307. self.assertEqual(result.annotations, {'arg1': 'test'})
  308. self.assertEqual(result.units, 1*pq.uV)
  309. assert_arrays_almost_equal(np.array(result), self.data1.reshape(-1, 1)*1000., 1e-10)
  310. assert_array_equal(result.times, self.time1quant)
  311. def test__rescale_new_incompatible_ValueError(self):
  312. self.assertRaises(ValueError, self.signal1.rescale, pq.nA)
  313. def test_time_slice(self):
  314. targdataquant = [[1.0], [2.0], [3.0]] * pq.mV
  315. targtime = np.logspace(1, 5, 10)
  316. targtimequant = targtime [1:4] *pq.ms
  317. targ_signal = IrregularlySampledSignal(targtimequant,
  318. signal=targdataquant,
  319. name='spam',
  320. description='eggs',
  321. file_origin='testfile.txt',
  322. arg1='test')
  323. t_start = 15
  324. t_stop = 250
  325. result = self.signal1.time_slice(t_start, t_stop)
  326. assert_array_equal(result, targ_signal)
  327. assert_array_equal(result.times, targtimequant)
  328. self.assertEqual(result.units, 1*pq.mV)
  329. self.assertIsInstance(result, IrregularlySampledSignal)
  330. assert_neo_object_is_compliant(result)
  331. self.assertEqual(result.name, 'spam')
  332. self.assertEqual(result.description, 'eggs')
  333. self.assertEqual(result.file_origin, 'testfile.txt')
  334. self.assertEqual(result.annotations, {'arg1': 'test'})
  335. def test_time_slice_out_of_boundries(self):
  336. targdataquant = self.data1quant
  337. targtimequant = self.time1quant
  338. targ_signal = IrregularlySampledSignal(targtimequant,
  339. signal=targdataquant,
  340. name='spam',
  341. description='eggs',
  342. file_origin='testfile.txt',
  343. arg1='test')
  344. t_start = 0
  345. t_stop = 2500000
  346. result = self.signal1.time_slice(t_start, t_stop)
  347. assert_array_equal(result, targ_signal)
  348. assert_array_equal(result.times, targtimequant)
  349. self.assertEqual(result.units, 1*pq.mV)
  350. self.assertIsInstance(result, IrregularlySampledSignal)
  351. assert_neo_object_is_compliant(result)
  352. self.assertEqual(result.name, 'spam')
  353. self.assertEqual(result.description, 'eggs')
  354. self.assertEqual(result.file_origin, 'testfile.txt')
  355. self.assertEqual(result.annotations, {'arg1': 'test'})
  356. def test_time_slice_empty(self):
  357. targdataquant = [] * pq.mV
  358. targtimequant = [] *pq.ms
  359. targ_signal = IrregularlySampledSignal(targtimequant,
  360. signal=targdataquant,
  361. name='spam',
  362. description='eggs',
  363. file_origin='testfile.txt',
  364. arg1='test')
  365. t_start = 15
  366. t_stop = 250
  367. result = targ_signal.time_slice(t_start, t_stop)
  368. assert_array_equal(result, targ_signal)
  369. assert_array_equal(result.times, targtimequant)
  370. self.assertEqual(result.units, 1*pq.mV)
  371. self.assertIsInstance(result, IrregularlySampledSignal)
  372. assert_neo_object_is_compliant(result)
  373. self.assertEqual(result.name, 'spam')
  374. self.assertEqual(result.description, 'eggs')
  375. self.assertEqual(result.file_origin, 'testfile.txt')
  376. self.assertEqual(result.annotations, {'arg1': 'test'})
  377. def test_time_slice_none_stop(self):
  378. targdataquant = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0], [7.0], [8.0], [9.0]] * pq.mV
  379. targtime = np.logspace(1, 5, 10)
  380. targtimequant = targtime [1:10] *pq.ms
  381. targ_signal = IrregularlySampledSignal(targtimequant,
  382. signal=targdataquant,
  383. name='spam',
  384. description='eggs',
  385. file_origin='testfile.txt',
  386. arg1='test')
  387. t_start = 15
  388. t_stop = None
  389. result = self.signal1.time_slice(t_start, t_stop)
  390. assert_array_equal(result, targ_signal)
  391. assert_array_equal(result.times, targtimequant)
  392. self.assertEqual(result.units, 1*pq.mV)
  393. self.assertIsInstance(result, IrregularlySampledSignal)
  394. assert_neo_object_is_compliant(result)
  395. self.assertEqual(result.name, 'spam')
  396. self.assertEqual(result.description, 'eggs')
  397. self.assertEqual(result.file_origin, 'testfile.txt')
  398. self.assertEqual(result.annotations, {'arg1': 'test'})
  399. def test_time_slice_none_start(self):
  400. targdataquant = [[0.0], [1.0], [2.0], [3.0]] * pq.mV
  401. targtime = np.logspace(1, 5, 10)
  402. targtimequant = targtime [0:4] *pq.ms
  403. targ_signal = IrregularlySampledSignal(targtimequant,
  404. signal=targdataquant,
  405. name='spam',
  406. description='eggs',
  407. file_origin='testfile.txt',
  408. arg1='test')
  409. t_start = None
  410. t_stop = 250
  411. result = self.signal1.time_slice(t_start, t_stop)
  412. assert_array_equal(result, targ_signal)
  413. assert_array_equal(result.times, targtimequant)
  414. self.assertEqual(result.units, 1*pq.mV)
  415. self.assertIsInstance(result, IrregularlySampledSignal)
  416. assert_neo_object_is_compliant(result)
  417. self.assertEqual(result.name, 'spam')
  418. self.assertEqual(result.description, 'eggs')
  419. self.assertEqual(result.file_origin, 'testfile.txt')
  420. self.assertEqual(result.annotations, {'arg1': 'test'})
  421. def test_time_slice_none_both(self):
  422. targdataquant = [[0.0], [1.0], [2.0], [3.0], [4.0], [5.0], [6.0], [7.0], [8.0], [9.0]] * pq.mV
  423. targtime = np.logspace(1, 5, 10)
  424. targtimequant = targtime [0:10] *pq.ms
  425. targ_signal = IrregularlySampledSignal(targtimequant,
  426. signal=targdataquant,
  427. name='spam',
  428. description='eggs',
  429. file_origin='testfile.txt',
  430. arg1='test')
  431. t_start = None
  432. t_stop = None
  433. result = self.signal1.time_slice(t_start, t_stop)
  434. assert_array_equal(result, targ_signal)
  435. assert_array_equal(result.times, targtimequant)
  436. self.assertEqual(result.units, 1*pq.mV)
  437. self.assertIsInstance(result, IrregularlySampledSignal)
  438. assert_neo_object_is_compliant(result)
  439. self.assertEqual(result.name, 'spam')
  440. self.assertEqual(result.description, 'eggs')
  441. self.assertEqual(result.file_origin, 'testfile.txt')
  442. self.assertEqual(result.annotations, {'arg1': 'test'})
  443. def test_time_slice_differnt_units(self):
  444. targdataquant = [[1.0], [2.0], [3.0]] * pq.mV
  445. targtime = np.logspace(1, 5, 10)
  446. targtimequant = targtime [1:4] *pq.ms
  447. targ_signal = IrregularlySampledSignal(targtimequant,
  448. signal=targdataquant,
  449. name='spam',
  450. description='eggs',
  451. file_origin='testfile.txt',
  452. arg1='test')
  453. t_start = 15
  454. t_stop = 250
  455. t_start = 0.015 * pq.s
  456. t_stop = .250 * pq.s
  457. result = self.signal1.time_slice(t_start, t_stop)
  458. assert_array_equal(result, targ_signal)
  459. assert_array_equal(result.times, targtimequant)
  460. self.assertEqual(result.units, 1*pq.mV)
  461. self.assertIsInstance(result, IrregularlySampledSignal)
  462. assert_neo_object_is_compliant(result)
  463. self.assertEqual(result.name, 'spam')
  464. self.assertEqual(result.description, 'eggs')
  465. self.assertEqual(result.file_origin, 'testfile.txt')
  466. self.assertEqual(result.annotations, {'arg1': 'test'})
  467. def test_as_array(self):
  468. sig_as_arr = self.signal1.as_array()
  469. self.assertIsInstance(sig_as_arr, np.ndarray)
  470. assert_array_equal(self.data1, sig_as_arr.flat)
  471. def test_as_quantity(self):
  472. sig_as_q = self.signal1.as_quantity()
  473. self.assertIsInstance(sig_as_q, pq.Quantity)
  474. assert_array_equal(self.data1, sig_as_q.magnitude.flat)
  475. class TestIrregularlySampledSignalCombination(unittest.TestCase):
  476. def setUp(self):
  477. self.data1 = np.arange(10.0)
  478. self.data1quant = self.data1 * pq.mV
  479. self.time1 = np.logspace(1, 5, 10)
  480. self.time1quant = self.time1*pq.ms
  481. self.signal1 = IrregularlySampledSignal(self.time1quant,
  482. signal=self.data1quant,
  483. name='spam',
  484. description='eggs',
  485. file_origin='testfile.txt',
  486. arg1='test')
  487. def test__compliant(self):
  488. assert_neo_object_is_compliant(self.signal1)
  489. self.assertEqual(self.signal1.name, 'spam')
  490. self.assertEqual(self.signal1.description, 'eggs')
  491. self.assertEqual(self.signal1.file_origin, 'testfile.txt')
  492. self.assertEqual(self.signal1.annotations, {'arg1': 'test'})
  493. def test__add_const_quantity_should_preserve_data_complement(self):
  494. result = self.signal1 + 0.065*pq.V
  495. self.assertIsInstance(result, IrregularlySampledSignal)
  496. assert_neo_object_is_compliant(result)
  497. self.assertEqual(result.name, 'spam')
  498. self.assertEqual(result.description, 'eggs')
  499. self.assertEqual(result.file_origin, 'testfile.txt')
  500. self.assertEqual(result.annotations, {'arg1': 'test'})
  501. assert_array_equal(result.magnitude, self.data1.reshape(-1, 1) + 65)
  502. assert_array_equal(result.times, self.time1quant)
  503. self.assertEqual(self.signal1[9], 9*pq.mV)
  504. self.assertEqual(result[9], 74*pq.mV)
  505. def test__add_two_consistent_signals_should_preserve_data_complement(self):
  506. data2 = np.arange(10.0, 20.0)
  507. data2quant = data2*pq.mV
  508. signal2 = IrregularlySampledSignal(self.time1quant, signal=data2quant)
  509. assert_neo_object_is_compliant(signal2)
  510. result = self.signal1 + signal2
  511. self.assertIsInstance(result, IrregularlySampledSignal)
  512. assert_neo_object_is_compliant(result)
  513. self.assertEqual(result.name, 'spam')
  514. self.assertEqual(result.description, 'eggs')
  515. self.assertEqual(result.file_origin, 'testfile.txt')
  516. self.assertEqual(result.annotations, {'arg1': 'test'})
  517. targ = IrregularlySampledSignal(self.time1quant,
  518. signal=np.arange(10.0, 30.0, 2.0),
  519. units="mV",
  520. name='spam', description='eggs',
  521. file_origin='testfile.txt',
  522. arg1='test')
  523. assert_neo_object_is_compliant(targ)
  524. assert_array_equal(result, targ)
  525. assert_array_equal(self.time1quant, targ.times)
  526. assert_array_equal(result.times, targ.times)
  527. assert_same_sub_schema(result, targ)
  528. def test__add_signals_with_inconsistent_times_AssertionError(self):
  529. signal2 = IrregularlySampledSignal(self.time1quant*2.,
  530. signal=np.arange(10.0), units="mV")
  531. assert_neo_object_is_compliant(signal2)
  532. self.assertRaises(ValueError, self.signal1.__add__, signal2)
  533. def test__add_signals_with_inconsistent_dimension_ValueError(self):
  534. signal2 = np.arange(20).reshape(2, 10)
  535. self.assertRaises(ValueError, self.signal1.__add__, signal2)
  536. def test__subtract_const_should_preserve_data_complement(self):
  537. result = self.signal1 - 65*pq.mV
  538. self.assertIsInstance(result, IrregularlySampledSignal)
  539. assert_neo_object_is_compliant(result)
  540. self.assertEqual(result.name, 'spam')
  541. self.assertEqual(result.description, 'eggs')
  542. self.assertEqual(result.file_origin, 'testfile.txt')
  543. self.assertEqual(result.annotations, {'arg1': 'test'})
  544. self.assertEqual(self.signal1[9], 9*pq.mV)
  545. self.assertEqual(result[9], -56*pq.mV)
  546. assert_array_equal(result.magnitude, (self.data1 - 65).reshape(-1, 1))
  547. assert_array_equal(result.times, self.time1quant)
  548. def test__subtract_from_const_should_return_signal(self):
  549. result = 10*pq.mV - self.signal1
  550. self.assertIsInstance(result, IrregularlySampledSignal)
  551. assert_neo_object_is_compliant(result)
  552. self.assertEqual(result.name, 'spam')
  553. self.assertEqual(result.description, 'eggs')
  554. self.assertEqual(result.file_origin, 'testfile.txt')
  555. self.assertEqual(result.annotations, {'arg1': 'test'})
  556. self.assertEqual(self.signal1[9], 9*pq.mV)
  557. self.assertEqual(result[9], 1*pq.mV)
  558. assert_array_equal(result.magnitude, (10 - self.data1).reshape(-1, 1))
  559. assert_array_equal(result.times, self.time1quant)
  560. def test__mult_signal_by_const_float_should_preserve_data_complement(self):
  561. result = self.signal1*2.
  562. self.assertIsInstance(result, IrregularlySampledSignal)
  563. assert_neo_object_is_compliant(result)
  564. self.assertEqual(result.name, 'spam')
  565. self.assertEqual(result.description, 'eggs')
  566. self.assertEqual(result.file_origin, 'testfile.txt')
  567. self.assertEqual(result.annotations, {'arg1': 'test'})
  568. self.assertEqual(self.signal1[9], 9*pq.mV)
  569. self.assertEqual(result[9], 18*pq.mV)
  570. assert_array_equal(result.magnitude, self.data1.reshape(-1, 1)*2)
  571. assert_array_equal(result.times, self.time1quant)
  572. def test__mult_signal_by_const_array_should_preserve_data_complement(self):
  573. result = self.signal1*np.array(2.)
  574. self.assertIsInstance(result, IrregularlySampledSignal)
  575. assert_neo_object_is_compliant(result)
  576. self.assertEqual(result.name, 'spam')
  577. self.assertEqual(result.description, 'eggs')
  578. self.assertEqual(result.file_origin, 'testfile.txt')
  579. self.assertEqual(result.annotations, {'arg1': 'test'})
  580. self.assertEqual(self.signal1[9], 9*pq.mV)
  581. self.assertEqual(result[9], 18*pq.mV)
  582. assert_array_equal(result.magnitude, self.data1.reshape(-1, 1)*2)
  583. assert_array_equal(result.times, self.time1quant)
  584. def test__divide_signal_by_const_should_preserve_data_complement(self):
  585. result = self.signal1/0.5
  586. self.assertIsInstance(result, IrregularlySampledSignal)
  587. assert_neo_object_is_compliant(result)
  588. self.assertEqual(result.name, 'spam')
  589. self.assertEqual(result.description, 'eggs')
  590. self.assertEqual(result.file_origin, 'testfile.txt')
  591. self.assertEqual(result.annotations, {'arg1': 'test'})
  592. self.assertEqual(self.signal1[9], 9*pq.mV)
  593. self.assertEqual(result[9], 18*pq.mV)
  594. assert_array_equal(result.magnitude, self.data1.reshape(-1, 1)/0.5)
  595. assert_array_equal(result.times, self.time1quant)
  596. @unittest.skipUnless(HAVE_IPYTHON, "requires IPython")
  597. def test__pretty(self):
  598. res = pretty(self.signal1)
  599. signal = self.signal1
  600. targ = (("IrregularlySampledSignal with %d channels of length %d; units %s; datatype %s \n" % (signal.shape[1], signal.shape[0], signal.units.dimensionality.unicode, signal.dtype)) +
  601. ("name: '%s'\ndescription: '%s'\n" % (signal.name, signal.description)) +
  602. ("annotations: %s\n" % str(signal.annotations)) +
  603. ("sample times: %s" % (signal.times[:10],)))
  604. self.assertEqual(res, targ)
  605. class TestAnalogSignalFunctions(unittest.TestCase):
  606. def test__pickle(self):
  607. signal1 = IrregularlySampledSignal(np.arange(10.0)/100*pq.s,
  608. np.arange(10.0), units="mV")
  609. fobj = open('./pickle', 'wb')
  610. pickle.dump(signal1, fobj)
  611. fobj.close()
  612. fobj = open('./pickle', 'rb')
  613. try:
  614. signal2 = pickle.load(fobj)
  615. except ValueError:
  616. signal2 = None
  617. assert_array_equal(signal1, signal2)
  618. fobj.close()
  619. os.remove('./pickle')
  620. class TestIrregularlySampledSignalEquality(unittest.TestCase):
  621. def test__signals_with_different_times_should_be_not_equal(self):
  622. signal1 = IrregularlySampledSignal(np.arange(10.0)/100*pq.s,
  623. np.arange(10.0), units="mV")
  624. signal2 = IrregularlySampledSignal(np.arange(10.0)/100*pq.ms,
  625. np.arange(10.0), units="mV")
  626. self.assertNotEqual(signal1, signal2)
  627. if __name__ == "__main__":
  628. unittest.main()