OSCR

Circulating neuron-derived cfDNA for blood-based detection of Alzheimer's and other neurodegenerative conditions.

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] § Materials and methods › Differential methylation analysis and classifier development ↔ R/classify_ch3_reads.R, lines 56–159 · score 0.78 · collapse_windows, CpG position, mod diff, CH3, database, db
  2. [2] § Materials and methods › Differential methylation analysis and classifier development ↔ R/collapse_ch3_windows.R, lines 38–130 · score 0.66 · collapse windows, mod diff, CH3, database, db
  3. [3] § Materials and methods › DNA sequencing ↔ dorado/hts_utils/fastq_tags.cpp, lines 20–106 · score 0.64 · 400bps hac, dna r10, e8, dorado, basecalled, model
  4. [4] § Materials and methods › DNA sequencing ↔ dorado/hts_utils/HeaderMapper.cpp, lines 471–530 · score 0.63 · 400bps hac, dna r10, e8, ONT

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

R · 159 lines · 6.4 KB · other · 1 match

  1. #' Classify Reads as Case or Control Based on Methylation Profiles
  2. #'
  3. #' This function classifies reads in the `reads` table of a DuckDB database
  4. #' as either `"case"`, `"control"`, or `"unknown"` based on similarity
  5. #' to reference methylation fractions in a `key_table` (e.g., a collapsed windows file).
  6. #' Classification is based on how close the read's `mh_frac` is to the average
  7. #' case or control `mh_frac`, within a user-defined `meth_diff_threshold`.
  8. #'
  9. #' @param ch3_db Path to a DuckDB `.db` file created by this package (e.g., from `summarize_reads()`).
  10. #' @param table_name Character. Name of the output table to store classified reads (default: "classified_reads").
  11. #' @param reads_table Character. Name of the reads table in which you want to classify the reads (default: "reads").
  12. #' @param key_table Path to a CSV, TSV, or BED file generated by `collapse_windows()`. Must include the columns:
  13. #' `chrom`, `start`, `end`, `avg_mh_frac_control`, `avg_mh_frac_case`, and `avg_meth_diff`.
  14. #' @param case Character string used to label case reads (e.g., `"case"`).
  15. #' @param control Character string used to label control reads (e.g., `"control"`).
  16. #' @param meth_diff_threshold Numeric value specifying the maximum difference in `mh_frac` allowed
  17. #' to match either case or control averages. Must be less than half the minimum absolute value of
  18. #' `avg_meth_diff` to prevent ambiguous classifications.
  19. #'
  20. #' @return Invisibly returns the open database connection with a new table named `classified_reads`
  21. #' added to the database. This table includes:
  22. #' \itemize{
  23. #' \item \code{sample_name} – Sample identifier
  24. #' \item \code{read_id} – Unique read identifier
  25. #' \item \code{first_cpg_pos} – First CpG position of the read
  26. #' \item \code{last_cpg_pos} – Last CpG position of the read
  27. #' \item \code{mh_frac} – Methylation fraction of the read
  28. #' \item \code{classification} – `"case"`, `"control"`, or `"unknown"`
  29. #' }
  30. #'
  31. #' @details
  32. #' This function runs entirely in SQL for scalability. It performs an interval join
  33. #' between the `reads` table and the key table on `chrom` and CpG position range,
  34. #' then classifies each read based on proximity of `mh_frac` to either `avg_mh_frac_control` or `avg_mh_frac_case`.
  35. #'
  36. #' @examples
  37. #' \dontrun{
  38. #' classify_ch3_reads(
  39. #' ch3_db = "my_data.ch3.db",
  40. #' key_table = "key_table.csv",
  41. #' case = "treated",
  42. #' control = "untreated",
  43. #' meth_diff_threshold = 0.1
  44. #' )
  45. #' }
  46. #'
  47. #' @importFrom DBI dbConnect dbDisconnect dbExistsTable dbExecute dbWriteTable
  48. #' @importFrom duckdb duckdb
  49. #' @importFrom readr read_csv read_tsv
  50. #' @importFrom tools file_ext
  51. #' @importFrom dplyr tbl
  52. #' @importFrom glue glue
  53. #'
  54. #' @export
  55. classify_ch3_reads <- function(ch3_db,
  56. table_name = "classified_reads",
  57. reads_table = "reads",
  58. key_table,
  59. case,
  60. control,
  61. meth_diff_threshold = 0.1) {
  62. start_time <- Sys.time()
  63. ch3_db <- .ch3helper_connectDB(ch3_db)
  64. # Check if "mod_diff" table exists
  65. if (!dbExistsTable(ch3_db$con, reads_table)) {
  66. stop(glue("Error: Reads table not found in the database.
  67. Please run 'summarize_reads()' on database first to generate it."))
  68. }
  69. # Read in key_table and make sure the key_table looks like collapsed_windows...
  70. file_ext <- file_ext(key_table)
  71. if (file_ext == "csv") {
  72. annotation <- read_csv(key_table,
  73. show_col_types = FALSE)
  74. } else if (file_ext %in% c("bed", "tsv")) {
  75. annotation <- read_tsv(key_table,
  76. show_col_types = FALSE)
  77. } else {
  78. stop("Invalid file type. Only CSV, TSV, or BED files are supported.")
  79. }
  80. # Make sure key_table is a collapsed window format from collapse_windows().
  81. required_cols <- c("chrom", "start", "end", "avg_mh_frac_control", "avg_mh_frac_case", "avg_meth_diff")
  82. if (!all(required_cols %in% colnames(annotation))) {
  83. stop("\nMissing one or more required columns: start, end, avg_mh_frac_control, avg_meth_diff.\nkey_table must be a collapsed_windows table from the function collapse_windows().")
  84. }
  85. # Check to make sure threshold, make sure it is less than 1/2 of min_diff... make sure threshold doesn't overlap
  86. if (any(meth_diff_threshold >= abs(annotation$avg_meth_diff) / 2, na.rm = TRUE)) {
  87. stop("`\nmeth_diff_threshold` must be less than half the absolute value of all `avg_meth_diff` values.\nThis is to avoid overlapping in classification.\n")
  88. }
  89. # Upload annotation as a temporary table
  90. dbExecute(ch3_db$con, "DROP TABLE IF EXISTS temp_key_table;")
  91. dbWriteTable(ch3_db$con, "temp_key_table", annotation, temporary = TRUE)
  92. if (dbExistsTable(ch3_db$con, table_name))
  93. dbRemoveTable(ch3_db$con, table_name)
  94. query <- glue("
  95. CREATE TABLE {table_name} AS
  96. SELECT
  97. r.sample_name,
  98. r.read_id,
  99. r.first_cpg_pos,
  100. r.last_cpg_pos,
  101. r.mh_frac,
  102. CASE
  103. WHEN ABS(r.mh_frac - k.avg_mh_frac_control) <= {meth_diff_threshold} THEN '{control}'
  104. WHEN ABS(r.mh_frac - k.avg_mh_frac_case) <= {meth_diff_threshold} THEN '{case}'
  105. ELSE 'unknown'
  106. END AS classification
  107. FROM
  108. {reads_table} r
  109. JOIN
  110. temp_key_table k
  111. ON
  112. r.chrom = k.chrom
  113. AND r.first_cpg_pos <= k.end
  114. AND r.last_cpg_pos >= k.start")
  115. dbExecute(ch3_db$con, query)
  116. # Drop temporary tables
  117. dbExecute(ch3_db$con, "DROP TABLE IF EXISTS temp_key_table;")
  118. cat("\n")
  119. end_time <- Sys.time()
  120. total_time_difftime <- end_time - start_time
  121. # Convert the total_time_difftime object to numeric seconds for a reliable comparison
  122. total_seconds <- as.numeric(total_time_difftime, units = "secs")
  123. if (total_seconds > 60) {
  124. # If greater than 60 seconds, convert to numeric minutes for display
  125. total_minutes <- as.numeric(total_time_difftime, units = "mins")
  126. message("Classified reads table successfully created as '", table_name, "' in database!",
  127. "\nTime elapsed: ", round(total_minutes, 2), " minutes\n")
  128. } else {
  129. # Otherwise, display in numeric seconds
  130. message("Classified reads table successfully created as '", table_name, "' in database!",
  131. "\nTime elapsed: ", round(total_seconds, 2), " seconds\n")
  132. }
  133. ch3_db$current_table = table_name
  134. # print out table header for user
  135. print(head(tbl(ch3_db$con, table_name)))
  136. ch3_db <- .ch3helper_cleanup(ch3_db)
  137. invisible(ch3_db)
  138. }

classify_ch3_reads.R at commit 42977bd, under other · at the source

Overview

Authors: Chad Pollard1,2, Ryan Miller2,3, Isaac Stirland1,2, Mykle Keni1,2, Andrew Jenkins1,2, Erin Saito2, Jonathon T Hill1,2, Tim Jenkins1,2
  1. Department of Cell Biology & Physiology, Brigham Young University, Provo, UT, United States
  2. Resonant, LLC, Pleasant Grove, UT, United States
  3. Department of Biology, Brigham Young University, Provo, UT, United States
Institutions: Brigham Young University (United States)
Journal: Frontiers in neurology, volume 17, article 1822479
Dates: received 3 March 2026; accepted 8 June 2026; published online 6 August 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3389/fneur.2026.1822479 · PMID 42626456 · PMCID PMC13491437 · OpenAlex W7196980148
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), other (modality), human (organism), other condition (population), Alzheimer's / dementia (population), clinical / translational (subfield)
Methods: Spectral & time-frequency, Statistics, Smoothing, state filtering, decompositions, Machine learning
Keywords: Alzheimer’s disease, blood biomarkers, cell-free DNA, liquid biopsy, methylation, mild cognitive impairment, neurodegeneration, precision medicine
MeSH: Alzheimer Disease*, Cell-Free Nucleic Acids*, Neurodegenerative Diseases*, Neurons*, Amyotrophic Lateral Sclerosis, Biomarkers, DNA Methylation, Female, Humans, Male (* major topic)
Topic: Single-cell and spatial transcriptomics (Molecular Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Citations: not cited yet (Europe PMC); 97 references in the paper

Abstract

Blood-based biomarkers for neurodegenerative diseases are improving early detection and staging, but current assays primarily reflect aggregate neuropathology or generalized neuronal injury and do not resolve the specific neuronal populations affected. Circulating cell-free DNA (cfDNA) retains stable DNA methylation patterns reflective of tissue and cellular origin, making it a promising substrate for cell-of-origin analysis. However, conventional methylation approaches are limited by bisulfite-associated DNA damage and amplification-related bias, hindering the detection of neuron-derived cfDNA, a small fraction of total circulating cfDNA. Here, we present proof-of-concept evidence that native nanopore sequencing can support both brain methylation atlas generation and downstream cfDNA cell-of-origin classifier development in neurodegenerative disease. By directly profiling endogenous DNA methylation without bisulfite conversion or PCR amplification, nanopore sequencing preserves native molecules, reduces processing-related bias, and enables flexible, genome-wide methylation profiling that can be iteratively expanded as additional reference cell types are incorporated. Using whole-genome native nanopore sequencing, we generated a methylation reference atlas from six primary human neural cell populations—cortical neurons, dopaminergic neurons, spinal motor neurons, astrocytes, Schwann cells, and microglia—and developed cell-type-informed cfDNA classifiers. Classifier performance was assessed in silico using dilution series designed to model physiologic admixture. The framework was then applied to 137 blood plasma samples from individuals with mild cognitive impairment (MCI), Alzheimer’s disease (AD), Parkinson’s disease (PD), amyotrophic lateral sclerosis (ALS), and healthy controls. Elevated circulating cfDNA fragments exhibited methylation patterns similar to reference profiles from selectively vulnerable neuronal populations, including cortical neuron-like signatures in AD and progressive MCI, dopaminergic neuron-like signatures in PD, and spinal motor neuron-like signatures in ALS. Multivariate integration of neuronal signatures improved the separation of diagnostic groups within this cohort (AUC > 0.85). Although the reported atlas is limited and additional validation in larger and independent cohorts will be required, these results support the feasibility of native cfDNA nanopore methylation sequencing as a flexible platform for brain-derived cfDNA analysis and more cell-type-informed investigation of neurodegeneration from peripheral blood.

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 4 matches between paragraphs and lines of code.

nanoporetech/dorado

License: GPL-3.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 8b8fc5d36a9c0baab262a743cb175b5878e38ca6, 26 August 2026
Languages: C++ (371), C/C++ (329), Python (34), Shell (16)
Size: 1,496 files, 750 scripts
Software Heritage: archived
Found in: the text
Holds: README, license file, environment (tetra/setup.py), tests, continuous integration
Not found: CITATION.cff, documentation
Tools: SAMtools (5 files), pandas (3 files), NumPy (2 files), Biopython (1 file), Matplotlib (1 file), pysam (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
752 files

nanoporetech/modkit

License: GPL-3.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 5cecc3fb3a9336068d9e3c68d5c08d678153dd2c, 12 June 2026
Languages: Rust (108), JavaScript (8), Shell (8), Python (3)
Size: 419 files, 127 scripts
Software Heritage: archived
Found in: the text
Holds: README, license file, tests, continuous integration, documentation
Not found: CITATION.cff, environment file
Tools: SAMtools (3 files), pysam (2 files), NumPy (1 file), pandas (1 file), PyTorch (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
129 files

Wasatch-Biolabs-Bfx/MethylSeqR

License: other
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 42977bd32dd7b4079565dd09f76daa2489c3ce9f, 29 December 2025
Languages: R (42)
Size: 94 files, 42 scripts
Software Heritage: not archived
Found in: the text
Holds: README, license file, environment (DESCRIPTION), tests, documentation, 2 notebooks
Not found: CITATION.cff, continuous integration
Tools: tidyverse (19 files), ggplot2 (6 files)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
44 files

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:

  • 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 919 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

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

Data availability statement

The original contributions presented in the study are publicly available. This data can be found here: Data has been made available NCBI’s Sequence Read Archive (SRA) under the project name ‘Circulating neuron-derived cfDNA for blood-based detection of Alzheimer’s and other neurodegenerative conditions’ and under the BioProject ID PRJNA1503594.

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 3, 28 September 2026

  • Funding: added Utah State University; Brigham Young University

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 8 authors, 8 keywords, 10 MeSH terms, 95 references.

Cite

This paper

Pollard, C., Miller, R., Stirland, I., Keni, M., Jenkins, A., Saito, E., Hill, J. T., & Jenkins, T. (2026). Circulating neuron-derived cfDNA for blood-based detection of Alzheimer's and other neurodegenerative conditions. Frontiers in neurology, 17, 1822479. https://doi.org/10.3389/fneur.2026.1822479

BibTeX

@article{pollard2026circulating,
author = {Pollard, Chad and Miller, Ryan and Stirland, Isaac and Keni, Mykle and Jenkins, Andrew and Saito, Erin and Hill, Jonathon T and Jenkins, Tim},
title = {{Circulating neuron-derived cfDNA for blood-based detection of Alzheimer's and other neurodegenerative conditions}},
journal = {Frontiers in neurology},
year = {2026},
month = aug,
volume = {17},
pages = {1822479},
publisher = {Frontiers Media SA},
issn = {1664-2295},
doi = {10.3389/fneur.2026.1822479},
url = {https://doi.org/10.3389/fneur.2026.1822479},
pmid = {42626456},
pmcid = {PMC13491437}
}

RIS

TY - JOUR
AU - Pollard, Chad
AU - Miller, Ryan
AU - Stirland, Isaac
AU - Keni, Mykle
AU - Jenkins, Andrew
AU - Saito, Erin
AU - Hill, Jonathon T
AU - Jenkins, Tim
TI - Circulating neuron-derived cfDNA for blood-based detection of Alzheimer's and other neurodegenerative conditions
T2 - Frontiers in neurology
J2 - Front Neurol
PY - 2026
DA - 2026/08/06
VL - 17
SP - 1822479
SN - 1664-2295
PB - Frontiers Media SA
DO - 10.3389/fneur.2026.1822479
UR - https://doi.org/10.3389/fneur.2026.1822479
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fneur.2026.1822479",
"type": "article-journal",
"title": "Circulating neuron-derived cfDNA for blood-based detection of Alzheimer's and other neurodegenerative conditions",
"container-title": "Frontiers in neurology",
"author": [
{
"family": "Pollard",
"given": "Chad"
},
{
"family": "Miller",
"given": "Ryan"
},
{
"family": "Stirland",
"given": "Isaac"
},
{
"family": "Keni",
"given": "Mykle"
},
{
"family": "Jenkins",
"given": "Andrew"
},
{
"family": "Saito",
"given": "Erin"
},
{
"family": "Hill",
"given": "Jonathon T"
},
{
"family": "Jenkins",
"given": "Tim"
}
],
"container-title-short": "Front Neurol",
"volume": "17",
"page": "1822479",
"DOI": "10.3389/fneur.2026.1822479",
"PMID": "42626456",
"PMCID": "PMC13491437",
"ISSN": "1664-2295",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fneur.2026.1822479",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
6
]
]
}
}

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.xcrm.2026.102904 [code]
High-dose furmonertinib as first-line treatment for untreated EGFR-mutated advanced NSCLC with central nervous system metastases: A phase 2 trial.
Journal: Cell reports. Medicine
In common: pysam, Biopython, SAMtools, 5 other tools, other condition
[2] doi:10.1002/alz.71271 [code]
Intracellular protein GBF1 displays significant associations with amyloid pathology in Alzheimer's disease.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: pysam, Biopython, SAMtools, 5 other tools, Alzheimer's / dementia
[3] doi:10.1038/s41467-026-76675-1 [code]
Long-read proteogenomic atlas of human neuronal differentiation reveals isoform diversity informing neurodevelopmental risk mechanisms.
Journal: Nature communications
In common: pysam, Biopython, SAMtools, 5 other tools, genetics / omics
[4] doi:10.1038/s41592-026-03211-w [code]
Spatial isoform sequencing at single-cell resolution reveals cell-type-specific spatial isoform variability in multiple brain cell types.
Journal: Nature methods
In common: pysam, Biopython, SAMtools, 5 other tools, genetics / omics
[5] doi:10.1126/sciadv.aed2952 [code]
Activation of transposable elements is linked to a region- and cell type-specific interferon response in Parkinson's disease.
Journal: Science advances
In common: pysam, Biopython, SAMtools, 5 other tools
[6] doi:10.1038/s41586-026-10512-9 [code]
Astrocyte glucocorticoid receptor signalling restricts neuronal plasticity.
Journal: Nature
In common: pysam, Biopython, SAMtools, 5 other tools
[7] doi:10.3389/fnmol.2026.1844705 [code]
Risperidone regulates the expression of schizophrenia-related genes in the forebrain of adult male mice.
Journal: Frontiers in molecular neuroscience
In common: pysam, SAMtools, PyTorch, 5 other tools, genetics / omics
[8] doi:10.1186/s13073-026-01698-8 [code]
From aging to Alzheimer's disease: concordant brain DNA methylation changes in late life.
Journal: Genome medicine
In common: ggplot2, tidyverse, Alzheimer's / dementia, clinical / translational, genetics / omics, 4 references
[9] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: Biopython, SAMtools, PyTorch, 5 other tools
[10] doi:10.1007/s00262-026-04390-3 [code]
Identification and prioritisation of tumour antigen candidates from 79 glioblastoma transcriptomes.
Journal: Cancer immunology, immunotherapy : CII
In common: pysam, SAMtools, ggplot2, 4 other tools, genetics / omics, other condition

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.