diff --git a/neo/io/asciisignalio.py b/neo/io/asciisignalio.py index 0d6d1af17..b68230ddb 100644 --- a/neo/io/asciisignalio.py +++ b/neo/io/asciisignalio.py @@ -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 @@ -94,7 +93,7 @@ class AsciiSignalIO(BaseIO): "units": "kHz" }, "method": "genfromtxt", - "signal_group_mode": 'all-in-one' + "signal_group_mode": 'split-all' } """ @@ -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 diff --git a/neo/io/nixio_fr.py b/neo/io/nixio_fr.py index 7a78feb5d..1dd02174f 100644 --- a/neo/io/nixio_fr.py +++ b/neo/io/nixio_fr.py @@ -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) diff --git a/neo/test/iotest/test_asciisignalio.py b/neo/test/iotest/test_asciisignalio.py index bead9269e..c4214f98f 100644 --- a/neo/test/iotest/test_asciisignalio.py +++ b/neo/test/iotest/test_asciisignalio.py @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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 @@ -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() diff --git a/neo/test/iotest/test_blackrockio.py b/neo/test/iotest/test_blackrockio.py index 91fc2748b..c667f1c21 100644 --- a/neo/test/iotest/test_blackrockio.py +++ b/neo/test/iotest/test_blackrockio.py @@ -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) diff --git a/neo/test/iotest/test_neuralynxio.py b/neo/test/iotest/test_neuralynxio.py index 7c1ecc658..7ad526e17 100644 --- a/neo/test/iotest/test_neuralynxio.py +++ b/neo/test/iotest/test_neuralynxio.py @@ -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 @@ -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