Skip to content

Commit 85777cf

Browse files
Merge pull request #1056 from legouee/test_asciisignalio
Test AsciiSignalIO
2 parents f5330d6 + 52caab1 commit 85777cf

File tree

2 files changed

+243
-3
lines changed

2 files changed

+243
-3
lines changed

neo/io/asciisignalio.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ def read_segment(self, lazy=False):
196196
usecols=self.usecols,
197197
skip_header=self.skiprows,
198198
dtype='f',
199+
filling_values=None,
200+
comments='""',
201+
names=None,
202+
loose=True,
199203
invalid_raise=False)
200204
if len(sig.shape) == 1:
201205
sig = sig[:, np.newaxis]

neo/test/iotest/test_asciisignalio.py

Lines changed: 239 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ def test_csv_expect_success(self):
7878

7979
os.remove(filename)
8080
# test_csv_expect_failure
81-
# test_homemade_expect_success
8281

8382
def test_homemade_expect_success(self):
8483
filename = 'test_homemade_expect_success.txt'
@@ -133,8 +132,115 @@ def reader(filename, comment_rows):
133132

134133
os.remove(filename)
135134

136-
# test usecols
137-
# test skiprows
135+
def test_skiprows(self):
136+
filename = 'test_skiprows.txt'
137+
sample_data = [
138+
(-65, -65, -65, 0.5),
139+
(-64.8, -64.5, -64.0, 0.6),
140+
(-64.6, -64.2, -77.0, 0.7),
141+
(-64.3, -64.0, -99.9, 0.8),
142+
(-66, -64.3, -61.0, 1.4),
143+
]
144+
with open(filename, 'w') as datafile:
145+
for row in sample_data:
146+
datafile.write("\t ".join(map(str, row)) + "\t\n")
147+
io = AsciiSignalIO(filename, skiprows=1)
148+
block = io.read_block()
149+
signal = block.segments[0].analogsignals[0]
150+
self.assertEqual(signal.shape, (4, 1))
151+
self.assertEqual(len(block.segments[0].analogsignals), 5)
152+
self.assertEqual(len(block.segments[0].analogsignals[0]), 4)
153+
self.assertEqual(signal.units, pq.V)
154+
assert_array_equal(signal.times, [0., 1., 2., 3.] * pq.s)
155+
assert_array_equal(signal.times.magnitude, [0., 1., 2., 3.])
156+
assert_array_equal(signal[0].magnitude, -64.8)
157+
assert_array_equal(signal[1].magnitude, -64.6)
158+
assert_array_equal(signal[2].magnitude, -64.3)
159+
assert_array_equal(signal[3].magnitude, -66)
160+
assert_array_almost_equal(np.asarray(signal).flatten(),
161+
np.array([-64.8, -64.6, -64.3, -66]), decimal=5)
162+
163+
os.remove(filename)
164+
165+
def test_usecols(self):
166+
filename = 'test_usecols.txt'
167+
sample_data = [
168+
(-65, -65, -65, 0.5),
169+
(-64.8, -64.5, -64.0, 0.6),
170+
(-64.6, -64.2, -77.0, 0.7),
171+
(-64.3, -64.0, -99.9, 0.8),
172+
(-66, -64.3, -61.0, 1.4),
173+
]
174+
with open(filename, 'w') as datafile:
175+
for row in sample_data:
176+
datafile.write("\t ".join(map(str, row)) + "\t\n")
177+
io = AsciiSignalIO(filename, usecols=3)
178+
block = io.read_block()
179+
signal = block.segments[0].analogsignals[0]
180+
self.assertEqual(signal.shape, (5, 1))
181+
self.assertEqual(len(block.segments[0].analogsignals[0]), 5)
182+
self.assertEqual(len(block.segments[0].analogsignals), 1)
183+
self.assertEqual(signal.units, pq.V)
184+
assert_array_equal(signal.times, [0., 1., 2., 3., 4.] * pq.s)
185+
assert_array_equal(signal.times.magnitude, [0., 1., 2., 3., 4.])
186+
assert_array_equal(signal[0].magnitude, 0.5)
187+
assert_array_equal(signal[1].magnitude, 0.6)
188+
assert_array_equal(signal[2].magnitude, 0.7)
189+
assert_array_equal(signal[3].magnitude, 0.8)
190+
assert_array_equal(signal[4].magnitude, 1.4)
191+
assert_array_almost_equal(np.asarray(signal).flatten(),
192+
np.array([0.5, 0.6, 0.7, 0.8, 1.4]), decimal=5)
193+
194+
os.remove(filename)
195+
196+
# test skip comments
197+
def test_skip_comments(self):
198+
199+
sample_data = [
200+
("INFORMATION"),
201+
("20170119_cell1_CA"),
202+
(""),
203+
(""),
204+
(""),
205+
(""),
206+
(""),
207+
(),
208+
("Waveform"),
209+
("Unit"),
210+
(),
211+
(-0.02121),
212+
(-0.01740),
213+
(-0.00671),
214+
(-0.00885),
215+
(-0.00092),
216+
(-0.01373),
217+
(-0.01175),
218+
(-0.00504),
219+
(-0.01358),
220+
(-0.01526),
221+
(-0.00244),
222+
(2.26852),
223+
("CHANNEL" "5"),
224+
("Evt+-"),
225+
(""),
226+
(""),
227+
]
228+
sampling_rate = 1 * pq.kHz
229+
filename = 'test_skip_comments.txt'
230+
with open(filename, 'w') as datafile:
231+
for row in sample_data:
232+
datafile.write(str(float))
233+
234+
io = AsciiSignalIO(filename, sampling_rate=sampling_rate, delimiter=' ',
235+
units='mV', method='genfromtxt')
236+
block = io.read_block()
237+
signal1 = block.segments[0].analogsignals[0]
238+
239+
self.assertEqual(len(block.segments[0].analogsignals), 1)
240+
self.assertEqual(signal1.units, pq.mV)
241+
self.assertEqual(len(block.segments[0].analogsignals), 1)
242+
243+
os.remove(filename)
138244

