Skip to content

Commit 979ce2b

Browse files
committed
blackrockrawio filespec 3 - add support for nsx.
1 parent 0e89241 commit 979ce2b

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

neo/rawio/blackrockrawio.py

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)