OSCR

Cortical representation of multidimensional handwriting movement and implications for neuroprostheses.

Code ↔ Paper

4 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 4 matches
  1. [1] § Results › Neural encoding of multidimensional handwriting movements ↔ full model-Fig4F-S8.py, lines 136–213 · score 0.60 · axis velocity, full model, firing rates, Vz, LNP, EMG
  2. [2] § Methods › Neural encoding: model-based encoding and evaluation ↔ bits_per_spike-Fig4.py, lines 35–66 · score 0.60 · mutual information, bits, firing rate, MI, metric, spike
  3. [3] § Results › Neural encoding of multidimensional handwriting movements ↔ encoding model-Fig4d-S7.py, lines 67–129 · score 0.56 · encoding model, grip force, firing rates, S7, Vxy, EMG
  4. [4] § Methods › Neural encoding: model-based encoding and evaluation ↔ full model-Fig4F-S8.py, lines 136–213 · score 0.54 · full model, axis velocity, EMG, pressure, variables, encoding

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 213 lines · 11 KB · GPL-3.0 · 2 matches

  1. import time
  2. from scipy.io import loadmat
  3. import numpy as np
  4. from torch.utils.data import DataLoader, TensorDataset
  5. import math
  6. import scipy.io as io
  7. from scipy.interpolate import interp1d
  8. import torch
  9. from sklearn import preprocessing
  10. def find_samesegments(arr):
  11. segments = []
  12. n = len(arr)
  13. if n == 0:
  14. return segments
  15. start_idx = 0
  16. for i in range(1, n):
  17. if arr[i] != arr[start_idx]:
  18. segments.append((start_idx, i - 1))
  19. start_idx = i
  20. segments.append((start_idx, n - 1))
  21. return segments
  22. def cal_spike_counts(predict):
  23. lambdas = predict.detach().cpu().numpy()
  24. spike_count = np.empty_like(lambdas)
  25. for i, lmbda_val in enumerate(lambdas):
  26. if np.isnan(lmbda_val):
  27. spike_count[i] = np.nan
  28. else:
  29. spike_count[i] = np.random.poisson(lmbda_val)
  30. spike_count = torch.tensor(spike_count, dtype=torch.float).to('cuda')
  31. return spike_count
  32. def fit_lnp(variables, spikes,num_epochs):
  33. dataset = TensorDataset(variables, spikes)
  34. batch_size = 256
  35. dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
  36. # Use a random vector of weights to start (mean 0, sd .1)
  37. w = torch.normal(0, 0.1, (1,14)).to('cuda').requires_grad_(True)
  38. optimizer = torch.optim.SGD([w], lr=1e-3)
  39. scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
  40. for epoch in range(num_epochs):
  41. start = time.time()
  42. total_log_lik = 0
  43. for X, y in dataloader:
  44. rate = torch.exp(torch.sum(X * w[0,0:13],dim=1) + w[0,-1]).float()
  45. # Compute the Poisson log likelihood
  46. log_lik = -(torch.unsqueeze(y, 0) @ torch.log(rate) - rate.sum())
  47. optimizer.zero_grad()
  48. log_lik.backward()
  49. optimizer.step()
  50. total_log_lik += log_lik.item()
  51. scheduler.step()
  52. avg_loss = total_log_lik / len(dataloader)
  53. end = time.time()
  54. print(f"Epoch {epoch + 1}/{num_epochs}, log_lik: {avg_loss:.4f}, time:{end - start:.4f}s")
  55. return w
  56. def predict_fr_lnp(variables, theta=None):
  57. yhat = torch.exp(torch.sum(variables * theta[0,0:13],dim=1) + theta[0,-1])
  58. return yhat
  59. # encoding of an example session
  60. data = loadmat('data0623.mat')
  61. bined_spk = data['bined_spk'] # neural data
  62. break_ind = data['break_ind']
  63. trial_mask = data['trial_mask']
  64. trial_target = data['trial_target']
  65. velocity_xy = data['velocity'][:2,:] # average handwriting data
  66. velocity_z = data['velocity'][2,:]
  67. Fgrip = data['Fgrip']/1000*9.8 # g -> N
  68. Fpres = data['Fpres']/1000*9.8
  69. data = loadmat('0623_s1.mat')
  70. emg = data['emg_data']
  71. # neurons with spike rate<1Hz were removed
  72. firing_rates = bined_spk / 0.2
  73. neuron_ind = np.where(np.mean(firing_rates,1) >= 1)[0]
  74. bined_spk = bined_spk[neuron_ind,:]
  75. num_epochs = 70
  76. stroke_ind = np.where(break_ind[0]>0)
  77. velocity_z[stroke_ind[0]] = 0
  78. # velocity normalization
  79. v_max = np.nanmax(velocity_xy)
  80. v_min = np.nanmin(velocity_xy)
  81. for i in range(velocity_xy.shape[0]):
  82. for j in range(velocity_xy.shape[1]):
  83. velocity_xy[i][j] = (2*(velocity_xy[i][j]-v_min)/(v_max-v_min))-1 #[-1,1]
  84. z_scale = max(np.abs(np.nanmin(velocity_z)),np.abs(np.nanmax(velocity_z)))
  85. velocity_z = velocity_z/z_scale
  86. velocity = torch.tensor(np.vstack([velocity_xy, velocity_z])).to('cuda')
  87. bined_spk = torch.tensor(bined_spk,dtype=torch.float).to('cuda')
  88. # grip force and pressure normalization
  89. min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
  90. Fgrip = (min_max_scaler.fit_transform(Fgrip.T)).T
  91. Fpres = (min_max_scaler.fit_transform(Fpres.T)).T
  92. # emg normalization
  93. emg_max = np.max(emg)
  94. emg_min = np.min(emg)
  95. for i in range(emg.shape[0]):
  96. for j in range(emg.shape[1]):
  97. emg[i][j] = (emg[i][j]-emg_min)/(emg_max-emg_min)
  98. handwriting_data = torch.cat((velocity,torch.tensor(Fgrip).to('cuda'),torch.tensor(Fpres).to('cuda'),torch.tensor(emg).to('cuda')),dim=0)
  99. for i_stroke in range(2):
  100. if i_stroke == 0:
  101. ind = np.where(break_ind[0] < 0) # cohesion ind
  102. print('cohesion')
  103. else:
  104. ind = np.where(break_ind[0] > 0) # stroke ind
  105. print('stroke')
  106. lamda_pre = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.double).to('cuda')# initialize the predicted firing rates
  107. lamda_pre_delV = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.double).to('cuda') # full moodel-Vel
  108. lamda_pre_delVz = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.double).to('cuda')# full moodel-Vz
  109. lamda_pre_delg = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.double).to('cuda') # full moodel-grip
  110. lamda_pre_delp = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.double).to('cuda') # full moodel-pres
  111. lamda_pre_delemg = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.double).to('cuda') # full moodel-emg
  112. spk_predict = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.float).to('cuda')# initialize the predicted spike
  113. spk_predict_delV = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.float).to('cuda') # full moodel-Vel
  114. spk_predict_delVz = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.float).to('cuda')# full moodel-Vz
  115. spk_predict_delg = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.float).to('cuda') # full moodel-grip
  116. spk_predict_delp = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.float).to('cuda') # full moodel-pres
  117. spk_predict_delemg = torch.zeros((bined_spk.shape[0], bined_spk.shape[1]), dtype=torch.float).to('cuda') # full moodel-emg
  118. # encode each neuron in turn
  119. for channel_num in range(bined_spk.shape[0]):
  120. bined_spk_channelnum = bined_spk[channel_num, :] # each neuron
  121. numbers = list(range(1, 31)) # 30 characters in this session
  122. for count in range(10): # 10 fold
  123. print(f'neuron:{channel_num + 1},fold:{count + 1}')
  124. test_numbers = np.array(numbers[:3])
  125. del numbers[:3]
  126. character_ind = np.where(trial_target == test_numbers)[0]
  127. test_indices = np.where(trial_mask[0].reshape(-1, 1) == (character_ind + 1))[0] # character index for test
  128. tr_target_indices = np.setdiff1d(np.arange(len(trial_mask[0])), test_indices) # character index for training
  129. test_indices = np.intersect1d(ind, test_indices) # stroke/cohesion index for test
  130. tr_target_indices = np.intersect1d(ind, tr_target_indices) # stroke/cohesion index for training
  131. tr_idx = []
  132. seg_tr = find_samesegments(break_ind[0, tr_target_indices])
  133. for i_seg in range(len(seg_tr)):
  134. seg_s = bined_spk_channelnum.T[tr_target_indices[seg_tr[i_seg][0]]:tr_target_indices[seg_tr[i_seg][1]] + 1]
  135. if torch.any(seg_s.ne(0)):
  136. tr_idx.append(tr_target_indices[seg_tr[i_seg][0]:seg_tr[i_seg][1] + 1])
  137. tr_idx = np.concatenate(tr_idx)
  138. X_test, y_test = handwriting_data.T[test_indices], bined_spk_channelnum[test_indices] # test data
  139. X_train, y_train = handwriting_data.T[tr_idx], bined_spk_channelnum[tr_idx] # training data
  140. # remove each variable from the full model
  141. X_test_delV = X_test[:, 3:]
  142. X_test_delVz = torch.cat((X_test[:, :2], X_test[:, 3:]), dim=1)
  143. X_test_delg = torch.cat((X_test[:, :3], X_test[:, 4:]), dim=1)
  144. X_test_delp = torch.cat((X_test[:, :4], X_test[:, 5:]), dim=1)
  145. X_test_delemg = X_test[:, :5]
  146. # Fit LNP model
  147. theta_lnp = fit_lnp(X_train, y_train, num_epochs) # full model
  148. theta_lnp_delV = theta_lnp[:, 3:] # remove weights for velocity
  149. theta_lnp_delVz = torch.cat((theta_lnp[:, :2], theta_lnp[:, 3:]), dim=1) # remove weights for z-axis velocity
  150. theta_lnp_delg = torch.cat((theta_lnp[:, :3], theta_lnp[:, 4:]), dim=1) # remove weights for grip
  151. theta_lnp_delp = torch.cat((theta_lnp[:, :4], theta_lnp[:, 5:]), dim=1) # remove weights for pressure
  152. theta_lnp_delemg = torch.cat((theta_lnp[:, :5], theta_lnp[:, 13:]), dim=1) # remove weights for emg
  153. # test
  154. predict = predict_fr_lnp(X_test, theta_lnp) # predicted firing rate
  155. predict_delV = torch.exp(torch.sum(X_test_delV * theta_lnp_delV[0, :-1], dim=1) + theta_lnp_delV[0, -1])
  156. predict_delVz = torch.exp(torch.sum(X_test_delVz * theta_lnp_delVz[0, :-1], dim=1) + theta_lnp_delVz[0, -1])
  157. predict_delg = torch.exp(torch.sum(X_test_delg * theta_lnp_delg[0, :-1], dim=1) + theta_lnp_delg[0, -1])
  158. predict_delp = torch.exp(torch.sum(X_test_delp * theta_lnp_delp[0, :-1], dim=1) + theta_lnp_delp[0, -1])
  159. predict_delemg = torch.exp(torch.sum(X_test_delemg * theta_lnp_delemg[0, :-1], dim=1) + theta_lnp_delemg[0, -1])
  160. lamda_pre[channel_num, test_indices] = predict
  161. lamda_pre_delV[channel_num, test_indices] = predict_delV
  162. lamda_pre_delVz[channel_num, test_indices] = predict_delVz
  163. lamda_pre_delg[channel_num, test_indices] = predict_delg
  164. lamda_pre_delp[channel_num, test_indices] = predict_delp
  165. lamda_pre_delemg[channel_num, test_indices] = predict_delemg
  166. # predicted spike counts
  167. spk_predict[channel_num, test_indices] = cal_spike_counts(predict)
  168. spk_predict_delV[channel_num, test_indices] = cal_spike_counts(predict_delV)
  169. spk_predict_delVz[channel_num, test_indices] = cal_spike_counts(predict_delVz)
  170. spk_predict_delg[channel_num, test_indices] = cal_spike_counts(predict_delg)
  171. spk_predict_delp[channel_num, test_indices] = cal_spike_counts(predict_delp)
  172. spk_predict_delemg[channel_num, test_indices] = cal_spike_counts(predict_delemg)
  173. # save results
  174. if i_stroke == 0:
  175. io.savemat('cohesion/full.mat',{'spk_predict': spk_predict.detach().cpu().numpy(), 'lamda_pre': lamda_pre.detach().cpu().numpy()})
  176. io.savemat('cohesion/delV.mat', {'spk_predict': spk_predict_delV.detach().cpu().numpy(),'lamda_pre': lamda_pre_delV.detach().cpu().numpy()})
  177. io.savemat('cohesion/delVz.mat', {'spk_predict': spk_predict_delVz.detach().cpu().numpy(),'lamda_pre': lamda_pre_delVz.detach().cpu().numpy()})
  178. io.savemat('cohesion/delg.mat', {'spk_predict': spk_predict_delg.detach().cpu().numpy(),'lamda_pre': lamda_pre_delg.detach().cpu().numpy()})
  179. io.savemat('cohesion/delp.mat', {'spk_predict': spk_predict_delp.detach().cpu().numpy(),'lamda_pre': lamda_pre_delp.detach().cpu().numpy()})
  180. io.savemat('cohesion/delemg.mat', {'spk_predict': spk_predict_delemg.detach().cpu().numpy(),'lamda_pre': lamda_pre_delemg.detach().cpu().numpy()})
  181. else:
  182. io.savemat('stroke/full.mat',{'spk_predict': spk_predict.detach().cpu().numpy(), 'lamda_pre': lamda_pre.detach().cpu().numpy()})
  183. io.savemat('stroke/delV.mat', {'spk_predict': spk_predict_delV.detach().cpu().numpy(),'lamda_pre': lamda_pre_delV.detach().cpu().numpy()})
  184. io.savemat('stroke/delVz.mat', {'spk_predict': spk_predict_delVz.detach().cpu().numpy(),'lamda_pre': lamda_pre_delVz.detach().cpu().numpy()})
  185. io.savemat('stroke/delg.mat', {'spk_predict': spk_predict_delg.detach().cpu().numpy(),'lamda_pre': lamda_pre_delg.detach().cpu().numpy()})
  186. io.savemat('stroke/delp.mat', {'spk_predict': spk_predict_delp.detach().cpu().numpy(),'lamda_pre': lamda_pre_delp.detach().cpu().numpy()})
  187. io.savemat('stroke/delemg.mat', {'spk_predict': spk_predict_delemg.detach().cpu().numpy(),'lamda_pre': lamda_pre_delemg.detach().cpu().numpy()})

