OSCR

Hybrid knowledge- and data-driven modelling for robust spike detection and sorting in human C-fiber microneurography.

Code ↔ Paper

14 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 14 matches · 4 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
  1. [1] § Methods › A knowledge- and data-driven spike sorting pipeline › Template-based identification of optimal units ↔ scripts/templates_distance.py, lines 10–64 · score 0.80 · squared error, absolute error, Template distance, spike templates, MAE, MSE
  2. [2] § Methods › Validation and evaluation methods › Statistical analysis › Comparing statistical models ↔ Statistics/StatisticsCountData.R, the whole file · a weak match · score 0.78 · dispersion ratio, model formula, negative Binomial, Poisson, Pearson, log
  3. [3] § Methods › Validation and evaluation methods › Statistical analysis › Comparing statistical models ↔ Statistics/StatisticsCountDataSpike.R, the whole file · a weak match · score 0.78 · dispersion ratio, model formula, negative Binomial, Poisson, Pearson, log
  4. [4] § Methods › A knowledge- and data-driven spike sorting pipeline › Spike classification using machine learning ↔ scripts/model/svm_model.py, lines 51–104 · score 0.71 · SVM model, Optuna, background spikes, Hyperparameter, XGBoost, F1 score
  5. [5] § Results › Feature importance analysis ↔ scripts/feature_importance.py, lines 11–14 · score 0.67 · logistic regression, random forest, importance scores, classifier, models
  6. [6] § Results › Template similarity as a pre-sorting indicator ↔ scripts/templates_distance.py, lines 10–64 · score 0.64 · square error, absolute error, template distance, MAE, RMSE, metrics
  7. [7] § Methods › A knowledge- and data-driven spike sorting pipeline › Spike classification using machine learning ↔ scripts/model/xgboost_model.py, lines 55–106 · score 0.62 · Optuna, background spikes, Hyperparameter, XGBoost, F1 score, fold
  8. [8] § Results › A computational pipeline for adaptive spike detection and sorting › The combo XGBoost + achieves the highest median F1-scorehe combo XGBoost + achieves the highest median F1-score ↔ Statistics/StatisticsCountData.R, the whole file · a weak match · score 0.60 · dispersion ratios, negative Binomial, AIC, residuals, TN, FN
  9. [9] § Results › A computational pipeline for adaptive spike detection and sorting › The combo XGBoost + achieves the highest median F1-scorehe combo XGBoost + achieves the highest median F1-score ↔ Statistics/StatisticsCountDataSpike.R, the whole file · a weak match · score 0.59 · dispersion ratios, negative Binomial, AIC, residuals, FN, TP
  10. [10] § Methods › A knowledge- and data-driven spike sorting pipeline › Spike detection with constrained search space ↔ scripts/detection_via_thresholding.py, lines 237–254 · score 0.57 · find_peaks, Spike detection, SciPy, thresholds
  11. [11] § Results › A computational pipeline for adaptive spike detection and sorting › Constraining the search space with latency information ↔ scripts/detection_via_thresholding.py, lines 190–199 · score 0.52 · latency jump, search space, thresholding, detection, segments
  12. [12] § Methods › A knowledge- and data-driven spike sorting pipeline › Data pre-processing ↔ scripts/helper.py, lines 41–100 · score 0.52 · negative peak, raw signal, alignment, derivative, window
  13. [13] § Methods › A knowledge- and data-driven spike sorting pipeline › Data pre-processing ↔ scripts/pre_processing.py, lines 20–39 · score 0.51 · negative peak, raw signal, derivative, pre, window
  14. [14] § Methods › A knowledge- and data-driven spike sorting pipeline › Spike detection with constrained search space ↔ scripts/detection_via_thresholding.py, lines 190–199 · score 0.51 · Search spaces, spike detection, threshold, chemically, activity, latency

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 · 307 lines · 11 KB · MIT · 3 matches

  1. from snakemake.script import snakemake
  2. import pandas as pd
  3. import numpy as np
  4. from scipy.signal import find_peaks
  5. from tqdm.auto import tqdm
  6. from helper import (
  7. align_spike_to_fd_min,
  8. compute_window_bounds,
  9. extract_raw_values,
  10. check_if_background,
  11. rename_index,
  12. )
  13. tqdm.pandas()
  14. # read in dataframes s
  15. spikes = pd.read_pickle(snakemake.input.spikes)
  16. raw_data = pd.read_pickle(snakemake.input.raw_data)
  17. track_of_interest_label = snakemake.params.track_of_interest_label
  18. dataset_name = snakemake.params.name
  19. stimulations = pd.read_pickle(snakemake.input.stimulations)
  20. window_start_offset = snakemake.params.window_start_offset
  21. window_end_offset = snakemake.params.window_end_offset
  22. latency_difference_threshold = snakemake.params.latency_difference_threshold
  23. restrict_to_stimulus_ranges = snakemake.params.restrict_to_stimulus_ranges
  24. detection_threshold = snakemake.params.threshold
  25. use_absolute_latency_difference = snakemake.params.use_absolute_latency_difference
  26. peak_distance = snakemake.params.peak_distance
  27. peak_prominence = snakemake.params.peak_prominence
  28. evaluation_mode = snakemake.params.evaluation_mode
  29. # check if time ranges contain stimuli
  30. def contains_stimuli(stimulations, time_ranges):
  31. time_range_flags = {}
  32. for time_range_index in range(len(time_ranges)):
  33. for stim in stimulations:
  34. if (stim > time_ranges[time_range_index][0]) & (
  35. stim < time_ranges[time_range_index][1]
  36. ):
  37. time_range_flags[time_ranges[time_range_index]] = 1
  38. return time_range_flags
  39. # remove stimulation artifacts from detected spikes
  40. def remove_stimulation_artifacts(
  41. indices, times_list, stimulations, artifact_duration=0.01
  42. ):
  43. indices_copy = list(indices)
  44. for index in indices:
  45. timing = times_list[index]
  46. for stim in stimulations:
  47. # duration of stimulus not longer than 0.01 seconds
  48. if (timing > stim) and (timing < (stim + artifact_duration)):
  49. indices_copy.remove(index)
  50. return indices_copy
  51. # filter true spikes in time ranges for evaluation
  52. def filter_spikes_in_ranges(spikes, time_ranges):
  53. spike_in_range = False
  54. for start, end in time_ranges:
  55. spike_in_range |= (spikes["spike_ts"] >= start) & (spikes["spike_ts"] <= end)
  56. return spikes[spike_in_range]
  57. # function to evalute detection
  58. def evaluate_detection(true_spikes, detected_spikes, tolerance=0.002):
  59. true_spikes["matched"] = False
  60. detected_spikes["matched"] = False
  61. true_positive = 0
  62. # Match detected spikes to true spikes
  63. for i, true_spike in true_spikes.iterrows():
  64. in_range = detected_spikes[
  65. (detected_spikes["spike_ts"] >= (true_spike["spike_ts"] - tolerance))
  66. & (detected_spikes["spike_ts"] <= (true_spike["spike_ts"] + tolerance))
  67. & (~detected_spikes["matched"])
  68. ] # Unmatched spikes only
  69. if not in_range.empty:
  70. true_spikes.at[i, "matched"] = True
  71. if len(in_range) > 1:
  72. differences = in_range.apply(
  73. lambda row: np.abs(row.spike_ts - true_spike.spike_ts).min(), axis=1
  74. )
  75. index_with_smallest_difference = differences.idxmin()
  76. true_spikes.at[i, "matched"] = True
  77. detected_spikes.at[index_with_smallest_difference, "matched"] = True
  78. else:
  79. detected_spikes.at[in_range.index[0], "matched"] = True
  80. true_positive += 1
  81. false_negative = len(true_spikes) - true_positive
  82. false_positive = len(detected_spikes) - true_positive
  83. results = {
  84. "TP": true_positive,
  85. "FN": false_negative,
  86. "FP": false_positive,
  87. "Precision": (
  88. true_positive / (true_positive + false_positive)
  89. if true_positive + false_positive > 0
  90. else 0
  91. ),
  92. "Recall": (
  93. true_positive / (true_positive + false_negative)
  94. if true_positive + false_negative > 0
  95. else 0
  96. ),
  97. "F1": (
  98. (2 * true_positive / (2 * true_positive + false_positive + false_negative))
  99. if true_positive + false_positive + false_negative > 0
  100. else 0
  101. ),
  102. }
  103. return results
  104. # extract track of interest, specified before in config file
  105. spikes_of_interest = (
  106. spikes[spikes["track"] == track_of_interest_label]
  107. .reset_index(drop=False)
  108. .pipe(rename_index, "spike_idx")
  109. )
  110. spike_of_interest_times = spikes_of_interest.drop(["track"], axis=1)
  111. # label spikes and stimuli by their onset if they belong to the background or are extra spikes/stimuli
  112. spikes_of_interest = check_if_background(spikes_of_interest, "spike_ts")
  113. spikes_of_interest_background = spikes_of_interest[
  114. spikes_of_interest["is_background"] == True
  115. ].drop(["is_background"], axis=1)
  116. stimulations_of_interest = stimulations.reset_index()
  117. stimulations_of_interest = check_if_background(
  118. stimulations_of_interest, "stimulation_ts"
  119. ).set_index("stimulation_idx")
  120. stimulations_background = (
  121. stimulations_of_interest[stimulations_of_interest["is_background"] == True]
  122. .drop(["is_background"], axis=1)
  123. .reset_index(drop=True)
  124. .pipe(rename_index, "stimulation_idx")
  125. )
  126. # extract and align spikes from raw signal
  127. sio_background_window_iloc = (
  128. spikes_of_interest_background[["spike_ts"]]
  129. .progress_apply(
  130. align_spike_to_fd_min,
  131. args=(raw_data,),
  132. window_start_offset=window_start_offset,
  133. window_end_offset=window_end_offset,
  134. evaluation_mode=evaluation_mode,
  135. axis=0,
  136. )
  137. .progress_apply(
  138. compute_window_bounds,
  139. axis=1,
  140. result_type="expand",
  141. window_start_offset=-window_start_offset,
  142. window_end_offset=window_end_offset,
  143. )
  144. .rename(columns={0: "start_iloc", 1: "end_iloc"})
  145. )
  146. sio_background_raw = sio_background_window_iloc[
  147. ["start_iloc", "end_iloc"]
  148. ].progress_apply(extract_raw_values, args=(raw_data,), axis=1, result_type="expand")
  149. # add latency in ms
  150. spikes_of_interest_background["latency"] = -1 # np.nan
  151. spikes_of_interest_background["stimulation_ts"] = -1 # np.nan
  152. for matching_indices, row in stimulations_background.iterrows():
  153. stim_onset = row["stimulation_ts"]
  154. matching_rows = spikes_of_interest_background[
  155. (spikes_of_interest_background["spike_ts"] > stim_onset)
  156. & (spikes_of_interest_background["spike_ts"] <= stim_onset + 4)
  157. ]
  158. if len(matching_rows) > 0:
  159. latency = abs(stim_onset - matching_rows.spike_ts) * 1000
  160. spikes_of_interest_background.loc[matching_rows.index[0], "latency"] = round(
  161. float(latency.iloc[0]), 4
  162. )
  163. spikes_of_interest_background.loc[matching_rows.index[0], "stimulation_ts"] = (
  164. stim_onset
  165. )
  166. # if the latency jump/difference is greater than the threshold value, the speed of fiber correction slows down
  167. # and activity-dependent slowing was observed, this threshold is fiber dependent
  168. # limit search space for spike detection to segments with latency jumps greater than threshold
  169. # use abs for chemical data
  170. latency_diff = spikes_of_interest_background["latency"].diff()
  171. if use_absolute_latency_difference:
  172. latency_diff = latency_diff.abs()
  173. indices_latency_jumps = latency_diff[latency_diff >= latency_difference_threshold].index
  174. # determine the start of the signal segment to know where the search region begins
  175. onsets_segments_jumps = [
  176. spikes_of_interest_background.loc[index]["stimulation_ts"]
  177. for index in indices_latency_jumps
  178. ]
  179. print(onsets_segments_jumps)
  180. # collect time tanges of signal segments to apply spike detection only in these segments
  181. # if restrict_to_stimulus_ranges is set to True, only segments with stimuli are kept
  182. time_ranges = []
  183. stimulation_onsets = []
  184. for onset in onsets_segments_jumps:
  185. index = stimulations_background.index[
  186. stimulations_background["stimulation_ts"] == onset
  187. ].tolist()
  188. time_ranges.append(
  189. (
  190. stimulations_background.loc[index[0] - 1]["stimulation_ts"],
  191. stimulations_background.loc[index[0]]["stimulation_ts"],
  192. )
  193. )
  194. stimulation_onsets.append(
  195. stimulations_background.loc[index[0] - 1]["stimulation_ts"]
  196. )
  197. stimulation_onsets.append(stimulations_background.loc[index[0]]["stimulation_ts"])
  198. if restrict_to_stimulus_ranges:
  199. time_range_flags = contains_stimuli(stimulations, time_ranges)
  200. time_ranges = [
  201. time_range
  202. for time_range in time_ranges
  203. if time_range_flags.get(time_range, False)
  204. ]
  205. df_time_ranges = pd.DataFrame(time_ranges, columns=["start", "end"])
  206. # apply find_peaks for spike detection
  207. crossing_indices_scipy = {}
  208. times_list_scipy = {}
  209. amplitude_list_scipy = {}
  210. for index_time_range in range(len(time_ranges)):
  211. time_range_start = time_ranges[index_time_range][0]
  212. time_range_end = time_ranges[index_time_range][1]
  213. signal_piece = raw_data[time_range_start:time_range_end]
  214. peaks, _ = find_peaks(
  215. signal_piece,
  216. height=detection_threshold,
  217. distance=peak_distance,
  218. prominence=peak_prominence,
  219. )
  220. crossing_indices_scipy[index_time_range] = peaks
  221. times_list_scipy[index_time_range] = signal_piece.index
  222. amplitude_list_scipy[index_time_range] = signal_piece.values
  223. # iterate over each crossing and remove artifacts
  224. spike_times = []
  225. for k in crossing_indices_scipy:
  226. crossing_indices_scipy[k] = remove_stimulation_artifacts(
  227. crossing_indices_scipy[k], times_list_scipy[k], stimulations.values
  228. )
  229. for matching_indices in crossing_indices_scipy[k]:
  230. spike_times.append(times_list_scipy[k][matching_indices])
  231. # save detected spike times in dataframe
  232. spikes_detected = (
  233. pd.DataFrame({"spike_ts": spike_times})
  234. .reset_index(drop=True)
  235. .pipe(rename_index, "spike_idx")
  236. )
  237. # evaluate spike detection by comparing detected spikes with true spikes in the time ranges of interest
  238. # the ones with ground truth data
  239. # evaluate spike detection only if ground truth is available
  240. if evaluation_mode == "ground_truth":
  241. true_spikes_filtered = filter_spikes_in_ranges(
  242. spikes[spikes["track"] == track_of_interest_label], time_ranges
  243. )
  244. results = {"dataset": dataset_name, "detected_spikes_count": len(spikes_detected)}
  245. results_spike_detection = evaluate_detection(true_spikes_filtered, spikes_detected)
  246. final_dict = results | results_spike_detection
  247. df_result = pd.DataFrame.from_dict([final_dict])
  248. elif evaluation_mode == "background_spikes":
  249. df_result = pd.DataFrame(
  250. [
  251. {
  252. "dataset": dataset_name,
  253. "detected_spikes_count": len(spikes_detected),
  254. "TP": None,
  255. "FN": None,
  256. "FP": None,
  257. "Precision": None,
  258. "Recall": None,
  259. "F1": None,
  260. }
  261. ]
  262. )
  263. else:
  264. raise ValueError(f"Unknown evaluation_mode: {evaluation_mode}")
  265. # save dataframes and csv files
  266. spike_of_interest_times.to_csv(snakemake.output.spikes_of_interest_file)
  267. spikes_of_interest.to_pickle(snakemake.output.spikes_of_interest_df)
  268. spikes_detected.to_csv(snakemake.output.spikes_detected_file)
  269. spikes_detected.to_pickle(snakemake.output.spikes_detected_df)
  270. df_result.to_csv(snakemake.output.result_detection, index=False)
  271. df_time_ranges.to_csv(snakemake.output.time_ranges, index=False)

