OSCR

A validated workflow for paired total and small RNA sequencing from low-input submandibular gland biopsy specimens in <i>de novo</i> Parkinson's disease patients.

Code ↔ Paper

2 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 2 matches
  1. [1] § Materials and methods › Post-sequencing quality control ↔ R/plots.R, lines 293–342 · score 0.55 · principal component, rlog transformed, PCA, gene, seq
  2. [2] § Results › Post-sequencing quality assessment ↔ R/plots.R, lines 293–342 · score 0.51 · principal components, rlog transformed, PCA, variance, gene, seq

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 · 456 lines · 16 KB · no license · 2 matches

  1. plotDispEsts.DESeqDataSet <- function( object, ymin, CV=FALSE,
  2. genecol = "black", fitcol = "red", finalcol = "dodgerblue",
  3. legend=TRUE, xlab, ylab, log = "xy", cex = 0.45, ... )
  4. {
  5. if (missing(xlab)) xlab <- "mean of normalized counts"
  6. if (missing(ylab)) {
  7. if (CV) {
  8. ylab <- "coefficient of variation"
  9. } else {
  10. ylab <- "dispersion"
  11. }
  12. }
  13. px = mcols(object)$baseMean
  14. sel = (px>0)
  15. px = px[sel]
  16. # transformation of dispersion into CV or not
  17. f <- if (CV) sqrt else I
  18. py = f(mcols(object)$dispGeneEst[sel])
  19. if(missing(ymin))
  20. ymin = 10^floor(log10(min(py[py>0], na.rm=TRUE))-0.1)
  21. plot(px, pmax(py, ymin), xlab=xlab, ylab=ylab,
  22. log=log, pch=ifelse(py<ymin, 6, 20), col=genecol, cex=cex, ... )
  23. # use a circle over outliers
  24. pchOutlier <- ifelse(mcols(object)$dispOutlier[sel],1,16)
  25. cexOutlier <- ifelse(mcols(object)$dispOutlier[sel],2*cex,cex)
  26. lwdOutlier <- ifelse(mcols(object)$dispOutlier[sel],2,1)
  27. if (!is.null(dispersions(object))) {
  28. points(px, f(dispersions(object)[sel]), col=finalcol, cex=cexOutlier,
  29. pch=pchOutlier, lwd=lwdOutlier)
  30. }
  31. if (!is.null(mcols(object)$dispFit)) {
  32. points(px, f(mcols(object)$dispFit[sel]), col=fitcol, cex=cex, pch=16)
  33. }
  34. if (legend) {
  35. legend("bottomright",c("gene-est","fitted","final"),pch=16,
  36. col=c(genecol,fitcol,finalcol),bg="white")
  37. }
  38. }
  39. #' Plot dispersion estimates
  40. #'
  41. #' A simple helper function that plots the per-gene dispersion
  42. #' estimates together with the fitted mean-dispersion relationship.
  43. #'
  44. #' @docType methods
  45. #' @name plotDispEsts
  46. #' @rdname plotDispEsts
  47. #' @aliases plotDispEsts plotDispEsts,DESeqDataSet-method
  48. #'
  49. #' @param object a DESeqDataSet, with dispersions estimated
  50. #' @param ymin the lower bound for points on the plot, points beyond this
  51. #' are drawn as triangles at ymin
  52. #' @param CV logical, whether to plot the asymptotic or biological
  53. #' coefficient of variation (the square root of dispersion) on the y-axis.
  54. #' As the mean grows to infinity, the square root of dispersion gives
  55. #' the coefficient of variation for the counts. Default is \code{FALSE},
  56. #' plotting dispersion.
  57. #' @param genecol the color for gene-wise dispersion estimates
  58. #' @param fitcol the color of the fitted estimates
  59. #' @param finalcol the color of the final estimates used for testing
  60. #' @param legend logical, whether to draw a legend
  61. #' @param xlab xlab
  62. #' @param ylab ylab
  63. #' @param log log
  64. #' @param cex cex
  65. #' @param ... further arguments to \code{plot}
  66. #'
  67. #' @author Simon Anders
  68. #'
  69. #' @examples
  70. #'
  71. #' dds <- makeExampleDESeqDataSet()
  72. #' dds <- estimateSizeFactors(dds)
  73. #' dds <- estimateDispersions(dds)
  74. #' plotDispEsts(dds)
  75. #'
  76. #' @export
  77. setMethod("plotDispEsts", signature(object="DESeqDataSet"), plotDispEsts.DESeqDataSet)
  78. # Jan 2023 -- single function copied from `geneplotter` to reduce dependency count
  79. # colors were changed for ease of viewing from red to blue
  80. plotMA.dataframe <- function( object, ylim = NULL,
  81. colNonSig = "gray60", colSig = "blue", colLine = "grey40",
  82. log = "x", cex=0.45,
  83. xlab="mean of normalized counts", ylab="log fold change",
  84. ... ) {
  85. if ( !( ncol(object) == 3 & inherits( object[[1]], "numeric" ) & inherits( object[[2]], "numeric" )
  86. & inherits( object[[3]], "logical" ) ) ) {
  87. stop( "When called with a data.frame, plotMA expects the data frame
  88. to have 3 columns, two numeric ones for mean and log fold change,
  89. and a logical one for significance.")
  90. }
  91. colnames(object) <- c( "mean", "lfc", "sig" )
  92. object <- subset( object, mean != 0 )
  93. py <- object$lfc
  94. if ( is.null(ylim) )
  95. ylim <- c(-1,1) * quantile(abs(py[is.finite(py)]), probs=0.99) * 1.1
  96. plot(object$mean, pmax(ylim[1], pmin(ylim[2], py)),
  97. log=log, pch=ifelse(py<ylim[1], 6, ifelse(py>ylim[2], 2, 16)),
  98. cex=cex, col=ifelse( object$sig, colSig, colNonSig ), xlab=xlab, ylab=ylab, ylim=ylim, ...)
  99. abline( h=0, lwd=4, col=colLine )
  100. }
  101. plotMA.DESeqDataSet <- function(object, alpha=.1, main="",
  102. xlab="mean of normalized counts", ylim,
  103. colNonSig="gray60", colSig="blue", colLine="grey40",
  104. returnData=FALSE,
  105. MLE=FALSE, ...) {
  106. res <- results(object, ...)
  107. plotMA.DESeqResults(res, alpha=alpha, main=main, xlab=xlab, ylim=ylim, MLE=MLE)
  108. }
  109. plotMA.DESeqResults <- function(object, alpha, main="",
  110. xlab="mean of normalized counts", ylim,
  111. colNonSig="gray60", colSig="blue", colLine="grey40",
  112. returnData=FALSE,
  113. MLE=FALSE, ...) {
  114. sval <- "svalue" %in% names(object)
  115. if (sval) {
  116. test.col <- "svalue"
  117. } else {
  118. test.col <- "padj"
  119. }
  120. if (MLE) {
  121. if (is.null(object$lfcMLE)) {
  122. stop("lfcMLE column is not present: you should first run results() with addMLE=TRUE")
  123. }
  124. lfc.col <- "lfcMLE"
  125. } else {
  126. lfc.col <- "log2FoldChange"
  127. }
  128. if (missing(alpha)) {
  129. if (sval) {
  130. alpha <- 0.005
  131. message("thresholding s-values on alpha=0.005 to color points")
  132. } else {
  133. if (is.null(metadata(object)$alpha)) {
  134. alpha <- 0.1
  135. } else {
  136. alpha <- metadata(object)$alpha
  137. }
  138. }
  139. }
  140. isDE <- ifelse(is.na(object[[test.col]]), FALSE, object[[test.col]] < alpha)
  141. df <- data.frame(mean = object[["baseMean"]],
  142. lfc = object[[lfc.col]],
  143. isDE = isDE)
  144. if (returnData) {
  145. return(df)
  146. }
  147. if (missing(ylim)) {
  148. ylim <- NULL
  149. }
  150. plotMA.dataframe(
  151. df, ylim=ylim,
  152. colNonSig=colNonSig, colSig=colSig, colLine=colLine,
  153. xlab=xlab, main=main, ...)
  154. }
  155. #' MA-plot from base means and log fold changes
  156. #'
  157. #' A simple helper function that makes a so-called "MA-plot", i.e. a
  158. #' scatter plot of log2 fold changes (on the y-axis) versus the mean of
  159. #' normalized counts (on the x-axis).
  160. #'
  161. #' This function is essentially two lines of code: building a
  162. #' \code{data.frame} and passing this to the \code{plotMA} method
  163. #' for \code{data.frame}, now copied from the geneplotter package.
  164. #' The code was modified in version 1.28 to change from red to blue points
  165. #' for better visibility for users with color-blindness. The original plots
  166. #' can still be made via the use of \code{returnData=TRUE} and passing the
  167. #' resulting data.frame directly to \code{geneplotter::plotMA}.
  168. #' The code of this function can be seen with:
  169. #' \code{getMethod("plotMA","DESeqDataSet")}
  170. #' If the \code{object} contains a column \code{svalue} then these
  171. #' will be used for coloring the points (with a default \code{alpha=0.005}).
  172. #'
  173. #' @docType methods
  174. #' @name plotMA
  175. #' @rdname plotMA
  176. #' @aliases plotMA plotMA,DESeqDataSet-method plotMA,DESeqResults-method
  177. #'
  178. #' @param object a \code{DESeqResults} object produced by \code{\link{results}};
  179. #' or a \code{DESeqDataSet} processed by \code{\link{DESeq}}, or the
  180. #' individual functions \code{\link{nbinomWaldTest}} or \code{\link{nbinomLRT}}
  181. #' @param alpha the significance level for thresholding adjusted p-values
  182. #' @param main optional title for the plot
  183. #' @param xlab optional defaults to "mean of normalized counts"
  184. #' @param ylim optional y limits
  185. #' @param colNonSig color to use for non-significant data points
  186. #' @param colSig color to use for significant data points
  187. #' @param colLine color to use for the horizontal (y=0) line
  188. #' @param returnData logical, whether to return the data.frame used for plotting
  189. #' @param MLE if \code{betaPrior=TRUE} was used,
  190. #' whether to plot the MLE (unshrunken estimates), defaults to FALSE.
  191. #' Requires that \code{\link{results}} was run with \code{addMLE=TRUE}.
  192. #' Note that the MLE will be plotted regardless of this argument,
  193. #' if DESeq() was run with \code{betaPrior=FALSE}. See \code{\link{lfcShrink}}
  194. #' for examples on how to plot shrunken log2 fold changes.
  195. #' @param ... further arguments passed to \code{plotMA} if object
  196. #' is \code{DESeqResults} or to \code{\link{results}} if object is
  197. #' \code{DESeqDataSet}
  198. #'
  199. #' @author Michael Love
  200. #'
  201. #' @examples
  202. #'
  203. #' dds <- makeExampleDESeqDataSet()
  204. #' dds <- DESeq(dds)
  205. #' plotMA(dds)
  206. #' res <- results(dds)
  207. #' plotMA(res)
  208. #'
  209. #' @importFrom graphics abline
  210. #'
  211. #' @export
  212. setMethod("plotMA", signature(object="DESeqDataSet"), plotMA.DESeqDataSet)
  213. #' @name plotMA
  214. #' @rdname plotMA
  215. #' @export
  216. setMethod("plotMA", signature(object="DESeqResults"), plotMA.DESeqResults)
  217. plotPCA.DESeqTransform = function(object, intgroup="condition",
  218. ntop=500, returnData=FALSE, pcsToUse=1:2)
  219. {
  220. message(paste0("using ntop=",ntop," top features by variance"))
  221. # calculate the variance for each gene
  222. rv <- rowVars(assay(object))
  223. # select the ntop genes by variance
  224. select <- order(rv, decreasing=TRUE)[seq_len(min(ntop, length(rv)))]
  225. # perform a PCA on the data in assay(x) for the selected genes
  226. pca <- prcomp(t(assay(object)[select,]))
  227. # the contribution to the total variance for each component
  228. percentVar <- pca$sdev^2 / sum( pca$sdev^2 )
  229. if (!all(intgroup %in% names(colData(object)))) {
  230. stop("the argument 'intgroup' should specify columns of colData(dds)")
  231. }
  232. # add the intgroup factors together to create a new grouping factor
  233. group <- if (length(intgroup) > 1) {
  234. intgroup.df <- as.data.frame(colData(object)[, intgroup, drop=FALSE])
  235. factor(apply( intgroup.df, 1, paste, collapse=":"))
  236. } else {
  237. colData(object)[[intgroup]]
  238. }
  239. # assembly the data for the plot
  240. pcs <- paste0("PC", pcsToUse)
  241. d <- data.frame(V1=pca$x[,pcsToUse[1]],
  242. V2=pca$x[,pcsToUse[2]],
  243. group=group, name=colnames(object), colData(object))
  244. colnames(d)[1:2] <- pcs
  245. if (returnData) {
  246. attr(d, "percentVar") <- percentVar[pcsToUse]
  247. return(d)
  248. }
  249. ggplot2::ggplot(
  250. data=d,
  251. ggplot2::aes(
  252. x = .data[[ pcs[1] ]],
  253. y = .data[[ pcs[2] ]],
  254. color=group)
  255. ) +
  256. ggplot2::geom_point(size=3) +
  257. ggplot2::xlab(paste0(pcs[1],": ",round(percentVar[pcsToUse[1]] * 100),"% variance")) +
  258. ggplot2::ylab(paste0(pcs[2],": ",round(percentVar[pcsToUse[2]] * 100),"% variance")) +
  259. ggplot2::coord_fixed()
  260. }
  261. #' Sample PCA plot for transformed data
  262. #'
  263. #' This plot helps to check for batch effects and the like.
  264. #'
  265. #' @docType methods
  266. #' @name plotPCA
  267. #' @rdname plotPCA
  268. #' @aliases plotPCA plotPCA,DESeqTransform-method
  269. #'
  270. #' @param object a \code{\link{DESeqTransform}} object, with data in \code{assay(x)},
  271. #' produced for example by either \code{\link{rlog}} or
  272. #' \code{\link{varianceStabilizingTransformation}}.
  273. #' @param intgroup interesting groups: a character vector of
  274. #' names in \code{colData(x)} to use for grouping
  275. #' @param ntop number of top genes to use for principal components,
  276. #' selected by highest row variance
  277. #' @param returnData should the function only return the data.frame of PC1 and PC2
  278. #' with intgroup covariates for custom plotting (default is FALSE)
  279. #' @param pcsToUse numeric of length 2, which PCs to plot
  280. #'
  281. #' @return An object created by \code{ggplot}, which can be assigned and further customized.
  282. #'
  283. #' @author Wolfgang Huber
  284. #'
  285. #' @note See the vignette for an example of variance stabilization and PCA plots.
  286. #' Note that the source code of \code{plotPCA} is very simple.
  287. #' The source can be found by typing \code{DESeq2:::plotPCA.DESeqTransform}
  288. #' or \code{getMethod("plotPCA","DESeqTransform")}, or
  289. #' browsed on github at \url{https://github.com/mikelove/DESeq2/blob/master/R/plots.R}
  290. #' Users should find it easy to customize this function.
  291. #'
  292. #' @examples
  293. #'
  294. #' # using rlog transformed data:
  295. #' dds <- makeExampleDESeqDataSet(betaSD=1)
  296. #' vsd <- vst(dds, nsub=500)
  297. #' plotPCA(vsd)
  298. #'
  299. #' # also possible to perform custom transformation:
  300. #' dds <- estimateSizeFactors(dds)
  301. #' # shifted log of normalized counts
  302. #' se <- SummarizedExperiment(log2(counts(dds, normalized=TRUE) + 1),
  303. #' colData=colData(dds))
  304. #' # the call to DESeqTransform() is needed to
  305. #' # trigger our plotPCA method.
  306. #' plotPCA( DESeqTransform( se ) )
  307. #'
  308. #' @importFrom ggplot2 ggplot geom_point xlab ylab coord_fixed aes
  309. #' @export
  310. setMethod("plotPCA", signature(object="DESeqTransform"), plotPCA.DESeqTransform)
  311. #' Plot of normalized counts for a single gene
  312. #'
  313. #' Normalized counts plus a pseudocount of 0.5 are shown by default.
  314. #'
  315. #' @param dds a \code{DESeqDataSet}
  316. #' @param gene a character, specifying the name of the gene to plot
  317. #' @param intgroup interesting groups: a character vector of names in \code{colData(x)} to use for grouping.
  318. #' Must be factor variables. If you want to plot counts over numeric, choose \code{returnData=TRUE}
  319. #' @param normalized whether the counts should be normalized by size factor
  320. #' (default is TRUE)
  321. #' @param transform whether to have log scale y-axis or not.
  322. #' defaults to TRUE
  323. #' @param main as in 'plot'
  324. #' @param xlab as in 'plot'
  325. #' @param returnData should the function only return the data.frame of counts and
  326. #' covariates for custom plotting (default is FALSE)
  327. #' @param replaced use the outlier-replaced counts if they exist
  328. #' @param pc pseudocount for log transform
  329. #' @param ... arguments passed to plot
  330. #'
  331. #' @examples
  332. #'
  333. #' dds <- makeExampleDESeqDataSet()
  334. #' plotCounts(dds, "gene1")
  335. #'
  336. #' @export
  337. plotCounts <- function(dds, gene, intgroup="condition",
  338. normalized=TRUE, transform=TRUE,
  339. main, xlab="group",
  340. returnData=FALSE,
  341. replaced=FALSE,
  342. pc, ...) {
  343. stopifnot(length(gene) == 1 & (is.character(gene) | (is.numeric(gene) & (gene >= 1 & gene <= nrow(dds)))))
  344. if (!all(intgroup %in% names(colData(dds)))) stop("all variables in 'intgroup' must be columns of colData")
  345. if (!returnData) {
  346. if (!all(sapply(intgroup, function(v) is(colData(dds)[[v]], "factor")))) {
  347. stop("all variables in 'intgroup' should be factors, or choose returnData=TRUE and plot manually")
  348. }
  349. }
  350. if (missing(pc)) {
  351. pc <- if (transform) 0.5 else 0
  352. }
  353. if (is.null(sizeFactors(dds)) & is.null(normalizationFactors(dds))) {
  354. dds <- estimateSizeFactors(dds)
  355. }
  356. cnts <- counts(dds,normalized=normalized,replaced=replaced)[gene,]
  357. group <- if (length(intgroup) == 1) {
  358. colData(dds)[[intgroup]]
  359. } else if (length(intgroup) == 2) {
  360. lvls <- as.vector(t(outer(levels(colData(dds)[[intgroup[1]]]),
  361. levels(colData(dds)[[intgroup[2]]]),
  362. function(x,y) paste(x,y,sep=":"))))
  363. droplevels(factor(apply( as.data.frame(colData(dds)[, intgroup, drop=FALSE]),
  364. 1, paste, collapse=":"), levels=lvls))
  365. } else {
  366. factor(apply( as.data.frame(colData(dds)[, intgroup, drop=FALSE]),
  367. 1, paste, collapse=":"))
  368. }
  369. data <- data.frame(count=cnts + pc, group=as.integer(group))
  370. logxy <- if (transform) "y" else ""
  371. if (missing(main)) {
  372. main <- if (is.numeric(gene)) {
  373. rownames(dds)[gene]
  374. } else {
  375. gene
  376. }
  377. }
  378. ylab <- ifelse(normalized,"normalized count","count")
  379. if (returnData) return(data.frame(count=data$count, colData(dds)[intgroup]))
  380. plot(data$group + runif(ncol(dds),-.05,.05), data$count, xlim=c(.5,max(data$group)+.5),
  381. log=logxy, xaxt="n", xlab=xlab, ylab=ylab, main=main, ...)
  382. axis(1, at=seq_along(levels(group)), levels(group))
  383. }
  384. #' Sparsity plot
  385. #'
  386. #' A simple plot of the concentration of counts in a single sample over the
  387. #' sum of counts per gene. Not technically the same as "sparsity", but this
  388. #' plot is useful diagnostic for datasets which might not fit a negative
  389. #' binomial assumption: genes with many zeros and individual very large
  390. #' counts are difficult to model with the negative binomial distribution.
  391. #'
  392. #' @param x a matrix or DESeqDataSet
  393. #' @param normalized whether to normalize the counts from a DESeqDataSEt
  394. #' @param ... passed to \code{plot}
  395. #'
  396. #' @examples
  397. #'
  398. #' dds <- makeExampleDESeqDataSet(n=1000,m=4,dispMeanRel=function(x) .5)
  399. #' dds <- estimateSizeFactors(dds)
  400. #' plotSparsity(dds)
  401. #'
  402. #' @export
  403. plotSparsity <- function(x, normalized=TRUE, ...) {
  404. if (is(x, "DESeqDataSet")) {
  405. x <- counts(x, normalized=normalized)
  406. }
  407. rs <- MatrixGenerics::rowSums(x)
  408. rmx <- apply(x, 1, max)
  409. plot(rs[rs > 0], (rmx/rs)[rs > 0], log="x", ylim=c(0,1), xlab="sum of counts per gene",
  410. ylab="max count / sum", main="Concentration of counts over total sum of counts", ...)
  411. }
  412. # convenience function for adding alpha transparency to named colors
  413. ## col2useful <- function(col,alpha) {
  414. ## x <- col2rgb(col)/255
  415. ## rgb(x[1],x[2],x[3],alpha)
  416. ## }

plots.R at commit 9d1555f, no license · at the source

Overview

Authors: Ko-Eun Choi1,2, Joong-Seok Kim2
  1. Department of Anatomy, Korea University College of Medicine, Seoul, Republic of Korea
  2. Department of Neurology, College of Medicine, The Catholic University of Korea, Seoul, Republic of Korea
Institutions: Korea University (South Korea); Catholic University of Korea (South Korea)
Journal: Frontiers in aging neuroscience, volume 18, article 1931183
Dates: received 7 July 2026; accepted 17 August 2026; published online 31 August 2026
Type: Methods article · Language: English
License: CC BY
Identifiers: DOI 10.3389/fnagi.2026.1931183 · PMID 42741392 · PMCID PMC13572653 · OpenAlex W7204756738
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), human (organism), Parkinson's (population), clinical / translational (subfield)
Methods: Smoothing, state filtering, decompositions, Connectivity
Keywords: low-input tissue, Parkinson’s disease, small RNA sequencing, submandibular gland, transcriptomics
Topic: Parkinson's Disease Mechanisms and Treatments (Neurology, Medicine), according to OpenAlex
Citations: not cited yet (Europe PMC); 37 references in the paper

