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.
The 2 matches
- [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] § 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
- plotDispEsts.DESeqDataSet <- function( object, ymin, CV=FALSE,
- genecol = "black", fitcol = "red", finalcol = "dodgerblue",
- legend=TRUE, xlab, ylab, log = "xy", cex = 0.45, ... )
- {
- if (missing(xlab)) xlab <- "mean of normalized counts"
- if (missing(ylab)) {
- if (CV) {
- ylab <- "coefficient of variation"
- } else {
- ylab <- "dispersion"
- }
- }
- px = mcols(object)$baseMean
- sel = (px>0)
- px = px[sel]
- # transformation of dispersion into CV or not
- f <- if (CV) sqrt else I
- py = f(mcols(object)$dispGeneEst[sel])
- if(missing(ymin))
- ymin = 10^floor(log10(min(py[py>0], na.rm=TRUE))-0.1)
- plot(px, pmax(py, ymin), xlab=xlab, ylab=ylab,
- log=log, pch=ifelse(py<ymin, 6, 20), col=genecol, cex=cex, ... )
- # use a circle over outliers
- pchOutlier <- ifelse(mcols(object)$dispOutlier[sel],1,16)
- cexOutlier <- ifelse(mcols(object)$dispOutlier[sel],2*cex,cex)
- lwdOutlier <- ifelse(mcols(object)$dispOutlier[sel],2,1)
- if (!is.null(dispersions(object))) {
- points(px, f(dispersions(object)[sel]), col=finalcol, cex=cexOutlier,
- pch=pchOutlier, lwd=lwdOutlier)
- }
- if (!is.null(mcols(object)$dispFit)) {
- points(px, f(mcols(object)$dispFit[sel]), col=fitcol, cex=cex, pch=16)
- }
- if (legend) {
- legend("bottomright",c("gene-est","fitted","final"),pch=16,
- col=c(genecol,fitcol,finalcol),bg="white")
- }
- }
- #' Plot dispersion estimates
- #'
- #' A simple helper function that plots the per-gene dispersion
- #' estimates together with the fitted mean-dispersion relationship.
- #'
- #' @docType methods
- #' @name plotDispEsts
- #' @rdname plotDispEsts
- #' @aliases plotDispEsts plotDispEsts,DESeqDataSet-method
- #'
- #' @param object a DESeqDataSet, with dispersions estimated
- #' @param ymin the lower bound for points on the plot, points beyond this
- #' are drawn as triangles at ymin
- #' @param CV logical, whether to plot the asymptotic or biological
- #' coefficient of variation (the square root of dispersion) on the y-axis.
- #' As the mean grows to infinity, the square root of dispersion gives
- #' the coefficient of variation for the counts. Default is \code{FALSE},
- #' plotting dispersion.
- #' @param genecol the color for gene-wise dispersion estimates
- #' @param fitcol the color of the fitted estimates
- #' @param finalcol the color of the final estimates used for testing
- #' @param legend logical, whether to draw a legend
- #' @param xlab xlab
- #' @param ylab ylab
- #' @param log log
- #' @param cex cex
- #' @param ... further arguments to \code{plot}
- #'
- #' @author Simon Anders
- #'
- #' @examples
- #'
- #' dds <- makeExampleDESeqDataSet()
- #' dds <- estimateSizeFactors(dds)
- #' dds <- estimateDispersions(dds)
- #' plotDispEsts(dds)
- #'
- #' @export
- setMethod("plotDispEsts", signature(object="DESeqDataSet"), plotDispEsts.DESeqDataSet)
- # Jan 2023 -- single function copied from `geneplotter` to reduce dependency count
- # colors were changed for ease of viewing from red to blue
- plotMA.dataframe <- function( object, ylim = NULL,
- colNonSig = "gray60", colSig = "blue", colLine = "grey40",
- log = "x", cex=0.45,
- xlab="mean of normalized counts", ylab="log fold change",
- ... ) {
- if ( !( ncol(object) == 3 & inherits( object[[1]], "numeric" ) & inherits( object[[2]], "numeric" )
- & inherits( object[[3]], "logical" ) ) ) {
- stop( "When called with a data.frame, plotMA expects the data frame
- to have 3 columns, two numeric ones for mean and log fold change,
- and a logical one for significance.")
- }
- colnames(object) <- c( "mean", "lfc", "sig" )
- object <- subset( object, mean != 0 )
- py <- object$lfc
- if ( is.null(ylim) )
- ylim <- c(-1,1) * quantile(abs(py[is.finite(py)]), probs=0.99) * 1.1
- plot(object$mean, pmax(ylim[1], pmin(ylim[2], py)),
- log=log, pch=ifelse(py<ylim[1], 6, ifelse(py>ylim[2], 2, 16)),
- cex=cex, col=ifelse( object$sig, colSig, colNonSig ), xlab=xlab, ylab=ylab, ylim=ylim, ...)
- abline( h=0, lwd=4, col=colLine )
- }
- plotMA.DESeqDataSet <- function(object, alpha=.1, main="",
- xlab="mean of normalized counts", ylim,
- colNonSig="gray60", colSig="blue", colLine="grey40",
- returnData=FALSE,
- MLE=FALSE, ...) {
- res <- results(object, ...)
- plotMA.DESeqResults(res, alpha=alpha, main=main, xlab=xlab, ylim=ylim, MLE=MLE)
- }
- plotMA.DESeqResults <- function(object, alpha, main="",
- xlab="mean of normalized counts", ylim,
- colNonSig="gray60", colSig="blue", colLine="grey40",
- returnData=FALSE,
- MLE=FALSE, ...) {
- sval <- "svalue" %in% names(object)
- if (sval) {
- test.col <- "svalue"
- } else {
- test.col <- "padj"
- }
- if (MLE) {
- if (is.null(object$lfcMLE)) {
- stop("lfcMLE column is not present: you should first run results() with addMLE=TRUE")
- }
- lfc.col <- "lfcMLE"
- } else {
- lfc.col <- "log2FoldChange"
- }
- if (missing(alpha)) {
- if (sval) {
- alpha <- 0.005
- message("thresholding s-values on alpha=0.005 to color points")
- } else {
- if (is.null(metadata(object)$alpha)) {
- alpha <- 0.1
- } else {
- alpha <- metadata(object)$alpha
- }
- }
- }
- isDE <- ifelse(is.na(object[[test.col]]), FALSE, object[[test.col]] < alpha)
- df <- data.frame(mean = object[["baseMean"]],
- lfc = object[[lfc.col]],
- isDE = isDE)
- if (returnData) {
- return(df)
- }
- if (missing(ylim)) {
- ylim <- NULL
- }
- plotMA.dataframe(
- df, ylim=ylim,
- colNonSig=colNonSig, colSig=colSig, colLine=colLine,
- xlab=xlab, main=main, ...)
- }
- #' MA-plot from base means and log fold changes
- #'
- #' A simple helper function that makes a so-called "MA-plot", i.e. a
- #' scatter plot of log2 fold changes (on the y-axis) versus the mean of
- #' normalized counts (on the x-axis).
- #'
- #' This function is essentially two lines of code: building a
- #' \code{data.frame} and passing this to the \code{plotMA} method
- #' for \code{data.frame}, now copied from the geneplotter package.
- #' The code was modified in version 1.28 to change from red to blue points
- #' for better visibility for users with color-blindness. The original plots
- #' can still be made via the use of \code{returnData=TRUE} and passing the
- #' resulting data.frame directly to \code{geneplotter::plotMA}.
- #' The code of this function can be seen with:
- #' \code{getMethod("plotMA","DESeqDataSet")}
- #' If the \code{object} contains a column \code{svalue} then these
- #' will be used for coloring the points (with a default \code{alpha=0.005}).
- #'
- #' @docType methods
- #' @name plotMA
- #' @rdname plotMA
- #' @aliases plotMA plotMA,DESeqDataSet-method plotMA,DESeqResults-method
- #'
- #' @param object a \code{DESeqResults} object produced by \code{\link{results}};
- #' or a \code{DESeqDataSet} processed by \code{\link{DESeq}}, or the
- #' individual functions \code{\link{nbinomWaldTest}} or \code{\link{nbinomLRT}}
- #' @param alpha the significance level for thresholding adjusted p-values
- #' @param main optional title for the plot
- #' @param xlab optional defaults to "mean of normalized counts"
- #' @param ylim optional y limits
- #' @param colNonSig color to use for non-significant data points
- #' @param colSig color to use for significant data points
- #' @param colLine color to use for the horizontal (y=0) line
- #' @param returnData logical, whether to return the data.frame used for plotting
- #' @param MLE if \code{betaPrior=TRUE} was used,
- #' whether to plot the MLE (unshrunken estimates), defaults to FALSE.
- #' Requires that \code{\link{results}} was run with \code{addMLE=TRUE}.
- #' Note that the MLE will be plotted regardless of this argument,
- #' if DESeq() was run with \code{betaPrior=FALSE}. See \code{\link{lfcShrink}}
- #' for examples on how to plot shrunken log2 fold changes.
- #' @param ... further arguments passed to \code{plotMA} if object
- #' is \code{DESeqResults} or to \code{\link{results}} if object is
- #' \code{DESeqDataSet}
- #'
- #' @author Michael Love
- #'
- #' @examples
- #'
- #' dds <- makeExampleDESeqDataSet()
- #' dds <- DESeq(dds)
- #' plotMA(dds)
- #' res <- results(dds)
- #' plotMA(res)
- #'
- #' @importFrom graphics abline
- #'
- #' @export
- setMethod("plotMA", signature(object="DESeqDataSet"), plotMA.DESeqDataSet)
- #' @name plotMA
- #' @rdname plotMA
- #' @export
- setMethod("plotMA", signature(object="DESeqResults"), plotMA.DESeqResults)
- plotPCA.DESeqTransform = function(object, intgroup="condition",
- ntop=500, returnData=FALSE, pcsToUse=1:2)
- {
- message(paste0("using ntop=",ntop," top features by variance"))
- # calculate the variance for each gene
- rv <- rowVars(assay(object))
- # select the ntop genes by variance
- select <- order(rv, decreasing=TRUE)[seq_len(min(ntop, length(rv)))]
- # perform a PCA on the data in assay(x) for the selected genes
- pca <- prcomp(t(assay(object)[select,]))
- # the contribution to the total variance for each component
- percentVar <- pca$sdev^2 / sum( pca$sdev^2 )
- if (!all(intgroup %in% names(colData(object)))) {
- stop("the argument 'intgroup' should specify columns of colData(dds)")
- }
- # add the intgroup factors together to create a new grouping factor
- group <- if (length(intgroup) > 1) {
- intgroup.df <- as.data.frame(colData(object)[, intgroup, drop=FALSE])
- factor(apply( intgroup.df, 1, paste, collapse=":"))
- } else {
- colData(object)[[intgroup]]
- }
- # assembly the data for the plot
- pcs <- paste0("PC", pcsToUse)
- d <- data.frame(V1=pca$x[,pcsToUse[1]],
- V2=pca$x[,pcsToUse[2]],
- group=group, name=colnames(object), colData(object))
- colnames(d)[1:2] <- pcs
- if (returnData) {
- attr(d, "percentVar") <- percentVar[pcsToUse]
- return(d)
- }
- ggplot2::ggplot(
- data=d,
- ggplot2::aes(
- x = .data[[ pcs[1] ]],
- y = .data[[ pcs[2] ]],
- color=group)
- ) +
- ggplot2::geom_point(size=3) +
- ggplot2::xlab(paste0(pcs[1],": ",round(percentVar[pcsToUse[1]] * 100),"% variance")) +
- ggplot2::ylab(paste0(pcs[2],": ",round(percentVar[pcsToUse[2]] * 100),"% variance")) +
- ggplot2::coord_fixed()
- }
- #' Sample PCA plot for transformed data
- #'
- #' This plot helps to check for batch effects and the like.
- #'
- #' @docType methods
- #' @name plotPCA
- #' @rdname plotPCA
- #' @aliases plotPCA plotPCA,DESeqTransform-method
- #'
- #' @param object a \code{\link{DESeqTransform}} object, with data in \code{assay(x)},
- #' produced for example by either \code{\link{rlog}} or
- #' \code{\link{varianceStabilizingTransformation}}.
- #' @param intgroup interesting groups: a character vector of
- #' names in \code{colData(x)} to use for grouping
- #' @param ntop number of top genes to use for principal components,
- #' selected by highest row variance
- #' @param returnData should the function only return the data.frame of PC1 and PC2
- #' with intgroup covariates for custom plotting (default is FALSE)
- #' @param pcsToUse numeric of length 2, which PCs to plot
- #'
- #' @return An object created by \code{ggplot}, which can be assigned and further customized.
- #'
- #' @author Wolfgang Huber
- #'
- #' @note See the vignette for an example of variance stabilization and PCA plots.
- #' Note that the source code of \code{plotPCA} is very simple.
- #' The source can be found by typing \code{DESeq2:::plotPCA.DESeqTransform}
- #' or \code{getMethod("plotPCA","DESeqTransform")}, or
- #' browsed on github at \url{https://github.com/mikelove/DESeq2/blob/master/R/plots.R}
- #' Users should find it easy to customize this function.
- #'
- #' @examples
- #'
- #' # using rlog transformed data:
- #' dds <- makeExampleDESeqDataSet(betaSD=1)
- #' vsd <- vst(dds, nsub=500)
- #' plotPCA(vsd)
- #'
- #' # also possible to perform custom transformation:
- #' dds <- estimateSizeFactors(dds)
- #' # shifted log of normalized counts
- #' se <- SummarizedExperiment(log2(counts(dds, normalized=TRUE) + 1),
- #' colData=colData(dds))
- #' # the call to DESeqTransform() is needed to
- #' # trigger our plotPCA method.
- #' plotPCA( DESeqTransform( se ) )
- #'
- #' @importFrom ggplot2 ggplot geom_point xlab ylab coord_fixed aes
- #' @export
- setMethod("plotPCA", signature(object="DESeqTransform"), plotPCA.DESeqTransform)
- #' Plot of normalized counts for a single gene
- #'
- #' Normalized counts plus a pseudocount of 0.5 are shown by default.
- #'
- #' @param dds a \code{DESeqDataSet}
- #' @param gene a character, specifying the name of the gene to plot
- #' @param intgroup interesting groups: a character vector of names in \code{colData(x)} to use for grouping.
- #' Must be factor variables. If you want to plot counts over numeric, choose \code{returnData=TRUE}
- #' @param normalized whether the counts should be normalized by size factor
- #' (default is TRUE)
- #' @param transform whether to have log scale y-axis or not.
- #' defaults to TRUE
- #' @param main as in 'plot'
- #' @param xlab as in 'plot'
- #' @param returnData should the function only return the data.frame of counts and
- #' covariates for custom plotting (default is FALSE)
- #' @param replaced use the outlier-replaced counts if they exist
- #' @param pc pseudocount for log transform
- #' @param ... arguments passed to plot
- #'
- #' @examples
- #'
- #' dds <- makeExampleDESeqDataSet()
- #' plotCounts(dds, "gene1")
- #'
- #' @export
- plotCounts <- function(dds, gene, intgroup="condition",
- normalized=TRUE, transform=TRUE,
- main, xlab="group",
- returnData=FALSE,
- replaced=FALSE,
- pc, ...) {
- stopifnot(length(gene) == 1 & (is.character(gene) | (is.numeric(gene) & (gene >= 1 & gene <= nrow(dds)))))
- if (!all(intgroup %in% names(colData(dds)))) stop("all variables in 'intgroup' must be columns of colData")
- if (!returnData) {
- if (!all(sapply(intgroup, function(v) is(colData(dds)[[v]], "factor")))) {
- stop("all variables in 'intgroup' should be factors, or choose returnData=TRUE and plot manually")
- }
- }
- if (missing(pc)) {
- pc <- if (transform) 0.5 else 0
- }
- if (is.null(sizeFactors(dds)) & is.null(normalizationFactors(dds))) {
- dds <- estimateSizeFactors(dds)
- }
- cnts <- counts(dds,normalized=normalized,replaced=replaced)[gene,]
- group <- if (length(intgroup) == 1) {
- colData(dds)[[intgroup]]
- } else if (length(intgroup) == 2) {
- lvls <- as.vector(t(outer(levels(colData(dds)[[intgroup[1]]]),
- levels(colData(dds)[[intgroup[2]]]),
- function(x,y) paste(x,y,sep=":"))))
- droplevels(factor(apply( as.data.frame(colData(dds)[, intgroup, drop=FALSE]),
- 1, paste, collapse=":"), levels=lvls))
- } else {
- factor(apply( as.data.frame(colData(dds)[, intgroup, drop=FALSE]),
- 1, paste, collapse=":"))
- }
- data <- data.frame(count=cnts + pc, group=as.integer(group))
- logxy <- if (transform) "y" else ""
- if (missing(main)) {
- main <- if (is.numeric(gene)) {
- rownames(dds)[gene]
- } else {
- gene
- }
- }
- ylab <- ifelse(normalized,"normalized count","count")
- if (returnData) return(data.frame(count=data$count, colData(dds)[intgroup]))
- plot(data$group + runif(ncol(dds),-.05,.05), data$count, xlim=c(.5,max(data$group)+.5),
- log=logxy, xaxt="n", xlab=xlab, ylab=ylab, main=main, ...)
- axis(1, at=seq_along(levels(group)), levels(group))
- }
- #' Sparsity plot
- #'
- #' A simple plot of the concentration of counts in a single sample over the
- #' sum of counts per gene. Not technically the same as "sparsity", but this
- #' plot is useful diagnostic for datasets which might not fit a negative
- #' binomial assumption: genes with many zeros and individual very large
- #' counts are difficult to model with the negative binomial distribution.
- #'
- #' @param x a matrix or DESeqDataSet
- #' @param normalized whether to normalize the counts from a DESeqDataSEt
- #' @param ... passed to \code{plot}
- #'
- #' @examples
- #'
- #' dds <- makeExampleDESeqDataSet(n=1000,m=4,dispMeanRel=function(x) .5)
- #' dds <- estimateSizeFactors(dds)
- #' plotSparsity(dds)
- #'
- #' @export
- plotSparsity <- function(x, normalized=TRUE, ...) {
- if (is(x, "DESeqDataSet")) {
- x <- counts(x, normalized=normalized)
- }
- rs <- MatrixGenerics::rowSums(x)
- rmx <- apply(x, 1, max)
- plot(rs[rs > 0], (rmx/rs)[rs > 0], log="x", ylim=c(0,1), xlab="sum of counts per gene",
- ylab="max count / sum", main="Concentration of counts over total sum of counts", ...)
- }
- # convenience function for adding alpha transparency to named colors
- ## col2useful <- function(col,alpha) {
- ## x <- col2rgb(col)/255
- ## rgb(x[1],x[2],x[3],alpha)
- ## }
plots.R at commit 9d1555f, no license · at the source
Overview
- Department of Anatomy, Korea University College of Medicine, Seoul, Republic of Korea
- Department of Neurology, College of Medicine, The Catholic University of Korea, Seoul, Republic of Korea
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
9d1555f492ef16ba4b0f5e3ba09d99f3d97aa5ca, 25 September 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
52 files
- R/
AllClasses.R , R, 511 lines - R/
AllGenerics.R , R, 31 lines - R/
RcppExports.R , R, 15 lines - R/
core.R , R, 2,938 lines - R/
expanded.R , R, 100 lines - R/
fitNbinomGLMs.R , R, 409 lines - R/
helper.R , R, 435 lines - R/
lfcShrink.R , R, 531 lines - R/
methods.R , R, 883 lines - R/
parallel.R , R, 82 lines - R/
plots.R , R, 456 lines, 2 matches - R/
results.R , R, 1,301 lines - R/
rlog.R , R, 287 lines - R/
vst.R , R, 267 lines - R/
wrappers.R , R, 119 lines - inst/
script/ , R, 97 linesicobra_benchmarks.R - inst/
script/ , R, 15 linesmakeSim.R - inst/
script/ , R, 174 linesrunScripts.R - inst/
script/ , R, 173 linestestsuite.Rmd - inst/
script/ , Mathematica, 1,000 linesvst.nb - src/
DESeq2.cpp , C++, 513 lines - src/
RcppExports.cpp , C++, 94 lines - tests/
testthat.R , R, 3 lines - tests/
testthat/ , R, 20 linestest_DESeq.R - tests/
testthat/ , R, 47 linestest_LRT.R - tests/
testthat/ , R, 10 linestest_QR.R - tests/
testthat/ , R, 20 linestest_addMLE.R - tests/
testthat/ , R, 47 linestest_betaFitting.R - tests/
testthat/ , R, 15 linestest_collapse.R - tests/
testthat/ , R, 57 linestest_construction_errors .R - tests/
testthat/ , R, 32 linestest_design_matrix.R - tests/
testthat/ , R, 148 linestest_dispersions.R - tests/
testthat/ , R, 49 linestest_edge_case.R - tests/
testthat/ , R, 12 linestest_factors.R - tests/
testthat/ , R, 8 linestest_fpkm.R - tests/
testthat/ , R, 30 linestest_interactions.R - tests/
testthat/ , R, 112 linestest_lfcShrink.R - tests/
testthat/ , R, 23 linestest_linear_mu.R - tests/
testthat/ , R, 11 linestest_methods.R - tests/
testthat/ , R, 31 linestest_model_matrix.R - tests/
testthat/ , R, 83 linestest_nbinomWald.R - tests/
testthat/ , R, 40 linestest_optim.R - tests/
testthat/ , R, 85 linestest_outlier.R - tests/
testthat/ , R, 70 linestest_parallel.R - tests/
testthat/ , R, 39 linestest_plots.R - tests/
testthat/ , R, 243 linestest_results.R - tests/
testthat/ , R, 47 linestest_size_factor.R - tests/
testthat/ , R, 61 linestest_txi.R - tests/
testthat/ , R, 58 linestest_unmix.R - tests/
testthat/ , R, 123 linestest_weights.R - tests/
testthat/ , R, 31 linestest_zero_zero.R - vignettes/
DESeq2.Rmd , R, 2,975 lines
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/
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 &
BibTeX
@article{choi2026validat
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 \&
journal = {Frontiers in aging neuroscience},
year = {2026},
month = aug,
volume = {18},
pages = {1931183},
publisher = {Frontiers Media SA},
issn = {1663-4365},
doi = {10.3389/
url = {https://
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 &
T2 - Frontiers in aging neuroscience
J2 - Front Aging Neurosci
PY - 2026
DA - 2026/
VL - 18
SP - 1931183
SN - 1663-4365
PB - Frontiers Media SA
DO - 10.3389/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.3389/
"type": "article-journal",
"title": "A validated workflow for paired total and small RNA sequencing from low-input submandibular gland biopsy specimens in &
"container-title": "Frontiers in aging neuroscience",
"author": [
{
"family": "Choi",
"given": "Ko-Eun"
},
{
"family": "Kim",
"given": "Joong-Seok"
}
],
"container-title-short":
"volume": "18",
"page": "1931183",
"DOI": "10.3389/
"PMID": "42741392",
"PMCID": "PMC13572653",
"ISSN": "1663-4365",
"publisher": "Frontiers Media SA",
"URL": "https://
"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 communicationsIn 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 communicationsIn 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 researchIn 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: iScienceIn 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 communicationsIn 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. MedicineIn common: edgeR, limma, DESeq2, 4 other tools, genetics / omics
- [8] doi:10.1002/imt2.70163 [code]
- Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.Journal: iMetaIn common: edgeR, limma, DESeq2, 4 other tools, genetics / omics
- [9] doi:10.1038/s41593-026-02367-0 [code]
- A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes.Journal: Nature neuroscienceIn common: edgeR, limma, DESeq2, 4 other tools
- [10] doi:10.1016/j.isci.2026.115573 [code]
- Female cortical cellular mosaicism underlies shared MeCP2 and PCB impacted gene pathways.Journal: iScienceIn common: edgeR, limma, DESeq2, 4 other tools
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: 1 repository of the authors' code, each at its verified commit and with its license, 52 scripts, and 2 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:c8b74d1137dab77c…
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.
