OSCR

Identifying maximal beta power from directional subthalamic local field potentials in Parkinson's disease.

Code ↔ Paper

1 match 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 1 match
  1. [1] § Methods › Feature extraction ↔ notebooks/1_bssu_clean_FFT_FOOOF.ipynb, lines 64–177 · score 0.60 · monopolar power, power spectra, peak, active, Spectral, band

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

Jupyter notebook · 519 lines · 15 KB · MIT · 1 match

  1. # %% [markdown]
  2. # # Removal of artifacts from time series and Fourier Transform to PSD
  3. # %%
  4. import os
  5. import sys
  6. import importlib
  7. from importlib import reload
  8. from dataclasses import dataclass, field, fields
  9. from itertools import compress
  10. import pandas as pd
  11. import numpy as np
  12. import matplotlib.pyplot as plt
  13. import ipywidgets as widgets
  14. from ipywidgets import interact, interact_manual
  15. from IPython.display import display
  16. import mplcursors
  17. #import mpld3
  18. from cycler import cycler
  19. import scipy
  20. import scipy.io as sio
  21. from scipy import signal
  22. from scipy.signal import spectrogram, hann, butter, filtfilt, freqz
  23. from scipy import stats
  24. import seaborn as sns
  25. import pingouin as pg
  26. import itertools
  27. from itertools import combinations
  28. from statannotations.Annotator import Annotator
  29. import statsmodels.api as sm
  30. import statsmodels.formula.api as smf
  31. from patsy import dmatrices
  32. import plotly.express as px
  33. from sklearn.linear_model import LogisticRegression
  34. from sklearn.model_selection import train_test_split, RepeatedStratifiedKFold, GridSearchCV
  35. from sklearn.metrics import classification_report
  36. from sklearn.decomposition import FastICA
  37. # import openpyxl
  38. # from openpyxl import Workbook, load_workbook
  39. # import xlrd
  40. import pickle
  41. import json
  42. import csv
  43. #mne
  44. import mne_bids
  45. import mne
  46. from mne.time_frequency import tfr_morlet
  47. from mne.stats import permutation_cluster_test
  48. from mne.preprocessing import ICA, create_ecg_epochs
  49. # TODO: add README file:
  50. # pip install pingouin
  51. # pip install statannotations
  52. # pip install fooof
  53. # pip install mpldatacursor
  54. # %%
  55. jennifer_user_path = os.getcwd()
  56. while jennifer_user_path[-14:] != 'jenniferbehnke':
  57. jennifer_user_path = os.path.dirname(jennifer_user_path)
  58. # directory to this Repository
  59. project_path = os.path.join(jennifer_user_path, 'code', 'Monopolar_power_estimation', 'monopolar_directional_beta')
  60. sys.path.append(project_path)
  61. os.chdir(project_path)
  62. import src.bssu.utils.find_folders as find_folders
  63. importlib.reload(find_folders)
  64. # import PyPerceive
  65. project_path = find_folders.chdir_repository("Py_Perceive")
  66. from PerceiveImport.classes import (
  67. main_class, modality_class, metadata_class,
  68. session_class, condition_class, task_class,
  69. contact_class, run_class
  70. )
  71. import PerceiveImport.methods.load_rawfile as load_rawfile
  72. import PerceiveImport.methods.find_folders as PyPerceive_find_folders
  73. import PerceiveImport.methods.metadata_helpers as metaHelpers
  74. # import meet
  75. project_path = find_folders.chdir_repository("meet")
  76. import meet as meet
  77. # import all functions from BetaSenSightLongterm
  78. project_path = find_folders.chdir_repository("BetaSenSightLongterm")
  79. # tfr, processing
  80. import src.monopolar_bssu.percept_lfp.artifact_cleaning as artifacts
  81. import src.monopolar_bssu.percept_lfp.FourierTransform_clean_data as FFT_clean
  82. import src.monopolar_bssu.percept_lfp.bssu_from_source_JSON as bssu_from_source_JSON
  83. import src.monopolar_bssu.percept_lfp.fooof_fit as fooof_fit
  84. # monopolar Referencing
  85. import src.bssu.monopolar.MonoRef_JLB as MonoRefJLB
  86. import src.bssu.monopolar.GroupMonopolarPSD as groupMonopol
  87. import src.bssu.monopolar.monoRef_weightPsdAverageByCoordinateDistance as MonoRefWeightedCoordinateDistance
  88. import src.bssu.monopolar.externalized_lfp as externalized
  89. import src.bssu.monopolar.monopol_method_comparison as monopol_comparison
  90. import src.bssu.monopolar.bssu_contacts_maximal_beta as bssu_contacts
  91. import src.bssu.monopolar.monoRef_Strelow as detec_strelow
  92. # Ranking Order
  93. import src.bssu.ranking.HighestRankedChannelPSD as highestRank
  94. import src.bssu.ranking.monopolPSDaverage_withinSubject as PSDaverageMonopol
  95. import src.bssu.ranking.BIPchannelGroups_ranks as BIP_ranks
  96. import src.bssu.ranking.Permutation_rankings as Permute_ranks
  97. # Clinical stimulation parameters
  98. import src.bssu.stimulation.activeStimulationContacts as activeStimContacts
  99. # utility functions
  100. import src.bssu.utils.loadResults as loadResults
  101. import src.bssu.utils.find_folders as find_folders
  102. import src.bssu.utils.writeGroupDataframes as writeGroupDF
  103. import src.bssu.utils.load_data_files as load_data
  104. import src.bssu.utils.monopol_comparison_helpers as mono_comp_helpers
  105. import src.bssu.utils.sub_session_dict as sub_session_dic
  106. # import Classes
  107. from src.bssu.classes import (metadataAnalysis_class, mainAnalysis_class, sessionAnalysis_class,
  108. channelAnalysis_class, featureAnalysis_class, frequencyBand_class)
  109. # import mni coordinates
  110. import src.bssu.mni.load_rotated_coordinates as load_mni
  111. importlib.reload(BSSuPsd)
  112. importlib.reload(MonoRefJLB)
  113. importlib.reload(loadResults)
  114. importlib.reload(highestRank)
  115. importlib.reload(groupMonopol)
  116. importlib.reload(PSDaverageMonopol)
  117. importlib.reload(FFpsd)
  118. importlib.reload(find_folders)
  119. importlib.reload(metadataAnalysis_class)
  120. importlib.reload(mainAnalysis_class)
  121. importlib.reload(sessionAnalysis_class)
  122. importlib.reload(channelAnalysis_class)
  123. importlib.reload(featureAnalysis_class)
  124. importlib.reload(frequencyBand_class)
  125. importlib.reload(PeakFrequency_psd)
  126. importlib.reload(power_spectra_plots)
  127. importlib.reload(BIP_channelGroups)
  128. importlib.reload(BIP_ranks)
  129. importlib.reload(activeStimContacts)
  130. importlib.reload(Permute_ranks)
  131. importlib.reload(BIP_perChannel)
  132. importlib.reload(load_mni)
  133. importlib.reload(writeGroupDF)
  134. importlib.reload(MonoRefWeightedCoordinateDistance)
  135. importlib.reload(load_data)
  136. importlib.reload(externalized)
  137. importlib.reload(monopol_comparison)
  138. importlib.reload(bssu_contacts)
  139. importlib.reload(mono_comp_helpers)
  140. importlib.reload(detec_strelow)
  141. importlib.reload(move_artifacts)
  142. importlib.reload(artifacts)
  143. importlib.reload(sub_session_dict)
  144. importlib.reload(FFT_clean)
  145. importlib.reload(bssu_from_source_JSON)
  146. importlib.reload(fooof_fit)
  147. # %%
  148. # load if you want to see complete Dataframes
  149. pd.set_option("display.max_rows", None)
  150. # %%
  151. # for interactive plots
  152. # %matplotlib ipympl
  153. # for static plots
  154. %matplotlib inline
  155. # %% [markdown]
  156. # ## 1. Run a script to clean ECG artifacts out of BSSU Channels
  157. # %% [markdown]
  158. # 1. Choose subjects and sessions that show ECG artifacts
  159. # 2. Visualize raw time series
  160. # 3. Fit ICA and visualize its components
  161. # 4. Pick which component contains the ECG artifact
  162. # 5. Clean the ECG artifact from the original data
  163. # 6. Plot the cleaned data and save
  164. # %%
  165. load_pyPerceive = artifacts.load_mne_object_pyPerceive(sub="059", session="fu12m", channel_group="SegmInterR")
  166. # %%
  167. load_pyPerceive.get_data()
  168. # %%
  169. load_json = bssu_from_source_JSON.load_json_data_if_perceive_error(sub="030", session="fu24m", condition="m0s0")
  170. # %%
  171. ecg_artifact_excel = artifacts.get_ecg_artifact_excel()
  172. # %% [markdown]
  173. # Run the cleaning script for each subject
  174. # %%
  175. clean_artifacts_one_sub_all_sessions = artifacts.ecg_cleaning("019")
  176. # %% [markdown]
  177. # %% [markdown]
  178. # Load 2D arrays of channel groups singularly
  179. # %%
  180. load_cleaned_pickle_file = FFT_clean.load_clean_data(sub="021", session="fu3m", channel_group="SegmInterR")
  181. load_cleaned_pickle_file
  182. # %%
  183. loadJSON = bssu_from_source_JSON.load_json_data_if_perceive_error(sub="030", session="fu24m", condition="m0s0")
  184. # %% [markdown]
  185. # ## 2. Plot the Power Spectra of the clean data
  186. # %%
  187. # plot the clean power spectra
  188. sub_list = ["017", "019", "021", "024", "025", "026", "028", "029", "030", "031", "032", "033", "036",
  189. "038", "040", "041", "045", "047", "048", "049", "050", "052", "055", "059", "060", "061", "062", "063", "065", "066"]
  190. filter_list = ["band-pass", "unfiltered"]
  191. for sub in sub_list:
  192. for filt in filter_list:
  193. plot_clean_power_spectra = FFT_clean.plot_power_spectrum(sub=sub, normalization="rawPsd", filter=filt)
  194. # %% [markdown]
  195. # ## 3. Write the JSON Files of the clean Power spectra in all normalization forms
  196. # - Important for running FOOOF afterwards
  197. # %%
  198. # write the cleaned data to a pickle file
  199. sub_list = ["017", "019", "021", "024", "025", "026", "028", "029", "030", "031", "032", "033", "036",
  200. "038", "040", "041", "045", "047", "048", "049", "050", "052", "055", "059", "060", "061", "062", "063", "065", "066"]
  201. for sub in sub_list:
  202. clean_data_file = FFT_clean.write_clean_json_files_with_psd(sub=sub)
  203. # %% [markdown]
  204. # Load the clean PSD file for each subject
  205. # %%
  206. clean_power_spectra = loadResults.load_sub_pickle_file(sub="017", filename="SPECTROGRAMPSD_clean")
  207. clean_power_spectra
  208. # %% [markdown]
  209. # ## 4. Run FOOOF for all clean power spectra
  210. # %%
  211. fooof_single_sub = fooof_fit.fooof_fit_single_cleaned(subject="019", fooof_version="v2")
  212. # %%
  213. fooof_all_subjects = fooof_fit.fooof_group_percept_clean(incl_sub= ["017", "019", "021", "024", "025", "026",
  214. "028", "029", "030", "031", "032", "033",
  215. "036", "038", "040", "041", "045", "047",
  216. "048", "049", "050", "052", "055", "059",
  217. "060", "061", "062", "063", "065", "066"], fooof_version="v2")
  218. # %% [markdown]
  219. # Read the group FOOOF file
  220. # %%
  221. loaded_fooof_result = loadResults.load_pickle_group_result(filename="fooof_group_data_percept", fooof_version="v2")
  222. loaded_fooof_result.head()
  223. # %% [markdown]
  224. # ## Plot raw time series from each subject hemisphere, session and channel group in M0S0
  225. # %%
  226. mne_object = artifacts.load_mne_object_pyPerceive(sub="033", session="fu12m", channel_group="SegmIntraL")
  227. # %%
  228. plot_time_series = artifacts.plot_ieeg_data(sub="024", session="fu18m", channel_group="SegmIntraL", ieeg_data=mne_object.get_data(), fig_title="raw_time_series")
  229. # %%
  230. plot_time_series = artifacts.plot_raw_time_series_before_MNE(sub="024", session="fu18m", channel_group="SegmIntraL")
  231. # %% [markdown]
  232. # Plot a group of raw time series...
  233. # %%
  234. time_series = artifacts.plot_raw_time_series(
  235. incl_sub=["024"],
  236. incl_session=["fu18m"],
  237. incl_condition=["m0s0"],
  238. )
  239. # %% [markdown]
  240. # FIT ICA
  241. # - n_components: if the artifact is strong, not many components needed
  242. # - include all EEG channels including those without ecg artifacts
  243. # - FastICA input must be 2D array: rows = time points, columns = channels
  244. # %%
  245. data = mne_object.get_data() # 2D shape (n_channels in rows, n_times in columns)
  246. # %%
  247. # Step 1: Initialize ICA
  248. # Function to fit data in shape (n_channels, n_times) to ICA
  249. # Output: tuple (ica_components, n_components)
  250. fit_ica = artifacts.fit_ica_on_channel_group(data)
  251. # %%
  252. ica_components = fit_ica[0]
  253. n_components = fit_ica[1]
  254. # %%
  255. # Step 2: Plot ICA components and visually inspect to find the component with the ECG artifact
  256. plot_components = artifacts.plot_ica_components(data)
  257. # %%
  258. # Step 3: Remove ECG artifact from data
  259. # %%
  260. # Step 3: Identify the component representing ECG artifact (replace 5 with the actual index)
  261. ecg_component_index = 5
  262. ecg_component = ica_components[:, ecg_component_index]
  263. # Step 3: Remove ECG artifact contribution from the initial EEG data
  264. # try different scaling of the ECG component
  265. scaled_ecg_component = 0.5 * ecg_component
  266. cleaned_ieeg_data = data.T - np.outer(scaled_ecg_component, ica.mixing_[:, ecg_component_index]) # both shape times x channels
  267. # Now, cleaned_ieeg_data contains the EEG data with the ECG artifact removed
  268. # Note: Depending on the scaling of the components, you might need to adjust the amplitude of the subtracted signal to achieve the desired artifact removal.
  269. # You may also need to experiment with the sign of the subtracted signal.
  270. # If the artifact is not completely removed, you can try multiplying the ECG component by a scaling factor before subtraction.
  271. # %%
  272. cleaned_ieeg_data.shape
  273. # %%
  274. # plot the cleaned channels
  275. cleaned_ieeg_data_transposed = cleaned_ieeg_data.T
  276. time_points = np.arange(cleaned_ieeg_data_transposed.shape[1])
  277. n_channels = cleaned_ieeg_data_transposed.shape[0]
  278. plt.figure(figsize=(100, 20))
  279. fig, axes = plt.subplots(n_channels, 1, figsize=(60, 2 * n_channels), sharex=True, sharey=True)
  280. for i in range(n_channels):
  281. axes[i].plot(time_points, cleaned_ieeg_data_transposed[i], label=f'Channel {i + 1}')
  282. axes[i].set_ylabel(f'Amplitude (Component {i + 1})')
  283. axes[n_channels - 1].set_xlabel('Time points')
  284. plt.tight_layout()
  285. plt.show()
  286. # %% [markdown]
  287. # Using MNE ICA: first re-create the raw MNE objects in PyPerceive and add the info chs kind: "dbs" or "ieeg"
  288. # - without a channel type ICA won't work
  289. # %%
  290. for chan in mne_object.info["chs"]:
  291. print(f"Channel Name: {chan['ch_name']}, Channel Type: {chan['kind']}")
  292. # %%
  293. mne_object.info["chs"]
  294. # %%
  295. #picks = mne.pick_types(mne_object.info, eeg=True, meg=False, stim=False, eog=False, exclude=[])
  296. all_picks = range(mne_object.info['nchan'])
  297. ica = ICA(n_components=20, random_state=97, max_iter="auto")
  298. ica.fit(mne_object, picks=all_picks)
  299. # %%
  300. ica.plot_components()
  301. plt.show()
  302. ica.exclude = [ecg_component_index] # Replace with the index of the ECG component
  303. cleaned_data = ica.apply(raw_data)
  304. plt.plot(cleaned_data[0]) # Replace 0 with the appropriate channel index
  305. plt.title('Cleaned Data without ECG Artifact')
  306. plt.show()
  307. # %%
  308. load_movement_artifact_table = loadResults.load_preprocessing_files(
  309. signal_filter="band-pass", table="movement_artifact_coord"
  310. )
  311. # %%
  312. table = load_movement_artifact_table
  313. table
  314. # %%
  315. clean_power_spectra_table = loadResults.load_preprocessing_files(
  316. table="cleaned_power_spectra"
  317. )
  318. clean_power_spectra_table
  319. # %%
  320. move_artifacts.plot_clean_power_spectra(signal_filter="band-pass")
  321. # %%
  322. hemisphere = "Right"
  323. # depending on hemisphere: define incl_contact
  324. incl_contact = {}
  325. if hemisphere == "Right":
  326. incl_contact["Right"] = ["RingR", "SegmIntraR", "SegmInterR"]
  327. elif hemisphere == "Left":
  328. incl_contact["Left"] = ["RingL", "SegmIntraL", "SegmInterL"]
  329. mainclass_sub = main_class.PerceiveData(
  330. sub = "017",
  331. incl_modalities= ["survey"],
  332. incl_session = ["fu3m"],
  333. incl_condition = ["m0s0"],
  334. incl_task = ["rest"],
  335. incl_contact=incl_contact[f"{hemisphere}"]
  336. )
  337. # %%
  338. for cont, contact in enumerate(incl_contact[f"{hemisphere}"]):
  339. time_series = getattr(mainclass_sub.survey, "fu3m")
  340. #time_series = getattr(mainclass_sub, "m0s0")
  341. #time_series = getattr(mainclass_sub.rest, contact)
  342. #time_series = time_series.run1.data
  343. # %%
  344. data = time_series.m0s0.rest.RingR.run1.data
  345. # %%
  346. channel_1=data.get_data()[0, :]
  347. # %%
  348. fig, ax = plt.subplots()
  349. lines = ax.plot(channel_1)
  350. ax.set_title("Mouse over a point")
  351. ax.plot(channel_1)
  352. x = np.arange(1, len(channel_1)+1)
  353. y = channel_1
  354. pos = []
  355. def onclick(event):
  356. pos.append([event.xdata,event.ydata])
  357. fig.canvas.mpl_connect('button_press_event', onclick)
  358. fig.show()
  359. # %%
  360. pos
  361. # %%
  362. time_series = move_artifacts.plot_raw_time_series(
  363. incl_sub=["024", "025"],
  364. incl_session=["fu3m", "fu12m"],
  365. incl_condition=["m0s0"],
  366. filter="band-pass"
  367. )
  368. # %%
  369. time_series["time_series"]
  370. # %%
  371. first = [x_list[0] for x_list in time_series["pos"]]
  372. second = [y_list[1] for y_list in time_series["pos"]]
  373. df = pd.DataFrame({"x": first, "y": second})
  374. df
  375. # %%
  376. # %% [markdown]
  377. # ## Plot Time Frequency Plots of all subject hemispheres
  378. # %%
  379. plot_time_frequency = TF.time_frequency(
  380. incl_sub=["017"],
  381. incl_session=["postop", "fu3m", "fu12m", "fu18m"],
  382. incl_condition=["m0s0"],
  383. filter_signal="band-pass"
  384. )
  385. # %%

