Skip to content

Commit 7ffcbea

Browse files
author
kleinjohann
committed
Fix quantities being loaded with wrong shape
1 parent f3bb3fb commit 7ffcbea

File tree

2 files changed

+66
-12
lines changed

2 files changed

+66
-12
lines changed

neo/io/nixio.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,7 @@ def _nix_attr_to_neo(nix_obj):
12631263
neo_attrs["description"] = stringify(nix_obj.definition)
12641264
if nix_obj.metadata:
12651265
for prop in nix_obj.metadata.inherited_properties():
1266-
values = prop.values
1266+
values = list(prop.values)
12671267
if prop.unit:
12681268
units = prop.unit
12691269
values = create_quantity(values, units)
@@ -1274,8 +1274,6 @@ def _nix_attr_to_neo(nix_obj):
12741274
values = ""
12751275
elif len(values) == 1:
12761276
values = values[0]
1277-
else:
1278-
values = list(values)
12791277
neo_attrs[prop.name] = values
12801278
neo_attrs["name"] = stringify(neo_attrs.get("neo_name"))
12811279

neo/test/iotest/test_nixio.py

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,8 @@ def compare_attr(self, neoobj, nixobj):
325325
if isinstance(nixvalue, Iterable):
326326
nixvalue = np.array(nixvalue)
327327
np.testing.assert_almost_equal(nixvalue, v.magnitude)
328+
if isinstance(v, np.ndarray):
329+
self.assertTrue(np.all(v==nixmd[str(k)]))
328330
else:
329331
self.assertEqual(nixmd[str(k)], v,
330332
"Property value mismatch: {}".format(k))
@@ -373,15 +375,15 @@ def create_full_nix_file(cls, filename):
373375
asig_md = group.metadata.create_section(asig_name,
374376
asig_name + ".metadata")
375377

376-
arr_ann_name, arr_ann_val = cls.rword(6), cls.rquant(10, pq.uV)
378+
arr_ann_name, arr_ann_val = 'anasig_arr_ann', cls.rquant(10, pq.uV)
377379
asig_md.create_property(arr_ann_name, arr_ann_val.magnitude.flatten())
378380
asig_md.props[arr_ann_name].unit = str(arr_ann_val.dimensionality)
379381

380-
for idx in range(3):
382+
for idx in range(10):
381383
da_asig = blk.create_data_array(
382384
"{}.{}".format(asig_name, idx),
383385
"neo.analogsignal",
384-
data=cls.rquant(100, 10)
386+
data=cls.rquant(100, 1)
385387
)
386388
da_asig.definition = asig_definition
387389
da_asig.unit = "mV"
@@ -406,14 +408,14 @@ def create_full_nix_file(cls, filename):
406408
isig_md = group.metadata.create_section(isig_name,
407409
isig_name + ".metadata")
408410
isig_times = cls.rquant(200, 1, True)
409-
arr_ann_name, arr_ann_val = cls.rword(6), cls.rquant(10, pq.uV)
411+
arr_ann_name, arr_ann_val = 'irrsig_arr_ann', cls.rquant(7, pq.uV)
410412
isig_md.create_property(arr_ann_name, arr_ann_val.magnitude.flatten())
411413
isig_md.props[arr_ann_name].unit = str(arr_ann_val.dimensionality)
412-
for idx in range(10):
414+
for idx in range(7):
413415
da_isig = blk.create_data_array(
414416
"{}.{}".format(isig_name, idx),
415417
"neo.irregularlysampledsignal",
416-
data=cls.rquant(200, 10)
418+
data=cls.rquant(200, 1)
417419
)
418420
da_isig.definition = isig_definition
419421
da_isig.unit = "mV"
@@ -447,7 +449,7 @@ def create_full_nix_file(cls, filename):
447449
mtag_st.metadata = mtag_st_md
448450
mtag_st_md.create_property("t_stop", times[-1] + 1.0)
449451

450-
arr_ann_name, arr_ann_val = cls.rword(6), cls.rquant(40, pq.uV)
452+
arr_ann_name, arr_ann_val = 'st_arr_ann', cls.rquant(40, pq.uV)
451453
mtag_st_md.create_property(arr_ann_name, arr_ann_val.magnitude.flatten())
452454
mtag_st_md.props[arr_ann_name].unit = str(arr_ann_val.dimensionality)
453455

@@ -498,7 +500,7 @@ def create_full_nix_file(cls, filename):
498500
mtag_ep.definition = cls.rsentence(2)
499501
mtag_ep.extents = extents_da
500502

