test_event.py 18 KB

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