1_bssu_clean_FFT_FOOOF.ipynb at commit 0a9fb48, under MIT · at the source

Overview

Authors: Jennifer K. Behnke1,2, Robert L. Peach3,4,5, Moritz Gerster6, Richard M. Köhler1, Jeroen G. V. Habets1,2, Johannes L. Busch1,2, Varvara Mathiopoulou1, Jonathan Kaplan1, Lucia K. Feldmann1, Juliette Vivien1,7, Chi Wang Ip3, Gerd-Helge Schneider8, Katharina Faust9, Patricia Krause1, Andrea A. Kühn1,2,10,11
  1. Movement Disorders and Neuromodulation Unit, Department of Neurology, Charité University Medicine,Berlin, Germany
  2. Berlin Institute of Health (BIH),Berlin, Germany
  3. Department of Neurology, University Hospital,Würzburg, Germany
  4. Department of Brain Sciences, Imperial College,London, UK
  5. UK Dementia Research Institute, Imperial College,London, UK
  6. Research Group Neural Interactions and Dynamics, Department of Neurology, Max Planck Institute for Human Cognitive and Brain Sciences,Leipzig, Germany
  7. Humboldt-Universität zu Berlin, Berlin School of Mind and Brain,Berlin, Germany
  8. Department of Neurosurgery, Charité University Medicine,Berlin, Germany
  9. Department of Neurosurgery, University Hospital,Düsseldorf, Germany
  10. NeuroCure Clinical Research Centre, Charité University Medicine,Berlin, Germany
  11. German Center for Neurodegenerative Diseases (DZNE),Berlin, Germany