full model-Fig4F-S8.py at commit 97b0bc6, under GPL-3.0 · at the source

Overview

Authors: Zebin Wang1,2,3, Guangxiang Xu1,2,3, Bowen Yu1,2,3, Kedi Xu3, Junming Zhu4, Gang Pan1,5, Jianmin Zhang4, Yueming Wang2,5, Yaoyao Hao1,2,5
  1. The State Key Lab of Brain-Machine Intelligence, Zhejiang University,Hangzhou, China
  2. Nanhu Brain-Computer Interface Institute, Hangzhou, China
  3. Department of Biomedical Engineering, Zhejiang University,Hangzhou, China
  4. Department of Neurosurgery, Second Affiliated Hospital of Zhejiang University School of Medicine,Hangzhou, China
  5. College of Computer Science and Technology, Zhejiang University,Hangzhou, China
Journal: Nature communications, volume 17, issue 1, article 3966
Dates: received 29 January 2025; accepted 24 February 2026; published online 14 March 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1038/s41467-026-70536-7 · PMID 41832195 · PMCID PMC13133357 · OpenAlex W7135420386
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: other (modality), human (organism), systems (subfield)
Methods: Spectral & time-frequency, Connectivity, Statistics, Smoothing, state filtering, decompositions, Machine learning, Preprocessing, Single-unit activity, calcium imaging, Physiology & signal measures
Keywords: Motor cortex, Brain-machine interface
MeSH: Brain-Computer Interfaces*, Handwriting*, Motor Cortex*, Neural Prostheses*, Adult, Biomechanical Phenomena, Electromyography, Hand Strength, Humans, Male, Movement (* major topic)
Topic: Writing and Handwriting Education (Education, Social Sciences), according to OpenAlex
Funding: National Natural Science Foundation of China (62336007, STI2030); Zhejiang University (SN-ZJU-SIAS-002); Fundamental Research Funds for the Central Universities (2024ZFJH01-01, 2023ZFJH01-01)
Citations: cited by 1 paper (Europe PMC); 56 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

