Skip to content

Commit d786a0b

Browse files
authored
Merge pull request #1043 from JuliaSprenger/add/neuralynx_exclude_files
[Neuralynx] add 'exclude_filename' keyword
2 parents b384214 + 63c9015 commit d786a0b

File tree

4 files changed

+73
-3
lines changed

4 files changed

+73
-3
lines changed

neo/io/neuralynxio.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class NeuralynxIO(NeuralynxRawIO, BaseFromRaw):
2727
mode = 'dir'
2828

2929
def __init__(self, dirname='', filename='', use_cache=False, cache_path='same_as_resource',
30-
keep_original_times=False):
30+
exclude_filename=None, keep_original_times=False):
3131
"""
3232
Initialise IO instance
3333
@@ -41,13 +41,17 @@ def __init__(self, dirname='', filename='', use_cache=False, cache_path='same_as
4141
cache_path : str, optional
4242
Folder path to use for cache files.
4343
Default: 'same_as_resource'
44+
exclude_filename: str or list
45+
Filename or list of filenames to be excluded. Expects base filenames without
46+
directory path.
4447
keep_original_times : bool
4548
Preserve original time stamps as in data files. By default datasets are
4649
shifted to begin at t_start = 0*pq.second.
4750
Default: False
4851
"""
4952
NeuralynxRawIO.__init__(self, dirname=dirname, filename=filename, use_cache=use_cache,
50-
cache_path=cache_path, keep_original_times=keep_original_times)
53+
cache_path=cache_path, exclude_filename=exclude_filename,
54+
keep_original_times=keep_original_times)
5155
if self.rawmode == 'one-file':
5256
BaseFromRaw.__init__(self, filename)
5357
elif self.rawmode == 'one-dir':

neo/rawio/neuralynxrawio/neuralynxrawio.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ class NeuralynxRawIO(BaseRawIO):
7878
_ncs_dtype = [('timestamp', 'uint64'), ('channel_id', 'uint32'), ('sample_rate', 'uint32'),
7979
('nb_valid', 'uint32'), ('samples', 'int16', (NcsSection._RECORD_SIZE))]
8080

