Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 16 additions & 42 deletions neo/io/asciisignalio.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ class AsciiSignalIO(BaseIO):
t_start:
time of the first sample (Quantity). Ignored if timecolumn is not None
signal_group_mode:
if 'all-in-one', load data as a single, multi-channel AnalogSignal, if 'split-all'
(default for backwards compatibility) load data as separate, single-channel
'split-all' (default for backwards compatibility) load data as separate, single-channel
AnalogSignals
method:
'genfromtxt', 'csv', 'homemade' or a user-defined function which takes a filename and
Expand Down Expand Up @@ -94,7 +93,7 @@ class AsciiSignalIO(BaseIO):
"units": "kHz"
},
"method": "genfromtxt",
"signal_group_mode": 'all-in-one'
"signal_group_mode": 'split-all'
}
"""

Expand Down Expand Up @@ -285,53 +284,28 @@ def read_segment(self, lazy=False):
sampling_rate = None
t_start = sig[0, self.timecolumn] * self.time_units

if self.signal_group_mode == "all-in-one":
channel_index_annotation = self.usecols or np.arange(sig.shape[1])
channel_index_annotation = np.asarray(channel_index_annotation)
if self.timecolumn is not None:
mask = list(range(sig.shape[1]))
if self.timecolumn >= 0:
mask.remove(self.timecolumn)
else: # allow negative column index
mask.remove(sig.shape[1] + self.timecolumn)
signal = sig[:, mask]
channel_index_annotation = channel_index_annotation[mask]
else:
signal = sig
if self.timecolumn is not None and self.timecolumn < 0:
time_col = sig.shape[1] + self.timecolumn
else:
time_col = self.timecolumn
for i in range(sig.shape[1]):
if time_col == i:
continue
signal = sig[:, i] * self.units
if sampling_rate is None:
irr_sig = IrregularlySampledSignal(
signal[:, self.timecolumn] * self.time_units, signal * self.units, name="multichannel"
sig[:, time_col] * self.time_units,
signal,
t_start=t_start,
channel_index=i,
name="Column %d" % i,
)
seg.irregularlysampledsignals.append(irr_sig)
else:
ana_sig = AnalogSignal(
signal * self.units, sampling_rate=sampling_rate, t_start=t_start, name="multichannel"
signal, sampling_rate=sampling_rate, t_start=t_start, channel_index=i, name="Column %d" % i
)
ana_sig.array_annotate(channel_index=channel_index_annotation)
seg.analogsignals.append(ana_sig)
else:
if self.timecolumn is not None and self.timecolumn < 0:
time_col = sig.shape[1] + self.timecolumn
else:
time_col = self.timecolumn
for i in range(sig.shape[1]):
if time_col == i:
continue
signal = sig[:, i] * self.units
if sampling_rate is None:
irr_sig = IrregularlySampledSignal(
sig[:, time_col] * self.time_units,
signal,
t_start=t_start,
channel_index=i,
name="Column %d" % i,
)
seg.irregularlysampledsignals.append(irr_sig)
else:
ana_sig = AnalogSignal(
signal, sampling_rate=sampling_rate, t_start=t_start, channel_index=i, name="Column %d" % i
)
seg.analogsignals.append(ana_sig)

seg.check_relationships()
return seg
Expand Down
2 changes: 1 addition & 1 deletion neo/io/nixio_fr.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class NixIO(NIXRawIO, BaseFromRaw):
name = "NIX IO"

_prefered_signal_group_mode = "group-by-same-units"
_prefered_units_group_mode = "all-in-one"
_prefered_units_group_mode = "split-all"

def __init__(self, filename):
NIXRawIO.__init__(self, filename)
Expand Down
40 changes: 22 additions & 18 deletions neo/test/iotest/test_asciisignalio.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,14 @@ def test_csv_expect_success(self):
delimiter=",",
units="mV",
method="csv",
signal_group_mode="all-in-one",
signal_group_mode="split-all",
t_start=0.5,
)

block = io.read_block()
signal = block.segments[0].analogsignals[0]
self.assertEqual(signal.shape, (4, 2)) # two columns remaining after usecols
# and timecolumn applied
assert_array_almost_equal(signal[:, 1].reshape(-1).magnitude, np.array(sample_data)[:, 1], decimal=5)
self.assertEqual(signal.shape, (4, 1))
assert_array_almost_equal(signal[:, 0].reshape(-1).magnitude, np.array(sample_data)[:, 0], decimal=5)
self.assertAlmostEqual(signal.sampling_period, 0.1 * pq.ms)

expected_channel_index = list(usecols)
Expand Down Expand Up @@ -110,15 +109,14 @@ def test_homemade_expect_success(self):
delimiter="\t",
units="mV",
method="homemade",
signal_group_mode="all-in-one",
signal_group_mode="split-all",
t_start=0.5,
)

block = io.read_block()
signal = block.segments[0].analogsignals[0]
self.assertEqual(signal.shape, (4, 2)) # two columns remaining after usecols
# and timecolumn applied
assert_array_almost_equal(signal[:, 1].reshape(-1).magnitude, np.array(sample_data)[:, 1], decimal=5)
self.assertEqual(signal.shape, (4, 1))
assert_array_almost_equal(signal[:, 0].reshape(-1).magnitude, np.array(sample_data)[:, 0], decimal=5)
self.assertAlmostEqual(signal.sampling_period, 0.1 * pq.ms)

os.remove(filename)
Expand Down Expand Up @@ -290,12 +288,14 @@ def test_multichannel(self):
delimiter=" ",
units="mV",
method="genfromtxt",
signal_group_mode="all-in-one",
signal_group_mode="split-all",
)
block = io.read_block()

signal = block.segments[0].analogsignals[0]
assert_array_almost_equal(signal.magnitude, sample_data, decimal=6)
assert_array_almost_equal(signal.magnitude, sample_data[:, 0], decimal=6)
signal1 = block.segments[1].analogsignals[1]
assert_array_almost_equal(signal1.magnitude, sample_data[:, 1], decimal=6)
self.assertEqual(len(block.segments[0].analogsignals), 1)
self.assertEqual(signal.t_stop, sample_data.shape[0] / sampling_rate)
self.assertEqual(signal.units, pq.mV)
Expand All @@ -316,12 +316,14 @@ def test_multichannel_with_timecolumn(self):
method="genfromtxt",
timecolumn=0,
time_units="ms",
signal_group_mode="all-in-one",
signal_group_mode="split-all",
)
block = io.read_block()

signal = block.segments[0].analogsignals[0]
assert_array_almost_equal(signal.magnitude, sample_data, decimal=6)
assert_array_almost_equal(signal.magnitude, sample_data[:,0], decimal=6)
signal1 = block.segments[1].analogsignals[0]
assert_array_almost_equal(signal1.magnitude, sample_data[:,1], decimal=6)
self.assertEqual(signal.sampling_period, sampling_period * pq.ms)
self.assertEqual(len(block.segments[0].analogsignals), 1)
self.assertEqual(signal.t_stop, sample_data.shape[0] * sampling_period * pq.ms)
Expand All @@ -343,12 +345,14 @@ def test_multichannel_with_negative_timecolumn(self):
method="genfromtxt",
timecolumn=-1,
time_units="ms",
signal_group_mode="all-in-one",
signal_group_mode="split-all",
)
block = io.read_block()

signal = block.segments[0].analogsignals[0]
assert_array_almost_equal(signal.magnitude, sample_data, decimal=6)
assert_array_almost_equal(signal.magnitude, sample_data[:,0], decimal=6)
signal1 = block.segments[1].analogsignals[0]
assert_array_almost_equal(signal1.magnitude, sample_data[:,1], decimal=6)
self.assertEqual(signal.sampling_period, sampling_period * pq.ms)
self.assertEqual(len(block.segments[0].analogsignals), 1)
self.assertEqual(signal.t_stop, sample_data.shape[0] * sampling_period * pq.ms)
Expand All @@ -371,7 +375,7 @@ def test_write_without_timecolumn(self):
seg1.analogsignals.append(signal1)
block1.segments.append(seg1)

iow = AsciiSignalIO(filename, method="genfromtxt", time_units="ms", signal_group_mode="all-in-one")
iow = AsciiSignalIO(filename, method="genfromtxt", time_units="ms", signal_group_mode="split-all")
iow.write_block(block1)

ior = AsciiSignalIO(filename)
Expand Down Expand Up @@ -410,7 +414,7 @@ def test_write_with_timecolumn(self):
block1.segments.append(seg1)

iow = AsciiSignalIO(
filename, method="genfromtxt", timecolumn=0, time_units="ms", signal_group_mode="all-in-one"
filename, method="genfromtxt", timecolumn=0, time_units="ms", signal_group_mode="split-all"
)
iow.write_block(block1)

Expand Down Expand Up @@ -448,7 +452,7 @@ def test_write_with_timeunits_different_from_those_of_signal(self):
block1.segments.append(seg1)

iow = AsciiSignalIO(
filename, method="genfromtxt", timecolumn=0, units="mV", time_units="ms", signal_group_mode="all-in-one"
filename, method="genfromtxt", timecolumn=0, units="mV", time_units="ms", signal_group_mode="split-all"
)
def_units = iow.units
def_time_units = iow.time_units
Expand Down Expand Up @@ -560,7 +564,7 @@ def test_irregular_multichannel(self):
np.savetxt(filename, sample_data, delimiter=" ")

io = AsciiSignalIO(
filename, delimiter=" ", timecolumn=0, units="mV", method="genfromtxt", signal_group_mode="all-in-one"
filename, delimiter=" ", timecolumn=0, units="mV", method="genfromtxt", signal_group_mode="split-all"
)
block = io.read_block()

Expand Down
2 changes: 1 addition & 1 deletion neo/test/iotest/test_blackrockio.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ def test_inputs_V21(self):
block = reader.read_block(
load_waveforms=True,
signal_group_mode="split-all",
) # units_group_mode='all-in-one')
)

self.assertEqual(len(block.segments[0].analogsignals), 96)
# self.assertEqual(len(block.channel_indexes[-1].units), 218)
Expand Down
6 changes: 0 additions & 6 deletions neo/test/iotest/test_neuralynxio.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,6 @@ def test_read_block(self):

# self.assertEqual(len(block.channel_indexes[-1].units[0].spiketrains), 2) # 2 segment

# block = nio.read_block(load_waveforms=True, units_group_mode='all-in-one')
# self.assertEqual(len(block.channel_indexes[-1].units), 2) # 2 units

# block = nio.read_block(load_waveforms=True, units_group_mode='split-all')
# self.assertEqual(len(block.channel_indexes[-1].units), 1) # 1 units by ChannelIndex

Expand Down Expand Up @@ -125,9 +122,6 @@ def test_read_block(self):

# self.assertEqual(len(block.channel_indexes[-1].units[0].spiketrains), 2)

# block = nio.read_block(load_waveforms=True, units_group_mode='all-in-one')
# self.assertEqual(len(block.channel_indexes[-1].units), 8)

# block = nio.read_block(load_waveforms=True, units_group_mode='split-all')
# self.assertEqual(len(block.channel_indexes[-1].units), 1) # 1 units by ChannelIndex

Expand Down