Its files are read in the Code ↔ Paper reader above, with 4 matches between paragraphs and lines of code.

yaoyao-hao/handwriting_codec

License: GPL-3.0
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 97b0bc6b3f4f6930986bc4684f7a4e42efd148f8, 3 December 2025
Languages: Python (5)
Size: 8 files, 5 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file, environment (requirements.txt)
Not found: CITATION.cff, tests, continuous integration, documentation
Tools: NumPy (5 files), SciPy (5 files), scikit-learn (4 files), PyTorch (3 files)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
7 files

Code availability statement

The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1038/s41467-026-70536-7.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 5 scripts, each with its path and the digest of its content;
  • 4 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data availability statement

The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1038/s41467-026-70536-7.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 9 authors, 2 keywords, 11 MeSH terms, 3 funders, 44 references.

Cite

This paper

Wang, Z., Xu, G., Yu, B., Xu, K., Zhu, J., Pan, G., Zhang, J., Wang, Y., & Hao, Y. (2026). Cortical representation of multidimensional handwriting movement and implications for neuroprostheses. Nature communications, 17(1), 3966. https://doi.org/10.1038/s41467-026-70536-7

BibTeX

@article{wang2026cortical,
author = {Wang, Zebin and Xu, Guangxiang and Yu, Bowen and Xu, Kedi and Zhu, Junming and Pan, Gang and Zhang, Jianmin and Wang, Yueming and Hao, Yaoyao},
title = {{Cortical representation of multidimensional handwriting movement and implications for neuroprostheses}},
journal = {Nature communications},
year = {2026},
month = mar,
volume = {17},
number = {1},
pages = {3966},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/s41467-026-70536-7},
url = {https://doi.org/10.1038/s41467-026-70536-7},
pmid = {41832195},
pmcid = {PMC13133357}
}