detection_via_thresholding.py at commit 8fda173, under MIT · at the source

Overview

Authors: Alina Troglio1,2, Andrea Fiebig3, Anna Maxion4, Ekaterina Kutafina5, Barbara Namer2
  1. Institute of Neurophysiology, Uniklinik RWTH Aachen University,Aachen, Germany
  2. Department of Anesthesiology, Intensive Care, Emergency and Pain Medicine, University Hospital Würzburg, Center for Interdisciplinary Pain Medicine,Würzburg, Germany
  3. Research Group Neuroscience, Interdisciplinary Centre for Clinical Research (IZKF), Faculty of Medicine, RWTH Aachen University,Aachen, Germany
  4. Institute for Computational Biomedicine, RWTH Aachen University,Aachen, Germany
  5. Institute for Biomedical Informatics, Faculty of Medicine and University Hospital Cologne, University of Cologne,Cologne, Germany
Journal: Scientific reports, volume 16, issue 1, article 8975
Dates: received 11 June 2025; accepted 20 February 2026; published online 12 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41598-026-41561-9 · PMID 41820449 · PMCID PMC12987942 · OpenAlex W7135026704
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: extracellular electrophysiology (units, LFP) (modality), human (organism), pain (population), methods / tools (subfield)
Methods: Spectral & time-frequency, Preprocessing, Machine learning, Statistics, Evoked potentials, Connectivity, Single-unit activity, calcium imaging
Keywords: Microneurography, Spike detection, Spike sorting, Machine learning, Pain, Itch, C-fiber, Extracellular recording, Single-channel recording, Neuropathic pain
MeSH: Action Potentials*, Models, Neurological*, Nerve Fibers, Unmyelinated*, Boosting Machine Learning Algorithms, Humans, Machine Learning, Support Vector Machine (* major topic)
Topic: Neuroscience and Neural Engineering (Cellular and Molecular Neuroscience, Neuroscience), according to OpenAlex
Funding: Universität zu Köln (1017)
Citations: not cited yet (Europe PMC); 41 references in the paper