139245
def test_timecolumn(self):
140246
sample_data = np.random.uniform(size=(200, 3))
@@ -224,8 +330,138 @@ def test_multichannel_with_negative_timecolumn(self):
224330
os.remove(filename)
225331

226332
# test write without timecolumn
333+
def test_write_without_timecolumn(self):
334+
sample_data = np.random.uniform(size=(2, 3))
335+
sampling_period = 1
336+
time_data = sampling_period * np.arange(sample_data.shape[0])
337+
combined_data = np.hstack((time_data[:, np.newaxis], sample_data))
338+
filename = "test_write_without_timecolumn.txt"
339+
np.savetxt(filename, combined_data, delimiter=' ')
340+
341+
signal1 = AnalogSignal(sample_data, units="V", sampling_rate=1 * pq.Hz)
342+
seg1 = Segment()
343+
block1 = Block()
344+
seg1.analogsignals.append(signal1)
345+
seg1.block = block1
346+
block1.segments.append(seg1)
347+
348+
iow = AsciiSignalIO(filename,
349+
method='genfromtxt',
350+
time_units='ms',
351+
signal_group_mode='all-in-one')
352+
iow.write_block(block1)
353+
354+
ior = AsciiSignalIO(filename)
355+
block2 = ior.read_block()
356+
357+
assert len(block2.segments[0].analogsignals) == 3
358+
signal2 = block2.segments[0].analogsignals[1]
359+
360+
assert_array_almost_equal(signal1.magnitude[:, 1], signal2.magnitude.reshape(-1),
361+
decimal=7)
362+
self.assertEqual(signal1.units, signal2.units)
363+
self.assertEqual(signal1.sampling_rate, signal2.sampling_rate)
364+
assert_array_equal(signal1.times, signal2.times)
365+
366+
assert_array_almost_equal(signal2.magnitude.reshape(-1), sample_data[:, 1],
367+
decimal=6)
368+
369+
self.assertEqual(signal2.sampling_period, sampling_period * pq.s)
370+
self.assertEqual(len(block2.segments[0].analogsignals), 3)
371+
self.assertEqual(signal2.t_stop, sample_data.shape[0] * sampling_period * pq.s)
372+
self.assertEqual(signal2.units, pq.V)
373+
374+
os.remove(filename)
375+
227376
# test write with timecolumn
377+
def test_write_with_timecolumn(self):
378+
sample_data = np.random.uniform(size=(200, 3))
379+
sampling_period = 1
380+
time_data = sampling_period * np.arange(sample_data.shape[0])
381+
combined_data = np.hstack((time_data[:, np.newaxis], sample_data))
382+
filename = "test_write_with_timecolumn.txt"
383+
np.savetxt(filename, combined_data, delimiter=' ')
384+
385+
signal1 = AnalogSignal(sample_data, units="V", sampling_rate=1 * pq.Hz)
386+
seg1 = Segment()
387+
block1 = Block()
388+
seg1.analogsignals.append(signal1)
389+
seg1.block = block1
390+
block1.segments.append(seg1)
391+
392+
iow = AsciiSignalIO(filename,
393+
method='genfromtxt',
394+
timecolumn=0,
395+
time_units='ms',
396+
signal_group_mode='all-in-one')
397+
iow.write_block(block1)
398+
399+
ior = AsciiSignalIO(filename)
400+
block2 = ior.read_block()
401+
402+
assert len(block2.segments[0].analogsignals) == 4
403+
signal2 = block2.segments[0].analogsignals[1]
404+
405+
assert_array_almost_equal(signal1.magnitude[:, 0], signal2.magnitude.reshape(-1),
406+
decimal=7)
407+
self.assertEqual(signal1.units, signal2.units)
408+
self.assertEqual(signal1.sampling_rate, signal2.sampling_rate)
409+
assert_array_equal(signal1.times, signal2.times)
410+
assert_array_almost_equal(signal2.magnitude[:, 0], sample_data[:, 0],
411+
decimal=6)
412+
self.assertEqual(signal2.sampling_period, sampling_period * pq.s)
413+
self.assertEqual(len(block2.segments[0].analogsignals), 4)
414+
self.assertEqual(signal2.t_stop, sample_data.shape[0] * sampling_period * pq.s)
415+
self.assertEqual(signal2.units, pq.V)
416+
417+
os.remove(filename)
418+
228419
# test write with units/timeunits different from those of signal
420+
def test_write_with_timeunits_different_from_those_of_signal(self):
421+
sample_data = np.random.uniform(size=(3, 3))
422+
sampling_period = 1
423+
time_data = sampling_period * np.arange(sample_data.shape[0])
424+
combined_data = np.hstack((time_data[:, np.newaxis], sample_data))
425+
filename = "test_write_with_timeunits_different_from_those_of_signal.txt"
426+
np.savetxt(filename, combined_data, delimiter=' ')
427+
428+
signal1 = AnalogSignal(sample_data, units="A",
429+
sampling_rate=2 * pq.Hz, sampling_period=0.5)
430+
seg1 = Segment()
431+
block1 = Block()
432+
seg1.analogsignals.append(signal1)
433+
seg1.block = block1
434+
block1.segments.append(seg1)
435+
436+
iow = AsciiSignalIO(filename,
437+
method='genfromtxt',
438+
timecolumn=0,
439+
units='mV',
440+
time_units='ms',
441+
signal_group_mode='all-in-one')
442+
def_units = iow.units
443+
def_time_units = iow.time_units
444+
iow.write_block(block1)
445+
446+
ior = AsciiSignalIO(filename)
447+
block2 = ior.read_block()
448+
449+
assert len(block2.segments[0].analogsignals) == 4
450+
signal2 = block2.segments[0].analogsignals[1]
451+
452+
self.assertTrue(signal1.units, def_units)
453+
self.assertEqual(signal1.units, pq.A)
454+
self.assertEqual(iow.units, pq.A)
455+
self.assertEqual(signal1.units, iow.units)
456+
self.assertTrue(def_units, iow.units)
457+
458+
self.assertTrue(signal1.units, ior.time_units)
459+
self.assertEqual(iow.time_units, ior.time_units)
460+
self.assertTrue(def_time_units, iow.time_units)
461+
self.assertEqual(iow.time_units, pq.s)
462+
self.assertEqual(ior.time_units, pq.s)
463+
464+
os.remove(filename)
229465

230466
def test_read_with_json_metadata(self):
231467
sample_data = np.random.uniform(size=(200, 3))

0 commit comments

Comments
 (0)