81-
def __init__(self, dirname='', filename='', keep_original_times=False, **kargs):
81+
def __init__(self, dirname='', filename='', exclude_filename=None, keep_original_times=False,
82+
**kargs):
8283
"""
8384
Initialize io for either a directory of Ncs files or a single Ncs file.
8485
@@ -90,6 +91,9 @@ def __init__(self, dirname='', filename='', keep_original_times=False, **kargs):
9091
filename: str
9192
name of a single ncs, nse, nev, or ntt file to include in dataset. If used,
9293
dirname must not be provided.
94+
exclude_filename: str or list
95+
name of a single ncs, nse, nev or ntt file or list of such files. Expects plain
96+
filenames (without directory path).
9397
keep_original_times:
9498
if True, keep original start time as in files,
9599
otherwise set 0 of time to first time in dataset
@@ -104,6 +108,7 @@ def __init__(self, dirname='', filename='', keep_original_times=False, **kargs):
104108
raise ValueError("One of dirname or filename must be provided.")
105109

106110
self.keep_original_times = keep_original_times
111+
self.exclude_filename = exclude_filename
107112
BaseRawIO.__init__(self, **kargs)
108113

109114
def _source_name(self):
@@ -152,6 +157,15 @@ def _parse_header(self):
152157
dirname, fname = os.path.split(self.filename)
153158
filenames = [fname]
154159

160+
if not isinstance(self.exclude_filename, (list, set, np.ndarray)):
161+
self.exclude_filename = [self.exclude_filename]
162+
163+
# remove files that were explicitly excluded
164+
if self.exclude_filename is not None:
165+
for excl_file in self.exclude_filename:
166+
if excl_file in filenames:
167+
filenames.remove(excl_file)
168+
155169
for filename in filenames:
156170
filename = os.path.join(dirname, filename)
157171

neo/test/iotest/test_neuralynxio.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,29 @@ def test_read_single_file(self):
189189
self.assertTrue((len(block.segments[0].events)) == 0)
190190
self.assertTrue((len(block.segments[0].epochs)) == 0)
191191

192+
def test_exclude_filename(self):
193+
dname = self.get_local_path(
194+
'neuralynx/Cheetah_v5.7.4/original_data/'
195+
)
196+
197+
# exclude a single file
198+
nio = NeuralynxIO(dirname=dname, exclude_filename='CSC1.ncs', use_cache=False)
199+
block = nio.read_block()
200+
self.assertTrue(len(block.segments[0].analogsignals) > 0)
201+
self.assertTrue((len(block.segments[0].spiketrains)) >= 0)
202+
self.assertTrue((len(block.segments[0].events)) >= 0)
203+
self.assertTrue((len(block.segments[0].epochs)) == 0)
204+
205+
# exclude all ncs files from session
206+
exclude_files = [f'CSC{i}.ncs' for i in range(6)]
207+
nio = NeuralynxIO(dirname=dname, exclude_filename=exclude_files,
208+
use_cache=False)
209+
block = nio.read_block()
210+
self.assertTrue(len(block.segments[0].analogsignals) == 0)
211+
self.assertTrue((len(block.segments[0].spiketrains)) >= 0)
212+
self.assertTrue((len(block.segments[0].events)) >= 0)
213+
self.assertTrue((len(block.segments[0].epochs)) == 0)
214+
192215

193216
class TestPegasus_v211(CommonNeuralynxIOTest, unittest.TestCase):
194217
pegasus_version = '2.1.1'

neo/test/rawiotest/test_neuralynxrawio.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,35 @@ def test_single_file_mode(self):
120120
self.assertEqual(len(rawio.header['signal_channels']), 0)
121121
self.assertEqual(len(rawio.header['event_channels']), 0)
122122

123+
def test_exclude_filenames(self):
124+
# exclude single ncs file from session
125+
dname = self.get_local_path('neuralynx/Cheetah_v5.6.3/original_data/')
126+
rawio = NeuralynxRawIO(dirname=dname, exclude_filename='CSC2.ncs')
127+
rawio.parse_header()
128+
129+
self.assertEqual(rawio._nb_segment, 2)
130+
self.assertEqual(len(rawio.ncs_filenames), 1)
131+
self.assertEqual(len(rawio.nev_filenames), 1)
132+
sigHdrs = rawio.header['signal_channels']
133+
self.assertEqual(sigHdrs.size, 1)
134+
self.assertEqual(sigHdrs[0][0], 'CSC1')
135+
self.assertEqual(sigHdrs[0][1], '58')
136+
self.assertEqual(len(rawio.header['spike_channels']), 8)
137+
self.assertEqual(len(rawio.header['event_channels']), 2)
138+
139+
# exclude multiple files from session
140+
rawio = NeuralynxRawIO(dirname=dname, exclude_filename=['Events.nev', 'CSC2.ncs'])
141+
rawio.parse_header()
142+
143+
self.assertEqual(rawio._nb_segment, 2)
144+
self.assertEqual(len(rawio.ncs_filenames), 1)
145+
self.assertEqual(len(rawio.nev_filenames), 0)
146+
sigHdrs = rawio.header['signal_channels']
147+
self.assertEqual(sigHdrs.size, 1)
148+
self.assertEqual(sigHdrs[0][0], 'CSC1')
149+
self.assertEqual(sigHdrs[0][1], '58')
150+
self.assertEqual(len(rawio.header['spike_channels']), 8)
151+
self.assertEqual(len(rawio.header['event_channels']), 0)
123152

124153
class TestNcsRecordingType(TestNeuralynxRawIO, unittest.TestCase):
125154
"""

0 commit comments

Comments
 (0)