RIS

TY - JOUR
AU - Wang, Zebin
AU - Xu, Guangxiang
AU - Yu, Bowen
AU - Xu, Kedi
AU - Zhu, Junming
AU - Pan, Gang
AU - Zhang, Jianmin
AU - Wang, Yueming
AU - Hao, Yaoyao
TI - Cortical representation of multidimensional handwriting movement and implications for neuroprostheses
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/03/14
VL - 17
IS - 1
SP - 3966
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/s41467-026-70536-7
UR - https://doi.org/10.1038/s41467-026-70536-7
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41467-026-70536-7",
"type": "article-journal",
"title": "Cortical representation of multidimensional handwriting movement and implications for neuroprostheses",
"container-title": "Nature communications",
"author": [
{
"family": "Wang",
"given": "Zebin"
},
{
"family": "Xu",
"given": "Guangxiang"
},
{
"family": "Yu",
"given": "Bowen"
},
{
"family": "Xu",
"given": "Kedi"
},
{
"family": "Zhu",
"given": "Junming"
},
{
"family": "Pan",
"given": "Gang"
},
{
"family": "Zhang",
"given": "Jianmin"
},
{
"family": "Wang",
"given": "Yueming"
},
{
"family": "Hao",
"given": "Yaoyao"
}
],
"container-title-short": "Nat Commun",
"volume": "17",
"issue": "1",
"page": "3966",
"DOI": "10.1038/s41467-026-70536-7",
"PMID": "41832195",
"PMCID": "PMC13133357",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41467-026-70536-7",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
14
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s42003-026-10144-9 [code]
Low-power differencing feature extracts spiking-band activities for high-performance intracortical brain-computer interfaces.
Journal: Communications biology
In common: PyTorch, scikit-learn, SciPy, 1 other tool, 6 references, 3 authors
[2] doi:10.1038/s41467-026-71267-5 [code]
Human-like cognitive generalization for large models via mental representation-guided supervision.
Journal: Nature communications
In common: PyTorch, scikit-learn, SciPy, 1 other tool, 2 authors
[3] doi:10.1126/sciadv.adw3876 [code]
Intracortical brain-computer interface for navigation in virtual reality in macaque monkeys.
Journal: Science advances
In common: scikit-learn, SciPy, NumPy, systems, 4 references
[4] doi:10.1038/s41591-026-04414-6 [code]
Long-term independent use of an intracortical brain-computer interface for speech and cursor control.
Journal: Nature medicine
In common: SciPy, NumPy, 4 references
[5] doi:10.1162/imag.a.1265
Neurophysiological mechanisms of optimized graphomotor performance in biscriptuals.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: 4 references
[6] doi:10.1038/s41586-026-10653-x [code]
A mosaic of whole-body representations on the human precentral gyrus.
Journal: Nature
In common: PyTorch, scikit-learn, SciPy, 1 other tool, systems, 2 references
[7] doi:10.1016/j.neuroimage.2026.121837
Optimal location for gesture decoding in the sensorimotor cortex and implications for brain-computer interface research.
Journal: NeuroImage
In common: systems, 4 references
[8] doi:10.1038/s41467-026-75455-1 [code]
Shared latent representations of speech production for cross-patient speech decoding.
Journal: Nature communications
In common: PyTorch, scikit-learn, SciPy, 1 other tool, 2 references
[9] doi:10.1038/s41593-026-02258-4 [code]
Laminar organization of cellular microcircuits modulating human interictal epileptiform discharges.
Journal: Nature neuroscience
In common: scikit-learn, SciPy, NumPy, systems, 2 references
[10] doi:10.1038/s41467-026-75588-3 [code]
Frequency-dependent effects of motor thalamus deep brain stimulation on speech and swallowing.
Journal: Nature communications
In common: 4 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.