501-
arr_ann_name, arr_ann_val = cls.rword(6), cls.rquant(5, pq.uV)
503+
arr_ann_name, arr_ann_val = 'ep_arr_ann', cls.rquant(5, pq.uV)
502504
mtag_ep.metadata.create_property(arr_ann_name, arr_ann_val.magnitude.flatten())
503505
mtag_ep.metadata.props[arr_ann_name].unit = str(arr_ann_val.dimensionality)
504506

@@ -528,7 +530,7 @@ def create_full_nix_file(cls, filename):
528530
group.multi_tags.append(mtag_ev)
529531
mtag_ev.definition = cls.rsentence(2)
530532

531-
arr_ann_name, arr_ann_val = cls.rword(6), cls.rquant(5, pq.uV)
533+
arr_ann_name, arr_ann_val = 'ev_arr_ann', cls.rquant(5, pq.uV)
532534
mtag_ev.metadata.create_property(arr_ann_name, arr_ann_val.magnitude.flatten())
533535
mtag_ev.metadata.props[arr_ann_name].unit = str(arr_ann_val.dimensionality)
534536

@@ -1401,6 +1403,60 @@ def test_neo_name_read(self):
14011403
neoblock = self.io.read_block(neoname=neoname)
14021404
self.assertEqual(neoblock.annotations["nix_name"], nixblock.name)
14031405

1406+
def test_array_annotations_read(self):
1407+
for bl in self.io.read_all_blocks():
1408+
nix_block = self.nixfile.blocks[bl.annotations['nix_name']]
1409+
for seg in bl.segments:
1410+
for anasig in seg.analogsignals:
1411+
da = nix_block.data_arrays[anasig.annotations['nix_name']+'.0']
1412+
self.assertIn('anasig_arr_ann', da.metadata)
1413+
self.assertIn('anasig_arr_ann', anasig.array_annotations)
1414+
self.assertTrue(np.all(da.metadata['anasig_arr_ann'] ==
1415+
anasig.array_annotations['anasig_arr_ann'].magnitude))
1416+
self.assertEqual(da.metadata.props['anasig_arr_ann'].unit,
1417+
units_to_string(
1418+
anasig.array_annotations['anasig_arr_ann'].units))
1419+
for irrsig in seg.irregularlysampledsignals:
1420+
da = nix_block.data_arrays[irrsig.annotations['nix_name'] + '.0']
1421+
self.assertIn('irrsig_arr_ann', da.metadata)
1422+
self.assertIn('irrsig_arr_ann', irrsig.array_annotations)
1423+
self.assertTrue(np.all(da.metadata['irrsig_arr_ann'] ==
1424+
irrsig.array_annotations[
1425+
'irrsig_arr_ann'].magnitude))
1426+
self.assertEqual(da.metadata.props['irrsig_arr_ann'].unit,
1427+
units_to_string(
1428+
irrsig.array_annotations['irrsig_arr_ann'].units))
1429+
for ev in seg.events:
1430+
da = nix_block.multi_tags[ev.annotations['nix_name']]
1431+
self.assertIn('ev_arr_ann', da.metadata)
1432+
self.assertIn('ev_arr_ann', ev.array_annotations)
1433+
self.assertTrue(np.all(da.metadata['ev_arr_ann'] ==
1434+
ev.array_annotations[
1435+
'ev_arr_ann'].magnitude))
1436+
self.assertEqual(da.metadata.props['ev_arr_ann'].unit,
1437+
units_to_string(
1438+
ev.array_annotations['ev_arr_ann'].units))
1439+
for ep in seg.epochs:
1440+
da = nix_block.multi_tags[ep.annotations['nix_name']]
1441+
self.assertIn('ep_arr_ann', da.metadata)
1442+
self.assertIn('ep_arr_ann', ep.array_annotations)
1443+
self.assertTrue(np.all(da.metadata['ep_arr_ann'] ==
1444+
ep.array_annotations[
1445+
'ep_arr_ann'].magnitude))
1446+
self.assertEqual(da.metadata.props['ep_arr_ann'].unit,
1447+
units_to_string(
1448+
ep.array_annotations['ep_arr_ann'].units))
1449+
for st in seg.spiketrains:
1450+
da = nix_block.multi_tags[st.annotations['nix_name']]
1451+
self.assertIn('st_arr_ann', da.metadata)
1452+
self.assertIn('st_arr_ann', st.array_annotations)
1453+
self.assertTrue(np.all(da.metadata['st_arr_ann'] ==
1454+
st.array_annotations[
1455+
'st_arr_ann'].magnitude))
1456+
self.assertEqual(da.metadata.props['st_arr_ann'].unit,
1457+
units_to_string(
1458+
st.array_annotations['st_arr_ann'].units))
1459+
14041460

14051461
@unittest.skipUnless(HAVE_NIX, "Requires NIX")
14061462
class NixIOContextTests(NixIOTest):

0 commit comments

Comments
 (0)