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): """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(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), 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(lazy=True) self.assertEqual(len(block.segments[0].analogsignals[0]), 0) 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_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_keep_original_spike_times(self): for session in self.files_to_test: dirname = self.get_local_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: dirname = self.get_local_path(session) nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # check that data agrees in first segment first channel only for anasig_id, anasig in enumerate( block.segments[0].analogsignals): chid = int(anasig.array_annotations['channel_ids'][0]) chname = str(anasig.array_annotations['channel_names'][0]) chuid = (chname, chid) filename = nio.ncs_filenames[chuid][:-3] + 'txt' filename = filename.replace('original_data', 'plain_data') overlap = 512 * 500 if os.path.isfile(filename): plain_data = self._load_plaindata(filename, overlap) gain_factor_0 = plain_data[0] / anasig.magnitude[0, 0] numToTest = min(len(plain_data), len(anasig.magnitude[:, 0])) np.testing.assert_allclose( plain_data[:numToTest], anasig.magnitude[:numToTest, 0] * gain_factor_0, rtol=0.01, err_msg=" for file " + filename) else: warnings.warn( f'Could not find corresponding test file {filename}')
def test_read_block(self): dirname = self.get_local_path('neuralynx/Neuraview_v2/original_data') nio = NeuralynxIO(dirname=dirname, use_cache=False) bl = nio.read_block() # This dataset contains two event sets self.assertEqual(len(bl.segments[0].events), 2)
def test_gap_handling_v563(self): dirname = self.get_local_path('neuralynx/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)
def test_read_single_file(self): filename = self.get_local_path( 'neuralynx/Cheetah_v5.7.4/original_data/CSC1.ncs') nio = NeuralynxIO(filename=filename, 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_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_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_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_incomplete_block_handling_v632(self): dirname = self.get_filename_path('Cheetah_v6.3.2/incomplete_blocks') nio = NeuralynxIO(dirname=dirname, use_cache=False) block = nio.read_block() # known gap values n_gaps = 2 # so 3 segments, 3 anasigs by Channelindex self.assertEqual(len(block.segments), n_gaps + 1) self.assertEqual(len(block.channel_indexes[0].analogsignals), n_gaps + 1) for t, gt in zip(nio._sigs_t_start, [8408.806811, 8427.832053, 8487.768561]): self.assertEqual(np.round(t, 4), np.round(gt, 4)) for t, gt in zip(nio._sigs_t_stop, [8427.830803, 8487.768029, 8515.816549]): self.assertEqual(np.round(t, 4), np.round(gt, 4))
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_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)