Hybrid knowledge- and data-driven modelling for robust spike detection and sorting in human C-fiber microneurography.
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] § 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] § 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] § 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] § 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] § Results › Feature importance analysis ↔ scripts/feature_importance.py, lines 11–14 · score 0.67 · logistic regression, random forest, importance scores, classifier, models
- [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] § 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] § 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] § 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] § 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] § 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] § 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] § 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] § 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
- from snakemake.script import snakemake
- import pandas as pd
- import numpy as np
- from scipy.signal import find_peaks
- from tqdm.auto import tqdm
- from helper import (
- align_spike_to_fd_min,
- compute_window_bounds,
- extract_raw_values,
- check_if_background,
- rename_index,
- )
- tqdm.pandas()
- # read in dataframes s
- spikes = pd.read_pickle(snakemake.input.spikes)
- raw_data = pd.read_pickle(snakemake.input.raw_data)
- track_of_interest_label = snakemake.params.track_of_interest_label
- dataset_name = snakemake.params.name
- stimulations = pd.read_pickle(snakemake.input.stimulations)
- window_start_offset = snakemake.params.window_start_offset
- window_end_offset = snakemake.params.window_end_offset
- latency_difference_threshold = snakemake.params.latency_difference_threshold
- restrict_to_stimulus_ranges = snakemake.params.restrict_to_stimulus_ranges
- detection_threshold = snakemake.params.threshold
- use_absolute_latency_difference = snakemake.params.use_absolute_latency_difference
- peak_distance = snakemake.params.peak_distance
- peak_prominence = snakemake.params.peak_prominence
- evaluation_mode = snakemake.params.evaluation_mode
- # check if time ranges contain stimuli
- def contains_stimuli(stimulations, time_ranges):
- time_range_flags = {}
- for time_range_index in range(len(time_ranges)):
- for stim in stimulations:
- if (stim > time_ranges[time_range_index][0]) & (
- stim < time_ranges[time_range_index][1]
- ):
- time_range_flags[time_ranges[time_range_index]] = 1
- return time_range_flags
- # remove stimulation artifacts from detected spikes
- def remove_stimulation_artifacts(
- indices, times_list, stimulations, artifact_duration=0.01
- ):
- indices_copy = list(indices)
- for index in indices:
- timing = times_list[index]
- for stim in stimulations:
- # duration of stimulus not longer than 0.01 seconds
- if (timing > stim) and (timing < (stim + artifact_duration)):
- indices_copy.remove(index)
- return indices_copy
- # filter true spikes in time ranges for evaluation
- def filter_spikes_in_ranges(spikes, time_ranges):
- spike_in_range = False
- for start, end in time_ranges:
- spike_in_range |= (spikes["spike_ts"] >= start) & (spikes["spike_ts"] <= end)
- return spikes[spike_in_range]
- # function to evalute detection
- def evaluate_detection(true_spikes, detected_spikes, tolerance=0.002):
- true_spikes["matched"] = False
- detected_spikes["matched"] = False
- true_positive = 0
- # Match detected spikes to true spikes
- for i, true_spike in true_spikes.iterrows():
- in_range = detected_spikes[
- (detected_spikes["spike_ts"] >= (true_spike["spike_ts"] - tolerance))
- & (detected_spikes["spike_ts"] <= (true_spike["spike_ts"] + tolerance))
- & (~detected_spikes["matched"])
- ] # Unmatched spikes only
- if not in_range.empty:
- true_spikes.at[i, "matched"] = True
- if len(in_range) > 1:
- differences = in_range.apply(
- lambda row: np.abs(row.spike_ts - true_spike.spike_ts).min(), axis=1
- )
- index_with_smallest_difference = differences.idxmin()
- true_spikes.at[i, "matched"] = True
- detected_spikes.at[index_with_smallest_difference, "matched"] = True
- else:
- detected_spikes.at[in_range.index[0], "matched"] = True
- true_positive += 1
- false_negative = len(true_spikes) - true_positive
- false_positive = len(detected_spikes) - true_positive
- results = {
- "TP": true_positive,
- "FN": false_negative,
- "FP": false_positive,
- "Precision": (
- true_positive / (true_positive + false_positive)
- if true_positive + false_positive > 0
- else 0
- ),
- "Recall": (
- true_positive / (true_positive + false_negative)
- if true_positive + false_negative > 0
- else 0
- ),
- "F1": (
- (2 * true_positive / (2 * true_positive + false_positive + false_negative))
- if true_positive + false_positive + false_negative > 0
- else 0
- ),
- }
- return results
- # extract track of interest, specified before in config file
- spikes_of_interest = (
- spikes[spikes["track"] == track_of_interest_label]
- .reset_index(drop=False)
- .pipe(rename_index, "spike_idx")
- )
- spike_of_interest_times = spikes_of_interest.drop(["track"], axis=1)
- # label spikes and stimuli by their onset if they belong to the background or are extra spikes/stimuli
- spikes_of_interest = check_if_background(spikes_of_interest, "spike_ts")
- spikes_of_interest_background = spikes_of_interest[
- spikes_of_interest["is_background"] == True
- ].drop(["is_background"], axis=1)
- stimulations_of_interest = stimulations.reset_index()
- stimulations_of_interest = check_if_background(
- stimulations_of_interest, "stimulation_ts"
- ).set_index("stimulation_idx")
- stimulations_background = (
- stimulations_of_interest[stimulations_of_interest["is_background"] == True]
- .drop(["is_background"], axis=1)
- .reset_index(drop=True)
- .pipe(rename_index, "stimulation_idx")
- )
- # extract and align spikes from raw signal
- sio_background_window_iloc = (
- spikes_of_interest_background[["spike_ts"]]
- .progress_apply(
- align_spike_to_fd_min,
- args=(raw_data,),
- window_start_offset=window_start_offset,
- window_end_offset=window_end_offset,
- evaluation_mode=evaluation_mode,
- axis=0,
- )
- .progress_apply(
- compute_window_bounds,
- axis=1,
- result_type="expand",
- window_start_offset=-window_start_offset,
- window_end_offset=window_end_offset,
- )
- .rename(columns={0: "start_iloc", 1: "end_iloc"})
- )
- sio_background_raw = sio_background_window_iloc[
- ["start_iloc", "end_iloc"]
- ].progress_apply(extract_raw_values, args=(raw_data,), axis=1, result_type="expand")
- # add latency in ms
- spikes_of_interest_background["latency"] = -1 # np.nan
- spikes_of_interest_background["stimulation_ts"] = -1 # np.nan
- for matching_indices, row in stimulations_background.iterrows():
- stim_onset = row["stimulation_ts"]
- matching_rows = spikes_of_interest_background[
- (spikes_of_interest_background["spike_ts"] > stim_onset)
- & (spikes_of_interest_background["spike_ts"] <= stim_onset + 4)
- ]
- if len(matching_rows) > 0:
- latency = abs(stim_onset - matching_rows.spike_ts) * 1000
- spikes_of_interest_background.loc[matching_rows.index[0], "latency"] = round(
- float(latency.iloc[0]), 4
- )
- spikes_of_interest_background.loc[matching_rows.index[0], "stimulation_ts"] = (
- stim_onset
- )
- # if the latency jump/difference is greater than the threshold value, the speed of fiber correction slows down
- # and activity-dependent slowing was observed, this threshold is fiber dependent
- # limit search space for spike detection to segments with latency jumps greater than threshold
- # use abs for chemical data
- latency_diff = spikes_of_interest_background["latency"].diff()
- if use_absolute_latency_difference:
- latency_diff = latency_diff.abs()
- indices_latency_jumps = latency_diff[latency_diff >= latency_difference_threshold].index
- # determine the start of the signal segment to know where the search region begins
- onsets_segments_jumps = [
- spikes_of_interest_background.loc[index]["stimulation_ts"]
- for index in indices_latency_jumps
- ]
- print(onsets_segments_jumps)
- # collect time tanges of signal segments to apply spike detection only in these segments
- # if restrict_to_stimulus_ranges is set to True, only segments with stimuli are kept
- time_ranges = []
- stimulation_onsets = []
- for onset in onsets_segments_jumps:
- index = stimulations_background.index[
- stimulations_background["stimulation_ts"] == onset
- ].tolist()
- time_ranges.append(
- (
- stimulations_background.loc[index[0] - 1]["stimulation_ts"],
- stimulations_background.loc[index[0]]["stimulation_ts"],
- )
- )
- stimulation_onsets.append(
- stimulations_background.loc[index[0] - 1]["stimulation_ts"]
- )
- stimulation_onsets.append(stimulations_background.loc[index[0]]["stimulation_ts"])
- if restrict_to_stimulus_ranges:
- time_range_flags = contains_stimuli(stimulations, time_ranges)
- time_ranges = [
- time_range
- for time_range in time_ranges
- if time_range_flags.get(time_range, False)
- ]
- df_time_ranges = pd.DataFrame(time_ranges, columns=["start", "end"])
- # apply find_peaks for spike detection
- crossing_indices_scipy = {}
- times_list_scipy = {}
- amplitude_list_scipy = {}
- for index_time_range in range(len(time_ranges)):
- time_range_start = time_ranges[index_time_range][0]
- time_range_end = time_ranges[index_time_range][1]
- signal_piece = raw_data[time_range_start:time_range_end]
- peaks, _ = find_peaks(
- signal_piece,
- height=detection_threshold,
- distance=peak_distance,
- prominence=peak_prominence,
- )
- crossing_indices_scipy[index_time_range] = peaks
- times_list_scipy[index_time_range] = signal_piece.index
- amplitude_list_scipy[index_time_range] = signal_piece.values
- # iterate over each crossing and remove artifacts
- spike_times = []
- for k in crossing_indices_scipy:
- crossing_indices_scipy[k] = remove_stimulation_artifacts(
- crossing_indices_scipy[k], times_list_scipy[k], stimulations.values
- )
- for matching_indices in crossing_indices_scipy[k]:
- spike_times.append(times_list_scipy[k][matching_indices])
- # save detected spike times in dataframe
- spikes_detected = (
- pd.DataFrame({"spike_ts": spike_times})
- .reset_index(drop=True)
- .pipe(rename_index, "spike_idx")
- )
- # evaluate spike detection by comparing detected spikes with true spikes in the time ranges of interest
- # the ones with ground truth data
- # evaluate spike detection only if ground truth is available
- if evaluation_mode == "ground_truth":
- true_spikes_filtered = filter_spikes_in_ranges(
- spikes[spikes["track"] == track_of_interest_label], time_ranges
- )
- results = {"dataset": dataset_name, "detected_spikes_count": len(spikes_detected)}
- results_spike_detection = evaluate_detection(true_spikes_filtered, spikes_detected)
- final_dict = results | results_spike_detection
- df_result = pd.DataFrame.from_dict([final_dict])
- elif evaluation_mode == "background_spikes":
- df_result = pd.DataFrame(
- [
- {
- "dataset": dataset_name,
- "detected_spikes_count": len(spikes_detected),
- "TP": None,
- "FN": None,
- "FP": None,
- "Precision": None,
- "Recall": None,
- "F1": None,
- }
- ]
- )
- else:
- raise ValueError(f"Unknown evaluation_mode: {evaluation_mode}")
- # save dataframes and csv files
- spike_of_interest_times.to_csv(snakemake.output.spikes_of_interest_file)
- spikes_of_interest.to_pickle(snakemake.output.spikes_of_interest_df)
- spikes_detected.to_csv(snakemake.output.spikes_detected_file)
- spikes_detected.to_pickle(snakemake.output.spikes_detected_df)
- df_result.to_csv(snakemake.output.result_detection, index=False)
- df_time_ranges.to_csv(snakemake.output.time_ranges, index=False)
detection_via_thresholding.py at commit 8fda173, under MIT · at the source
Overview
- Institute of Neurophysiology, Uniklinik RWTH Aachen University,Aachen, Germany
- Department of Anesthesiology, Intensive Care, Emergency and Pain Medicine, University Hospital Würzburg, Center for Interdisciplinary Pain Medicine,Würzburg, Germany
- Research Group Neuroscience, Interdisciplinary Centre for Clinical Research (IZKF), Faculty of Medicine, RWTH Aachen University,Aachen, Germany
- Institute for Computational Biomedicine, RWTH Aachen University,Aachen, Germany
- Institute for Biomedical Informatics, Faculty of Medicine and University Hospital Cologne, University of Cologne,Cologne, Germany
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/
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
8fda173cd68efac4fca223ec09fa330b3a4bae35, 27 March 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
20 files
- Statistics/
Statistics2.R , R, 194 lines - Statistics/
Statistics2_spike.R , R, 186 lines - Statistics/
StatisticsCountData.R , R, 84 lines, 2 matches - Statistics/
StatisticsCountDataSpike , R, 88 lines, 2 matches.R - scripts/
create_nix.py , Python, 44 lines - scripts/
detection_via_thresholdi , Python, 307 lines, 3 matchesng.py - scripts/
feature_extraction.py , Python, 471 lines - scripts/
feature_importance.py , Python, 34 lines, 1 match - scripts/
helper.py , Python, 241 lines, 1 match - scripts/
model/ , Python, 224 linesone_class_svm.py - scripts/
model/ , Python, 189 lines, 1 matchsvm_model.py - scripts/
model/ , Python, 156 lines, 1 matchxgboost_model.py - scripts/
pre_processing.py , Python, 54 lines, 1 match - scripts/
pre_processing_classific , Python, 108 linesation.py - scripts/
read_in_data.py , Python, 151 lines - scripts/
select_best_model.py , Python, 47 lines - scripts/
templates_and_snr.py , Python, 149 lines - scripts/
templates_distance.py , Python, 73 lines, 2 matches - LICENSE, License, 21 lines
- README.md, Text, 146 lines
digital-c-fiber/spikesortingforspikingpatterns](https:
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://
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/
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://
BibTeX
@article{troglio2026hybr
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/
url = {https://
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/
VL - 16
IS - 1
SP - 8975
SN - 2045-2322
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"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":
"volume": "16",
"issue": "1",
"page": "8975",
"DOI": "10.1038/
"PMID": "41820449",
"PMCID": "PMC12987942",
"ISSN": "2045-2322",
"publisher": "Nature Publishing Group",
"URL": "https://
"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: eLifeIn 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 physiologyIn 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 biologyIn 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 reportsIn 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. ClinicalIn 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 sciencesIn 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 reportsIn 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 2 repositories of the authors' code, each at its verified commit and with its license, 18 scripts, and 14 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:383e43d4360900e2…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
