def test_read_block(self): """Read data in a certain time range into one block""" dirname = self.get_filename_path('Cheetah_v5.6.3/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # There are two segments due to gap in recording self.assertEqual(len(block.segments), 2) for seg in block.segments: self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 2) self.assertEqual(seg.analogsignals[0].sampling_rate, 2. * pq.kHz) self.assertEqual(len(seg.spiketrains), 8) # Testing different parameter combinations block = nio.read_block(load_waveforms=True) self.assertEqual(len(block.segments[0].analogsignals), 1) self.assertEqual(len(block.segments[0].spiketrains), 8) self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[0], block.segments[0].spiketrains[0].shape[0]) # this is tetrode data, containing 32 samples per waveform self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[1], 4) self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[-1], 32) self.assertGreater(len(block.segments[0].events), 0) 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
def test_read_block(self): """Read data in a certain time range into one block""" dirname = self.get_filename_path('Cheetah_v5.5.1/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # Everything put in one segment self.assertEqual(len(block.segments), 2) seg = block.segments[0] self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 2) self.assertEqual(seg.analogsignals[0].sampling_rate, 32. * pq.kHz) self.assertEqual(len(seg.spiketrains), 2) # Testing different parameter combinations block = nio.read_block(load_waveforms=True) self.assertEqual(len(block.segments[0].analogsignals), 1) self.assertEqual(len(block.segments[0].spiketrains), 2) self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[0], block.segments[0].spiketrains[0].shape[0]) self.assertGreater(len(block.segments[0].events), 0) 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
def test_read_block(self): dirname = self.get_filename_path('Cheetah_v5.7.4/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # Everything put in one segment seg = block.segments[0] self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 5) self.assertEqual(seg.analogsignals[0].sampling_rate, 32 * pq.kHz) self.assertEqual(len(seg.spiketrains), 0) # no nse files available # Testing different parameter combinations block = nio.read_block(load_waveforms=True) self.assertEqual(len(block.segments[0].analogsignals), 1) self.assertEqual(len(block.segments[0].spiketrains), 0) self.assertGreater(len(block.segments[0].events), 0) block = nio.read_block(signal_group_mode='split-all') self.assertEqual(len(block.channel_indexes), 5) block = nio.read_block(signal_group_mode='group-by-same-units') self.assertEqual(len(block.channel_indexes), 1)
def test_read_segment(self): dirname = self.get_filename_path('Cheetah_v5.7.4/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) seg = nio.read_segment(time_slice=None) self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 5) self.assertEqual(seg.analogsignals[0].sampling_rate, 32*pq.kHz) self.assertEqual(len(seg.spiketrains), 0) # Testing different parameter combinations seg = nio.read_segment(lazy=True) self.assertEqual(len(seg.analogsignals[0]), 0) self.assertEqual(len(seg.spiketrains), 0) seg = nio.read_segment(cascade=False) self.assertEqual(len(seg.analogsignals), 0) self.assertEqual(len(seg.spiketrains), 0) seg = nio.read_segment(load_waveforms=True) self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(len(seg.spiketrains), 0) self.assertTrue(len(seg.events) > 0)
def test_gap_handling_v563(self): dirname = self.get_filename_path('Cheetah_v5.6.3/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # known gap values n_gaps = 1 # so 2 segments, 2 anasigs by Channelindex, 2 SpikeTrain by Units self.assertEqual(len(block.segments), n_gaps + 1) self.assertEqual(len(block.channel_indexes[0].analogsignals), n_gaps + 1) self.assertEqual(len(block.channel_indexes[-1].units[0].spiketrains), n_gaps + 1)
def test_ncs(self): for session in self.files_to_test[1:2]: # in the long run this should include all files dirname = self.get_filename_path(session) nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() for anasig_id, anasig in enumerate(block.segments[0].analogsignals): chid = anasig.channel_index.annotations['channel_id'][anasig_id] filename = nio.ncs_filenames[chid][:-3] + 'txt' filename = filename.replace('original_data', 'plain_data') plain_data = np.loadtxt(filename)[:, 5:].flatten() # first columns are meta info overlap = 512 * 500 gain_factor_0 = plain_data[0] / anasig.magnitude[0, 0] np.testing.assert_allclose(plain_data[:overlap], anasig.magnitude[:overlap, 0] * gain_factor_0, rtol=0.01)
def compare_old_and_new_neuralynxio(): base = '/tmp/files_for_testing_neo/neuralynx/' dirname = base+'Cheetah_v5.5.1/original_data/' #~ dirname = base+'Cheetah_v5.7.4/original_data/' t0 = time.perf_counter() newreader = NewNeuralynxIO(dirname) t1 = time.perf_counter() bl1 = newreader.read_block(load_waveforms=True) t2 = time.perf_counter() print('newreader header', t1-t0, 's') print('newreader data', t2-t1, 's') print('newreader toal', t2-t0, 's') for seg in bl1.segments: print('seg', seg.index) for anasig in seg.analogsignals: print(' AnalogSignal', anasig.name, anasig.shape, anasig.t_start) for st in seg.spiketrains: print(' SpikeTrain', st.name, st.shape, st.waveforms.shape, st[:5]) for ev in seg.events: print(' Event', ev.name, ev.times.shape) print('*'*10) t0 = time.perf_counter() oldreader = OldNeuralynxIO(sessiondir=dirname, use_cache='never') t1 = time.perf_counter() bl2 = oldreader.read_block(waveforms=True, events=True) t2 = time.perf_counter() print('oldreader header', t1-t0, 's') print('oldreader data', t2-t1, 's') print('oldreader toal', t2-t0, 's') for seg in bl2.segments: print('seg', seg.index) for anasig in seg.analogsignals: print(' AnalogSignal', anasig.name, anasig.shape, anasig.t_start) for st in seg.spiketrains: print(' SpikeTrain', st.name, st.shape, st.waveforms.shape, st[:5]) for ev in seg.events: print(' Event', ev.name, ev.times.shape) print('*' * 10) compare_neo_content(bl1, bl2)
def test_read_segment(self): dirname = self.get_filename_path('Cheetah_v5.5.1/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) # read first segment entirely seg = nio.read_segment(seg_index=0, time_slice=None) self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 2) self.assertEqual(seg.analogsignals[0].sampling_rate, 32 * pq.kHz) self.assertEqual(len(seg.spiketrains), 2) # Testing different parameter combinations seg = nio.read_segment(seg_index=0, load_waveforms=True) self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(len(seg.spiketrains), 2) self.assertTrue(len(seg.spiketrains[0].waveforms) > 0) self.assertTrue(len(seg.events) > 0)
def test_keep_original_spike_times(self): for session in self.files_to_test: dirname = self.get_filename_path(session) nio = NeuralynxIO(dirname=dirname, keep_original_times=True) block = nio.read_block() for st in block.segments[0].spiketrains: filename = st.file_origin.replace('original_data', 'plain_data') if '.nse' in st.file_origin: filename = filename.replace('.nse', '.txt') times_column = 0 plain_data = np.loadtxt(filename)[:, times_column] elif '.ntt' in st.file_origin: filename = filename.replace('.ntt', '.txt') times_column = 2 plain_data = np.loadtxt(filename)[:, times_column] # ntt files contain 4 rows per spike time plain_data = plain_data[::4] times = st.rescale(pq.microsecond).magnitude overlap = min(len(plain_data), len(times)) np.testing.assert_allclose(plain_data[:overlap], times[:overlap], rtol=1e-10)
def test_ncs(self): for session in self.files_to_test[ 1:2]: # in the long run this should include all files dirname = self.get_filename_path(session) nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() for anasig_id, anasig in enumerate( block.segments[0].analogsignals): chid = anasig.channel_index.channel_ids[anasig_id] chname = anasig.channel_index.channel_names[anasig_id].decode( 'UTF-8') # need to decode, unless keyerror chuid = (chname, chid) filename = nio.ncs_filenames[chuid][:-3] + 'txt' filename = filename.replace('original_data', 'plain_data') plain_data = np.loadtxt( filename)[:, 5:].flatten() # first columns are meta info overlap = 512 * 500 gain_factor_0 = plain_data[0] / anasig.magnitude[0, 0] np.testing.assert_allclose(plain_data[:overlap], anasig.magnitude[:overlap, 0] * gain_factor_0, rtol=0.01)
def test_read_block(self): """Read data in a certain time range into one block""" dirname = self.get_local_path('neuralynx/Cheetah_v5.5.1/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # Everything put in one segment self.assertEqual(len(block.segments), 2) seg = block.segments[0] self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 2) self.assertEqual(seg.analogsignals[0].sampling_rate, 32. * pq.kHz) self.assertEqual(len(seg.spiketrains), 2) # Testing different parameter combinations block = nio.read_block(load_waveforms=True) self.assertEqual(len(block.segments[0].analogsignals), 1) self.assertEqual(len(block.segments[0].spiketrains), 2) self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[0], block.segments[0].spiketrains[0].shape[0]) self.assertGreater(len(block.segments[0].events), 0)
def test_read_segment(self): dirname = self.get_filename_path('Cheetah_v5.7.4/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) seg = nio.read_segment(time_slice=None) self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 5) self.assertEqual(seg.analogsignals[0].sampling_rate, 32 * pq.kHz) self.assertEqual(len(seg.spiketrains), 0) # Testing different parameter combinations seg = nio.read_segment(lazy=True) self.assertEqual(len(seg.analogsignals[0]), 0) self.assertEqual(len(seg.spiketrains), 0) seg = nio.read_segment(load_waveforms=True) self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(len(seg.spiketrains), 0) self.assertTrue(len(seg.events) > 0)
def test_read_block(self): """Read data in a certain time range into one block""" dirname = self.get_filename_path('Cheetah_v5.6.3/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # There are two segments due to gap in recording self.assertEqual(len(block.segments), 2) for seg in block.segments: self.assertEqual(len(seg.analogsignals), 1) self.assertEqual(seg.analogsignals[0].shape[-1], 2) self.assertEqual(seg.analogsignals[0].sampling_rate, 2. * pq.kHz) self.assertEqual(len(seg.spiketrains), 8) # Testing different parameter combinations block = nio.read_block(lazy=True) self.assertEqual(len(block.segments[0].analogsignals[0]), 0) self.assertEqual(len(block.segments[0].spiketrains[0]), 0) block = nio.read_block(load_waveforms=True) self.assertEqual(len(block.segments[0].analogsignals), 1) self.assertEqual(len(block.segments[0].spiketrains), 8) self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[0], block.segments[0].spiketrains[0].shape[0]) # this is tetrode data, containing 32 samples per waveform self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[1], 4) self.assertEqual(block.segments[0].spiketrains[0].waveforms.shape[-1], 32) self.assertGreater(len(block.segments[0].events), 0) 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
def test_read_block(self): dirname = self.get_local_path('neuralynx/Pegasus_v2.1.1') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # Everything put in one segment seg = block.segments[0] self.assertEqual(len(seg.analogsignals), 0) # no ncs file available self.assertGreater(len(block.segments[0].events), 1) # single nev file available self.assertEqual(len(seg.spiketrains), 0) # no nse files available # Testing different parameter combinations block = nio.read_block(load_waveforms=True) self.assertEqual(len(block.segments[0].spiketrains), 0) self.assertGreater(len(block.segments[0].events), 1) block = nio.read_block(signal_group_mode='split-all') block = nio.read_block(signal_group_mode='group-by-same-units')
def test_exclude_filename(self): dname = self.get_local_path('neuralynx/Cheetah_v5.7.4/original_data/') # exclude a single file nio = NeuralynxIO(dirname=dname, exclude_filename='CSC1.ncs', use_cache=False) block = nio.read_block() self.assertTrue(len(block.segments[0].analogsignals) > 0) self.assertTrue((len(block.segments[0].spiketrains)) >= 0) self.assertTrue((len(block.segments[0].events)) >= 0) self.assertTrue((len(block.segments[0].epochs)) == 0) # exclude all ncs files from session exclude_files = [f'CSC{i}.ncs' for i in range(6)] nio = NeuralynxIO(dirname=dname, exclude_filename=exclude_files, use_cache=False) block = nio.read_block() self.assertTrue(len(block.segments[0].analogsignals) == 0) self.assertTrue((len(block.segments[0].spiketrains)) >= 0) self.assertTrue((len(block.segments[0].events)) >= 0) self.assertTrue((len(block.segments[0].epochs)) == 0)
def test_header_read(self): dirname = '/tmp/ncsTestData/Cheetah_v5.3.1_digital' nio = NeuralynxIO(dirname=dirname, use_cache=False)