5757import os
5858import pathlib
5959import copy
60+ import warnings
6061from collections import namedtuple , OrderedDict
6162
6263from neo .rawio .neuralynxrawio .ncssections import NcsSection , NcsSectionsFactory
@@ -75,10 +76,12 @@ class NeuralynxRawIO(BaseRawIO):
7576 dirname: str, default: ''
7677 Name of directory containing all files for a dataset. If provided, filename is
7778 ignored. But one of either dirname or filename is required.
78- filename: str, default: ''
79- Name of a single ncs, nse, nev, or ntt file to include in dataset. Will be ignored,
80- if dirname is provided. But one of either dirname or filename is required.
81- exclude_filename: str | list | None, default: None
79+ include_filenames: str | list | None, default: None
80+ Name of a single ncs, nse, nev or ntt file or list of such files. Will only include
81+ file names in the list. This can be plain filenames or fullpath or path relative to
82+ dirname.
83+ All files should be in a single path.
84+ exclude_filenames: str | list | None, default: None
8285 Name of a single ncs, nse, nev or ntt file or list of such files. Expects plain
8386 filenames (without directory path).
8487 None will search for all file types
@@ -128,32 +131,59 @@ class NeuralynxRawIO(BaseRawIO):
128131 ("channel_id" , "uint32" ),
129132 ("sample_rate" , "uint32" ),
130133 ("nb_valid" , "uint32" ),
131- ("samples" , "int16" , ( NcsSection ._RECORD_SIZE ) ),
134+ ("samples" , "int16" , NcsSection ._RECORD_SIZE ),
132135 ]
133136
134137 def __init__ (
135- self , dirname = "" , filename = "" , exclude_filename = None , keep_original_times = False , strict_gap_mode = True , ** kargs
138+ self ,
139+ dirname = "" ,
140+ include_filenames = None ,
141+ exclude_filenames = None ,
142+ keep_original_times = False ,
143+ strict_gap_mode = True ,
144+ filename = None ,
145+ exclude_filename = None ,
146+ ** kargs
136147 ):
137148
138- if dirname != "" :
139- self .dirname = dirname
140- self .rawmode = "one-dir"
141- elif filename != "" :
142- self .filename = filename
143- self .rawmode = "one-file"
149+ if not dirname :
150+ raise ValueError ("`dirname` cannot be empty." )
151+
152+ if filename is not None :
153+ include_filenames = [filename ]
154+ warnings .warn ("`filename` is deprecated and will be removed. Please use `include_filenames` instead" )
155+
156+ if exclude_filename is not None :
157+ if isinstance (exclude_filename , str ):
158+ exclude_filenames = [exclude_filename ]
159+ else :
160+ exclude_filenames = exclude_filename
161+ warnings .warn ("`exclude_filename` is deprecated and will be removed. Please use `exclude_filenames` instead" )
162+
163+ if include_filenames is None :
164+ include_filenames = []
165+ elif isinstance (include_filenames , str ):
166+ include_filenames = [include_filenames ]
167+
168+ if exclude_filenames is None :
169+ exclude_filenames = []
170+ elif isinstance (exclude_filenames , str ):
171+ exclude_filenames = [exclude_filenames ]
172+
173+ if include_filenames :
174+ self .rawmode = 'multiple-files'
144175 else :
145- raise ValueError ( "One of dirname or filename must be provided." )
176+ self . rawmode = "one-dir"
146177
178+ self .dirname = dirname
179+ self .include_filenames = include_filenames
180+ self .exclude_filenames = exclude_filenames
147181 self .keep_original_times = keep_original_times
148182 self .strict_gap_mode = strict_gap_mode
149- self .exclude_filename = exclude_filename
150183 BaseRawIO .__init__ (self , ** kargs )
151184
152185 def _source_name (self ):
153- if self .rawmode == "one-file" :
154- return self .filename
155- else :
156- return self .dirname
186+ return self .dirname
157187
158188 def _parse_header (self ):
159189
@@ -183,33 +213,24 @@ def _parse_header(self):
183213 event_annotations = []
184214
185215 if self .rawmode == "one-dir" :
186- filenames = sorted (os .listdir (self .dirname ))
187- dirname = self .dirname
216+ filenames = os .listdir (self .dirname )
188217 else :
189- if not os .path .isfile (self .filename ):
218+ filenames = self .include_filenames
219+
220+ filenames = [f for f in filenames if f not in self .exclude_filenames ]
221+ full_filenames = [os .path .join (self .dirname , f ) for f in filenames ]
222+
223+ for filename in full_filenames :
224+ if not os .path .isfile (filename ):
190225 raise ValueError (
191226 f"Provided Filename is not a file: "
192- f"{ self . filename } . If you want to provide a "
227+ f"{ filename } . If you want to provide a "
193228 f"directory use the `dirname` keyword"
194229 )
195230
196- dirname , fname = os .path .split (self .filename )
197- filenames = [fname ]
198-
199- if not isinstance (self .exclude_filename , (list , set , np .ndarray )):
200- self .exclude_filename = [self .exclude_filename ]
201-
202- # remove files that were explicitly excluded
203- if self .exclude_filename is not None :
204- for excl_file in self .exclude_filename :
205- if excl_file in filenames :
206- filenames .remove (excl_file )
207-
208231 stream_props = {} # {(sampling_rate, n_samples, t_start): {stream_id: [filenames]}
209232
210- for filename in filenames :
211- filename = os .path .join (dirname , filename )
212-
233+ for filename in full_filenames :
213234 _ , ext = os .path .splitext (filename )
214235 ext = ext [1 :] # remove dot
215236 ext = ext .lower () # make lower case for comparisons
0 commit comments