Journal: NPJ Parkinson's disease, volume 12, issue 1, article 114
Dates: received 13 August 2025; accepted 28 April 2026; published online 8 May 2026
Type: Brief report · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41531-026-01380-1 · PMID 42103747 · PMCID PMC13156298 · OpenAlex W4414146149
Open access: gold, a free copy (OpenAlex)
Status: code verified
Methods: Spectral & time-frequency, Preprocessing, Statistics, Connectivity
Keywords: Neurology, Neuroscience
Topic: Neurological disorders and treatments (Neurology, Medicine), according to OpenAlex
Funding: BIH-Charité Junior Clinician Scientist Program; Deutsche Forschungsgemeinschaft (DFG) (424778381); DAAD; Deutsche Forschungsgemeinschaft, 424778381; Interdisziplinäres Zentrum für Klinische Forschung, Universitätsklinikum Würzburg; Michael J. Fox Foundation for Parkinson’s Research; Germany´s Excellence Strategy - EXC-2049 Project Neurocure - BrainLab (390688087); Lundbeck Foundation (R336-2020-1035)
Citations: not cited yet (Europe PMC); 24 references in the paper

Abstract

Accurate subthalamic beta activity could guide deep brain stimulation programming in Parkinson’s disease, but bipolar recordings complicate contact selection. In 39 patients, we validated three methods to estimate pseudo-monopolar beta power. Distance-weighted methods (Euclidean, Strelow) agreed consistently with the externalized “ground-truth” beta distribution. Maximal beta power across 20s windows was more stable in ring than in directional channels. Beta-contacts from all methods aligned with clinically active stimulation contacts one year after surgery.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

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

