Skip to content

Commit 957649c

Browse files
committed
Add support for IrregularlySampledSignal in NeoMatlabIO (fixes #1126)
1 parent 5f8cdb7 commit 957649c

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

neo/io/neomatlabio.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
SCIPY_ERR = None
3838

3939
from neo.io.baseio import BaseIO
40-
from neo.core import (Block, Segment, AnalogSignal, Event, Epoch, SpikeTrain,
41-
objectnames, class_by_name)
40+
from neo.core import (Block, Segment, AnalogSignal, IrregularlySampledSignal,
41+
Event, Epoch, SpikeTrain, objectnames, class_by_name)
4242

4343
classname_lower_to_upper = {}
4444
for k in objectnames:
@@ -190,7 +190,8 @@ class NeoMatlabIO(BaseIO):
190190
is_readable = True
191191
is_writable = True
192192

193-
supported_objects = [Block, Segment, AnalogSignal, Epoch, Event, SpikeTrain]
193+
supported_objects = [Block, Segment, AnalogSignal, IrregularlySampledSignal,
194+
Epoch, Event, SpikeTrain]
194195
readable_objects = [Block]
195196
writeable_objects = [Block]
196197

@@ -251,6 +252,10 @@ def write_block(self, bl, **kargs):
251252
anasig_struct = self.create_struct_from_obj(anasig)
252253
seg_struct['analogsignals'].append(anasig_struct)
253254

255+
for irrsig in seg.irregularlysampledsignals:
256+
irrsig_struct = self.create_struct_from_obj(irrsig)
257+
seg_struct['irregularlysampledsignals'].append(irrsig_struct)
258+
254259
for ea in seg.events:
255260
ea_struct = self.create_struct_from_obj(ea)
256261
seg_struct['events'].append(ea_struct)
@@ -348,7 +353,13 @@ def create_ob_from_struct(self, struct, classname):
348353
else:
349354
data_complement["t_start"] = 0.0
350355

351-
ob = cl(arr, **data_complement)
356+
if "times" in (at[0] for at in cl._necessary_attrs) and quantity_attr != "times":
357+
# handle IrregularlySampledSignal
358+
times = getattr(struct, "times")
359+
data_complement["time_units"] = getattr(struct, "times_units")
360+
ob = cl(times, arr, **data_complement)
361+
else:
362+
ob = cl(arr, **data_complement)
352363
else:
353364
ob = cl()
354365

neo/test/iotest/test_neomatlabio.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
"""
44

55
import unittest
6-
6+
from numpy.testing import assert_array_equal
77
import quantities as pq
8+
9+
from neo.core.analogsignal import AnalogSignal
10+
from neo.core.irregularlysampledsignal import IrregularlySampledSignal
811
from neo import Block, Segment, SpikeTrain
912
from neo.test.iotest.common_io_test import BaseTestIO
1013
from neo.io.neomatlabio import NeoMatlabIO, HAVE_SCIPY
@@ -21,8 +24,12 @@ def test_write_read_single_spike(self):
2124
seg = Segment('segment1')
2225
spiketrain1 = SpikeTrain([1] * pq.s, t_stop=10 * pq.s, sampling_rate=1 * pq.Hz)
2326
spiketrain1.annotate(yep='yop')
27+
sig1 = AnalogSignal([4, 5, 6] * pq.A, sampling_period=1 * pq.ms)
28+
irrsig1 = IrregularlySampledSignal([0, 1, 2] * pq.ms, [4, 5, 6] * pq.A)
2429
block1.segments.append(seg)
2530
seg.spiketrains.append(spiketrain1)
31+
seg.analogsignals.append(sig1)
32+
seg.irregularlysampledsignals.append(irrsig1)
2633

2734
# write block
2835
filename = self.get_local_path('matlabiotestfile.mat')
@@ -36,6 +43,14 @@ def test_write_read_single_spike(self):
3643
self.assertEqual(block1.segments[0].spiketrains[0],
3744
block2.segments[0].spiketrains[0])
3845

46+
assert_array_equal(block1.segments[0].analogsignals[0],
47+
block2.segments[0].analogsignals[0])
48+
49+
assert_array_equal(block1.segments[0].irregularlysampledsignals[0].magnitude,
50+
block2.segments[0].irregularlysampledsignals[0].magnitude)
51+
assert_array_equal(block1.segments[0].irregularlysampledsignals[0].times,
52+
block2.segments[0].irregularlysampledsignals[0].times)
53+
3954
# test annotations
4055
spiketrain2 = block2.segments[0].spiketrains[0]
4156
assert 'yep' in spiketrain2.annotations

0 commit comments

Comments
 (0)