Skip to content

Commit be1a3c9

Browse files
committed
simple proposal for buffer_id in rawio
1 parent cf99680 commit be1a3c9

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

neo/rawio/baserawio.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,15 @@
8686

8787
error_header = "Header is not read yet, do parse_header() first"
8888

89+
_signal_buffer_dtype = [
90+
("name", "U64"), # not necessarily unique
91+
("id", "U64"), # must be unique
92+
]
93+
8994
_signal_stream_dtype = [
9095
("name", "U64"), # not necessarily unique
9196
("id", "U64"), # must be unique
97+
("buffer_id", "U64"),
9298
]
9399

94100
_signal_channel_dtype = [
@@ -100,6 +106,7 @@
100106
("gain", "float64"),
101107
("offset", "float64"),
102108
("stream_id", "U64"),
109+
("buffer_id", "U64"),
103110
]
104111

105112
# TODO for later: add t_start and length in _signal_channel_dtype

neo/rawio/spikeglxrawio.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
BaseRawIO,
6161
_signal_channel_dtype,
6262
_signal_stream_dtype,
63+
_signal_buffer_dtype,
6364
_spike_channel_dtype,
6465
_event_channel_dtype,
6566
)
@@ -140,15 +141,20 @@ def _parse_header(self):
140141
self._memmaps[key] = data
141142

142143
# create channel header
144+
signal_buffers = []
143145
signal_streams = []
144146
signal_channels = []
145147
for stream_name in stream_names:
146148
# take first segment
147149
info = self.signals_info_dict[0, stream_name]
148150

151+
buffer_id = stream_name
152+
buffer_name = stream_name
153+
signal_buffers.append((buffer_name, buffer_id))
154+
149155
stream_id = stream_name
150156
stream_index = stream_names.index(info["stream_name"])
151-
signal_streams.append((stream_name, stream_id))
157+
signal_streams.append((stream_name, stream_id, buffer_id))
152158

153159
# add channels to global list
154160
for local_chan in range(info["num_chan"]):
@@ -164,6 +170,7 @@ def _parse_header(self):
164170
info["channel_gains"][local_chan],
165171
info["channel_offsets"][local_chan],
166172
stream_id,
173+
buffer_id,
167174
)
168175
)
169176
# check sync channel validity
@@ -173,6 +180,7 @@ def _parse_header(self):
173180
if self.load_sync_channel and not info["has_sync_trace"]:
174181
raise ValueError("SYNC channel is not present in the recording. " "Set load_sync_channel to False")
175182

183+
signal_buffers = np.array(signal_buffers, dtype=_signal_buffer_dtype)
176184
signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype)
177185
signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype)
178186

@@ -213,6 +221,7 @@ def _parse_header(self):
213221
self.header = {}
214222
self.header["nb_block"] = 1
215223
self.header["nb_segment"] = [nb_segment]
224+
self.header["signal_buffers"] = signal_buffers
216225
self.header["signal_streams"] = signal_streams
217226
self.header["signal_channels"] = signal_channels
218227
self.header["spike_channels"] = spike_channels

neo/test/rawiotest/rawio_compliance.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from neo.rawio.baserawio import (
2121
_signal_channel_dtype,
2222
_signal_stream_dtype,
23+
_signal_buffer_dtype,
2324
_spike_channel_dtype,
2425
_event_channel_dtype,
2526
_common_sig_characteristics,
@@ -47,6 +48,12 @@ def header_is_total(reader):
4748
assert "nb_segment" in h, "`nb_segment`missing in header"
4849
assert len(h["nb_segment"]) == h["nb_block"]
4950

51+
assert "signal_buffers" in h, "signal_buffers missing in header"
52+
if h["signal_buffers"] is not None:
53+
dt = h["signal_buffers"].dtype
54+
for k, _ in _signal_buffer_dtype:
55+
assert k in dt.fields, f"{k} not in _ignal_buffers.dtype"
56+
5057
assert "signal_streams" in h, "signal_streams missing in header"
5158
if h["signal_streams"] is not None:
5259
dt = h["signal_streams"].dtype

0 commit comments

Comments
 (0)