test_event.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. # -*- coding: utf-8 -*-
  2. """
  3. Tests of the neo.core.event.Event class
  4. """
  5. import unittest
  6. import numpy as np
  7. import quantities as pq
  8. import pickle
  9. import os
  10. from numpy.testing import assert_array_equal
  11. try:
  12. from IPython.lib.pretty import pretty
  13. except ImportError as err:
  14. HAVE_IPYTHON = False
  15. else:
  16. HAVE_IPYTHON = True
  17. from neo.core.event import Event
  18. from neo.core import Segment
  19. from neo.test.tools import (assert_neo_object_is_compliant,
  20. assert_arrays_equal,
  21. assert_arrays_almost_equal,
  22. assert_same_sub_schema)
  23. from neo.test.generate_datasets import (get_fake_value, get_fake_values,
  24. fake_neo, TEST_ANNOTATIONS)
  25. class Test__generate_datasets(unittest.TestCase):
  26. def setUp(self):
  27. np.random.seed(0)
  28. self.annotations = dict([(str(x), TEST_ANNOTATIONS[x]) for x in
  29. range(len(TEST_ANNOTATIONS))])
  30. def test__get_fake_values(self):
  31. self.annotations['seed'] = 0
  32. times = get_fake_value('times', pq.Quantity, seed=0, dim=1)
  33. labels = get_fake_value('labels', np.ndarray, seed=1, dim=1, dtype='S')
  34. name = get_fake_value('name', str, seed=2, obj=Event)
  35. description = get_fake_value('description', str,
  36. seed=3, obj='Event')
  37. file_origin = get_fake_value('file_origin', str)
  38. attrs1 = {'name': name,
  39. 'description': description,
  40. 'file_origin': file_origin}
  41. attrs2 = attrs1.copy()
  42. attrs2.update(self.annotations)
  43. res11 = get_fake_values(Event, annotate=False, seed=0)
  44. res12 = get_fake_values('Event', annotate=False, seed=0)
  45. res21 = get_fake_values(Event, annotate=True, seed=0)
  46. res22 = get_fake_values('Event', annotate=True, seed=0)
  47. assert_arrays_equal(res11.pop('times'), times)
  48. assert_arrays_equal(res12.pop('times'), times)
  49. assert_arrays_equal(res21.pop('times'), times)
  50. assert_arrays_equal(res22.pop('times'), times)
  51. assert_arrays_equal(res11.pop('labels'), labels)
  52. assert_arrays_equal(res12.pop('labels'), labels)
  53. assert_arrays_equal(res21.pop('labels'), labels)
  54. assert_arrays_equal(res22.pop('labels'), labels)
  55. self.assertEqual(res11, attrs1)
  56. self.assertEqual(res12, attrs1)
  57. self.assertEqual(res21, attrs2)
  58. self.assertEqual(res22, attrs2)
  59. def test__fake_neo__cascade(self):
  60. self.annotations['seed'] = None
  61. obj_type = Event
  62. cascade = True
  63. res = fake_neo(obj_type=obj_type, cascade=cascade)
  64. self.assertTrue(isinstance(res, Event))
  65. assert_neo_object_is_compliant(res)
  66. self.assertEqual(res.annotations, self.annotations)
  67. def test__fake_neo__nocascade(self):
  68. self.annotations['seed'] = None
  69. obj_type = 'Event'
  70. cascade = False
  71. res = fake_neo(obj_type=obj_type, cascade=cascade)
  72. self.assertTrue(isinstance(res, Event))
  73. assert_neo_object_is_compliant(res)
  74. self.assertEqual(res.annotations, self.annotations)
  75. class TestEvent(unittest.TestCase):
  76. def test_Event_creation(self):
  77. params = {'test2': 'y1', 'test3': True}
  78. evt = Event([1.1, 1.5, 1.7]*pq.ms,
  79. labels=np.array(['test event 1',
  80. 'test event 2',
  81. 'test event 3'], dtype='S'),
  82. name='test', description='tester',
  83. file_origin='test.file',
  84. test1=1, **params)
  85. evt.annotate(test1=1.1, test0=[1, 2])
  86. assert_neo_object_is_compliant(evt)
  87. assert_arrays_equal(evt.times, [1.1, 1.5, 1.7]*pq.ms)
  88. assert_arrays_equal(evt.labels, np.array(['test event 1',
  89. 'test event 2',
  90. 'test event 3'], dtype='S'))
  91. self.assertEqual(evt.name, 'test')
  92. self.assertEqual(evt.description, 'tester')
  93. self.assertEqual(evt.file_origin, 'test.file')
  94. self.assertEqual(evt.annotations['test0'], [1, 2])
  95. self.assertEqual(evt.annotations['test1'], 1.1)
  96. self.assertEqual(evt.annotations['test2'], 'y1')
  97. self.assertTrue(evt.annotations['test3'])
  98. def tests_time_slice (self):
  99. params = {'test2': 'y1', 'test3': True}
  100. evt = Event([0.1, 0.5, 1.1, 1.5, 1.7, 2.2, 2.9, 3.0, 3.1, 3.3]*pq.ms,
  101. name='test', description='tester',
  102. file_origin='test.file',
  103. test1=1, **params)
  104. evt.annotate(test1=1.1, test0=[1, 2])
  105. assert_neo_object_is_compliant(evt)
  106. targ = Event([ 2.2, 2.9, 3.0 ]*pq.ms)
  107. result = evt.time_slice(t_start=2.0, t_stop=3.0 )
  108. assert_arrays_equal(targ, result)
  109. self.assertEqual(evt.name, result.name)
  110. self.assertEqual(evt.description, result.description)
  111. self.assertEqual(evt.file_origin, result.file_origin)
  112. self.assertEqual(evt.annotations['test0'], result.annotations['test0'])
  113. self.assertEqual(evt.annotations['test1'], result.annotations['test1'])
  114. self.assertEqual(evt.annotations['test2'], result.annotations['test2'])
  115. def test_time_slice_out_of_boundries(self):
  116. params = {'test2': 'y1', 'test3': True}
  117. evt = Event([0.1, 0.5, 1.1, 1.5, 1.7, 2.2, 2.9, 3.0, 3.1, 3.3]*pq.ms,
  118. name='test', description='tester',
  119. file_origin='test.file',
  120. test1=1, **params)
  121. evt.annotate(test1=1.1, test0=[1, 2])
  122. assert_neo_object_is_compliant(evt)
  123. targ = evt
  124. result = evt.time_slice(t_start=0.0001, t_stop=30.0 )
  125. assert_arrays_equal(targ, result)
  126. self.assertEqual(evt.name, result.name)
  127. self.assertEqual(evt.description, result.description)
  128. self.assertEqual(evt.file_origin, result.file_origin)
  129. self.assertEqual(evt.annotations['test0'], result.annotations['test0'])
  130. self.assertEqual(evt.annotations['test1'], result.annotations['test1'])
  131. self.assertEqual(evt.annotations['test2'], result.annotations['test2'])
  132. def test_time_slice_empty(self):
  133. params = {'test2': 'y1', 'test3': True}
  134. evt = Event([]*pq.ms,
  135. name='test', description='tester',
  136. file_origin='test.file',
  137. test1=1, **params)
  138. evt.annotate(test1=1.1, test0=[1, 2])
  139. result = evt.time_slice(t_start=0.0001, t_stop=30.0 )
  140. assert_neo_object_is_compliant(evt)
  141. assert_arrays_equal(evt, result)
  142. self.assertEqual(evt.name, result.name)
  143. self.assertEqual(evt.description, result.description)
  144. self.assertEqual(evt.file_origin, result.file_origin)
  145. self.assertEqual(evt.annotations['test0'], result.annotations['test0'])
  146. self.assertEqual(evt.annotations['test1'], result.annotations['test1'])
  147. self.assertEqual(evt.annotations['test2'], result.annotations['test2'])
  148. def test_time_slice_none_stop(self):
  149. params = {'test2': 'y1', 'test3': True}
  150. evt = Event([0.1, 0.5, 1.1, 1.5, 1.7, 2.2, 2.9, 3.0, 3.1, 3.3]*pq.ms,
  151. name='test', description='tester',
  152. file_origin='test.file',
  153. test1=1, **params)
  154. evt.annotate(test1=1.1, test0=[1, 2])
  155. targ = Event([ 2.2, 2.9, 3.0, 3.1, 3.3 ]*pq.ms)
  156. assert_neo_object_is_compliant(evt)
  157. t_start = 2.0
  158. t_stop = None
  159. result = evt.time_slice(t_start, t_stop)
  160. assert_arrays_equal(targ, result)
  161. self.assertEqual(evt.name, result.name)
  162. self.assertEqual(evt.description, result.description)
  163. self.assertEqual(evt.file_origin, result.file_origin)
  164. self.assertEqual(evt.annotations['test0'], result.annotations['test0'])
  165. self.assertEqual(evt.annotations['test1'], result.annotations['test1'])
  166. self.assertEqual(evt.annotations['test2'], result.annotations['test2'])
  167. def test_time_slice_none_start(self):
  168. params = {'test2': 'y1', 'test3': True}
  169. evt = Event([0.1, 0.5, 1.1, 1.5, 1.7, 2.2, 2.9, 3.0, 3.1, 3.3]*pq.ms,
  170. name='test', description='tester',
  171. file_origin='test.file',
  172. test1=1, **params)
  173. evt.annotate(test1=1.1, test0=[1, 2])
  174. assert_neo_object_is_compliant(evt)
  175. targ = Event([0.1, 0.5, 1.1, 1.5, 1.7, 2.2, 2.9, 3.0]*pq.ms)
  176. t_start = None
  177. t_stop = 3.0
  178. result = evt.time_slice(t_start, t_stop)
  179. assert_arrays_equal(targ, result)
  180. self.assertEqual(evt.name, result.name)
  181. self.assertEqual(evt.description, result.description)
  182. self.assertEqual(evt.file_origin, result.file_origin)
  183. self.assertEqual(evt.annotations['test0'], result.annotations['test0'])
  184. self.assertEqual(evt.annotations['test1'], result.annotations['test1'])
  185. self.assertEqual(evt.annotations['test2'], result.annotations['test2'])
  186. def test_time_slice_none_both(self):
  187. params = {'test2': 'y1', 'test3': True}
  188. evt = Event([0.1, 0.5, 1.1, 1.5, 1.7, 2.2, 2.9, 3.0, 3.1, 3.3]*pq.ms,
  189. name='test', description='tester',
  190. file_origin='test.file',
  191. test1=1, **params)
  192. assert_neo_object_is_compliant(evt)
  193. evt.annotate(test1=1.1, test0=[1, 2])
  194. t_start = None
  195. t_stop = None
  196. result = evt.time_slice(t_start, t_stop)
  197. assert_arrays_equal(evt, result)
  198. self.assertEqual(evt.name, result.name)
  199. self.assertEqual(evt.description, result.description)
  200. self.assertEqual(evt.file_origin, result.file_origin)
  201. self.assertEqual(evt.annotations['test0'], result.annotations['test0'])
  202. self.assertEqual(evt.annotations['test1'], result.annotations['test1'])
  203. self.assertEqual(evt.annotations['test2'], result.annotations['test2'])
  204. def test_time_slice_differnt_units(self):
  205. params = {'test2': 'y1', 'test3': True}
  206. evt = Event([0.1, 0.5, 1.1, 1.5, 1.7, 2.2, 2.9, 3.1, 3.3]*pq.ms,
  207. name='test', description='tester',
  208. file_origin='test.file',
  209. test1=1, **params)
  210. assert_neo_object_is_compliant(evt)
  211. evt.annotate(test1=1.1, test0=[1, 2])
  212. targ = Event([ 2.2, 2.9 ]*pq.ms,
  213. name='test', description='tester',
  214. file_origin='test.file',
  215. test1=1, **params)
  216. assert_neo_object_is_compliant(targ)
  217. targ.annotate(test1=1.1, test0=[1, 2])
  218. t_start = 0.002 * pq.s
  219. t_stop = 0.003 * pq.s
  220. result = evt.time_slice(t_start, t_stop)
  221. assert_arrays_equal(targ, result)
  222. self.assertEqual(targ.name, result.name)
  223. self.assertEqual(targ.description, result.description)
  224. self.assertEqual(targ.file_origin, result.file_origin)
  225. self.assertEqual(targ.annotations['test0'], result.annotations['test0'])
  226. self.assertEqual(targ.annotations['test1'], result.annotations['test1'])
  227. self.assertEqual(targ.annotations['test2'], result.annotations['test2'])
  228. def test_Event_repr(self):
  229. params = {'test2': 'y1', 'test3': True}
  230. evt = Event([1.1, 1.5, 1.7]*pq.ms,
  231. labels=np.array(['test event 1',
  232. 'test event 2',
  233. 'test event 3'], dtype='S'),
  234. name='test', description='tester',
  235. file_origin='test.file',
  236. test1=1, **params)
  237. evt.annotate(test1=1.1, test0=[1, 2])
  238. assert_neo_object_is_compliant(evt)
  239. targ = ('<Event: test event 1@1.1 ms, test event 2@1.5 ms, ' +
  240. 'test event 3@1.7 ms>')
  241. res = repr(evt)
  242. self.assertEqual(targ, res)
  243. def test_Event_merge(self):
  244. params1 = {'test2': 'y1', 'test3': True}
  245. params2 = {'test2': 'no', 'test4': False}
  246. paramstarg = {'test2': 'yes;no',
  247. 'test3': True,
  248. 'test4': False}
  249. evt1 = Event([1.1, 1.5, 1.7]*pq.ms,
  250. labels=np.array(['test event 1 1',
  251. 'test event 1 2',
  252. 'test event 1 3'], dtype='S'),
  253. name='test', description='tester 1',
  254. file_origin='test.file',
  255. test1=1, **params1)
  256. evt2 = Event([2.1, 2.5, 2.7]*pq.us,
  257. labels=np.array(['test event 2 1',
  258. 'test event 2 2',
  259. 'test event 2 3'], dtype='S'),
  260. name='test', description='tester 2',
  261. file_origin='test.file',
  262. test1=1, **params2)
  263. evttarg = Event([1.1, 1.5, 1.7, .0021, .0025, .0027]*pq.ms,
  264. labels=np.array(['test event 1 1',
  265. 'test event 1 2',
  266. 'test event 1 3',
  267. 'test event 2 1',
  268. 'test event 2 2',
  269. 'test event 2 3'], dtype='S'),
  270. name='test',
  271. description='merge(tester 1, tester 2)',
  272. file_origin='test.file',
  273. test1=1, **paramstarg)
  274. assert_neo_object_is_compliant(evt1)
  275. assert_neo_object_is_compliant(evt2)
  276. assert_neo_object_is_compliant(evttarg)
  277. evtres = evt1.merge(evt2)
  278. assert_neo_object_is_compliant(evtres)
  279. assert_same_sub_schema(evttarg, evtres)
  280. def test__children(self):
  281. params = {'test2': 'y1', 'test3': True}
  282. evt = Event([1.1, 1.5, 1.7]*pq.ms,
  283. labels=np.array(['test event 1',
  284. 'test event 2',
  285. 'test event 3'], dtype='S'),
  286. name='test', description='tester',
  287. file_origin='test.file',
  288. test1=1, **params)
  289. evt.annotate(test1=1.1, test0=[1, 2])
  290. assert_neo_object_is_compliant(evt)
  291. segment = Segment(name='seg1')
  292. segment.events = [evt]
  293. segment.create_many_to_one_relationship()
  294. self.assertEqual(evt._single_parent_objects, ('Segment',))
  295. self.assertEqual(evt._multi_parent_objects, ())
  296. self.assertEqual(evt._single_parent_containers, ('segment',))
  297. self.assertEqual(evt._multi_parent_containers, ())
  298. self.assertEqual(evt._parent_objects, ('Segment',))
  299. self.assertEqual(evt._parent_containers, ('segment',))
  300. self.assertEqual(len(evt.parents), 1)
  301. self.assertEqual(evt.parents[0].name, 'seg1')
  302. assert_neo_object_is_compliant(evt)
  303. @unittest.skipUnless(HAVE_IPYTHON, "requires IPython")
  304. def test__pretty(self):
  305. evt = Event([1.1, 1.5, 1.7]*pq.ms,
  306. labels=np.array(['test event 1',
  307. 'test event 2',
  308. 'test event 3'], dtype='S'),
  309. name='test', description='tester',
  310. file_origin='test.file')
  311. evt.annotate(test1=1.1, test0=[1, 2])
  312. assert_neo_object_is_compliant(evt)
  313. prepr = pretty(evt)
  314. targ = ("Event\nname: '%s'\ndescription: '%s'\nannotations: %s" %
  315. (evt.name, evt.description, pretty(evt.annotations)))
  316. self.assertEqual(prepr, targ)
  317. def test__time_slice(self):
  318. data = [2, 3, 4, 5] * pq.ms
  319. evt = Event(data, foo='bar')
  320. evt1 = evt.time_slice(2.2 * pq.ms, 4.2 * pq.ms)
  321. assert_arrays_equal(evt1.times, [3, 4] * pq.ms)
  322. self.assertEqual(evt.annotations, evt1.annotations)
  323. evt2 = evt.time_slice(None, 4.2 * pq.ms)
  324. assert_arrays_equal(evt2.times, [2, 3, 4] * pq.ms)
  325. evt3 = evt.time_slice(2.2 * pq.ms, None)
  326. assert_arrays_equal(evt3.times, [3, 4, 5] * pq.ms)
  327. def test_as_array(self):
  328. data = [2, 3, 4, 5]
  329. evt = Event(data * pq.ms)
  330. evt_as_arr = evt.as_array()
  331. self.assertIsInstance(evt_as_arr, np.ndarray)
  332. assert_array_equal(data, evt_as_arr)
  333. def test_as_quantity(self):
  334. data = [2, 3, 4, 5]
  335. evt = Event(data * pq.ms)
  336. evt_as_q = evt.as_quantity()
  337. self.assertIsInstance(evt_as_q, pq.Quantity)
  338. assert_array_equal(data * pq.ms, evt_as_q)
  339. class TestDuplicateWithNewData(unittest.TestCase):
  340. def setUp(self):
  341. self.data = np.array([0.1, 0.5, 1.2, 3.3, 6.4, 7])
  342. self.dataquant = self.data*pq.ms
  343. self.event = Event(self.dataquant)
  344. def test_duplicate_with_new_data(self):
  345. signal1 = self.event
  346. new_data = np.sort(np.random.uniform(0, 100, (self.event.size))) * pq.ms
  347. signal1b = signal1.duplicate_with_new_data(new_data)
  348. assert_arrays_almost_equal(np.asarray(signal1b),
  349. np.asarray(new_data), 1e-12)
  350. class TestEventFunctions(unittest.TestCase):
  351. def test__pickle(self):
  352. event1 = Event(np.arange(0, 30, 10)*pq.s, labels=np.array(['t0', 't1', 't2'], dtype='S'),
  353. units='s')
  354. fobj = open('./pickle', 'wb')
  355. pickle.dump(event1, fobj)
  356. fobj.close()
  357. fobj = open('./pickle', 'rb')
  358. try:
  359. event2 = pickle.load(fobj)
  360. except ValueError:
  361. event2 = None
  362. fobj.close()
  363. assert_array_equal(event1.times, event2.times)
  364. os.remove('./pickle')
  365. if __name__ == "__main__":
  366. unittest.main()