Abstract

Analyzing temporal spike patterns in C-fibers recorded via microneurography is challenging due to the use of a single recording electrode, waveform variability, and high similarity of spike shapes across neurons, limiting the interpretation of sensory coding, such as pain and itch. We present a computational pipeline combining peak detection and supervised classification for spike sorting to improve the analysis of discharges, identified through activity-dependent conduction velocity changes. In the knowledge-driven step, we extract spike templates from electrically evoked spikes obtained during low-frequency stimulation and focus on the “best” template as the fiber of interest. Spike detection is further restricted to intervals showing activity-dependent latency shifts, substantially reducing the search space compared to unsupervised clustering. In the data-driven steps, we systematically evaluate three feature sets and machine learning models: One-class SVM, SVM, and XGBoost. For the evaluation, we created a specialized stimulation protocol, providing reliable ground truth labels for all electrically evoked spikes, allowing precise spike time-locking. Compared to Spike2 software, our approach achieved higher F1-scores and reduced false positives, indicating improved spike sorting. Although XGBoost achieved the highest median F1-scores, optimal performance was dependent on individual combinations of feature sets and models for each recording. In some recordings with many nerve fibers and a low signal-to-noise ratio, reliable sorting was not feasible. This highlights the necessity to determine sortability and optimal configurations for individual recordings. To illustrate the potential of our approach to sensory spike train analysis, we present a proof-of-concept application of the pipeline to chemically induced C-fiber activity. These findings represent an important step toward reliable analysis of activity associated with pain and itch signaling.