Abstract

Parkinson’s disease (PD) is characterized by progressive α-synuclein aggregation, yet the molecular mechanisms underlying this process remain incompletely understood. Transcriptomic analyses may provide important insights into the RNA-mediated regulation of PD pathogenesis, but studies of affected brain tissue are limited by the inaccessibility of living brain tissue and post-mortem RNA degradation. The submandibular gland (SMG), which exhibits α-synuclein pathology comparable to that of the substantia nigra, represents a clinically accessible peripheral tissue for investigating disease-associated transcriptomic alterations. However, ultrasound-guided core needle biopsy yields only a limited amount of tissue, making comprehensive RNA sequencing technically challenging. Here, we present and validate a workflow for paired total RNA and small RNA sequencing from low-input SMG biopsy specimens obtained from patients with de novo PD and age-matched, neurologically unaffected surgical controls. Ultrasound-guided core needle biopsy yielded specimens measuring approximately 1.2 × 7–10 mm. To enable direct tissue-to-blood comparisons, fasting peripheral blood samples were collected from the same participants on the morning of biopsy. Following immediate tissue stabilization, RNA extraction, library preparation, and next-generation sequencing, workflow performance was evaluated by assessing RNA integrity, library quality, sequencing metrics, mapping performance, and reproducibility. Despite the limited tissue input, the protocol consistently generated high-quality RNA suitable for both total RNA sequencing and small RNA sequencing. The validated workflow produced robust sequencing libraries with high reproducibility and enabled comprehensive profiling of protein-coding transcripts together with multiple classes of small non-coding RNAs, including miRNAs, piRNAs, snoRNAs, snRNAs, and tRNA-derived RNAs. This validated workflow provides a practical and reproducible approach for comprehensive transcriptomic profiling of minimally invasive SMG biopsy specimens and matched fasting peripheral blood, and may facilitate future studies of disease mechanisms, biomarker discovery, and translational applications in Parkinson’s disease.

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

