Data from: Performance of intracortical microelectrode arrays in people with implanted brain-computer interfaces over a 20-year period
Data files
Sep 09, 2026 version files 84.73 GB
-
decoding_T10.tar.gz
4.62 GB
-
decoding_T11.tar.gz
21.24 GB
-
decoding_T2.tar.gz
4.37 GB
-
decoding_T3.tar.gz
616.04 MB
-
decoding_T5.tar.gz
11.34 GB
-
decoding_T6.tar.gz
6.92 GB
-
decoding_T7.tar.gz
4.42 GB
-
decoding_T8.tar.gz
14.18 GB
-
decoding_T9.tar.gz
11.73 GB
-
README.md
20.33 KB
-
yield_A1.tar.gz
28.76 MB
-
yield_S1.tar.gz
9.66 MB
-
yield_S2.tar.gz
9.49 MB
-
yield_S3.tar.gz
204.07 MB
-
yield_T1.tar.gz
139.94 MB
-
yield_T10.tar.gz
439.93 MB
-
yield_T11.tar.gz
966.56 MB
-
yield_T2.tar.gz
212.32 MB
-
yield_T3.tar.gz
61.33 MB
-
yield_T5.tar.gz
1.44 GB
-
yield_T6.tar.gz
176.28 MB
-
yield_T7.tar.gz
233.30 MB
-
yield_T8.tar.gz
864.81 MB
-
yield_T9.tar.gz
513.12 MB
Abstract
This dataset contains pre-processed neural recordings and task data used to evaluate the long-term performance of intracortical microelectrode arrays across the first 14 participants enrolled in the BrainGate and BrainGate2 clinical trials. Participants had one or two 96-channel "Utah" arrays placed in cortex, for a total of 20 arrays. Nineteen arrays were placed in the hand area of motor cortex, and one was placed in the middle frontal gyrus. The release includes recordings from 2,289 sessions used for array yield analyses and 729 closed-loop cursor-control sessions used for decoding analyses. The yield dataset contains one pre-processed neural recording for each included research session. The decoding dataset contains pre-processed neural recordings and associated task data from sessions in which participants attempted to use a brain-computer interface to move a computer cursor toward defined targets. Data are provided as session-level MATLAB .mat files grouped by dataset type and participant and distributed in participant-level .tar.gz archives.
Overview
This release contains pre-processed neural data used to evaluate long-term intracortical microelectrode array recording and movement-decoding performance in participants enrolled in the BrainGate and BrainGate2 pilot clinical trials. The dataset is intended to support reproduction and extension of the central analyses from the associated manuscript, including array yield, decoding signal-to-noise ratio (dSNR), tuning stability, and electrode-count scaling analyses.
The release is organized into two main datasets:
- yield (
yield_<participant_id>.tar.gz): recordings used to assess array yield. - decoding (
decoding_<participant_id>.tar.gz): closed-loop cursor-control recordings used to assess movement-intention decoding, tuning stability, and electrode-count scaling.
The data are provided as .mat files packaged by participant as .tar.gz archives.
Associated publication and code
Associated manuscript:
Hahn, N. V., Stein, E., BrainGate Consortium, Donoghue, J. P., Simeral, J. D., Hochberg, L. R., & Willett, F. R. Performance of intracortical microelectrode arrays in people with implanted brain-computer interfaces over a 20-year period.
Dataset DOI:
https://doi.org/10.5061/dryad.x0k6djj1h
Associated analysis code:
https://github.com/nptl-stanford/array-paper
Data summary
The study summarizes neural recording and decoding performance across the first 14 participants enrolled in the BrainGate and BrainGate2 clinical trials. Each participant had one or two 96-channel platinum-metalized Utah microelectrode arrays placed in cortex. Nineteen of the twenty arrays were placed in the hand area of motor cortex, and one was placed in the middle frontal gyrus.
The release contains two curated datasets:
| Dataset | Participants | Arrays | Sessions | Description |
|---|---|---|---|---|
| yield | 14 | 20 | 2,289 | One neural recording from each included research session, used to estimate array yield. |
| decoding | 9 | 14 | 729 | Closed-loop cursor-control sessions with (10 ms binned) neural recordings aligned to cursor and target positions, used to estimate movement decoding quality and related metrics. |
The decoding dataset is smaller because not every session included BCI cursor control, and because high-bandwidth neural data were not consistently available or alignable for all participants.
File organization
Dryad displays the release as a flat list of uploaded files:
| File | Description |
|---|---|
README.md |
Dataset documentation, including file organization, naming conventions, variable descriptions, and loading examples. |
decoding_T2.tar.gz |
Decoding dataset archive for participant T2; extracts to decoding/T2/*.mat. |
decoding_T3.tar.gz |
Decoding dataset archive for participant T3; extracts to decoding/T3/*.mat. |
decoding_T5.tar.gz |
Decoding dataset archive for participant T5; extracts to decoding/T5/*.mat. |
decoding_T6.tar.gz |
Decoding dataset archive for participant T6; extracts to decoding/T6/*.mat. |
decoding_T7.tar.gz |
Decoding dataset archive for participant T7; extracts to decoding/T7/*.mat. |
decoding_T8.tar.gz |
Decoding dataset archive for participant T8; extracts to decoding/T8/*.mat. |
decoding_T9.tar.gz |
Decoding dataset archive for participant T9; extracts to decoding/T9/*.mat. |
decoding_T10.tar.gz |
Decoding dataset archive for participant T10; extracts to decoding/T10/*.mat. |
decoding_T11.tar.gz |
Decoding dataset archive for participant T11; extracts to decoding/T11/*.mat. |
yield_S1.tar.gz |
Yield dataset archive for participant S1; extracts to yield/S1/*.mat. |
yield_S2.tar.gz |
Yield dataset archive for participant S2; extracts to yield/S2/*.mat. |
yield_S3.tar.gz |
Yield dataset archive for participant S3; extracts to yield/S3/*.mat. |
yield_A1.tar.gz |
Yield dataset archive for participant A1; extracts to yield/A1/*.mat. |
yield_T1.tar.gz |
Yield dataset archive for participant T1; extracts to yield/T1/*.mat. |
yield_T2.tar.gz |
Yield dataset archive for participant T2; extracts to yield/T2/*.mat. |
yield_T3.tar.gz |
Yield dataset archive for participant T3; extracts to yield/T3/*.mat. |
yield_T5.tar.gz |
Yield dataset archive for participant T5; extracts to yield/T5/*.mat. |
yield_T6.tar.gz |
Yield dataset archive for participant T6; extracts to yield/T6/*.mat. |
yield_T7.tar.gz |
Yield dataset archive for participant T7; extracts to yield/T7/*.mat. |
yield_T8.tar.gz |
Yield dataset archive for participant T8; extracts to yield/T8/*.mat. |
yield_T9.tar.gz |
Yield dataset archive for participant T9; extracts to yield/T9/*.mat. |
yield_T10.tar.gz |
Yield dataset archive for participant T10; extracts to yield/T10/*.mat. |
yield_T11.tar.gz |
Yield dataset archive for participant T11; extracts to yield/T11/*.mat. |
To extract all participant archives:
for archive in *.tar.gz; do
tar -xzf "$archive"
done
To extract a specific participant's decoding and yield files:
tar -xzf decoding_T10.tar.gz
tar -xzf yield_T10.tar.gz
Each archive expands into the dataset and participant directory. For example,
decoding/T10/
T10_day_294_decoding.mat
T10_day_<post_implant_day>_decoding.mat
...
yield/T10/
T10_day_<post_implant_day>_yield.mat
...
The .mat files can be loaded in MATLAB:
decoding_example = load("decoding/T10/T10_day_294_decoding.mat")
yield_example = load("yield/T5/T5_day_2218_yield.mat")
or Python:
from scipy.io import loadmat
decoding_example = loadmat(
"decoding/T10/T10_day_294_decoding.mat",
simplify_cells=True,
)
yield_example = loadmat(
"yield/T5/T5_day_2218_yield.mat",
simplify_cells=True,
)
File naming convention
Session files follow this naming pattern:
<participant_id>_day_<post_implant_day>_<dataset_type>.mat
where:
| Field | Description |
|---|---|
| participant_id | De-identified BrainGate participant identifier, such as T5, T10, S1, or A1. |
| post_implant_day | Integer day relative to array implantation. |
| dataset_type | Either "yield" or "decoding". |
Decoding dataset
The decoding dataset contains pre-processed neural recordings from sessions in which participants attempted to move a computer cursor toward defined targets. These sessions can be used to evaluate decoding quality.
The decoding files include aligned neural features, cursor positions, target positions, block metadata, and trial metadata. Task designs varied across sessions and participants and included target-directed cursor-control tasks such as Radial-8, grid tasks, Fitts tasks, and related variations.
For standardization, all neural time-series features in this release are provided in 10 ms bins.
Decoding file contents
Each decoding .mat file contains the following top-level variables.
| Variable | Type / shape | Description |
|---|---|---|
participant_id |
string | De-identified participant identifier. Example: "T10". |
post_implant_day |
scalar integer | Day post array placement. Example: 294. |
bin_size |
scalar float | Neural feature bin size in seconds (0.01). |
electrodes |
struct | Electrode metadata. Fields are described below. |
cursor_position |
n_time_bins x 2 float array |
Cursor position at each time bin in task coordinates. Column 0 is x-position and column 1 is y-position. |
target_position |
n_time_bins x 2 float array |
Target position at each time bin in task coordinates. Column 0 is x-position and column 1 is y-position. |
blocks |
struct | Block-level metadata. Fields are described below. |
trials |
struct | Metadata describing movement-attempt ("go") periods used as analysis intervals. Fields are described below. |
neural |
struct | Binned neural features. Fields are described below. |
electrodes struct
| Field | Shape | Description |
|---|---|---|
electrode_id |
n_electrodes |
Zero-based electrode identifier. For a single 96-channel array this ranges from 0 to 95. For files containing two arrays, this may range from 0 to 191. |
array |
n_electrodes |
Array label for each electrode, such as "lateral" or "medial". |
x |
n_electrodes |
Electrode x-coordinate on the Utah array grid. |
y |
n_electrodes |
Electrode y-coordinate on the Utah array grid. |
impedance |
n_electrodes |
Electrode impedance in kΩ. This field is present only for sessions with available impedance measurements. |
blocks struct
| Field | Shape | Description |
|---|---|---|
block_id |
n_blocks |
Identifier for each individual neural recording within a session. |
sample_start_index |
n_blocks |
Zero-based start index for each block in the time-series variables. |
sample_end_index |
n_blocks |
Zero-based exclusive end index for each block in the time-series variables. |
trials struct
The trials structure contains movement-attempt ("go") periods identified from the task data (changes in target positions and/or task-state signals).
| Field | Shape | Description | |
|---|---|---|---|
trial_start_index |
n_trials |
Zero-based index of the first time bin in each attempt/go period. | |
trial_end_index |
n_trials |
Zero-based exclusive index immediately after each attempt/go period. | |
block_id |
n_trials |
Block identifier associated with each attempt/go period. |
neural struct in decoding files
The neural struct contains 10 ms binned neural features with shape n_time_bins x n_electrodes.
| Field | Description |
|---|---|
sbp |
Spike band power feature. Spike band power reflects power in the 250-5000 Hz band and can capture low-amplitude spiking activity that may not produce clear threshold crossings. |
tx_3 |
Threshold crossing counts per bin using a -3.0 times the robust standard deviation of the voltage signal threshold multiplier. The robust standard deviation is estimated as 1.4826 times MAD, where MAD is the median absolute deviation of the voltage signal. |
tx_3_5 |
Same, using a -3.5 multiplier. |
tx_4 |
Same, using a -4.0 multiplier. |
tx_4_5 |
Same, using a -4.5 multiplier. |
tx_5 |
Same, using a -5.0 multiplier. |
tx_5_5 |
Same, using a -5.5 multiplier. |
Threshold crossing fields (tx_*) are given in units of counts per bin and spike-band power (sbp) is given in µV²
Note that analyses in the associated manuscript apply additional block-wise normalization before fitting decoding or encoding models.
Yield dataset
The yield dataset contains one neural recording from each included research session. These files were used to estimate array yield (the number of electrodes detecting spiking activity in an array) over time.
Yield files include electrode metadata, including impedance when available, firing rates across threshold settings used for determining spiking electrodes, mean spike waveform snippets for detected spiking electrodes, and binned threshold crossing features. No associated behavioral data are included in this dataset, and derived threshold crossings for dual-array participants may not be time aligned between arrays.
Yield file contents
Each yield .mat file contains the following top-level variables.
| Variable | Type / shape | Description |
|---|---|---|
participant_id |
string | De-identified participant identifier. Example: T5. |
post_implant_day |
scalar integer | Day after array placement. Example: 2218. |
bin_size |
scalar float | Neural feature bin size in seconds (0.01) |
electrodes |
struct | Electrode metadata. Fields are the same as in decoding files. |
firing_rates |
struct | Electrode-by-threshold firing-rate table. Fields are described below. |
spike_waveforms |
struct | Mean spike waveform snippets for electrodes with detected spiking activity. Fields are described below. |
neural |
struct | Binned threshold-crossing neural features. Fields are described below. |
firing_rates struct
The firing_rates struct is a long-format table with one row per electrode-threshold combination.
| Field | Shape | Description |
|---|---|---|
electrode_id |
n_rows |
Zero-based electrode identifier. |
threshold_description |
n_rows |
Threshold multiplier label, such as -3, -3.5, -4, -4.5, -5, or -5.5. |
threshold_value |
n_rows |
Numeric voltage threshold applied to the electrode for that threshold setting, in microvolts (µV). |
firing_rate |
n_rows |
Robust threshold-crossing rate in Hz for that electrode and threshold setting. |
Firing rates were calculated by counting threshold crossings within each complete, non-overlapping 10-second window, converting each count to a rate in hertz, and taking the median rate across windows.
spike_waveforms struct
| Field | Shape | Description |
|---|---|---|
electrode_id |
n_spiking_electrodes |
Zero-based electrode identifiers for electrodes with mean waveform snippets included. |
mean_waveforms |
n_spiking_electrodes x n_waveform_samples |
Robust mean spike waveform for each listed electrode, in µV. Rows correspond to electrodes and columns correspond to samples at 15 kHz. |
Waveform snippets were computed from preprocessed voltage traces. Preprocessing included decimation from 30 kHz to 15 kHz, band-pass filtering from 250–5000 Hz, linear regression referencing, and thresholding at −4.5 times the robust standard deviation of the voltage signal to identify threshold-crossing times. Mean waveforms were calculated by averaging waveform snippets within non-overlapping 10-second windows and then taking the sample-wise median across window-level means. Waveforms are reported in microvolts and are included for electrodes with a robust −4.5 threshold-crossing rate of at least 2 Hz.
This waveform estimator differs from the standard mean across all snippets used in the associated paper. The median of 10-second window means was found to be less sensitive to transient noise and was therefore used for the released waveform summaries. Consequently, released mean waveforms may differ slightly from the waveform summaries used in the paper.
neural struct in yield files
The yield neural structure is organized first by array name and then by threshold-crossing feature:
neural.<array_name>.<threshold_feature>
For example a dual array file may contain:
neural.lateral.tx_4_5
neural.medial.tx_4_5
and each matrix has shape:
n_time_bins_for_array x n_electrodes_for_array
Arrays from the same yield session can have different numbers of time bins and should not be assumed to be synchronized.
| Field | Description |
|---|---|
tx_3 |
Threshold crossing counts per bin using a -3.0 threshold multiplier. |
tx_3_5 |
Threshold crossing counts per bin using a -3.5 threshold multiplier. |
tx_4 |
Threshold crossing counts per bin using a -4.0 threshold multiplier. |
tx_4_5 |
Threshold crossing counts per bin using a -4.5 threshold multiplier. |
tx_5 |
Threshold crossing counts per bin using a -5.0 threshold multiplier. |
tx_5_5 |
Threshold crossing counts per bin using a -5.5 threshold multiplier. |
Threshold crossing fields are counts per bin.
De-identification
Participant identifiers are de-identified study identifiers. Calendar dates and direct personal identifiers are not included in these files. Timing is reported as day relative to implantation (post_implant_day).
Licensing and reuse
Dryad data are released under the Creative Commons Zero (CC0) waiver. As a courtesy, users are requested to cite the dataset and associated manuscript when reusing these data.
Contact
For questions about the dataset, contact:
Nick Hahn, nickhahn26@gmail.com
Frank Willett, fwillett@stanford.edu
Version notes
Version 1.0
Initial Dryad release. Use the latest Dryad version for analysis, as later versions may include corrections, additional documentation, or file packaging updates.
Human subjects data
No personally identifiable information (PII) is contained within this data