Supplementary Information: The online version contains supplementary material available at 10.1038/s41598-026-41561-9.

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

Repositories

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

Digital-C-Fiber/SpikeSortingForSpikingPatterns

License: MIT
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 8fda173cd68efac4fca223ec09fa330b3a4bae35, 27 March 2026
Languages: Python (14), R (4)
Size: 35 files, 18 scripts
Software Heritage: not archived
Found in: “Software accessibility”
Holds: README, license file, environment (environment.yml)
Not found: CITATION.cff, tests, continuous integration, documentation
Tools: pandas (14 files), Snakemake (12 files), NumPy (11 files), SciPy (6 files), scikit-learn (5 files), ggpubr (4 files), glmmTMB (4 files), Matplotlib (4 files), broom (2 files), ggplot2 (2 files), lme4 (2 files), lmerTest (2 files), Neo (2 files), XGBoost (2 files)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
20 files

digital-c-fiber/spikesortingforspikingpatterns](https:

License: none: the authors keep all their rights
State: the link is dead, verified on 30 September 2026
Evidence: found in the paper
Software Heritage: not archived
Found in: “Data availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 30 September 2026: the link is dead
  • 30 September 2026: the link is dead

Software accessibility

The complete spike sorting pipeline, including data preprocessing, feature extraction, and classification, is openly available at https://github.com/Digital-C-Fiber/SpikeSortingForSpikingPatterns. The repository includes source code, documentation, and an example recording.

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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 18 scripts, each with its path and the digest of its content;
  • 14 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

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

Data availability

The raw datasets generated and/or analyzed during the current work are available from the corresponding author on reasonable request. The source code and selected test data are available on [https://github.com/Digital-C-Fiber/SpikeSortingForSpikingPatterns](https:/github.com/Digital-C-Fiber/SpikeSortingForSpikingPatterns).

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

Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 10 keywords, 7 MeSH terms, 1 funder, 34 references.

Cite

This paper

Troglio, A., Fiebig, A., Maxion, A., Kutafina, E., & Namer, B. (2026). Hybrid knowledge- and data-driven modelling for robust spike detection and sorting in human C-fiber microneurography. Scientific reports, 16(1), 8975. https://doi.org/10.1038/s41598-026-41561-9

BibTeX

@article{troglio2026hybrid,
author = {Troglio, Alina and Fiebig, Andrea and Maxion, Anna and Kutafina, Ekaterina and Namer, Barbara},
title = {{Hybrid knowledge- and data-driven modelling for robust spike detection and sorting in human C-fiber microneurography}},
journal = {Scientific reports},
year = {2026},
month = mar,
volume = {16},
number = {1},
pages = {8975},
publisher = {Nature Publishing Group},
issn = {2045-2322},
doi = {10.1038/s41598-026-41561-9},
url = {https://doi.org/10.1038/s41598-026-41561-9},
pmid = {41820449},
pmcid = {PMC12987942}
}

RIS

TY - JOUR
AU - Troglio, Alina
AU - Fiebig, Andrea
AU - Maxion, Anna
AU - Kutafina, Ekaterina
AU - Namer, Barbara
TI - Hybrid knowledge- and data-driven modelling for robust spike detection and sorting in human C-fiber microneurography
T2 - Scientific reports
J2 - Sci Rep
PY - 2026
DA - 2026/03/12
VL - 16
IS - 1
SP - 8975
SN - 2045-2322
PB - Nature Publishing Group
DO - 10.1038/s41598-026-41561-9
UR - https://doi.org/10.1038/s41598-026-41561-9
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41598-026-41561-9",
"type": "article-journal",
"title": "Hybrid knowledge- and data-driven modelling for robust spike detection and sorting in human C-fiber microneurography",
"container-title": "Scientific reports",
"author": [
{
"family": "Troglio",
"given": "Alina"
},
{
"family": "Fiebig",
"given": "Andrea"
},
{
"family": "Maxion",
"given": "Anna"
},
{
"family": "Kutafina",
"given": "Ekaterina"
},
{
"family": "Namer",
"given": "Barbara"
}
],
"container-title-short": "Sci Rep",
"volume": "16",
"issue": "1",
"page": "8975",
"DOI": "10.1038/s41598-026-41561-9",
"PMID": "41820449",
"PMCID": "PMC12987942",
"ISSN": "2045-2322",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41598-026-41561-9",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
12
]
]
}
}

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.7554/elife.110588 [code]
Opening the black box toward a modular approach to spike sorting.
Journal: eLife
In common: Neo, XGBoost, scikit-learn, 4 other tools, extracellular electrophysiology (units, LFP), methods / tools, 7 references
[2] doi:10.1113/jp290729 [code]
Modelling the memory of unmyelinated axons: Integration of a data-driven approach with physiological memory concept.
Journal: The Journal of physiology
In common: pandas, SciPy, Matplotlib, 1 other tool, 6 references
[3] doi:10.1016/j.patter.2026.101590 [code]
Density-based longitudinal neuron tracking in high-density electrophysiological recordings.
Journal: Patterns (New York, N.Y.)
In common: Neo, scikit-learn, pandas, 3 other tools, extracellular electrophysiology (units, LFP), 4 references
[4] doi:10.1093/cercor/bhag113 [code]
Long-term reliability and stability of parameterized resting state EEG: evidence from a five-year follow-up.
Journal: Cerebral cortex (New York, N.Y. : 1991)
In common: broom, lmerTest, lme4, 7 other tools, methods / tools
[5] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: XGBoost, broom, lme4, 7 other tools
[6] doi:10.1016/j.celrep.2026.117505 [code]
Impaired spatial coding and neuronal hyperactivity in the medial entorhinal cortex of aged APP knock-in mice.
Journal: Cell reports
In common: glmmTMB, broom, lmerTest, 5 other tools, extracellular electrophysiology (units, LFP)
[7] doi:10.1016/j.nicl.2026.104012 [code]
Structural-functional multilayer brain network properties and outcome of combined repetitive transcranial magnetic stimulation and psychotherapy for obsessive-compulsive disorder.
Journal: NeuroImage. Clinical
In common: XGBoost, lmerTest, lme4, 7 other tools
[8] doi:10.3390/ijms27135713 [code]
Chronic Administration of Marinobufagenin in Mice Causes Hyperlocomotion and Decrease in Anxiety by Altering Monoamine Turnover Unaccompanied by Motor Deficits or Oxidative Stress.
Journal: International journal of molecular sciences
In common: glmmTMB, broom, lmerTest, 5 other tools
[9] doi:10.1016/j.celrep.2026.117073 [code]
Single-cell epigenomics uncovers heterochromatin instability and transcription factor dysfunction during mouse brain aging.
Journal: Cell reports
In common: Snakemake, broom, lme4, 6 other tools
[10] doi:10.1162/imag.a.1321 [code]
Phase similarity between similar objects indicates representational merging across retrieval training but not sleep.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: broom, lmerTest, lme4, 6 other tools, 1 reference

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.