thelovelab/DESeq2

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 9d1555f492ef16ba4b0f5e3ba09d99f3d97aa5ca, 25 September 2026
Languages: R (49), C++ (2), Mathematica (1)
Size: 107 files, 52 scripts
Software Heritage: not archived
Found in: the text
Holds: environment (DESCRIPTION), tests, documentation, 3 notebooks
Not found: README, license file, CITATION.cff, continuous integration
Tools: DESeq2 (7 files), ggplot2 (3 files), limma (2 files), tidyverse (2 files), cowplot (1 file), edgeR (1 file), pheatmap (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
52 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:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 52 scripts, each with its path and the digest of its content;
  • 2 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 datasets presented in this study can be found in online repositories. The names of the repository/repositories and accession number(s) can be found at: https://www.ncbi.nlm.nih.gov/, PRJNA1027508 (https://ncbi.nlm.nih.gov/nucleotide/PRJNA1027508).

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

  • Funding: added Korean Neurological Association; Korea Health Industry Development Institute; Seoul St. Mary's Hospital, Catholic University of Korea

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 2 authors, 5 keywords, 37 references.

Cite

This paper

Choi, K.-E., & Kim, J.-S. (2026). A validated workflow for paired total and small RNA sequencing from low-input submandibular gland biopsy specimens in &lt;i&gt;de novo&lt;/i&gt; Parkinson's disease patients. Frontiers in aging neuroscience, 18, 1931183. https://doi.org/10.3389/fnagi.2026.1931183

BibTeX

@article{choi2026validated,
author = {Choi, Ko-Eun and Kim, Joong-Seok},
title = {{A validated workflow for paired total and small RNA sequencing from low-input submandibular gland biopsy specimens in \&lt;i\&gt;de novo\&lt;/i\&gt; Parkinson's disease patients}},
journal = {Frontiers in aging neuroscience},
year = {2026},
month = aug,
volume = {18},
pages = {1931183},
publisher = {Frontiers Media SA},
issn = {1663-4365},
doi = {10.3389/fnagi.2026.1931183},
url = {https://doi.org/10.3389/fnagi.2026.1931183},
pmid = {42741392},
pmcid = {PMC13572653}
}

RIS

TY - JOUR
AU - Choi, Ko-Eun
AU - Kim, Joong-Seok
TI - A validated workflow for paired total and small RNA sequencing from low-input submandibular gland biopsy specimens in &lt;i&gt;de novo&lt;/i&gt; Parkinson's disease patients
T2 - Frontiers in aging neuroscience
J2 - Front Aging Neurosci
PY - 2026
DA - 2026/08/31
VL - 18
SP - 1931183
SN - 1663-4365
PB - Frontiers Media SA
DO - 10.3389/fnagi.2026.1931183
UR - https://doi.org/10.3389/fnagi.2026.1931183
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fnagi.2026.1931183",
"type": "article-journal",
"title": "A validated workflow for paired total and small RNA sequencing from low-input submandibular gland biopsy specimens in &lt;i&gt;de novo&lt;/i&gt; Parkinson's disease patients",
"container-title": "Frontiers in aging neuroscience",
"author": [
{
"family": "Choi",
"given": "Ko-Eun"
},
{
"family": "Kim",
"given": "Joong-Seok"
}
],
"container-title-short": "Front Aging Neurosci",
"volume": "18",
"page": "1931183",
"DOI": "10.3389/fnagi.2026.1931183",
"PMID": "42741392",
"PMCID": "PMC13572653",
"ISSN": "1663-4365",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fnagi.2026.1931183",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
31
]
]
}
}

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