JKBehnke/monopolar_directional_beta

License: MIT
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 0a9fb4836c4e5fef615901c8639800101eba371e, 22 October 2024
Languages: Python (28), Jupyter (8)
Size: 40 files, 36 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file, 8 notebooks
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Matplotlib (1 file), MNE-Python (1 file), MNE-BIDS (1 file), NumPy (1 file), pandas (1 file), Pingouin (1 file), Plotly (1 file), scikit-learn (1 file), SciPy (1 file), seaborn (1 file), statannotations (1 file), statsmodels (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
3 files

Code availability

The underlying code for this study is available in the repository ‘monopolar_directional_beta’ and can be accessed via this link https://github.com/JKBehnke/monopolar_directional_beta.

Reproduced under the paper's license (CC BY), from the paper cited above.

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;
  • 1 script, each with its path and the digest of its content;
  • 1 match 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

No dataset and no data link were found in the paper.

Data availability

The data that support the findings of this study are available from the corresponding author upon reasonable request.

Reproduced under the paper's license (CC BY), from the paper cited above.

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, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 15 authors, 2 keywords, 8 funders, 24 references.

Cite

This paper

Behnke, J. K., Peach, R. L., Gerster, M., Köhler, R. M., Habets, J. G. V., Busch, J. L., Mathiopoulou, V., Kaplan, J., Feldmann, L. K., Vivien, J., Ip, C. W., Schneider, G.-H., Faust, K., Krause, P., & Kühn, A. A. (2026). Identifying maximal beta power from directional subthalamic local field potentials in Parkinson's disease. NPJ Parkinson's disease, 12(1), 114. https://doi.org/10.1038/s41531-026-01380-1

BibTeX

@article{behnke2026identifying,
author = {Behnke, Jennifer K. and Peach, Robert L. and Gerster, Moritz and Köhler, Richard M. and Habets, Jeroen G. V. and Busch, Johannes L. and Mathiopoulou, Varvara and Kaplan, Jonathan and Feldmann, Lucia K. and Vivien, Juliette and Ip, Chi Wang and Schneider, Gerd-Helge and Faust, Katharina and Krause, Patricia and Kühn, Andrea A.},
title = {{Identifying maximal beta power from directional subthalamic local field potentials in Parkinson's disease}},
journal = {NPJ Parkinson's disease},
year = {2026},
month = may,
volume = {12},
number = {1},
pages = {114},
publisher = {Nature Publishing Group},
issn = {2373-8057},
doi = {10.1038/s41531-026-01380-1},
url = {https://doi.org/10.1038/s41531-026-01380-1},
pmid = {42103747},
pmcid = {PMC13156298}
}

RIS

TY - JOUR
AU - Behnke, Jennifer K.
AU - Peach, Robert L.
AU - Gerster, Moritz
AU - Köhler, Richard M.
AU - Habets, Jeroen G. V.
AU - Busch, Johannes L.
AU - Mathiopoulou, Varvara
AU - Kaplan, Jonathan
AU - Feldmann, Lucia K.
AU - Vivien, Juliette
AU - Ip, Chi Wang
AU - Schneider, Gerd-Helge
AU - Faust, Katharina
AU - Krause, Patricia
AU - Kühn, Andrea A.
TI - Identifying maximal beta power from directional subthalamic local field potentials in Parkinson's disease
T2 - NPJ Parkinson's disease
J2 - NPJ Parkinsons Dis
PY - 2026
DA - 2026/05/08
VL - 12
IS - 1
SP - 114
SN - 2373-8057
PB - Nature Publishing Group
DO - 10.1038/s41531-026-01380-1
UR - https://doi.org/10.1038/s41531-026-01380-1
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41531-026-01380-1",
"type": "article-journal",
"title": "Identifying maximal beta power from directional subthalamic local field potentials in Parkinson's disease",
"container-title": "NPJ Parkinson's disease",
"author": [
{
"family": "Behnke",
"given": "Jennifer K."
},
{
"family": "Peach",
"given": "Robert L."
},
{
"family": "Gerster",
"given": "Moritz"
},
{
"family": "Köhler",
"given": "Richard M."
},
{
"family": "Habets",
"given": "Jeroen G. V."
},
{
"family": "Busch",
"given": "Johannes L."
},
{
"family": "Mathiopoulou",
"given": "Varvara"
},
{
"family": "Kaplan",
"given": "Jonathan"
},
{
"family": "Feldmann",
"given": "Lucia K."
},
{
"family": "Vivien",
"given": "Juliette"
},
{
"family": "Ip",
"given": "Chi Wang"
},
{
"family": "Schneider",
"given": "Gerd-Helge"
},
{
"family": "Faust",
"given": "Katharina"
},
{
"family": "Krause",
"given": "Patricia"
},
{
"family": "Kühn",
"given": "Andrea A."
}
],
"container-title-short": "NPJ Parkinsons Dis",
"volume": "12",
"issue": "1",
"page": "114",
"DOI": "10.1038/s41531-026-01380-1",
"PMID": "42103747",
"PMCID": "PMC13156298",
"ISSN": "2373-8057",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41531-026-01380-1",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
8
]
]
}
}

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.1016/j.cnp.2026.08.008 [code]
Subthalamic beta activity and neuroimaging concordance in deep brain stimulation: electrode placement and clinical outcomes.
Journal: Clinical neurophysiology practice
In common: statsmodels, seaborn, pandas, 3 other tools, extracellular electrophysiology (units, LFP), clinical / translational, 6 references
[2] doi:10.1002/ana.78206 [code]
Multimodal Image Guidance in Subthalamic Deep Brain Stimulation for Parkinson's Disease.
Journal: Annals of neurology
In common: seaborn, pandas, SciPy, 2 other tools, Parkinson's, clinical / translational, 4 references, author Andrea A Kühn
[3] doi:10.1038/s41531-026-01439-z [code]
DBSsync: combining intracranial and multimodal data to investigate new biomarkers in Parkinson's disease.
Journal: NPJ Parkinson's disease
In common: MNE-Python, pandas, SciPy, 2 other tools, Parkinson's, clinical / translational, 2 authors
[4] doi:10.34133/csbj.0042 [code]
Using Steady-State Visual Evoked Potentials to Characterize Wide-Ranging Retinopathy Linked to <i>CRB1</i>: Implications for Clinical Trials.
Journal: Computational and structural biotechnology journal
In common: MNE-BIDS, Pingouin, MNE-Python, 8 other tools, clinical / translational
[5] doi:10.1038/s41531-026-01531-4 [code]
Inconsistent subthalamic local field potential beta activity amid in- and antiphasic neuronal bursts.
Journal: NPJ Parkinson's disease
In common: MNE-Python, scikit-learn, pandas, 3 other tools, extracellular electrophysiology (units, LFP), Parkinson's, clinical / translational, 4 references
[6] doi:10.7554/elife.100605 [code]
Age-related changes in ‘cortical’ 1/f dynamics are linked to cardiac activity
Journal: n/a
In common: MNE-BIDS, Pingouin, MNE-Python, 7 other tools, 1 reference
[7] doi:10.1038/s41467-026-74824-0 [code]
Learning regularities in noise engages both neural predictive activity and representational changes.
Journal: Nature communications
In common: MNE-BIDS, Pingouin, MNE-Python, 7 other tools
[8] doi:10.1371/journal.pone.0343722 [code]
Comprehensive methodology for sample enrichment in EEG biomarker studies for Alzheimer's risk classification.
Journal: PloS one
In common: MNE-BIDS, Pingouin, MNE-Python, 7 other tools, clinical / translational
[9] doi:10.1002/alz.71649 [code]
Postmortem brain MRI reveals differential associations of subcortical and limbic volumes with cortical thinning and neurodegenerative pathologies.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: statannotations, Pingouin, Plotly, 7 other tools, Parkinson's
[10] doi:10.1016/j.ebiom.2026.106293 [code]
Dynamic neural states underpin motor symptom severity in Parkinson's disease: a longitudinal analysis of chronic cortico-subthalamic nucleus recordings.
Journal: EBioMedicine
In common: statsmodels, seaborn, pandas, 3 other tools, Parkinson's, 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.