@@ -179,44 +179,64 @@ def __init__(self, filename=None, nsx_override=None, nev_override=None,
179179 self .__nsx_header_reader = {
180180 '2.1' : self .__read_nsx_header_variant_a ,
181181 '2.2' : self .__read_nsx_header_variant_b ,
182- '2.3' : self .__read_nsx_header_variant_b }
182+ '2.3' : self .__read_nsx_header_variant_b ,
183+ '3.0' : self .__read_nsx_header_variant_b ,
184+ }
183185 self .__nsx_dataheader_reader = {
184186 '2.1' : self .__read_nsx_dataheader_variant_a ,
185187 '2.2' : self .__read_nsx_dataheader_variant_b ,
186- '2.3' : self .__read_nsx_dataheader_variant_b }
188+ '2.3' : self .__read_nsx_dataheader_variant_b ,
189+ '3.0' : self .__read_nsx_dataheader_variant_b
190+ }
187191 self .__nsx_data_reader = {
188192 '2.1' : self .__read_nsx_data_variant_a ,
189193 '2.2' : self .__read_nsx_data_variant_b ,
190- '2.3' : self .__read_nsx_data_variant_b }
194+ '2.3' : self .__read_nsx_data_variant_b ,
195+ '3.0' : self .__read_nsx_data_variant_b
196+ }
191197 self .__nsx_params = {
192198 '2.1' : self .__get_nsx_param_variant_a ,
193199 '2.2' : self .__get_nsx_param_variant_b ,
194- '2.3' : self .__get_nsx_param_variant_b }
200+ '2.3' : self .__get_nsx_param_variant_b ,
201+ '3.0' : self .__get_nsx_param_variant_b
202+ }
195203 # NEV
196204 self .__nev_header_reader = {
197205 '2.1' : self .__read_nev_header_variant_a ,
198206 '2.2' : self .__read_nev_header_variant_b ,
199- '2.3' : self .__read_nev_header_variant_c }
207+ '2.3' : self .__read_nev_header_variant_c ,
208+ '3.0' : self .__read_nev_header_variant_c ,
209+ }
200210 self .__nev_data_reader = {
201211 '2.1' : self .__read_nev_data_variant_a ,
202212 '2.2' : self .__read_nev_data_variant_a ,
203- '2.3' : self .__read_nev_data_variant_b }
213+ '2.3' : self .__read_nev_data_variant_b ,
214+ '3.0' : self .__read_nev_data_variant_b
215+ }
204216 self .__waveform_size = {
205217 '2.1' : self .__get_waveform_size_variant_a ,
206218 '2.2' : self .__get_waveform_size_variant_a ,
207- '2.3' : self .__get_waveform_size_variant_b }
219+ '2.3' : self .__get_waveform_size_variant_b ,
220+ '3.0' : self .__get_waveform_size_variant_b
221+ }
208222 self .__channel_labels = {
209223 '2.1' : self .__get_channel_labels_variant_a ,
210224 '2.2' : self .__get_channel_labels_variant_b ,
211- '2.3' : self .__get_channel_labels_variant_b }
225+ '2.3' : self .__get_channel_labels_variant_b ,
226+ '3.0' : self .__get_channel_labels_variant_b
227+ }
212228 self .__nonneural_evdicts = {
213229 '2.1' : self .__get_nonneural_evdicts_variant_a ,
214230 '2.2' : self .__get_nonneural_evdicts_variant_a ,
215- '2.3' : self .__get_nonneural_evdicts_variant_b }
231+ '2.3' : self .__get_nonneural_evdicts_variant_b ,
232+ '3.0' : self .__get_nonneural_evdicts_variant_b
233+ }
216234 self .__comment_evdict = {
217235 '2.1' : self .__get_comment_evdict_variant_a ,
218236 '2.2' : self .__get_comment_evdict_variant_a ,
219- '2.3' : self .__get_comment_evdict_variant_a }
237+ '2.3' : self .__get_comment_evdict_variant_a ,
238+ '3.0' : self .__get_comment_evdict_variant_a
239+ }
220240
221241 def _parse_header (self ):
222242
@@ -345,7 +365,7 @@ def _parse_header(self):
345365 sr = float (main_sampling_rate / self .__nsx_basic_header [nsx_nb ]['period' ])
346366 self .sig_sampling_rates [nsx_nb ] = sr
347367
348- if spec in ['2.2' , '2.3' ]:
368+ if spec in ['2.2' , '2.3' , '3.0' ]:
349369 ext_header = self .__nsx_ext_header [nsx_nb ]
350370 elif spec == '2.1' :
351371 ext_header = []
@@ -361,7 +381,7 @@ def _parse_header(self):
361381 if len (ext_header ) > 0 :
362382 signal_streams .append ((f'nsx{ nsx_nb } ' , str (nsx_nb )))
363383 for i , chan in enumerate (ext_header ):
364- if spec in ['2.2' , '2.3' ]:
384+ if spec in ['2.2' , '2.3' , '3.0' ]:
365385 ch_name = chan ['electrode_label' ].decode ()
366386 ch_id = str (chan ['electrode_id' ])
367387 units = chan ['units' ].decode ()
@@ -729,7 +749,7 @@ def __extract_nsx_file_spec(self, nsx_nb):
729749 nsx_file_id = np .fromfile (filename , count = 1 , dtype = dt0 )[0 ]
730750 if nsx_file_id ['file_id' ].decode () == 'NEURALSG' :
731751 spec = '2.1'
732- elif nsx_file_id ['file_id' ].decode () == 'NEURALCD' :
752+ elif nsx_file_id ['file_id' ].decode () in [ 'NEURALCD' , 'BRSMPGRP' ] :
733753 spec = '{}.{}' .format (
734754 nsx_file_id ['ver_major' ], nsx_file_id ['ver_minor' ])
735755 else :
@@ -798,7 +818,7 @@ def __read_nsx_header_variant_b(self, nsx_nb):
798818
799819 # basic header (file_id: NEURALCD)
800820 dt0 = [
801- ('file_id' , 'S8' ),
821+ ('file_id' , 'S8' ), # achFileType
802822 # file specification split into major and minor version number
803823 ('ver_major' , 'uint8' ),
804824 ('ver_minor' , 'uint8' ),
@@ -860,10 +880,12 @@ def __read_nsx_dataheader(self, nsx_nb, offset):
860880 """
861881 filename = '.' .join ([self ._filenames ['nsx' ], 'ns%i' % nsx_nb ])
862882
883+ ts_size = 'uint64' if self .__nsx_basic_header [nsx_nb ]['ver_major' ] >= 3 else 'uint32'
884+
863885 # dtypes data header
864886 dt2 = [
865887 ('header' , 'uint8' ),
866- ('timestamp' , 'uint32' ),
888+ ('timestamp' , ts_size ),
867889 ('nb_data_points' , 'uint32' )]
868890
869891 return np .memmap (filename , dtype = dt2 , shape = 1 , offset = offset , mode = 'r' )[0 ]
0 commit comments