Similar papers

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

[1] doi:10.1038/s41467-026-74961-6 [code]
Spatial multi-omics identifies early synaptic pruning and context-specific dopaminergic vulnerability in synucleinopathies.
Journal: Nature communications
In common: edgeR, cowplot, tidyverse, Parkinson's, genetics / omics, 5 references
[2] doi:10.1038/s41467-026-71525-6 [code]
Single-nucleus brain transcriptomics reveals microglia dysfunction in multiple system atrophy.
Journal: Nature communications
In common: DESeq2, cowplot, ggplot2, 1 other tool, Parkinson's, genetics / omics, 4 references
[3] doi:10.1101/gr.281113.125 [code]
Single-nucleus multiomic profiling of the aging mouse substantia nigra reveals conserved gene alterations linked to Parkinson's disease.
Journal: Genome research
In common: edgeR, limma, cowplot, 2 other tools, Parkinson's, genetics / omics, 2 references
[4] doi:10.1016/j.isci.2026.115657 [code]
Integration of machine learning to develop a disulfidptosis model for predicting glioma prognosis, immunotherapy response, and drug.
Journal: iScience
In common: edgeR, limma, DESeq2, 4 other tools, clinical / translational
[5] 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: edgeR, limma, DESeq2, 4 other tools, genetics / omics
[6] doi:10.1093/bioinformatics/btag592 [code]
Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.
Journal: Bioinformatics (Oxford, England)
In common: edgeR, limma, DESeq2, 4 other tools, genetics / omics
[7] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: edgeR, limma, DESeq2, 4 other tools, genetics / omics
[8] doi:10.1038/s41467-026-70232-6 [code]
Gene expression dynamics of human and mouse craniofacial development at the single-cell level.
Journal: Nature communications
In common: edgeR, limma, DESeq2, 4 other tools, genetics / omics
[9] doi:10.1016/j.xcrm.2026.102682 [code]
TET CpG sequence-context-specific DNA demethylation shapes progression of IDH-mutant gliomas.
Journal: Cell reports. Medicine
In common: edgeR, limma, DESeq2, 4 other tools, genetics / omics
[10] doi:10.1002/imt2.70163 [code]
Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.
Journal: iMeta
In common: edgeR, limma, DESeq2, 4 other tools, genetics / omics

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.